記錄我在大一第二學期期末做的C語言課程畢業設計
1. 班級檔案管理系統運用到的主要結構體
typedef struct birthday //出生日期
{
int year;
int month;
int day;
}Birthday;
struct file //學生檔案資訊
{
char id[20];//學號
char name[20];//姓名
char sex[2];//性別
int age;//年齡
Birthday birthday;//出生日期
char desc[20];//備注
}File[N];
2.班級檔案管理系統任務目標
對一個有N個學生的班級,通過該系統實作對該班級學生的基本資訊進行錄入、顯示、修改、洗掉、保存等操作的管理,
功能要求:
(1)本系統采用一個包含N個資料的結構體陣列,每個資料的結構應當包括:學號、姓名、性別、年齡、備注,
(2)本系統顯示這樣的選單:
請選擇系統功能項:
a 學生基本資訊錄入
b 學生基本資訊顯示
c 學生基本資訊保存
d 學生基本資訊洗掉
e 學生基本資訊修改(要求先輸入密碼)
f 學生基本資訊查詢
(1)按學號查詢
(2)按姓名查詢
(3)按性別查詢
(4)按年齡查詢
g. 退出系統
(3)執行一個具體的功能之后,程式將重新顯示選單,
(4)將學生基本資訊保存到檔案中,
(5)進入系統之前要先輸入密碼,
3.程式框圖或流程圖,程式清單與呼叫關系
(1)系統結構程式框圖



2)程式清單
各函式的主要功能:
|
函式 |
功能 |
|
void load() |
系統登陸驗證 |
|
save_password(charstr[]) |
保存密碼 |
|
void menu() |
選單功能 |
|
void input(int n) |
錄入學生資訊 |
|
void output() |
顯示學生資訊 |
|
void save(int n) |
保存學生資訊 |
|
void dele() |
洗掉學生資訊 |
|
void change() |
修改學生資訊 |
|
void invest() |
查詢學生資訊 |
|
void change_password() |
修改密碼 |
|
void over() |
退出系統 |
(3)函式呼叫關系圖

