c語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc
《c語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《c語言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng).doc(34頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
_ 目錄 學(xué)生成績(jī)管理程序題目要求 2設(shè)計(jì)目的 2總體設(shè)計(jì) 3詳細(xì)設(shè)計(jì) 3調(diào)試與測(cè)試 12源程序 14總結(jié) 30學(xué)生成績(jī)管理程序一 題目要求 1. 問題描述:對(duì)在校學(xué)生幾門課程的考試成績(jī)進(jìn)行統(tǒng)一管理.每個(gè)學(xué)生記錄包括學(xué)號(hào),姓名,年齡,數(shù)學(xué),英語,物理成績(jī),默認(rèn)以學(xué)號(hào)為序存放.2. 要求:(1)一個(gè)文件按以班為單位存儲(chǔ)學(xué)生記錄.(2)將允許的操作分為四種,以A,B ,C,D,E,F為標(biāo)志:A:插入一個(gè)學(xué)生記錄;B:修改學(xué)生記錄;C:刪除一個(gè)學(xué)生記錄;D:查找一個(gè)學(xué)生記錄;E:瀏覽學(xué)生成績(jī):F:退出3. 計(jì)算學(xué)生的總成績(jī).4. 按學(xué)號(hào)排序輸出全班學(xué)生成績(jī)表.二 設(shè)計(jì)目的根據(jù)題目要求,由于學(xué)生信息是存放在文件中,所以應(yīng)提供文件的輸入,輸出等操作;在程序中需要瀏覽學(xué)生的信息,應(yīng)提供顯示,查找,排序等操作;另外還應(yīng)提供鍵盤式選擇菜單實(shí)現(xiàn)功能選擇.三 總體設(shè)計(jì)根據(jù)上面的需求分析,可以將這個(gè)系統(tǒng)分為以下模塊:輸入模塊,修改模塊,刪除模塊,查找模塊,顯示模塊.學(xué)生成績(jī)管理系統(tǒng)數(shù)據(jù)輸入數(shù)據(jù)顯示數(shù)據(jù)修改數(shù)據(jù)刪除數(shù)據(jù)查找四 詳細(xì)設(shè)計(jì)1. 主函數(shù):主函數(shù)一般設(shè)計(jì)得比較簡(jiǎn)單,只提供輸入,處理和輸出部分的函數(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)計(jì)信息 |n); printf( | 2. 查詢學(xué)生記錄 6.打開文件 |n); printf( | 3. 修改學(xué)生記錄 7.保存文件 |n); printf( | 4. 學(xué)生紀(jì)錄排序 8.顯示記錄 |n); printf( | 0. 退出系統(tǒng) |n); printf(nn); printf(請(qǐng)選擇(0-8):); c=getchar(); getchar(); return (c-0); 2. 輸入模塊:分析:單獨(dú)看各數(shù)據(jù)信息,學(xué)號(hào),姓名是字符型,可以采用字符型數(shù)組;分?jǐn)?shù)為整數(shù),采用整數(shù);數(shù)據(jù)信息存放在文件中,一條記錄對(duì)應(yīng)一個(gè)學(xué)生,既符合習(xí)慣又方便信息管理.如果要存放若干學(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(請(qǐng)輸入增加的學(xué)生信息條目數(shù):); scanf(%d,&num); if(i=0) numstus=num; else numstus+=num; if(numstuslens) lens+=50; pointer=(student *)realloc(pointer,lens*LEN); printf(請(qǐng)輸入學(xué)生信息:n); for(;inumstus;i+) getchar(); printf(請(qǐng)輸入學(xué)號(hào):); gets(pointeri.number); printf(請(qǐng)輸入姓名:); gets(pointeri.name); printf(請(qǐng)輸入性別(男/女 1/0):); gets(pointeri.sex); if(pointeri.sex0=0) strcpy(pointeri.sex,女); else strcpy(pointeri.sex,男); printf(請(qǐng)輸入各科成績(jī):(按“語文,數(shù)學(xué),英語,歷史,政治”的順序):); studi.score=0; for(j=0;j0) 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)計(jì)信息*/ case 6:openfile(pointer);break; /*打開文件*/ case 7:writetotext(pointer);break; /*保存文件*/ case 8:display(pointer,0,numstus-1);break; /*顯示記錄*/ case 0: if(numstus!=0) printf(是否保存當(dāng)前記錄?(y/n); gets(str); if(str0=y|str0=Y) writetotext(pointer); i=-1;break; /*退出系統(tǒng)*/ default:printf(請(qǐng)輸入數(shù)字08:n);i=1; /*輸入錯(cuò)誤*/ printf(tt歡迎再次使用本系統(tǒng)。nn); display1(); 3. 修改模塊:分析:用戶輸入要修改學(xué)生的學(xué)號(hào),根據(jù)學(xué)生的學(xué)號(hào)等信息查找學(xué)生記錄,并提示用戶修改該記錄的哪部分信息.根據(jù)用戶選擇修改相應(yīng)的信息.流程圖:輸入要修改的學(xué)號(hào)找到? Y N提示沒有找到顯示記錄,調(diào)用修改函數(shù)返回主菜單繼續(xù)? Y N程序:void xiugai() if(fp=fopen(s_score.txt,rb+)=NULL|(fp1=fopen(temp.txt,wb+)=NULL) /*檢查是否出錯(cuò)*/ 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個(gè)字節(jié)處*/fseek(fp1,0L,0); while(fread(&data,sizeof(data),1,fp1)=1) fwrite(&data,sizeof(data),1,fp); fclose(fp); fclose(fp1); 4. 刪除模塊: 分析:該模塊的功能是,用戶輸入要?jiǎng)h除的學(xué)生的學(xué)號(hào),根據(jù)學(xué)生學(xué)號(hào)查找記錄并刪除.流程圖: 輸入要?jiǎng)h除的學(xué)號(hào)找到? Y N提示沒有找到顯示記錄,調(diào)用刪除函數(shù)返回主菜單繼續(xù)? Y N程序:void deleterecord(student stu,int i) /*刪除信息*/ int j; while(i=0) for(j=i;jnumstus;j+) stuj=stuj+1; numstus-; printf(刪除成功!n); void count(student stud) int i,j; for(i=0;inumstus;i+) studi.index=1; for(j=0;jstudi.score) studi.index+; 5. 查找模塊:需求分析:該模塊的功能是根據(jù)輸入的學(xué)生的姓名查找對(duì)應(yīng)的記錄,找到以后,顯示相應(yīng)的學(xué)生信息.流程圖:輸入學(xué)生學(xué)號(hào)返回主菜單詢問是否繼續(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é)號(hào)t2.姓名t3.名次n); gets(str); if(str0=1) /*按學(xué)號(hào)查找*/ printf(請(qǐng)輸入學(xué)號(hào):); 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(請(qǐng)輸入姓名:); 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(請(qǐng)輸入名次:); scanf(%d,&num); getchar(); for(i=0;inumstus) printf(沒有查找所要的信息。n); return -1; return i; 6. 顯示模塊:需求分析:該模塊的功能是顯示所有學(xué)生記錄信息.程序:void welcome() printf(t*n); printf(tttt*學(xué)生成績(jī)管理系統(tǒng)*ntttt 傾情奉獻(xiàn) 歡迎使用!n); printf(t*n); void showtable() printf(-n); printf(學(xué)號(hào)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)由計(jì)科二班制作nn); printf(tt制作人員列表: nn); printf(tt殷增鋒ttt邵超n); printf(nn); getchar(); 五 調(diào)試與測(cè)試在這次課程設(shè)計(jì)中,程序編寫過程中遇到了很多的問題,各種函數(shù)的運(yùn)用也讓人頭疼,在上機(jī)編譯運(yùn)行過程中出現(xiàn)了很多的錯(cuò)誤,例如:各種數(shù)據(jù)類型的定義,函數(shù)的調(diào)用等等。但最終還是在老師同學(xué)的幫助下進(jìn)行了各種代碼的編寫與修改,最終程序成功的運(yùn)行。下面是各個(gè)模塊的界面圖(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) /*一個(gè)結(jié)構(gòu)體數(shù)組元素的長(zhǎng)度*/ #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)計(jì)信息 |n); printf( | 2. 查詢學(xué)生記錄 6.打開文件 |n); printf( | 3. 修改學(xué)生記錄 7.保存文件 |n); printf( | 4. 學(xué)生紀(jì)錄排序 8.顯示記錄 |n); printf( | 0. 退出系統(tǒng) |n); printf(nn); printf(請(qǐng)選擇(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é)號(hào)t2.姓名t3.名次n); gets(str); if(str0=1) /*按學(xué)號(hào)查找*/ printf(請(qǐng)輸入學(xué)號(hào):); 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(請(qǐng)輸入姓名:); 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(請(qǐng)輸入名次:); scanf(%d,&num); getchar(); for(i=0;inumstus) printf(沒有查找所要的信息。n); return -1; return i; /#includehead.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(請(qǐng)輸入文件名:); gets(filename); numstus=0; if(fp=fopen(filename,rb+)=NULL) printf(無法打開該文件n); return(-1); fscanf(fp,%d,&numstus); fgetc(fp); while(inumstus) fscanf(fp,%s,stui.number); fscanf(fp,%s,stui.name); fscanf(fp,%s,stui.sex); for(j=0;jnumsubs;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(是否顯示紀(jì)錄?(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( 請(qǐng)輸入查詢方式:); printf((直接輸入回車則結(jié)束查詢操作)n); printf(1.按照學(xué)號(hào)t); printf(2.按照姓名t); printf(3.按照名次n); gets(str); if(strlen(str)=0) break; if(str0=1) printf(請(qǐng)輸入排序次序: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(請(qǐng)輸入排序次序: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(請(qǐng)輸入排序次序:n); printf(1.升序排列t); printf(2.降序排列n); gets(str); if(str0=1) sortcount2(p); else sortcount(p); display(stud,0,numstus-1); else printf(請(qǐng)輸入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;inumstus;i+) for(j=0;j0) 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;inumstus;i+) for(j=0;j0) 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;inumstus;i+) for(j=0;j0) 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;inumstus;i+) for(j=0;j0) 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;inumstus;i+) for(j=0;jstudj.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;inumstus;i+) for(j=0;jstudj+1.index) temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; /#includehead.h void statistic(student stud) /*新增功能,輸出統(tǒng)計(jì)信息*/ int i,j=0,k=0; char c1,str2; float averagenumsubs,sum=0; if(numstus=0) printf(沒有可被查找的記錄n); else while(1) printf(下面將統(tǒng)計(jì)考試成績(jī)n); printf(請(qǐng)選擇你要統(tǒng)計(jì)哪科的成績(jī) 1.At2.Bt3.Ct4.Dt5.En); c1=getchar(); printf(t一共有個(gè)%d記錄n,numstus); /*總共記錄數(shù)*/ switch(c1) case 1: for(i=0;istudi.subject0) k=i; if(studj.subject0studi.subject0) j=i; average0=sum/numstus; printf(t科目A的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,studj.name,studj.subject0); printf(t科目A的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,studk.name,studk.subject0); printf(t科目A的平均分是 %5.2fn,average0); /*平均分*/ break; case 2: for(i=0;istudi.subject1) k=i; if(studj.subject1studi.subject1) j=i; average1=sum/numstus; printf(t科目B的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,studj.name,studj.subject1); printf(t科目B的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,studk.name,studk.subject1); printf(t科目B的平均分是 %5.2fn,average1); /*平均分*/ break; case 3: for(i=0;istudi.subject2) k=i; if(studj.subject2studi.subject2) j=i; average2=sum/numstus; printf(t科目C的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,studj.name,studj.subject2); printf(t科目C的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,studk.name,studk.subject2); printf(t科目C的平均分是 %5.2fn,average2); /*平均分*/ break; case 4: for(i=0;istudi.subject3) k=i; if(studj.subject3studi.subject3) j=i; average3=sum/numstus; printf(t科目D的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,studj.name,studj.subject3); printf(t科目D的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,studk.name,studk.subject3); printf(t科目D的平均分是 %5.2fn,average3); /*平均分*/ break; case 5: for(i=0;istudi.subject4) k=i; if(studj.subject4studi.subject4) j=i; average4=sum/numstus; printf(t科目E的最高分:n); /*最高分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studj.number,studj.name,studj.subject4); printf(t科目E的最低分是:n); /*最低分*/ printf(tt學(xué)號(hào):%s 姓名:%s 分?jǐn)?shù):%.2fn,studk.number,studk.name,studk.subject4); printf(t科目E的平均分是 %5.2fn,average4); /*平均分*/ break; default:printf(輸入錯(cuò)誤!請(qǐng)輸入15之間的數(shù)n); sum=0; getchar(); printf(是否繼續(xù)進(jìn)行統(tǒng)計(jì)?(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(inumstus) fprintf(fp,%s %s %s ,studi.number,studi.name,studi.sex); for(j=0;jnumsubs;j+) fprintf(fp,%f ,studi.subjectj); fprintf(fp,%f %f %d ,studi.score,studi.average,studi.index); i+; fclose(fp); printf(已成功存儲(chǔ)!n); display(stud,0,numstus-1); numstus=0; return 0; void welcome() printf(t*n); printf(tttt*學(xué)生成績(jī)管理系統(tǒng)*ntttt 傾情奉獻(xiàn) 歡迎使用!n); printf(t*n); void showtable() printf(-n); printf(學(xué)號(hào)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)由計(jì)科二班制作nn); printf(tt制作人員列表: nn); printf(tt殷增鋒ttt邵超n); printf(nn); getchar(); #include void amendrecord(student stud) char str5; /*供用戶輸入*/ int i=-1,j; if(numstus=0) /*沒有記錄返回*/ printf(沒有可供修改的記錄!); while(i=0)- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
32 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語言 課程設(shè)計(jì) 學(xué)生 成績(jī)管理系統(tǒng)
鏈接地址:http://m.appdesigncorp.com/p-1575144.html