#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #define N 100 /*存儲100個學生的學籍信息*/ int flag; /*標記是否登錄*/ struct date /*出生日期*/ { int year; int month; int day; }; struct student { char num[20];/*學號*/ char name[25];/*姓名*/ char sex[10];/*性別*/ struct date birthday;/*出生年月*/ int age;/*年齡*/ char addr[50];/*籍貫*/ char dept[50]; /*系別*/ char major[30]; /*專業*/ char classs[30]; /*班級*/ char phone[20];/*電話*/ }stu[N]; void login() /*登錄*/ { void menu(); system("cls"); if(flag) { printf(" 已經登錄!\n"); printf("Press any key to continue…\n"); getchar(); getchar(); system("cls"); menu(); } int load(); int n,i,m,w; FILE *fp; if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/ n=load(); /*打開文件*/ else n=0; struct student s; char password[20]; int d,q; printf("\n\t請選擇登錄身份:1.管理員 2.用戶 [ ]\b\b"); scanf("%d",&d); if(d==1) { printf("\n\t\t\t請輸入密碼:"); getchar(); int j=0; while(1) { password[j]=getch(); if(password[j]=='\r') break; printf("*"); j++; } password[j]='\0'; if(!strcmp(password,"930322")) /*判斷密碼是否正確*/ { flag=1; printf("\n\t登錄成功!\n"); printf("\tPress [ Enter ] key to continue…"); getchar(); system("cls"); menu(); } if(!flag) { printf("\t\n密碼錯誤!\n"); printf("What do you want to do next? 1.繼續登錄 2.返回菜單 [ ]\b\b"); scanf("%d",&q); if(q==1) /*繼續登錄*/ { system("cls"); login(); } else if(q==2) /*返回主菜單*/ { system("cls"); menu(); } } } else { printf("\n\t\t\t用戶名:"); scanf("%s",s.name); printf("\t\t\t密碼:"); int j=0; while(1) { password[j]=getch(); if(password[j]=='\r') break; printf("*"); j++; } password[j]='\0'; flag=0; /*未登錄時flag=0*/ for(i=0;i<n;i++) if(!strcmp(s.name,stu[i].name)&&!strcmp(s.name,password)) { flag=1; /*登錄成功flag=1*/ break; } if(flag) { printf("\n\t登錄成功!\n"); printf("\tPress any key to continue…\n"); getchar(); getchar(); system("cls"); menu(); /*登錄成功後返回主菜單*/ } else { m=0; /*設置m是為了避免陷入 登錄失敗時 跳不出登錄界面*/ w=1; /*設置w是為了避免輸出多次 “用戶不存在”*/ int q; /*q為選項*/ do { if(w>0) printf("用戶名不存在或密碼錯誤!\n"); /*第一次登錄時輸入不存在的用戶時顯示*/ printf("What do you want to do next? 1.繼續登錄 2.返回菜單 [ ]\b\b"); scanf("%d",&q); if(q==1) /*繼續登錄*/ { login(); m=1; } else if(q==2) /*返回主菜單*/ { system("cls"); menu(); m=1; } else { printf("選擇錯誤!請重新選擇:\n"); w=0; } }while(m==0); } } } void printf_one(int k) /*輸出一個學生的信息*/ { system("color 4e"); printf("學號:%s\n",stu[k].num); printf("姓名:%s\n",stu[k].name); printf("性別:%s\n",stu[k].sex); printf("出生年月:%d/%d/%d\n",stu[k].birthday.year,stu[k].birthday.month,stu[k].birthday.day); printf("年齡:%d\n",stu[k].age); printf("籍貫:%s\n",stu[k].addr); printf("系別:%s\n",stu[k].dept); printf("專業:%s\n",stu[k].major); printf("班級:%s\n",stu[k].classs); printf("電話:%s\n",stu[k].phone); } void printf_n(int n) /*浏覽時輸出所有學生的信息*/ { system("color 2e"); int j,i=1; for(j=0;j<n;j++) { printf("第%d個學生:\n",i++); printf_one(j); printf("\n"); } getchar(); } int load() /*打開文件,讀取裡面的數據*/ { FILE *fp; int i; if((fp=fopen("D:\\file.txt","rb"))==NULL) /*讀入空文件,rb表示打開一個二進制文件,只允許讀數據*/ { printf("\n文件不存在!請輸入:\n"); return 0; } for(i=0;!feof(fp);i++) /*處理到文件結尾*/ fread(&stu[i],sizeof(struct student),1,fp); /*fread(buffer,size,cout,fp)將磁盤文件中的一批數據作為一個整體一次性讀取出來, buffer指定數據塊位置,sizeof數據塊字節數,count讀取次數,fp指向源磁盤文件*/ fclose(fp); return(i-1); } void input(int k) /*輸入學生信息*/ { getchar(); printf("學號:"); gets(stu[k].num); printf("姓名:"); gets(stu[k].name); printf("性別:"); gets(stu[k].sex); printf("出生年月:"); scanf("%d/%d/%d",&stu[k].birthday.year,&stu[k].birthday.month,&stu[k].birthday.day); printf("年齡:"); scanf("%d",&stu[k].age); getchar(); printf("籍貫:"); gets(stu[k].addr); printf("系別:"); gets(stu[k].dept); printf("專業:"); gets(stu[k].major); printf("班級:"); gets(stu[k].classs); printf("電話:"); gets(stu[k].phone); } void save(int n) /*保存學生信息*/ { void exit(); FILE *fp; int i; if((fp=fopen("D:\\file.txt","wb"))==NULL) /*只打開或建立一個二進制文件,只允許寫數據*/ { printf("\nCan not open file!\n"); exit(); } for(i=0;i<n;i++) if(stu[i].name[0]!='\0') if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) /*將一批數據作為一個整體一次性寫入磁盤文件*/ printf("文件寫入錯誤!\n"); fclose(fp); } void printf_back()/*添加學生信息後顯示的“是浏覽還是返回”*/ { int w,k=0; void browse(); void menu(); printf("\n\n\t^_^.插入成功. ^_^\n\n"); do { printf("What do you want to do next?\n\n\t1).浏覽所有\t2).返回: [ ]\b\b"); scanf("%d",&w); if(w==1) { system("cls"); browse(); } else if(w==2) { system("cls"); menu(); } else printf(" 選擇錯誤!請重新選擇!\n"); }while(k==0); } void insert() /*添加學生信息*/ { int i,n,k,t; FILE *fp; if((fp=fopen("D:\\file.txt","rb"))==NULL) /*讀入空文件,rb表示打開一個二進制文件,只允許讀數據*/ { printf("How many people do you want to add(1-%d)?:",N-1); n=0; } else { n=load(); printf("How many student do you want to insert (1-%d)?:",N-n-1); } scanf("%d",&t); k=n+t; for(i=n;i<k;i++) { printf("\n輸入第 %d 個學生學籍信息.\n",i-n+1); input(i); } save(k); /*保存所有學生的信息*/ printf_back(); } void deleter() /*刪除*/ { void menu(); if(!flag) { printf("\n\n\t請先登錄!\n"); printf("\n\t請按 Enter 鍵進入登錄界面!"); getchar(); getchar(); login(); } else { struct student s; int i,n,k,w0,w1; n=load(); do { k=-1; //printf_n(n); /*刪除之前先顯示所有學生的信息*/ do { printf("\n\n請輸入您想要刪除的學生的姓名!\nName:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,stu[i].name)==0) { k=i; s=stu[i]; } if(k==-1) { int m; printf("\n\n沒有這個學生的信息!\n"); printf("What do you want to do next? 1.繼續輸入 2.返回主菜單 [ ]\b\b"); scanf("%d",&m); if(m==1) deleter(); else { k=0; menu(); } } }while(k==-1); printf_one(k); printf("\n\t確定刪除?\n\t1).是 2).返回 [ ]\b\b");/*再次詢問是否刪除*/ scanf("%d",&w0); if(w0==1) { stu[k].name[0]='\0'; save(n); } else break; printf("\n\t^_^.成功刪除^_^.\n"); printf("What do you want to do?\n\t1).繼續 2).返回 [ ]\b\b"); scanf("%d",&w1); }while(w1==1); system("cls"); menu(); /*不再刪除時返回主菜單,w1!=1*/ } } void search() /*查找*/ { void menu(); int w0,k,i,n,w1,w2; struct student s; FILE *fp; if((fp=fopen("D:\\file.txt","rb"))!=NULL) /*不是空文件*/ n=load(); do { printf("請選擇查找類別: 1.姓名 2.學號 [ ]\b\b"); scanf("%d",&w1); if(w1<1||w1>2) { printf("輸入錯誤!請重新輸入!\n"); w2=1; } else w2=0; /*這裡要注意:不加這句話會陷入死循環,跳不出來*/ }while(w2==1); if(w1==1) /*按姓名查找*/ { do { k=-1; do { printf("\n請輸入您想要查找的學生的姓名!\nName:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,stu[i].name)==0) { k=i; s=stu[i]; } if(k==-1) /*沒有找到*/ { int o; printf("\n\n沒有這個學生的信息!\n!"); printf("What do you want to do?\n\t1.繼續 2.返回菜單 [ ]\b\b"); scanf("%d",&o); if(o==1) { system("cls"); search(); /*繼續查找*/ } else { system("cls"); menu(); } } }while(k==-1); system("cls"); printf_one(k); /*找到以後輸出這個學生的信息*/ printf("\nWhat do you want to do next?\n\t1).繼續 2).返回菜單 [ ]\b\b"); scanf("%d",&w0); }while(w0==1); system("cls"); menu(); /*不再查找時返回主菜單*/ } else /*按學號查找*/ { do { k=-1; do { printf("\n請輸入您想要查找的學生的學號!\nNum:"); scanf("%s",s.num); for(i=0;i<n;i++) if(strcmp(s.num,stu[i].num)==0) /*找到了*/ { k=i; s=stu[i]; } if(k==-1) /*沒有找到*/ { int o; printf("\n\n沒有這個學生的信息!\n!"); printf("What do you want to do?\n\t1.繼續 2.返回菜單 [ ]\b\b"); scanf("%d",&o); if(o==1) { system("cls"); search(); /*繼續查找*/ } else { system("cls"); menu(); } } }while(k==-1); system("cls"); printf_one(k); /*找到以後輸出這個學生的學籍信息*/ printf("\nWhat do you want to do?\n\t1).繼續 2).返回菜單 [ ]\b\b"); scanf("%d",&w0); }while(w0==1); system("cls"); menu();/*不再查找時返回主菜單*/ } } int modify_data(int i) /*修改信息函數*/ { int c,w1; void menu(); do { puts("\n請選擇要修改的選項:\n\n1.學號 2.姓名 3.性別 4.出生日期 5.年齡 6.籍貫 7.系別 8.專業 9.班級 10.電話 11.所有信息 12.取消並返回"); printf("請選擇?: [ ]\b\b\b"); scanf("%d",&c); if(c>12||c<1) { puts("\n選擇錯誤!請重新選擇!"); getchar(); } }while(c>12||c<1); do { switch(c) { case 1: printf("學號:"); scanf("%s",stu[i].num); break; case 2: printf("姓名:"); scanf("%s",stu[i].name); break; case 3: printf("性別:"); scanf("%s",stu[i].sex); break; case 4: printf("出生年月:"); scanf("%d/%d/%d",&stu[i].birthday.year,&stu[i].birthday.month,&stu[i].birthday.day); break; case 5: printf("年齡:"); scanf("%d",&stu[i].age);break; case 6: printf("籍貫:"); scanf("%s",stu[i].addr);break; case 7: printf("系別:"); scanf("%s",stu[i].dept);break; case 8: printf("專業:"); scanf("%s",stu[i].major);break; case 9: printf("班級:"); scanf("%s",stu[i].classs);break; case 10: printf("電話:"); scanf("%s",stu[i].phone);break; case 11: input(i); break; /*修改這個學生的所有信息*/ case 12: menu(); /*返回主菜單*/ } puts("\nNow:\n"); printf_one(i); /*輸出 修改後 的這個學生的信息*/ printf("\n確定?\n\n\t1).是 2).不,重新修改 3).返回不保存 [ ]\b\b"); scanf("%d",&w1); }while(w1==2); return(w1); /*修改成功並選擇1後返回1*/ } void modify() /*修改*/ { void menu(); if(!flag) { printf("\n\n\t請先登錄!\n"); printf("\n\t請按 Enter 鍵進入登錄界面!"); getchar(); getchar(); login(); } else { struct student s; int i,n,k,w0=1,w1,w2=0; n=load(); do { k=-1; //printf_n(n); /*刪除之前先顯示所有學生的信息*/ do { printf("\n請輸入您想要修改的學生的姓名!\nName:"); scanf("%s",s.name); for(i=0;i<n;i++) if(strcmp(s.name,stu[i].name)==0) /*與其中一個學生匹配*/ { k=i; s=stu[i]; } if(k==-1) /*沒有找到輸入的學生*/ { int o; printf("\n\n沒有這個學生的信息!\n"); printf("What do you want to do?\n\t1.繼續 2.返回菜單 [ ]\b\b"); scanf("%d",&o); if(o==1) { system("cls"); modify(); /*繼續修改*/ } else { system("cls"); menu(); } } }while(k==-1); system("cls"); printf_one(k); /*輸出這個學生的信息*/ w1=modify_data(k); if(w1==1) /*判斷是否修改成功修改*/ { printf("\n\t^_^.修改成功 ^_^.\n\n是否繼續?\n\n\t1).是 2).保存返回\t[ ]\b\b"); scanf("%d",&w0); w2=1; } else { w0=0; if(w2==0) stu[k]=s; } if((w0!=1)&&(w2==1)) /*修改成功保存*/ save(n); }while(w0==1); system("cls"); menu();/*不再修改返回主菜單*/ } } void browse()/*浏覽*/ { system("color 5f"); void menu(); int n; n=load(); printf_n(n); printf(" 共有 %d 個學生的記錄.\n",n); printf("\nPress [ ENTER ] key to back..."); getchar(); system("cls"); menu(); /*返回主函數*/ } void exit() /*退出*/ { exit(0); } void face() /*訪問頁面*/ { system("color 4e"); printf("\n\t ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★\n\n"); puts("\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※"); puts("\t ※※ ※※"); puts("\t ※※ ※※"); puts("\t ※※ 歡迎訪問學生學籍管理系統! ※※"); puts("\t ※※ ※※"); puts("\t ※※ ※※"); puts("\t ※※ ※※"); puts("\t ※※ ※※"); puts("\t ※※ 制作人:李遠航 ※※"); puts("\t ※※ 2013.6.20 ※※"); puts("\t ※※ ※※"); puts("\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※"); printf("\n\tPress [ Enter ] key to continue……\n"); getchar(); system("cls"); } void menu() /*主菜單*/ { system("color 2e"); printf("\n\t\t\t歡迎使用學生學籍管理系統!\n"); printf("\n"); int n,w1; do { puts("\t\t★★★★★★★★ 菜單 ★★★★★★★★"); puts("\t\t★ 1.登 錄 ★"); puts("\t\t★ 2.插 入 ★"); puts("\t\t★ 3.刪 除 ★"); puts("\t\t★ 4.查 找 ★"); puts("\t\t★ 5.修 改 ★"); puts("\t\t★ 6.浏 覽 ★"); puts("\t\t★ 7.退 出 ★"); puts("\t\t★★★★★★★★★★★★★★★★★★★★★"); printf("請選擇服務種類(1-7) : [ ]\b\b"); scanf("%d",&n); if(n<1||n>7) { system("cls"); printf("選擇錯誤! 請重新選擇!\n"); w1=1; } else w1=0; }while(w1==1); switch(n) { case 1: login(); break; /*登錄*/ case 2: system("cls"); insert(); break; /*插入*/ case 3: system("cls"); deleter(); break; /*刪除*/ case 4: system("cls"); search(); break; /*查找*/ case 5: system("cls"); modify(); break; /*修改*/ case 6: system("cls"); browse(); break; /*浏覽*/ case 7: exit(); break; /*退出*/ } } int main() { face(); menu(); return 0; }