c語言課程設(shè)計學(xué)生成績管理系統(tǒng).doc
_ 目錄 學(xué)生成績管理程序題目要求 ··················· 2設(shè)計目的 ··················· 2總體設(shè)計 ··················· 3詳細設(shè)計 ··················· 3調(diào)試與測試 ················· 12源程序 ··················· 14總結(jié) ··················· 30學(xué)生成績管理程序一 題目要求 1. 問題描述:對在校學(xué)生幾門課程的考試成績進行統(tǒng)一管理.每個學(xué)生記錄包括學(xué)號,姓名,年齡,數(shù)學(xué),英語,物理成績,默認以學(xué)號為序存放.2. 要求:(1)一個文件按以班為單位存儲學(xué)生記錄.(2)將允許的操作分為四種,以A,B ,C,D,E,F為標志:A:插入一個學(xué)生記錄;B:修改學(xué)生記錄;C:刪除一個學(xué)生記錄;D:查找一個學(xué)生記錄;E:瀏覽學(xué)生成績:F:退出3. 計算學(xué)生的總成績.4. 按學(xué)號排序輸出全班學(xué)生成績表.二 設(shè)計目的根據(jù)題目要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入,輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示,查找,排序等操作;另外還應(yīng)提供鍵盤式選擇菜單實現(xiàn)功能選擇.三 總體設(shè)計根據(jù)上面的需求分析,可以將這個系統(tǒng)分為以下模塊:輸入模塊,修改模塊,刪除模塊,查找模塊,顯示模塊.學(xué)生成績管理系統(tǒng)數(shù)據(jù)輸入數(shù)據(jù)顯示數(shù)據(jù)修改數(shù)據(jù)刪除數(shù)據(jù)查找四 詳細設(shè)計1. 主函數(shù):主函數(shù)一般設(shè)計得比較簡單,只提供輸入,處理和輸出部分的函數(shù)調(diào)用,其中各功能模塊用菜單方式選擇.流程圖:顯示一系列功能模塊 N輸入n,判斷n是否是A-F Y根據(jù)n的值調(diào)用各功能模塊函數(shù)程序:/#include "head.h" int menu_select() char c; printf("nn"); printf(" | 1. 增加學(xué)生記錄 5.統(tǒng)計信息 |n"); printf(" | 2. 查詢學(xué)生記錄 6.打開文件 |n"); printf(" | 3. 修改學(xué)生記錄 7.保存文件 |n"); printf(" | 4. 學(xué)生紀錄排序 8.顯示記錄 |n"); printf(" | 0. 退出系統(tǒng) |n"); printf("nn"); printf("請選擇(0-8):"); c=getchar(); getchar(); return (c-'0'); 2. 輸入模塊:分析:單獨看各數(shù)據(jù)信息,學(xué)號,姓名是字符型,可以采用字符型數(shù)組;分數(shù)為整數(shù),采用整數(shù);數(shù)據(jù)信息存放在文件中,一條記錄對應(yīng)一個學(xué)生,既符合習慣又方便信息管理.如果要存放若干學(xué)生信息就用結(jié)構(gòu)體數(shù)組:void addrecord(student stud) int i=0,j,num; char str5; if(numstus!=0) printf("已有記錄存在是否覆蓋?(y/n)n"); gets(str); if(str0='Y'|str0='y') i=0; else i=numstus; printf("請輸入增加的學(xué)生信息條目數(shù):"); scanf("%d",&num); if(i=0) numstus=num; else numstus+=num; if(numstus>lens) lens+=50; pointer=(student *)realloc(pointer,lens*LEN); printf("請輸入學(xué)生信息:n"); for(;i<numstus;i+) getchar(); printf("請輸入學(xué)號:"); gets(pointeri.number); printf("請輸入姓名:"); gets(pointeri.name); printf("請輸入性別(男/女 1/0):"); gets(pointeri.sex); if(pointeri.sex0='0') strcpy(pointeri.sex,"女"); else strcpy(pointeri.sex,"男"); printf("請輸入各科成績:(按“語文,數(shù)學(xué),英語,歷史,政治”的順序):"); studi.score=0; for(j=0;j<numsubs;j+) scanf("%f",&studi.subjectj); /*計算總分*/ studi.score+=studi.subjectj; studi.average=studi.score/numsubs; /*計算平均分*/ count(stud); /*附名次*/ display(stud,0,numstus-1); getchar(); int numstus; int lens; student *pointer; void main() int i=1; char str2; lens=100; pointer=(student *)malloc(lens*LEN); /*分配內(nèi)存*/ numstus=0; welcome(); /*歡迎界面*/ while(i>0) i=menu_select(); /*控制菜單*/ switch(i) case 1:addrecord(pointer);break; /*增加學(xué)生信息*/ case 2:findrecord(pointer);break; /*查詢學(xué)生信息*/ case 3:amendrecord(pointer);break; /*修改學(xué)生信息*/ case 4:sort(pointer);break; /*學(xué)生信息排序*/ case 5:statistic(pointer);break; /*統(tǒng)計信息*/ case 6:openfile(pointer);break; /*打開文件*/ case 7:writetotext(pointer);break; /*保存文件*/ case 8:display(pointer,0,numstus-1);break; /*顯示記錄*/ case 0: if(numstus!=0) printf("是否保存當前記錄?(y/n)"); gets(str); if(str0='y'|str0='Y') writetotext(pointer); i=-1;break; /*退出系統(tǒng)*/ default:printf("請輸入數(shù)字08:n");i=1; /*輸入錯誤*/ printf("tt歡迎再次使用本系統(tǒng)。nn"); display1(); 3. 修改模塊:分析:用戶輸入要修改學(xué)生的學(xué)號,根據(jù)學(xué)生的學(xué)號等信息查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息.根據(jù)用戶選擇修改相應(yīng)的信息.流程圖:輸入要修改的學(xué)號找到? Y N提示沒有找到顯示記錄,調(diào)用修改函數(shù)返回主菜單繼續(xù)? Y N程序:void xiugai() if(fp=fopen("s_score.txt","rb+")=NULL|(fp1=fopen("temp.txt","wb+")=NULL) /*檢查是否出錯*/ printf("Cannot open this file.n"); exit(0); printf("nPLease shuru xiugai xuehao:"); scanf("%d",&i); getchar(); while(fread(&data,sizeof(data),1,fp)=1) j=atoi(data.xuehao); if(j=i) printf("xuehao:%snmingzi:%snnianling:%sn",data.xuehao,data.mingzi,data.nianling); printf("Please shuru mingzi:"); gets(data.mingzi); printf("Please shuru shuxue score:"); gets(temp);data.score0=atof(temp); printf("Please input yingyu score:"); gets(temp);data.score1=atof(temp); printf("Please input wuli score:"); gets(temp);data.score2=atof(temp); data.score3=data.score0+data.score1+data.score2; fwrite(&data,sizeof(data),1,fp1); fseek(fp,0L,0); /*將位置指針移到離頭文件0個字節(jié)處*/fseek(fp1,0L,0); while(fread(&data,sizeof(data),1,fp1)=1) fwrite(&data,sizeof(data),1,fp); fclose(fp); fclose(fp1); 4. 刪除模塊: 分析:該模塊的功能是,用戶輸入要刪除的學(xué)生的學(xué)號,根據(jù)學(xué)生學(xué)號查找記錄并刪除.流程圖: 輸入要刪除的學(xué)號找到? Y N提示沒有找到顯示記錄,調(diào)用刪除函數(shù)返回主菜單繼續(xù)? Y N程序:void deleterecord(student stu,int i) /*刪除信息*/ int j; while(i>=0) for(j=i;j<numstus;j+) stuj=stuj+1; numstus-; printf("刪除成功!n"); void count(student stud) int i,j; for(i=0;i<numstus;i+) studi.index=1; for(j=0;j<numstus;j+) if(studj.score>studi.score) studi.index+; 5. 查找模塊:需求分析:該模塊的功能是根據(jù)輸入的學(xué)生的姓名查找對應(yīng)的記錄,找到以后,顯示相應(yīng)的學(xué)生信息.流程圖:輸入學(xué)生學(xué)號返回主菜單詢問是否繼續(xù)提示沒有找到顯示找到的記錄是否找到學(xué)生記錄 Y N N Y程序:/#include "head.h" int findrecord(student stud) /*查找信息*/ char str2; int i,num; if(numstus=0) printf("沒有可被查找的記錄n"); return -1; else printf("以何種方式查找?n1.學(xué)號t2.姓名t3.名次n"); gets(str); if(str0='1') /*按學(xué)號查找*/ printf("請輸入學(xué)號:"); gets(str); for(i=0;i<=numstus;i+) if(strcmp(str,studi.number)=0) display(stud,i,i); break; else continue; else if(str0='2') /*按姓名查找*/ printf("請輸入姓名:"); gets(str); for(i=0;i<=numstus;i+) if(strcmp(str,studi.name)=0) display(stud,i,i); break; else continue; else if(str0='3') /*按名次查找*/ printf("請輸入名次:"); scanf("%d",&num); getchar(); for(i=0;i<=numstus;i+) if(num=studi.index) display(stud,i,i); break; else continue; if(i>numstus) printf("沒有查找所要的信息。n"); return -1; return i; 6. 顯示模塊:需求分析:該模塊的功能是顯示所有學(xué)生記錄信息.程序:void welcome() printf("t*n"); printf("tttt*學(xué)生成績管理系統(tǒng)*ntttt 傾情奉獻 歡迎使用!n"); printf("t*n"); void showtable() printf("-n"); printf("學(xué)號t姓名t性別t語文t數(shù)學(xué)t英語t歷史t政治t總分t平均分t名次n"); printf("-n"); void display(student stud,int n1,int n2) int i; showtable(); /*顯示表頭*/ for(i=n1;i<=n2;i+) printf("%st%st%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dtn",studi.number,studi.name,studi.sex,studi.subject0,studi.subject1,studi.subject2,studi.subject3,studi.subject4,studi.score,studi.average,studi.index); /*通過循環(huán)輸出數(shù)據(jù)*/ void display1() printf("tt本系統(tǒng)由計科二班制作nn"); printf("tt制作人員列表: nn"); printf("tt殷增鋒ttt邵超n"); printf("nn"); getchar(); 五 調(diào)試與測試在這次課程設(shè)計中,程序編寫過程中遇到了很多的問題,各種函數(shù)的運用也讓人頭疼,在上機編譯運行過程中出現(xiàn)了很多的錯誤,例如:各種數(shù)據(jù)類型的定義,函數(shù)的調(diào)用等等。但最終還是在老師同學(xué)的幫助下進行了各種代碼的編寫與修改,最終程序成功的運行。下面是各個模塊的界面圖(1) 主菜單函數(shù):(2): 輸入模塊:(3): 顯示模塊:(4): 刪除模塊:(5): 查找模塊:(6): 修改模塊:6 程序源#ifndef H_STUDENT_HH #define H_STUDENT_HH #include "stdio.h" #include "string.h" #include "malloc.h" #define LEN sizeof(struct message_student) /*一個結(jié)構(gòu)體數(shù)組元素的長度*/ #define numsubs 5 /*學(xué)科數(shù)目*/ typedef struct message_student /*結(jié)構(gòu)體定義*/ char number6; char name20; char sex4; float subjectnumsubs; float score; float average; int index; student; extern int numstus; /*學(xué)生數(shù)目*/ extern student *pointer; /*指向結(jié)構(gòu)體數(shù)組*/ extern int lens; int menu_select(); /*函數(shù)聲明*/ int openfile(student stu); int findrecord(student stud); int writetotext(student stud); void welcome(); void display1(); void showtable(); void sort(student stu); void deleterecord(student stu,int i); void addrecord(student stud); void display(student stud,int n1,int n2); void amendrecord(student stud); void count(student stud); void sortnum(student stud); void sortnum2(student stud); void sortname(student stud); void sortname2(student stud); void sortcount(student stud); void sortcount2(student stud); void statistic(student stud); void display1(); #endif /#include "head.h" int menu_select() char c; printf("nn"); printf(" | 1. 增加學(xué)生記錄 5.統(tǒng)計信息 |n"); printf(" | 2. 查詢學(xué)生記錄 6.打開文件 |n"); printf(" | 3. 修改學(xué)生記錄 7.保存文件 |n"); printf(" | 4. 學(xué)生紀錄排序 8.顯示記錄 |n"); printf(" | 0. 退出系統(tǒng) |n"); printf("nn"); printf("請選擇(0-8):"); c=getchar(); getchar(); return (c-'0'); /#include "head.h" int findrecord(student stud) /*查找信息*/ char str2; int i,num; if(numstus=0) printf("沒有可被查找的記錄n"); return -1; else printf("以何種方式查找?n1.學(xué)號t2.姓名t3.名次n"); gets(str); if(str0='1') /*按學(xué)號查找*/ printf("請輸入學(xué)號:"); gets(str); for(i=0;i<=numstus;i+) if(strcmp(str,studi.number)=0) display(stud,i,i); break; else continue; else if(str0='2') /*按姓名查找*/ printf("請輸入姓名:"); gets(str); for(i=0;i<=numstus;i+) if(strcmp(str,studi.name)=0) display(stud,i,i); break; else continue; else if(str0='3') /*按名次查找*/ printf("請輸入名次:"); scanf("%d",&num); getchar(); for(i=0;i<=numstus;i+) if(num=studi.index) display(stud,i,i); break; else continue; if(i>numstus) printf("沒有查找所要的信息。n"); return -1; return i; /#include"head.h" int openfile(student stu) int i=0,j; FILE *fp; char filename20,str2; if(numstus!=0) printf("已經(jīng)有記錄存在,是否保存?(y/n)"); gets(str); if(str0='y'|str0='Y') writetotext(stu); printf("請輸入文件名:"); gets(filename); numstus=0; if(fp=fopen(filename,"rb+")=NULL) printf("無法打開該文件n"); return(-1); fscanf(fp,"%d",&numstus); fgetc(fp); while(i<numstus) fscanf(fp,"%s",stui.number); fscanf(fp,"%s",stui.name); fscanf(fp,"%s",stui.sex); for(j=0;j<numsubs;j+) fscanf(fp,"%f",&stui.subjectj); fscanf(fp,"%f",&stui.score); fscanf(fp,"%f",&stui.average); fscanf(fp,"%d",&stui.index); i+; fclose(fp); printf("文件讀取成功n"); printf("是否顯示紀錄?(y/n)"); gets(str); if(str0='y'|str0='Y') display(stu,0,numstus-1); return(0); /#include "head.h" void sort(student stud) int i,j=0; char str5; student *p; p=stud; if(numstus=0) printf("沒有可供查詢的記錄!"); while(1) for(i=0;i+) printf(" 請輸入查詢方式:"); printf("(直接輸入回車則結(jié)束查詢操作)n"); printf("1.按照學(xué)號t"); printf("2.按照姓名t"); printf("3.按照名次n"); gets(str); if(strlen(str)=0) break; if(str0='1') printf("請輸入排序次序:n"); printf("1.升序排列t"); printf("2.降序排列n"); gets(str); if(str0='1') sortnum2(p); else sortnum(p); display(stud,0,numstus-1); else if(str0='2') printf("請輸入排序次序:n"); printf("1.升序排列t"); printf("2.降序排列n"); gets(str); if(str0='1') sortname2(p); else sortname(p); display(stud,0,numstus-1); else if(str0='3') printf("請輸入排序次序:n"); printf("1.升序排列t"); printf("2.降序排列n"); gets(str); if(str0='1') sortcount2(p); else sortcount(p); display(stud,0,numstus-1); else printf("請輸入13"); printf("是否退出排序?(y/n)"); gets(str); if(str0='y'|str0='Y') break; return; void sortnum(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(strcmp(studj+1.number,studj.number)>0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; void sortnum2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(strcmp(studj.number,studj+1.number)>0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; void sortname(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(strcmp(studj+1.name,studj.name)>0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; void sortname2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(strcmp(studj.name,studj+1.name)>0) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; void sortcount(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(studj+1.index>studj.index) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; void sortcount2(student stud) int i,j; student temp; student *p; p=stud; for(i=0;i<numstus;i+) for(j=0;j<numstus-i-1;j+) if(studj.index>studj+1.index) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /#include"head.h" void statistic(student stud) /*新增功能,輸出統(tǒng)計信息*/ int i,j=0,k=0; char c1,str2; float averagenumsubs,sum=0; if(numstus=0) printf("沒有可被查找的記錄n"); else while(1) printf("下面將統(tǒng)計考試成績n"); printf("請選擇你要統(tǒng)計哪科的成績 1.At2.Bt3.Ct4.Dt5.En"); c1=getchar(); printf("t一共有個%d記錄n",numstus); /*總共記錄數(shù)*/ switch(c1) case '1': for(i=0;i<numstus;i+) /*循環(huán)輸入判斷*/ sum+=studi.subject0; if(studk.subject0>studi.subject0) k=i; if(studj.subject0<studi.subject0) j=i; average0=sum/numstus; printf("t科目A的最高分:n"); /*最高分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studj.number,studj.name,studj.subject0); printf("t科目A的最低分是:n"); /*最低分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studk.number,studk.name,studk.subject0); printf("t科目A的平均分是 %5.2fn",average0); /*平均分*/ break; case '2': for(i=0;i<numstus;i+) /*循環(huán)輸入判斷*/ sum+=studi.subject1; if(studk.subject1>studi.subject1) k=i; if(studj.subject1<studi.subject1) j=i; average1=sum/numstus; printf("t科目B的最高分:n"); /*最高分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studj.number,studj.name,studj.subject1); printf("t科目B的最低分是:n"); /*最低分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studk.number,studk.name,studk.subject1); printf("t科目B的平均分是 %5.2fn",average1); /*平均分*/ break; case '3': for(i=0;i<numstus;i+) /*循環(huán)輸入判斷*/ sum+=studi.subject2; if(studk.subject2>studi.subject2) k=i; if(studj.subject2<studi.subject2) j=i; average2=sum/numstus; printf("t科目C的最高分:n"); /*最高分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studj.number,studj.name,studj.subject2); printf("t科目C的最低分是:n"); /*最低分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studk.number,studk.name,studk.subject2); printf("t科目C的平均分是 %5.2fn",average2); /*平均分*/ break; case '4': for(i=0;i<numstus;i+) /*循環(huán)輸入判斷*/ sum+=studi.subject3; if(studk.subject3>studi.subject3) k=i; if(studj.subject3<studi.subject3) j=i; average3=sum/numstus; printf("t科目D的最高分:n"); /*最高分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studj.number,studj.name,studj.subject3); printf("t科目D的最低分是:n"); /*最低分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studk.number,studk.name,studk.subject3); printf("t科目D的平均分是 %5.2fn",average3); /*平均分*/ break; case '5': for(i=0;i<numstus;i+) /*循環(huán)輸入判斷*/ sum+=studi.subject4; if(studk.subject4>studi.subject4) k=i; if(studj.subject4<studi.subject4) j=i; average4=sum/numstus; printf("t科目E的最高分:n"); /*最高分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studj.number,studj.name,studj.subject4); printf("t科目E的最低分是:n"); /*最低分*/ printf("tt學(xué)號:%s 姓名:%s 分數(shù):%.2fn",studk.number,studk.name,studk.subject4); printf("t科目E的平均分是 %5.2fn",average4); /*平均分*/ break; default:printf("輸入錯誤!請輸入15之間的數(shù)n"); sum=0; getchar(); printf("是否繼續(xù)進行統(tǒng)計?(y/n)"); gets(str); if(str0='y'|str0='Y') ; else break; int writetotext(student stud) /*將所有記錄寫入文件*/ int i=0,j; FILE *fp; char filename20; printf("輸入文件名稱:"); gets(filename); fp=fopen(filename,"w"); fprintf(fp,"%dn",numstus); while(i<numstus) fprintf(fp,"%s %s %s ",studi.number,studi.name,studi.sex); for(j=0;j<numsubs;j+) fprintf(fp,"%f ",studi.subjectj); fprintf(fp,"%f %f %d ",studi.score,studi.average,studi.index); i+; fclose(fp); printf("已成功存儲!n"); display(stud,0,numstus-1); numstus=0; return 0; void welcome() printf("t*n"); printf("tttt*學(xué)生成績管理系統(tǒng)*ntttt 傾情奉獻 歡迎使用!n"); printf("t*n"); void showtable() printf("-n"); printf("學(xué)號t姓名t性別tAtBtCtDtEt總分t平均分t名次n"); printf("-n"); void display(student stud,int n1,int n2) int i; showtable(); /*顯示表頭*/ for(i=n1;i<=n2;i+) printf("%st%st%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%.2ft%dtn",studi.number,studi.name,studi.sex,studi.subject0,studi.subject1,studi.subject2,studi.subject3,studi.subject4,studi.score,studi.average,studi.index); /*通過循環(huán)輸出數(shù)據(jù)*/ void display1() printf("tt本系統(tǒng)由計科二班制作nn"); printf("tt制作人員列表: nn"); printf("tt殷增鋒ttt邵超n"); printf("nn"); getchar(); #include<string.h> void amendrecord(student stud) char str5; /*供用戶輸入*/ int i=-1,j; if(numstus=0) /*沒有記錄返回*/ printf("沒有可供修改的記錄!"); while(i<0) i=findrecord(stud); if(i>=0)