C語言程序設(shè)計報告-班級學生成績管理系統(tǒng)_第1頁
C語言程序設(shè)計報告-班級學生成績管理系統(tǒng)_第2頁
C語言程序設(shè)計報告-班級學生成績管理系統(tǒng)_第3頁
C語言程序設(shè)計報告-班級學生成績管理系統(tǒng)_第4頁
C語言程序設(shè)計報告-班級學生成績管理系統(tǒng)_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 C語言程序設(shè)計課程設(shè)計報告設(shè)計題目:班級學生成績管理系統(tǒng)專 業(yè): 班 級: 學 號: 姓 名: 指導教師: 時間:2011/06/12目 錄一、 課程設(shè)計目的和要求3二、 課程設(shè)計任務內(nèi)容4三、 程序流程圖16四、 軟件使用說明17五、 課程設(shè)計心得與體會19一. 課程設(shè)計的目的和要求目的:本課程設(shè)計是計算機科學與技術(shù)專業(yè)重要的實踐性環(huán)節(jié)之一,是在學生學習完程序設(shè)計語言(C)課程后進行的一次全面的綜合練習。本課程設(shè)計的目的和任務:1. 鞏固和加深學生對C語言課程的基本知識的理解和掌握2. 掌握C語言編程和程序調(diào)試的基本技能3. 利用C語言進行基本的軟件設(shè)計4. 掌握書寫程序設(shè)計說明文檔的能力

2、5. 提高運用C語言解決實際問題的能力 程序功能和要求:1. 學生記錄用結(jié)構(gòu)體2. 學生信息數(shù)據(jù)用文件保存3. 采用多文件形式組織程序4. 基本功能:1) 增加學生記錄2) 文件存儲3) 讀取文件4) 刪除記錄 5) 修改記錄6) 查詢記錄 5.程序簡潔易懂二課程設(shè)計任務和內(nèi)容代碼:#ifndef H_STUDENT_HH#define H_STUDENT_HH#include#include#include#include#define NUM_SUBJECT 5 /科目數(shù)#define INITIAL_SIZE 100 /數(shù)組初始大小#define INCR_SIZE 50 /數(shù)組每次增加

3、的大小struct student_infochar number15; /學號char name20; /姓名char gender4; /性別float scoreNUM_SUBJECT; /某學生的各科成績float sum; /總分float average; /平均分int index; /名次;typedef struct student_info StuInfo;extern int numStus; /記錄的學生數(shù)extern StuInfo* records; /記錄學生信息的數(shù)組extern char savedTag; /信息是否保存extern int arraySiz

4、e; /數(shù)組大小extern char* subject;void handle_menu(void);int menu_select(void);void addRecord(void);void modifyRecord(void);void display(void);void queryInfo(void);void removeRecord(void);int saveRecords(void);int loadRecords(void);void quit(void);void showTable(void);int findRecord(char* target,int targ

5、etType,int from);void copyRecord(StuInfo* src,StuInfo* dest);void sortInfo(void);int findRecord(char* target,int targetType,int from);int getIndex(float);#endif / H_STUDENT_HH#include student.h/*輸出表頭*void showTable(void)int j;printf(學號t姓名t性別);for(j=0;jNUM_SUBJECT;j+)printf( %s ,subjectj);printf( 總分

