程序代碼: #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 3 /*定義常量SIZE便于以后的修改*/ struct student /*定義一個結(jié)構(gòu)體數(shù)組存放學生的信息*/ { int number; /*學號*/ char name[20];/*名字*/ char xueyuan[20];/*學院*/ int cla;/*班級*/ int score[3];/*分數(shù)*/ int sum;/*總分*/ int average;/*平均分*/ }stu[SIZE]; void menu();/*調(diào)用菜單函數(shù)*/ void write();/*讀入信息*/ void save(int x);/*保存stud.dat文件函數(shù)*/ void SaveOneStudent(int i);/*保存一個學生信息*/ void SaveAllStudent(int n);/*保存全部學生信息*/ void inturn (struct student c[]);/*用于對學生的信息按學號排序的函數(shù)*/ void save2();/*將排序后的信息存入student.dat文件中*/ int AddStudent(int n);/*增加學生信息*/ void InputOnestudent(int i);/*輸入一個同學信息*/ int DelStudent(int n);/*刪除學生信息*/ void ModifyStudent(int n);/*修改學生信息*/ void OutputOneStudent(int i);/*查詢一個學生信息*/ void SearchMenu(int n);/*查詢學生信息操作*/ void SearchNumber(int n);/*按學號查詢學生信息*/ void SearchName(int n);/*按姓名查詢學生信息*/ void SearchXueyuan(int n);/*按所在學院查詢學生信息*/ void SearchCla(int n);/*按所在班級查詢學生信息*/ void tongji();/*學生信息統(tǒng)計操作*/ void tongji2();/*統(tǒng)計不及格率操作*/ void zfsc();/*總分排序操作*/ void avecz();/*按平均分統(tǒng)計人數(shù)操作*/ void avecz();/*按平均分統(tǒng)計人數(shù)操作*/ void search();/*查找最高成績操作*/ void tongji2();/*統(tǒng)計不及格率操作*/ void read();/*讀取student.dat文件文件中學生的信息*/ /*主函數(shù)************************************************************************************/ void main() { int n=SIZE; int choice;/*用戶選擇變量*/ printf("*******************************************************************************\n"); printf("* *\n"); printf("* Hwadee &學生成績文件管理& Hwadee *\n"); printf("* *\n"); printf("*******************************************************************************\n\n\n"); printf("******************************●●歡迎使用●●*********************************"); while (1) { menu();/*調(diào)用菜單函數(shù)形成操作界面*/ printf("請選擇:"); scanf("%d", &choice); if ( choice==0 ) { printf("\t\t\t\t謝謝使用!!!"); break; } switch(choice) /*多重選擇實現(xiàn)功能不同的功能*/ { case 1: write(); inturn(stu); save(SIZE); break; case 2: AddStudent(n); break; case 3: DelStudent(n); break; case 4: ModifyStudent(n); break; case 5: SearchMenu(n); break; case 6: tongji(); break; case 0: printf("\n謝謝使用!再見!\n"); default: printf("\n按鍵錯誤!請重新選擇!\n"); }/*結(jié)束switch*/ }/*結(jié)束while*/ } 部分程序清單 /*菜單函數(shù)*************************************************************************************/ void menu() { printf("************請輸入所需操作***********\n");/*選擇功能菜單*/ printf("*************************************\n"); printf("1.學生成績寫入及排序\n"); printf("2.增加學生信息\n"); printf("3.刪除學生信息\n"); printf("4.修改學生信息\n"); printf("5.查詢學生信息\n"); printf("6.學生成績統(tǒng)計操作\n"); printf("0.退出系統(tǒng)\n"); printf("**************************************\n"); } /*寫入函數(shù)*************************************************************************************/ void write() { int i;/*計數(shù)變量*/ for(i=0;i<SIZE;i++) { printf("學號:"); scanf("%d",&stu[i].number); printf("姓名:"); scanf("%s",&stu[i].number); printf("學院:"); scanf("%s",&stu[i].xueyuan); printf("班級:"); scanf("%d",&stu[i].cla); printf("高數(shù):"); scanf("%d",&stu[i].score[0]); printf("英語:"); scanf("%d",&stu[i].score[1]); printf("C語言:"); scanf("%d",&stu[i].score[2]); stu[i].sum=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]);/*計算總成績*/ printf("總成績:%d",stu[i].sum); stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*計算平均成績*/ printf("平均成績:%d\n",stu[i].average); } } /*排序函數(shù)**************************************************************************************/ void inturn(struct student m[]) { int i,j;/*計數(shù)變量*/ struct student temp;/*中間變量 類型為結(jié)構(gòu)體*/ for(i=0;i<SIZE-1;i++) /*運用冒泡排序?qū)Y(jié)構(gòu)體數(shù)組進行排序*/ for (j=i+1;j<SIZE-i-1;j++) { if(m[i].number>m[j].number) { temp=m[i]; m[i]=m[j]; m[j]=temp; } } printf("\n排序后的學生信息:\n\n"); for (i=0;i<SIZE;i++) { printf("學號%d\t姓名%s\t學院%s\t班級%d\t高數(shù)%d\t英語%d\tC語言%d\t總成績%d\t平均成績%d\n\n",i+1,stu[i].number,stu[i].name,stu[i].xueyuan,stu[i].cla,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].average); }/*輸出排序后的學生信息*/ } /*寫入文件*************************************************************************************/ void save(int x) { FILE *fp;/*定義文件指針用于向文件讀入數(shù)據(jù)*/ int i; if((fp=fopen("student.dat","rb+"))==NULL)/*以二進制讀,寫方式打開文件*/ { printf("cannot open file\n"); exit(1); } for(i=0;i<SIZE;i++) if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp); printf("\n信息保存成功!恭喜!!\n"); } /*保存一個學生信息******************************************************************************/ void SaveOneStudent(int i) { FILE *fp; if((fp=fopen("student.dat","rb+"))==NULL)/*以二進制讀,寫方式打開文件*/ { printf("文件打開失敗!\n"); exit(1); } fseek(fp,i,0);/*文件指針定位到第i個學生*/ fwrite(&stu[i],sizeof(struct student),1,fp);/*將第i個學生信息寫入文件*/ fclose(fp); } /*保存全部學生信息******************************************************************************/ void SaveAllStudent(int n)/*保存全部學生信息*/ { FILE *fp; if((fp=fopen("student.dat","wb"))==NULL)/*以二進制寫方式打開文件*/ { printf("文件打開失敗!\n"); exit(1); } fwrite(stu,sizeof(struct student),n,fp);/*將數(shù)組stu中全部學生信息寫入文件*/ fclose(fp); } /*將排序后的學生信息讀入到另外的文件中**********************************************************/ void save2() { FILE *fp; int i; if((fp=fopen("stud.dat","rb+"))==NULL)/*以二進制讀,寫方式打開文件*/ { printf("文件打開失敗!\n"); exit(1); } for (i=0;i<SIZE;i++) if (fwrite(&stu[i],sizeof(struct student),1,fp)!=1) printf("file write error\n"); fclose(fp);/*讀取完畢關(guān)閉文件*/ } /*增加學生信息*********************************************************************************/ int AddStudent(int n) { char c='y'; FILE *fp; if((fp=fopen("student.dat","ab"))==NULL)/*以二進制追加方式打開文件*/ { printf("文件打開失敗!\n"); exit(1); } while(c=='y') { printf("\n請輸入要增加的同學的信息:"); InputOnestudent(n);/*調(diào)用函數(shù)輸入第n個學生信息*/ fwrite(&stu[n],sizeof(struct student),1,fp);/*將第n個學生信息保存至文件*/ n++;/*學生數(shù)量增加1*/ printf("\n繼續(xù)輸入其他同學信息嗎?\n"); printf("確定進行刪除請按y;不進行刪除請按n\n"); c=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); fclose(fp); return(n); } /*輸入一個同學信息*****************************************************************************/ void InputOnestudent(int i) { printf("學號\t姓名\t學院\t班級\t高數(shù)\t英語\tC語言\n"); scanf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t\n",&stu[i].number,stu[i].name,stu[i].xueyuan,&stu[i].cla,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); stu[i].sum=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]);/*計算總成績*/ stu[i].average=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;/*計算平均成績*/ } /*刪除學生信息*********************************************************************************/ int DelStudent(int n) { int i,k=-1,x; char c1='y',c2; while(c1=='y') { c2='n'; printf("\n請輸入要刪除的同學的學號:"); scanf("%d",&x); for(i=0;i<n;i++) if(x==stu[i].number) { k=i;/*找到要刪除的同學學號,并用k記下其下標*/ break; } if(k<0)/*k<0表示在數(shù)組中沒有找到輸入學號對應(yīng)的學生*/ printf("\n輸入學號有誤,請重新輸入!"); else { printf("\n該同學信息如下:\n"); InputOnestudent(k); printf("\n確定刪除?\n"); printf("確定進行刪除請按y;不進行刪除請按n\n"); c2=getchar(); getchar(); if(c2=='y')/*c2為y,表示確定進行刪除操作*/ { for(i=k;i<n;i++) stu[i]=stu[i+1];/*刪除第k個學生信息*/ n--;/*學生人數(shù)減1*/ printf("刪除成功!恭喜!!\n"); } else printf("\n取消刪除!\n"); printf("\n繼續(xù)刪除操作嗎?"); printf("\n繼續(xù)刪除請按y;不進行刪除請按n\n"); c1=getchar(); getchar(); } }/*結(jié)束while*/ save(n); printf("\n按任意鍵繼續(xù)!\n"); getchar(); return(n); } /*修改學生信息********************************************************************************/ void ModifyStudent(int n) { struct student temp; int k=-1,x,i; char c1='y',c2; while(c1=='y') { c2='y'; printf("\n請輸入要修改的同學的學號:"); scanf("%d",&x); for(i=0;i<n;i++) if(x==stu[i].number) { k=i;/*找到要修改的同學學號,并用k記下其下標*/ break; } if(k<0)/*k<0表示在數(shù)組中沒有找到輸入學號對應(yīng)的學生*/ printf("\n輸入學號有誤,請重新輸入!"); else { printf("請輸入要修改學生修改后的的信息\n"); printf("學號\t姓名\t學院\t班級\t高數(shù)\t英語\tC語言\t\n"); scanf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t\n",&temp.number,stu[i].name,temp.xueyuan,&temp.cla,&temp.score[0],&temp.score[1],&temp.score[2]); temp.sum=(temp.score[0]+temp.score[1]+temp.score[2]);/*計算總成績*/ temp.average=(temp.score[0]+temp.score[1]+temp.score[2])/3;/*計算平均成績*/ stu[k]=temp;/*修改該學生信息*/ printf("\n修改成功!恭喜!!\n"); break; } SaveAllStudent(k);/*保存修改后的學生信息*/ printf("\n繼續(xù)修改操作嗎?"); printf("\n繼續(xù)修改請按y;不進行修改請按n\n"); c1=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); } /*查詢一個學生信息**********************************************************************************/ void OutputOneStudent(int i) { printf("學號:%d 姓名:%s 學院:%s 班級:%d\n",stu[i].number,stu[i].name,stu[i].xueyuan,stu[i].cla); printf("高數(shù):%d 英語:%d C語言:%d 總分:%d 平均分:%d\n",stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].average); } /*查詢學生信息操作*********************************************************************************/ void SearchMenu(int n) { int selet; while(1) { printf("**********************************************************\n"); printf("******************** 歡迎進入查詢系統(tǒng) *******************\n"); printf("**********************************************************\n"); printf("\n"); printf("********************* 請輸入所需操作 *******************\n");/*選擇功能菜單*/ printf("**********************************************************\n"); printf("1.按學號查詢\n"); printf("2.按姓名查詢\n"); printf("3.按學院查詢\n"); printf("4.按班級查詢\n"); printf("0.返回主菜單\n"); printf("**********************************************************\n"); printf("請輸入操作選項:"); scanf("%d",&selet); getchar(); switch(selet) { case 1: SearchNumber(n); break; case 2: SearchName(n); break; case 3: SearchXueyuan(n); break; case 4: SearchCla(n); break; case 0: return; default: printf("輸入錯誤!請重新輸入!\n"); } }/*結(jié)束while*/ } /*按姓名查詢學生信息*******************************************************************************/ void SearchName(int n) { int i,j,k; char xname[20],c='y'; while(c=='y') { k=-1; printf("\n請輸入學生姓名:"); gets(xname); for(i=0,j=1;i<n;i++)/*精確查詢*/ if(strcmp(stu[i].name,xname)==0) { k=i;/*找到要查詢的同學姓名,并用k記下其下標*/ printf("學生%d的信息:\n",j++); OutputOneStudent(k); printf("\n按任意鍵繼續(xù)!\n"); getchar(); } if(k==-1)/*k表示沒有精確查詢結(jié)果*/ { printf("\n模糊查詢結(jié)果如下:\n"); for(i=0,j=1;i<n;i++) if(strstr(stu[i].name,xname)!=NULL)/*模糊查詢*/ { k=1; printf("學生%d的信息:\n",j++); OutputOneStudent(k); printf("\n按任意鍵繼續(xù)!\n"); getchar(); } if(j==1) printf("\n抱歉!沒有該學生信息!\n"); } printf("繼續(xù)查詢其他學生信息嗎?"); printf("\n繼續(xù)修改請按y;不進行修改請按n\n"); c=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); } /*按學號查詢學生信息*******************************************************************************/ void SearchNumber(int n) { int i,j,k,x; char c='y'; while(c=='y') { k=-1; printf("\n請輸入學生學號:"); scanf("%d",&x); for(i=0,j=1;i<n;i++) if(stu[i].number==x) { k=i;/*找到要查詢的同學學號,并用k記下其下標*/ printf("學生%d的信息:\n",j++); OutputOneStudent(k); printf("\n按任意鍵繼續(xù)!\n"); getchar(); } printf("繼續(xù)查詢其他學生信息嗎?"); printf("\n繼續(xù)修改請按y;不進行修改請按n\n"); c=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); } /*按所在學院查詢學生信息***************************************************************************/ void SearchXueyuan(int n) { int i,j,k; char xxueyuan[20],c='y'; while(c=='y') { k=-1; printf("\n請輸入學生所在學院:"); gets(xxueyuan); for(i=0,j=1;i<n;i++) if(strcmp(stu[i].xueyuan,xxueyuan)==0) { k=i;/*找到要查詢的同學所在學院,并用k記下其下標*/ printf("學生%d的信息:\n",j++); OutputOneStudent(k); printf("\n按任意鍵繼續(xù)!\n"); getchar(); } printf("繼續(xù)查詢其他學生信息嗎?"); printf("\n繼續(xù)修改請按y;不進行修改請按n\n"); c=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); } /*按所在班級查詢學生信息***************************************************************************/ void SearchCla(int n) { int i,j,k,x; char c='y'; while(c=='y') { k=-1; printf("\n請輸入學生所在班級:"); scanf("%d",&x); for(i=0,j=1;i<n;i++) if(stu[i].cla==x) { k=i;/*找到要查詢的同學所在班級,并用k記下其下標*/ printf("學生%d的信息:\n",j++); OutputOneStudent(k); printf("\n按任意鍵繼續(xù)!\n"); getchar(); } printf("繼續(xù)查詢其他學生信息嗎?"); printf("\n繼續(xù)修改請按y;不進行修改請按n\n"); c=getchar(); getchar(); }/*結(jié)束while*/ printf("\n按任意鍵繼續(xù)!\n"); getchar(); } /*學生信息統(tǒng)計操作*********************************************************************************/ void tongji() { int x; printf("**********************************************************\n"); printf("******************** 歡迎進入統(tǒng)計系統(tǒng) *****************++\n"); printf("**********************************************************\n"); printf("\n"); printf("************請輸入所需操作***********\n");/*選擇功能菜單*/ printf("*************************************\n"); printf("1.按總分排序操作\n"); printf("2.按平均分統(tǒng)計人數(shù)操作\n"); printf("3.按查找最高成績操作\n"); printf("4.按統(tǒng)計部及格率操作\n"); printf("0.返回主菜單\n"); printf("**************************************\n"); printf("請輸入操作選項:"); scanf("%d",&x);/*用戶選擇變量*/ while(x>0&&x<6) { switch(x) { case 1: zfsc();break;/*選擇按總分排序操作*/ case 2: avecz();break;/*選擇按平均分統(tǒng)計人數(shù)操作*/ case 3: search();break;/*選擇按查找最高成績操作*/ case 4: tongji();break;/*選擇按統(tǒng)計部及格率操作*/ case 0: printf("謝謝使用!再見!\n"); return;/*選擇退出操作*/ default: printf("輸入錯誤!請重新輸入\n");/*提示錯誤信息*/ } } } /*總分排序操作*************************************************************************************/ void zfsc() { FILE *wj,*fp; int i,j; struct student temp; if((fp=fopen("student.dat","wb"))==NULL) { printf("文件打開失敗!\n"); exit(1); } for(i=0;i<SIZE-1;i++) for(j=0;j<SIZE-i-1;j++) if(stu[i].sum<stu[j].sum)/*冒泡法排序*/ { temp=stu[j]; stu[j]=stu[i]; stu[i]=temp; } if((wj=fopen("student1.dat","wb+"))==NULL) { printf("文件打開失敗!\n"); exit(1); } else { for(i=0;i<SIZE;i++) fwrite(&stu[i],sizeof(struct student),1,wj);/*寫入文件*/ } fclose(fp); fclose(wj); } /*按平均分統(tǒng)計人數(shù)操作*****************************************************************************/ void avecz() { int i=0,k,m; printf("平均分不及格的同學有:\n"); for(i=0;i<SIZE;i++)/*統(tǒng)計平均分不及格人數(shù)*/ { k=0; if(stu[i].average<60) { m=i;/*找到平均分不及格學生,并用m記下其下標*/ OutputOneStudent(m); k++;/*k為平均分不及格人數(shù)*/ } printf(" 平均分不及格的同學信息輸出結(jié)束\n"); printf("共%d人\n",k); printf(" **********************************************************"); } printf("平均分60~69分的同學有:\n"); for(i=0;i<SIZE;i++)/*統(tǒng)計平均分60~69分人數(shù)*/ { k=0; if(stu[i].average>59&&stu[i].average<70) { m=i;/*找到平均分69~69學生,并用m記下其下標*/ OutputOneStudent(m); k++;/*k為平均分60~69分人數(shù)*/ } printf(" 平均分60~69分的同學信息輸出結(jié)束\n"); printf("共%d人\n",k); printf(" **********************************************************"); } printf("平均分70~79分的同學有:\n"); for(i=0;i<SIZE;i++)/*統(tǒng)計平均分70~79分人數(shù)*/ { k=0; if(stu[i].average>69&&stu[i].average<80) { m=i;/*找到平均分70~79學生,并用m記下其下標*/ OutputOneStudent(m); k++;/*k為平均分70~79分人數(shù)*/ } printf(" 平均分70~79分的同學信息輸出結(jié)束\n"); printf("共%d人\n",k); printf(" **********************************************************"); } printf("平均分80~89分的同學有:\n"); for(i=0;i<SIZE;i++)/*統(tǒng)計平均分80~89分人數(shù)*/ { k=0; if(stu[i].average>79&&stu[i].average<90) { m=i;/*找到平均分80~89學生,并用m記下其下標*/ OutputOneStudent(m); k++;/*k為平均分80~89分人數(shù)*/ } printf(" 平均分80~89分的同學信息輸出結(jié)束\n"); printf("共%d人\n",k); printf(" **********************************************************"); } printf("平均分90~100分的同學有:\n"); for(i=0;i<SIZE;i++)/*統(tǒng)計平均分90~100分人數(shù)*/ { k=0; if(stu[i].average>89&&stu[i].average<=100) { m=i;/*找到平均分90~100學生,并用m記下其下標*/ OutputOneStudent(m); k++;/*k為平均分90~100分人數(shù)*/ } printf(" 平均分90~100分的同學信息輸出結(jié)束\n"); printf("共%d人\n",k); printf(" **********************************************************"); } } /*查找最高成績操作****************************************************************************/ void search() { int i=0,x,k=0; printf("********************輸入查找選項**********************\n");/*選擇功能菜單*/ printf(" 查找高數(shù)成績最高學生請按:1\n"); printf(" 查找英語成績最高學生請按:2\n"); printf(" 查找C語言成績最高學生請按:3\n"); scanf("%d",&x);/*用戶選擇變量*/ if(x==1) { for(i=0;i<SIZE;i++)/*查找高數(shù)成績最高學生*/ { if(stu[i].score[0]>stu[k].score[0]) i=k; } printf("高數(shù)成績最高學生信息如下:\n"); OutputOneStudent(k); printf(" 輸出結(jié)束\n"); printf(" **********************************************************"); } if(x==2) { for(i=0;i<SIZE;i++)/*查找英語成績最高學生*/ { if(stu[i].score[1]>stu[k].score[1]) i=k; } printf("英語成績最高學生信息如下:\n"); OutputOneStudent(k); printf(" 輸出結(jié)束\n"); printf(" **********************************************************"); } if(x==3) { for(i=0;i<SIZE;i++)/*查找C語言成績最高學生*/ { if(stu[i].score[2]>stu[k].score[2]) i=k; } printf("C語言成績最高學生信息如下:\n"); OutputOneStudent(k); printf(" 輸出結(jié)束\n"); printf(" **********************************************************"); } } /*統(tǒng)計不及格率操作*****************************************************************************/ void tongji2() { int x,i,k; printf("********************輸入統(tǒng)計選項**********************\n"); /*選擇功能菜單*/ printf("統(tǒng)計高數(shù)成績不及格率請按:1\n"); printf("統(tǒng)計英語成績不及格率請按:2\n"); printf("統(tǒng)計C語言成績不及格率請按:3\n"); scanf("%d",&x);/*用戶選擇變量 */ if(x==1) { for(i=0;i<SIZE;i++)/*統(tǒng)計高數(shù)成績不及格率*/ { k=0; if(stu[i].score[0]<60) k++;/*k為高數(shù)成績不及格人數(shù)*/ printf("共%d人高數(shù)未及格\n",k); printf("不及格率為%f\n",k/SIZE); printf(" **********************************************************"); } } if(x==2) { for(i=0;i<SIZE;i++)/*統(tǒng)計英語成績不及格率*/ { k=0; if(stu[i].score[1]<60) k++;/*k為英語成績不及格人數(shù)*/ printf("共%d人英語不及格\n",k); printf("不及格率為%f\n",k/SIZE); printf(" **********************************************************"); } } if(x==3) { for(i=0;i<SIZE;i++)/*統(tǒng)計C語言成績不及格率*/ { k=0; if(stu[i].score[2]<60) k++;/*k為C語言成績不及格人數(shù)*/ printf("共%d人C語言不及格\n",k); printf("不及格率為%f\n",k/SIZE); printf(" **********************************************************"); } } }