4.c程式原始碼
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<string.h> #include<conio.h> #define N 200 typedef struct birthday { int year; int month; int day; }Birthday; struct file { char id[20];//學號 char name[20];//姓名 char sex[2];//性別 int age;//年齡 Birthday birthday;//出生日期 char desc[20];//備注 }File[N]; void toxy(int x, int y) //將游標移動到X,Y坐標處 { COORD pos = { x , y }; HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out, pos); } void load();//系統登陸頁面 void save_password(char str[]);//保存密碼 void menu();//系統主選單 void input(int n);//學生資訊錄入 void output();//學生資訊顯示 void save(int n);//學生資訊保存 void dele();//學生資訊洗掉 void change();//學生資訊修改 void invest();//學生資訊查詢 void change_password();//修改密碼 void over();//退出系統 void input(int n)//資訊錄入,錄入學生的基本資訊 { int i; for(i=0;i<n;i++) { system("cls");//清屏 toxy(15,6); printf("請輸入學生學號:"); scanf("%s",File[i].id); toxy(15,7); printf("請輸入學生姓名:"); scanf("%s",File[i].name); toxy(15,8); printf("請輸入學生性別(男/女):"); scanf("%s",File[i].sex); toxy(15,9); printf("請輸入學生年齡:"); scanf("%d",&File[i].age); toxy(15,10); printf("請輸入學生的出生日期(年月日,以空格隔開):"); scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day); toxy(15,11); printf("請輸入備注:"); scanf("%s",File[i].desc); } system("cls");//清屏 toxy(15,6); printf("錄入完畢,請記得回傳保存(*^▽^*)"); toxy(15,8); printf("按任意鍵可回傳主選單!"); getch(); } void output()//資訊顯示,將學生的基本資訊顯示到螢屏上 { system("cls");//清屏 system("color F");//字體顏色為亮白色 int i; FILE*fp; toxy(15,6); printf("***********學生基本資訊*************\n"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,10); if((fp=fopen("stu","r"))==NULL)//只用讀,用r打開stu檔案 { system("cls"); toxy(15,6); printf("cannot open file"); toxy(15,8); exit(0); } else { for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp);//從檔案中讀取資料到File中 if(feof(fp))//判斷檔案是否讀到了最后 break; printf("%-10s %-10s%-s %7d %d-%d-%d %7s\n",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,11+i); } memset(File,NULL,sizeof(File));//重置File } printf("顯示完畢,請按任意鍵回傳主選單"); getch(); } void save(int n) //資訊保存,將錄入的學生資訊保存到檔案中 { system("cls");//清屏 system("color F");//字體顏色為亮白色 FILE*fp; fp=fopen("stu","a+");//以追加的方式打開檔案,結束時指標停在檔案尾 int i; for(i=0;i<n;i++) { if(File[i].age==NULL) continue;//避免空白資料 fwrite(&File[i],sizeof(struct file),1,fp);//向指定的檔案中寫入資料 } fclose(fp); n=NULL;//重置 memset(File,NULL,sizeof(File));//重置結構體陣列File toxy(15,8); printf("檔案保存成功!即將回傳主選單……"); Sleep(800); } void dele()//資訊洗掉,把不要的學生基本資訊洗掉 { system("cls");//清屏 system("color F");//字體顏色為亮白色 int i,flag=0;//flag是否找到洗掉學生的標志 char number[20]; char name[20]; char c; do { toxy(15,6); printf("請輸入要洗掉學生的學號和姓名:"); toxy(15,8); scanf("%s%s",number,name); FILE*fp1,*fp2; fp1=fopen("stu","r+");//為了讀和寫,用r+打開stu文本檔案 fp2=fopen("linshi","w+");//用w+打開一個臨時的文本檔案 if(fp1==NULL||fp2==NULL) { toxy(15,10); printf("cannot open file!"); toxy(15,12); exit(0); } for(i=0;i<N;i++) { while(fread(&File[i],sizeof(struct file),1,fp1))//從檔案中讀取資料到File { if(feof(fp1))// 判斷檔案是否讀到了最后 break; if(strcmp(number,File[i].id)==0&&strcmp(name,File[i].name)==0)//判斷要洗掉的學號和姓名是否與檔案資料有相同,若相同則跳過這次回圈 { flag=1; continue; } else { fwrite(&File[i],sizeof(struct file),1,fp2);//將File的資訊寫入檔案 } } } fclose(fp1); fclose(fp2); if(system("copy linshi stu")==0)//將linshi檔案的內容復制覆寫到stu檔案,若成功則回傳0 { system("cls");//清屏 system("DEL linshi");//洗掉linshi檔案 system("cls");//清屏 } if(flag==1)//找到洗掉學生 { toxy(15,10); printf("成功洗掉該學生,系統將自動幫您更新并保存檔案\n"); Sleep(800); menu(); } if(flag==0)//無法找到被洗掉學生 { toxy(15,10); printf("洗掉失敗!學號或姓名輸入錯誤"); toxy(15,11); printf("按1回傳主選單,按2重新輸入\n"); toxy(15,11); while(1) { c=getch(); if(c=='1') { menu(); } else if(c=='2') dele(); } } }while(1); } void change()//修改資訊,修改錯誤的學生資訊 { int sign=0;//用來標志密碼驗證成功或否 int j=3;//每次進入此功能,用戶有3次驗證密碼機會 do { system("cls");//清屏 system("color F");//字體顏色為亮白色 char str[18]; FILE*fp; if((fp=fopen("password","r"))==NULL) { printf("cannot open file\n"); exit(0); } fgets(str,18,fp);//從檔案中讀取密碼資料保存到str陣列中 fclose(fp); toxy(15,6); printf("進入該功能,須再次驗證登陸密碼:\n"); toxy(15,8); char c; char password[18]; int i=0; for(;;)//此處為輸入密碼不回顯操作 { c=getch();//輸入c if(c=='\r')//如果輸入c為回車,則跳出回圈 { break; } if(c=='\b') //如果輸入c為洗掉鍵 { printf("\b"); printf(" "); printf("\b"); } else { password[i]=c; printf("*"); i++; } } password[i]='\0';//在字串結尾作結束符標記 if(strcmp(str,password)==0)//驗證密碼是否正確 { system("cls");//清屏 toxy(15,10); printf("驗證成功!即將進入修改功能!"); Sleep(600); sign=1; break; } else { toxy(15,10); j--; printf("密碼錯誤!您還有%d次驗證機會",j); Sleep(600); } }while(j>0);//驗證機會不為0 if(j==0) { system("cls"); toxy(15,6); printf("驗證機會已用完,即將回傳主選單……"); Sleep(600); menu(); } int select,i; char number[20]; int count=0; if(sign) { system("cls"); while(select!=7) { system("cls"); toxy(15,6); printf("--------------1.修改學號-------------"); toxy(15,7); printf("--------------2.修改姓名-------------"); toxy(15,8); printf("--------------3.修改性別-------------"); toxy(15,9); printf("--------------4.修改年齡-------------"); toxy(15,10); printf("--------------5.修改出生日期---------"); toxy(15,11); printf("--------------6.修改備注 ------------"); toxy(15,12); printf("--------------7. 退出 ---------------"); toxy(15,13); printf("請輸入1~6進行選擇:"); toxy(15,14); scanf("%d",&select); FILE*fp1; toxy(15,15); if((fp1=fopen("stu","r+"))==NULL)//為了讀和寫,用r+打開stu檔案 { system("cls");//清屏 toxy(15,6); printf("cannot open file!"); toxy(15,8); exit(0); } for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp1);//從檔案中讀取資料到File if(feof(fp1))//判斷檔案是否讀到了最后 break; count++;//每次成功從stu檔案中讀取資訊,則學生資料個數加1 } int flag=0; switch(select) { case 1://修改學號 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的學號進行修改:"); toxy(15,11); scanf("%s",File[i].id); flag=1; break; } } fclose(fp1); if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 2://修改姓名 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的姓名進行修改:"); toxy(15,11); scanf("%s",File[i].name); flag=1; break; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 3://修改性別 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的性別進行修改:"); toxy(15,11); scanf("%s",File[i].sex); flag=1; break; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 4://修改年齡 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的年齡進行修改:"); toxy(15,11); scanf("%d",&File[i].age); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 5://修改出生日期 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的出生日期(年 月 日)進行修改:"); toxy(15,11); scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 6://修改備注 system("cls");//清屏 toxy(15,5); printf("請輸入要修改學生的學號:"); toxy(15,6); scanf("%s",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7); printf("*********************學生基本資訊*********************"); toxy(15,8); printf(" 學號 姓名 性別 年齡 出生日期 備注"); toxy(15,9); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); toxy(15,10); printf("重新輸入該學生的備注進行修改:"); toxy(15,11); scanf("%s",&File[i].desc); flag=1; } } if(flag==1) { system("cls");//清屏 toxy(15,12); printf("修改成功!系統已自動保存!"); toxy(15,13); printf("正在自動跳轉到主選單...."); FILE*fp2; if((fp2=fopen("stu","w+"))==NULL)//用w+打開stu檔案同時清空檔案內容 { printf("cannot open file!"); exit(0); } for(i=0;i<count;i++) fwrite(&File[i],sizeof(file),1,fp2);//將File的資訊寫入stu檔案 fclose(fp2); Sleep(600); menu(); } if(flag==0) { toxy(15,12); printf("該學生不存在!"); toxy(15,13); char c; printf("1.回傳上一級 2.回傳主選單"); toxy(15,14); c=getch(); if(c=='1') break; if(c=='2') menu(); } case 7:system("cls");//清屏 default:break; } } } } void invest()//查詢資訊,可按學號、姓名、性別、年齡、出生日期查詢學生的基本資訊 { system("cls");//清屏 system("color F");//字體顏色為亮白色 int i,x,flag,year,month,day,age; char number[20]; char name[20]; char sex[5]; while(x!=6) { system("cls"); toxy(15,6); printf("請選擇查詢功能:\n"); toxy(15,7); printf("\t1.查詢學號\n"); toxy(15,8); printf("\t2.查詢姓名\n"); toxy(15,9); printf("\t3.查詢性別\n"); toxy(15,10); printf("\t4.查詢出生日期\n"); toxy(15,11); printf("\t5.查詢年齡\n"); toxy(15,12); printf("\t6.退出\n"); toxy(15,13); printf("請輸入選擇:"); scanf("%d",&x); FILE*fp; if((fp=fopen("stu","r"))==NULL)//只用讀,用r打開stu檔案 { system("cls");//清屏 toxy(15,6); printf("cannot open file\n"); toxy(15,8); exit(0); } int count=0;//用來記錄檔案中學生資料的個數 for(i=0;i<N;i++) { fread(&File[i],sizeof(struct file),1,fp);//將stu檔案資訊傳到File中 if(feof(fp))//判斷檔案是否讀到了最后 break; count++;//每次成功從stu檔案中讀取資訊,則學生資料個數加1 } fclose(fp); switch(x) { case 1: system("cls");//清屏 toxy(15,6); printf("請輸入學號:"); toxy(15,8); scanf("%s",number); system("cls");//清屏 flag=0; toxy(15,6); printf("學號為%s的學生資訊如下:",number); for(i=0;i<count;i++) { if((strcmp(number,File[i].id))==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("無法找到你要找的學生!"); } toxy(15,11+count); printf("按任意鍵后可回傳……"); getch(); break; case 2: system("cls");//清屏 toxy(15,6); printf("請輸入姓名:"); toxy(15,8); scanf("%s",name); flag=0; system("cls");//清屏 toxy(15,6); printf("姓名為%s的學生資訊如下:",name); for(i=0;i<count;i++) { if(strcmp(name,File[i].name)==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("無法找到你要找的學生!"); } toxy(15,11+count); printf("按任意鍵后可回傳……"); getch(); break; case 3: system("cls");//清屏 toxy(15,6); printf("請輸入性別(男/女):"); toxy(15,8); scanf("%s",sex); system("cls");//清屏 flag=0; toxy(15,6); printf("性別為%s的學生資訊如下:",sex); for(i=0;i<count;i++) { if(strcmp(sex,File[i].sex)==0) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("無法找到你要找的學生!"); } toxy(15,11+count); printf("按任意鍵后可回傳……"); getch(); break; case 4: system("cls");//清屏 toxy(15,6); printf("請輸入出生日期(年 月 日):"); toxy(15,8); scanf("%d%d%d",&year,&month,&day); system("cls");//清屏 flag=0; toxy(15,6); printf("出生日期為%d年%d月%d日的學生資訊如下:",year,month,day); for(i=0;i<count;i++) { if(year==File[i].birthday.year&&year==File[i].birthday.month&&year==File[i].birthday.day) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("無法找到你要找的學生!"); } toxy(15,11+count); printf("按任意鍵后可回傳……"); getch(); break; case 5: system("cls");//清屏 toxy(15,6); printf("請輸入年齡:"); toxy(15,8); scanf("%d",&age); system("cls");//清屏 flag=0; toxy(15,6); printf("年齡為%d的學生資訊如下:",age); for(i=0;i<count;i++) { if(age==File[i].age) { toxy(15,7+i); printf("%-10s %-10s%-s %7d %d-%d-%d %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc); flag=1; } } if(flag==0) { toxy(15,8); printf("無法找到你要找的學生!"); } toxy(15,11+count); printf("按任意鍵后可回傳……"); getch(); break; case 6:system("cls");//清屏 toxy(15,8); printf("即將回傳主選單……"); Sleep(700); break; } } } void over()//退出功能,顯示退出軟體的提示 { char t; system("color F");//字體顏色為亮白色 toxy(15,11); printf("--------------------------"); toxy(15,12); printf("| 您確定要退出嗎? |"); toxy(15,14); printf("| 1.確定 2.取消 |"); toxy(15,15); printf("--------------------------"); while(1) { t=getch(); //輸入t switch(t) { case '1': system("cls");//清屏 system("color F");//字體顏色為亮白色 toxy(15,10); printf("正在安全退出...."); Sleep(1000); //暫停1秒 system("cls"); system("color F");//字體顏色為亮白色 toxy(15,10); printf("已安全退出軟體"); toxy(15,12); printf("謝謝使用!"); toxy(15,14); printf("bye-bye^_^"); toxy(15,16); exit(0); break; //終止程式 case '2': menu(); break; //呼叫函式,進入選單 default :break; } } } void menu()//選單功能,顯示各種操作功能 { system("cls");//清屏 fflush(stdin);//清空快取 char x; int n; while(x!='h') { system("color F");//字體顏色為亮白色 system("cls"); toxy(15,4); printf("-----班級檔案管理系統-----"); toxy(15,5); printf("| |"); toxy(15,6); printf("| a.學生基本資訊錄入 |"); toxy(15,7); printf("| |"); toxy(15,8); printf("| b.學生基本資訊顯示 |"); toxy(15,9); printf("| |"); toxy(15,10); printf("| c.學生基本資訊保存 |"); toxy(15,11); printf("| |"); toxy(15,12); printf("| d.學生基本資訊洗掉 |"); toxy(15,13); printf("| |"); toxy(15,14); printf("| e.學生基本資訊修改 |"); toxy(15,15); printf("| |"); toxy(15,16); printf("| f.學生基本資訊查詢 |"); toxy(15,17); printf("| |"); toxy(15,18); printf("| g.修 改 密 碼 |"); toxy(15,19); printf("| |"); toxy(15,20); printf("| h.退 出 系 統 |"); toxy(15,21); printf("| |"); toxy(15,22); printf("--------------------------"); toxy(15,23); printf("請輸入選擇:"); x=getch(); if(x<'A'||x>'H'&&x<'a'||x>'h')//如果輸入的范圍不是在A-H或a-h { toxy(15,25); printf("輸入選項有誤,請重新輸入"); Sleep(700); continue; } if(x>='A'&&x<='H') x=x+32;//將大寫轉換為小寫 switch(x) { case 'a': system("cls"); system("color F");//字體顏色為亮白色 toxy(15,8); printf("請輸入錄入學生人數:"); scanf("%d",&n); input(n); break; case 'b': output(); break; case 'c': save(n); break; case 'd':dele(); break; case 'e': change(); break; case 'f':invest();break; case 'g':change_password(); break; case'h': over(); break; default:break; } } } void save_password(char str[])//保存密碼到password文本檔案中 { FILE*fp; fp=fopen("password","w");//打開文本檔案 if(fp==NULL) { printf("cannot open file"); } if(fputs(str,fp)!=0)//使用fputs將密碼寫入密碼檔案,成功則回傳0,否則回傳非0值 { printf("write error!"); } fclose(fp); } void load()//密碼登陸,通過驗證讀取檔案的密碼與用戶輸入的密碼是否一致,從而進入系統 { char _password[18]; int p=3;//有3次驗證密碼機會 do { system("cls");//清屏 system("color F");//字體顏色為亮白色 int i=0; char password[18]; char str[]="hstc2018";//第一次登陸的初始密碼 char k; FILE*fp; if((fp=fopen("password","a+"))==NULL) { printf("cannot open file"); exit(0); } fseek(fp,0L,SEEK_END);//把檔案指標移到最后 int size=ftell(fp);//用ftell函式測定檔案位置標記的當前位置 rewind(fp);//使檔案位置標記重新回傳檔案的開頭 if(size==0)//如果檔案的長度為空,則說明是第一次登陸使用 { strcpy(password,str);//將初始密碼復制到password陣列 save_password(password);//保存密碼到檔案中 } else fgets(password,18,fp);//從檔案中讀取密碼 toxy(15,6); printf("----------學生檔案管理系統---------\n"); toxy(15,8); printf("請輸入管理者密碼:"); for(;;)//此處為輸入密碼不回顯操作 { k=getch();//輸入k if(k=='\r') //如果輸入k為回車,則跳出回圈 { break; } if(k=='\b')//如果輸入k為洗掉鍵 { if(i>0)//如果密碼還沒完全洗掉 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的k既不是洗掉鍵,也不是回車鍵 { _password[i]=k; printf("*"); i++; } } _password[i]='\0';//在字串結尾作結束符標記 if(strcmp(password,_password)==0)//判斷密碼是否輸入正確 { system("cls");//清屏 toxy(15,10); printf("正在登陸……"); Sleep(500); menu(); } else { toxy(15,10); p--; printf("密碼錯誤!您還有%d次機會",p); Sleep(600); } }while(p>0);//驗證機會不為0 if(p==0) { system("cls");//清屏 toxy(15,6); printf("機會已用完!"); toxy(15,8); } } void change_password()//修改密碼,需要輸入舊密碼和新密碼,如果舊密碼驗證正確則可成功修改 { system("cls");//清屏 system("color F");//字體顏色為亮白色 char str[18]; FILE*fp; if((fp=fopen("password","r"))==NULL)//只用讀,用r打開stu檔案 { printf("cannot open file"); exit(0); } fgets(str,18,fp);//從fp指向的password檔案讀入字串,存放到字符陣列str中 fclose(fp); do { system("cls");//清屏 char password[18],newpassword[18],c,t; int i=0; toxy(15,6); printf("學生管理系統"); toxy(15,8); printf("修改密碼"); toxy(15,10); printf("請輸入舊密碼:"); for(;;)//此處為密碼不回顯操作 { c=getch(); if(c=='\r')//如果輸入為回車鍵 { break; } else if(c=='\b')//如果輸入c為洗掉鍵 { if(i>0) //如果密碼還沒完全洗掉 { printf("\b"); printf(" "); printf("\b"); i--; } } else //如果輸入的c既不是洗掉鍵,也不是回車鍵 { password[i]=c; printf("*"); i++; } } password[i]='\0';//在字串結尾作結束符標記 i=0; toxy(15,12); printf("請輸入新密碼:"); for(;;)//此處為輸入密碼不回顯操作 { c=getch(); if(c=='\r') //如果輸入c為回車,則跳出回圈 { break; } else if(c=='\b')//如果輸入c為洗掉鍵 { if(i>0)//如果密碼還沒完全洗掉 { printf("\b"); printf(" "); printf("\b"); i--; } } else { newpassword[i]=c; printf("*"); i++; } } newpassword[i]='\0';//在字串結尾作結束符標記 if(strcmp(str,password)==0)//如果舊密碼與原來密碼驗證成功 { save_password(newpassword);//保存新密碼 system("cls");//清屏 toxy(15,6); printf("修改成功,即將回傳主選單……"); Sleep(600); menu(); } else { system("cls");//清屏 toxy(15,8); printf("-------------------------------------"); toxy(15,9); printf("| |"); toxy(15,10); printf("| 密碼錯誤!是否繼續? |"); toxy(15,11); printf("| |"); toxy(15,12); printf("| 1.是 2.否 |"); toxy(15,13); printf("| |"); toxy(15,14); printf("-------------------------------------"); while(1) { t=getch(); if(t=='1') { system("cls");//清屏 break; } else if(t=='2') { menu(); } } } }while(1); } int main() { load(); return 0; }
5.程式的運行效果圖




6.總結與展望
完成了該課程設計后,對檔案的輸入輸出有了更深一層的了解,還學會了利用windows.h函式庫里的system函式去進行
清屏-system("cls"),
延時-Sleep(),
設定字體顏色-system("color X")
洗掉檔案-system("DEL XX")
復制檔案-system("copy X1 X2")
雖然較為成功地完成了課程設計,但由于知識和時間的局限性,系統仍然存在缺陷,我認為此系統還可以鏈接資料庫,增加用戶權限等,這樣能夠使系統更具有實用性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67322.html
標籤:C
上一篇:C語言是什么