6、平均分 名次n);/*顯示所有學生信息函數(shù)*void display(void)int i,j;if(numStus=0)printf(沒有可供顯示的記錄!);return;showTable();for(i=0;inumStus;i+)printf(%4st%3st%3s,recordsi.number,,recordsi.gender);for(j=0;j= arraySize)records=realloc(records,(arraySize+INCR_SIZE)*sizeof(StuInfo);if(records=NULL)printf(memory fa

7、lled!);exit(-1);arraySize=arraySize+INCR_SIZE;printf(請輸入學號:);gets(recordsnumStus.number);printf(請輸入姓名:);gets(recordsnumS);printf(請輸入性別(0為女,1為男):);gets(str);if(str0=0)strcpy(recordsnumStus.gender,女);elsestrcpy(recordsnumStus.gender,男);sum=0;for(j=0;jNUM_SUBJECT;j+)printf(請輸入%s成績:,subjectj);ge

8、ts(str);mark=(float)atof(str);recordsnumStus.scorej=mark;sum+=mark;recordsnumStus.sum=sum;recordsnumStus.average=sum/NUM_SUBJECT;recordsnumStus.index=getIndex(sum);numStus+;printf(現(xiàn)在一共有%d條信息n,numStus);savedTag=1;/*找出總分為sum在第0至numStus-1個記錄中按升序排序的位置*int getIndex(float sum)int i;int count=0;for(i=0;inu

9、mStus;i+)if(recordsi.sumsum)count+;return count+1;#include student.h/*文件存儲操作函數(shù)*int saveRecords(void)FILE *fp;char fname30;if(numStus=0)printf(沒有記錄可存!);return -1;printf(請輸入要存入的文件名(直接回車選擇文件stu_info):);gets(fname);if(strlen(fname)=0)strcpy(fname,stu_info);if(fp=fopen(fname,wb)=NULL)printf(不能存入文件!n);ret

10、urn -1;printf(n存文件.n);fwrite(records,sizeof(StuInfo)*numStus,1,fp);fclose(fp);printf(%d條記錄已經(jīng)存入文件,請繼續(xù)操作。n,numStus);savedTag=0;return 0;/*文件讀取操作函數(shù)*int loadRecords(void)FILE *fp;char fname30;char str5;if(numStus!=0 & savedTag=0)printf(請選擇您是要覆蓋現(xiàn)有記錄(y),還是要將);printf(讀取的記錄添加到現(xiàn)有記錄之后(n)?n);printf(直接回車則覆蓋現(xiàn)有記錄

11、n);gets(str);if(str0=n|str0=N)savedTag=1;elseif(savedTag=1)printf(讀取文件將會更改原來的記錄,);printf(是否保存原來記錄?(y/n));gets(str);if(str0!=n&str0!=N)saveRecords();numStus=0;printf(請輸入要讀取的文件名(直接回車選擇文件stu_info):);gets(fname);if(strlen(fname)=0)strcpy(fname,stu_info);if(fp=fopen(fname,rb)=NULL)printf(打不開文件!請重新選擇n);re

12、turn -1;printf(n取文件.n);while(!feof(fp)if(numStus=arraySize)records=realloc(records,(arraySize+INCR_SIZE)*sizeof(StuInfo);if(records=NULL)printf(memory failed!);exit(-1);arraySize=arraySize+INCR_SIZE;if(fread(&recordsnumStus,sizeof(StuInfo),1,fp)!=1) break;/按照addRecord函數(shù)的方法,更新名次recordsnumStus.index =

13、 getIndex(recordsnumStus.sum);numStus+;fclose(fp);printf(現(xiàn)在共有%d條記錄。,numStus);return 0;#include student.h/*文件存儲操作函數(shù)*int saveRecords(void)FILE *fp;char fname30;if(numStus=0)printf(沒有記錄可存!);return -1;printf(請輸入要存入的文件名(直接回車選擇文件stu_info):);gets(fname);if(strlen(fname)=0)strcpy(fname,stu_info);if(fp=fopen

14、(fname,wb)=NULL)printf(不能存入文件!n);return -1;printf(n存文件.n);fwrite(records,sizeof(StuInfo)*numStus,1,fp);fclose(fp);printf(%d條記錄已經(jīng)存入文件,請繼續(xù)操作。n,numStus);savedTag=0;return 0;/*文件讀取操作函數(shù)*int loadRecords(void)FILE *fp;char fname30;char str5;if(numStus!=0 & savedTag=0)printf(請選擇您是要覆蓋現(xiàn)有記錄(y),還是要將);printf(讀取的

15、記錄添加到現(xiàn)有記錄之后(n)?n);printf(直接回車則覆蓋現(xiàn)有記錄n);gets(str);if(str0=n|str0=N)savedTag=1;elseif(savedTag=1)printf(讀取文件將會更改原來的記錄,);printf(是否保存原來記錄?(y/n));gets(str);if(str0!=n&str0!=N)saveRecords();numStus=0;printf(請輸入要讀取的文件名(直接回車選擇文件stu_info):);gets(fname);if(strlen(fname)=0)strcpy(fname,stu_info);if(fp=fopen(fn

16、ame,rb)=NULL)printf(打不開文件!請重新選擇n);return -1;printf(n取文件.n);while(!feof(fp)if(numStus=arraySize)records=realloc(records,(arraySize+INCR_SIZE)*sizeof(StuInfo);if(records=NULL)printf(memory failed!);exit(-1);arraySize=arraySize+INCR_SIZE;if(fread(&recordsnumStus,sizeof(StuInfo),1,fp)!=1) break;/按照addRe

17、cord函數(shù)的方法,更新名次recordsnumStus.index = getIndex(recordsnumStus.sum);numStus+;fclose(fp);printf(現(xiàn)在共有%d條記錄。,numStus);return 0;#include student.h/*學生信息排序函數(shù)*void sortInfo(void)char str5;int i,j;StuInfo tmps;if(numStus=0)printf(沒有可供排序的記錄!);return; printf(請輸入您希望進行排序的方式:n);printf(1.按學號進行升序排序n);printf(2.按學號進行

18、降序排序n);printf(3.按姓名進行升序排序n);printf(4.按姓名進行降序排序n);printf(5.按名次進行升序排序n);printf(6.按名次進行降序排序n);printf(7.按錯了,現(xiàn)在并不想進行排序n);gets(str);if(str06) return;/進行排序for(i=0;inumStus-1;i+)for(j=i+1;j0) |(str0=2 & strcmp(recordsi.number,recordsj.number)0) |(str0=4 & strcmp(,)recordsj.index) |

19、(str0=6 & recordsi.indexrecordsj.index)copyRecord(&recordsi,&tmps);copyRecord(&recordsj,&recordsi);copyRecord(&tmps,&recordsj);printf(排序已經(jīng)完成n);savedTag=1;#include student.h/初始化int numStus=0; /記錄學生數(shù)StuInfo *records=NULL; /記錄學生信息char savedTag=0; /信息保存標志,1為未保存,0為已保存int arraySize; /數(shù)組大小char* subject=高數(shù),

20、英語,線代,物理,電工,體育;/*主函數(shù)*int main()records=(StuInfo*)malloc(sizeof(StuInfo)*INITIAL_SIZE);if(records=NULL)printf(memory fall!);exit(-1);arraySize=INITIAL_SIZE;printf(n);printf(t*n);printf(t* 這是一個 *n);printf(t* 學生成績管理程序 *n);printf(t* 可以對學生成績進行管理 *n);printf(t* 歡迎使用管理系統(tǒng) *n);printf(t*n);printf(n);handle_men

21、u();/*菜單處理函數(shù)*void handle_menu(void)for(;)switch(menu_select()case 1:addRecord();break;case 2:modifyRecord();break;case 3:display();break;case 4:queryInfo();break;case 5:removeRecord();break;case 6:saveRecords();break;case 7:loadRecords();break;case 8:sortInfo();break;case 9:quit();/*菜單選擇函數(shù)*int menu_

22、select()char s2;int cn=0;printf(n);printf(t1.增加學生信息n);printf(t2.修改學生信息n);printf(t3.顯示學生信息n);printf(t4.查詢學生信息n);printf(t5.刪除學生信息n);printf(t6.保存學生信息至記錄文件n);printf(t7.從記錄文件讀取學生信息n);printf(t8.排序?qū)W生信息n);printf(t9.結(jié)束運行n);printf(n左邊數(shù)字對應功能選擇,請選19:t);for(;)gets(s);cn=atoi(s);if(cn9) printf(nt輸入錯誤,重選19:);else

23、break;return cn;/*結(jié)束運行*void quit(void)char str5;if(savedTag=1)printf(是否保存原來的記錄?(y/n));gets(str);if(str0!=n & str0!=N)saveRecords();free(records);exit(0); 1.總體設(shè)計:本設(shè)計有4個C文件(14個函數(shù))和一個頭文件組成,每個C文件都代表著某種特定功能,他們的關(guān)系如表12-1所示。 程序包含頭文件的存、取過程,其功能就是按輸入順序建立記錄。如果原來沒有記錄文件,可以重新建立一個文件;如果已經(jīng)有記錄,可以先把文件內(nèi)容讀入,然后把新記錄追加到原來記錄

24、的尾部;也可以單獨建立新文件,以后再使用讀取文件的方法拼裝。 表121 文件及函數(shù)組成源 文 件函數(shù)名或其他成分功 能student.cmain總控函數(shù)menu_select菜單選擇handle_menu菜單處理quit結(jié)束運行add_disp.cshowtable輸出表頭addRecord在結(jié)尾追加信息display顯示信息que_remv_modi.cremoveRecord刪除指定記錄findRecord查找指定的記錄queryInfo查詢指定的學生信息copyRecord復制記錄modifRecord修改指定學生的信息sav_load.csave文件存儲load文件讀取student.

25、h常數(shù)提供常數(shù)結(jié)構(gòu)申明學生成績結(jié)構(gòu)庫函數(shù)及函數(shù)原型申明引用庫函數(shù)及函數(shù)由上述功能分析可以看到改程序的全貌。因為它有并列選擇,所可以用選擇菜單方便地實現(xiàn)。這個菜單具有8項,用switch語句可以實現(xiàn)這些選擇。所以用簡潔的偽碼對它們進行選擇,因為并不復雜,所以這里不自在贅述。2.函數(shù)具體設(shè)計為一些函數(shù)設(shè)計兩個返回值以區(qū)分其執(zhí)行結(jié)果是否正確。每個學生信息資料用一個StnInfo結(jié)構(gòu)來保存,用StuInfo數(shù)組的全局變量records來保存一批學生的信息資料。宏定義INTIAL_SIZE表示數(shù)組初始大小,當已分配的數(shù)組大小不夠用時,敬愛那個增加數(shù)組大小,INCR_SIZE為每次增加的大小。全局變量nu

26、mStus 表示數(shù)組中記錄的學生數(shù),arraySize是為數(shù)組分配的空間大小。全局變量savedTag是信息是否保存的標志,當數(shù)組內(nèi)容被保存只文件后,設(shè)為以保存狀態(tài),當數(shù)組內(nèi)容被修改之后,設(shè)為“未保存”狀態(tài)。1) .文件存儲操作函數(shù)函數(shù)原型:int savedRecord(void)功 能:將及錄存入默認文件 stu_info 或者指定文件。參 數(shù):void。返 回 值:成功0,失敗-1。工作方式:數(shù)組records被保存至指定文件。要 求:報告是否有記錄可保存、是否能正常建立或打開文件、根據(jù)要求執(zhí)行存入操作并報告存入記錄的條數(shù)。2) .文件讀取操作函數(shù)函數(shù)原型:int loadRecords

27、(void)文件是否存在輸入文件新信息導入成功是否創(chuàng)建文件退 出是否保存?保存成功退 出開始結(jié)束功 能:將默認文件stu_info 或者指定文件里的記錄存入內(nèi)存。參 數(shù):void。返 回 值:成功0,失敗-1。工作方式:records 為從指定文件中讀取出記錄。要 求:報告是否有記錄可存、是否能正常打開文件、是否覆蓋已有記錄以及讀取記錄的條數(shù)。3) .顯示所有學生信息函數(shù)函數(shù)原型:void display(void)功 能:顯示內(nèi)存里的記錄信息。參 數(shù):void。返 回 值:void。工作方式:從頭文件開始逐個顯示記錄內(nèi)容。要 求:報告是否有記錄及記錄條數(shù)和內(nèi)容。4) .增加信息函數(shù)函數(shù)原型:

28、void addRecord(void)功 能:增加記錄。參 數(shù):void。返 回 值:void。工作方式:從尾部開始逐個追加記錄。要 求:將新記錄追加在記錄尾部,并對記錄進行計數(shù)。5) .輸出表頭函數(shù)函數(shù)原型:void showTable(void)功 能:輸出表頭信息。 改表頭里面含有學生學號,姓名,性別,及各學科名稱,總分,平均分,這樣以后每一次要輸出學生信息是直接就可以用此函數(shù),減少程序的代碼,是程序簡單化。參 數(shù):void。返 回 值:void。工作方式:輸出頭一行表頭信息。要 求:輸出一行表頭信息。6) .刪除記錄函數(shù)函數(shù)原型:void removerecord(void)功 能:

29、刪除內(nèi)存數(shù)組中指定記錄。 如果有的學生信息發(fā)生改變,你可以丟它進行刪除,刪除之前,你必須找到你要修改學生的記錄,你可以根據(jù)姓名,學號超找改學生的信息,找到之后,若要刪除,就對它進行刪除。參 數(shù):void。返 回 值:void。工作方式:根據(jù)給定的關(guān)鍵字,查找符合的記錄并刪除之。輸入是否存在輸入學生新信息修改成功退 出輸入要修改的學生學號開始結(jié)束要 求:將后面的記錄前移,同時改變名次并給出相關(guān)信息。7) .查找指定記錄函數(shù)函數(shù)原型:void findRecord(char*,int,int)功 能:查找指定記錄。參 數(shù):char *target:欲查找記錄的某一項與target相同。 int t

30、argetType:表明通過哪一項來查找,0為學號, 1為姓名,2為名次。 int from:從第from個記錄開始找。返 回 值:int(找到的記錄序號),若找不到則返回-1。工作方式:根據(jù)給定的關(guān)鍵字,查找符合記錄的序號。開始N輸入是否合法退 出Y按學號查詢?輸入學號按姓名查詢輸入姓名顯示結(jié)果顯示結(jié)果結(jié)束要 求:找不到則返回-1。8) .查找指定學生信息函數(shù)函數(shù)原型:void queryInfo(void)功 能:將一個文件的內(nèi)容追加到另一個文件的尾部。參 數(shù):void。返 回 值:void。工作方式:可以按照學號、姓名或名次來查詢。要 求:打印查詢到得學生信息或給出相關(guān)信息。9) .記錄

31、復制函數(shù)函數(shù)原型:void copyRecord(stuInfo*, stuInfo*)功 能:將src指向的一條記錄復制給dest指向的記錄。參 數(shù):StuInfo* src為源記錄StuInfo* dest為目的記錄。返 回 值:void。工作方式:將源記錄逐條復制到目的記錄。要 求:正確復制字符串。10) .修改指定學生信息函數(shù)函數(shù)原型:void modifyRecord(void)功 能:找到指定記錄并修改。如果有的學生信息發(fā)生改變,你可以丟它進行修改,修改之前,你必須找到你要修改學生的記錄,你可以根據(jù)姓名,學號超找改學生的信息,找到之后,若要修改,就對它進行修改。參 數(shù):void。返

32、 回 值:void。工作方式:可以按照學號、姓名活名次找到要修改的記錄,確認后方可修改。要 求:同時需要調(diào)整名次。11) .菜單處理函數(shù)函數(shù)函數(shù)原型:void handle_menu(void)功 能:處理選擇的菜單命令。參 數(shù):void。返 回 值:void。工作方式:根據(jù)命令,調(diào)用相應函數(shù)。要 求:給出結(jié)束信息。12) .菜單選擇函數(shù)函數(shù)原型:void menu_select(void)功 能:接受用戶選擇代碼。參 數(shù):void。返 回 值:int。工作方式:返回命令代碼整數(shù)值。要 求:只允許選擇規(guī)定鍵,若果輸入不符合要求,則提醒用戶重新輸入。13) .結(jié)束程序運行函數(shù)函數(shù)原型:void

33、quit(ADDR*)功 能:結(jié)束程序運行。參 數(shù):void。返 回 值:void。工作方式:根據(jù)要求決定在退出前是否將修改的記錄存入文件。要 求:結(jié)束運行之前,詢問是否丟修改的記錄進行存儲。14) 排序函數(shù)函數(shù)原型:sortInfo(void)功 能:對學生的總進行排序,可以按照升序,降序,對學生成績或?qū)W號進行準確的排名。參 數(shù):void。返 回 值:void。工作方式:對學生進行排序,可以根據(jù)需要,對學生的學號或者成績進行升序或者降序。你通過選擇17中的選項來滿足你的需求。要 求:升序或者降序。15) .主函數(shù)函數(shù)原型:void main(void)功 能:控制程序。參 數(shù):void。返

34、回 值:void。要 求:管理菜單命令并完成初始化。16) .頭文件文件名稱:student.h功 能:聲明函數(shù)原型,包含文件及自定義宏和數(shù)據(jù)結(jié)構(gòu)。要 求:報告是否能正常打開文件執(zhí)行存入操作及存入記錄條數(shù)。 #ifndef H_STUDENT_HH#define H_STUDENT_HH用來防止重復包含的。這種比較怪異方式,不如STUDENT_H那樣清晰明了,目的是盡量避免可能出現(xiàn)的重復的宏定義。在頭文件是,對于系統(tǒng)庫投文件,使用“”形勢,表示從系統(tǒng)查找頭文件;對于自己建立的頭文件,如student.h,使用 #include“student”的形勢,表示處理系統(tǒng)庫目錄外,還要從目錄去查找頭文件。這14個函數(shù)只就愛你緊密相關(guān)的,如若要對函數(shù)進行刪除,修改,就必須用到查找函數(shù),只有通過從查找函數(shù)才能對它們修改刪除。void findRecordvoid queryInfo(void)void modifyRecord(void) 98結(jié) 束關(guān) 閉 文 件結(jié)束運行對學生排名76345從記錄讀

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論