|
一. 功能設計要求 設計要求實現(xiàn)的功能較多,所以將他們分為幾個部分敘述。 1.建立文件 (1)可以使用默認文件名或指定文件名將記錄存儲到文件; (2)文件保存成功返回0,失敗返回-1; (3)設置保存標志savedtag作為是否已對記錄進行存儲操作的信息; (4)寫同名文件將覆蓋原來文件的內(nèi)容。 2.增加學生紀錄 (1)可在已有記錄后面追加新的記錄; (2)可以隨時用它增加新的記錄,它們僅保存在結構數(shù)組中; (3)可以將一個文件讀入,追加在已有記錄之后; (4)如果已經(jīng)采取用文件追加的方式,在沒有保存到文件之前,將繼續(xù)保持文件追加狀態(tài),以便實現(xiàn)連續(xù)文件追加操作方式; (5)如果沒有記錄存在,給出提示信息。 3.新建學生信息文件 (1)用來重新建立學生信息記錄; (2)如果已經(jīng)有記錄存在,可以覆蓋原記錄或者在原記錄后面追加,也可以將原有記錄信息保存到一個指定文件,然后重新建立記錄; (3)給出相應的提示信息。 4.顯示記錄 (1)如果沒有記錄可供顯示,給出提示信息; (2)可以隨時顯示內(nèi)存中的記錄; (3)顯示表頭。 5.文件存儲 (1)可以按默認名字或指定名字存儲記錄文件; (2)存儲成功返回0,否則返回-1; (3)更新存儲標志。 6.讀取文件 (1)可以按默認名字或指定名字將記錄文件讀入內(nèi)存; (2)讀取成功返回0,否則返回-1; (3)可以將指定或默認文件追加到現(xiàn)有記錄的尾部; (4)可以將文件連續(xù)追加到現(xiàn)有記錄并更新記錄的名次; (5)更新存儲標志。 7.刪除記錄 (1)可以按“學號”、“姓名”或“名次”方式刪除記錄; (2)給出將被刪除記錄的信息,經(jīng)確認后再刪除; (3)如果已經(jīng)是空表,刪除時應給出提示信息并返回住菜單; (4)如果沒有要刪除的信息,輸出沒有找到的信息; (5)應該更新其他記錄的名次; (6)刪除操作僅限于內(nèi)存,只有執(zhí)行存記錄時,才能覆蓋原記錄; (7)更新存儲標志。 8.修改記錄 (1)可以按“學號”、“姓名”或“名次”方式修改記錄; (2)給出將被修改記錄的信息,經(jīng)確認后進行修改; (3)如果已經(jīng)是空表,應給出提示信息并返回住菜單; (4)如果沒有找到需要修改的信息,輸出提示信息; (5)應該同時更新其他記錄的名次; (6)修改操作僅限于內(nèi)存,只有進行存儲操作時,才能覆蓋原記錄; (7)更新存儲標志。 9.查詢記錄 (1)可以按“學號”、“姓名”或“名次”方式查詢記錄; (2)能給出查詢記錄的信息; (3)如果查詢的信息不存在,輸出提示信息。 10.對記錄進行排序 (1)可以按學號進行升序或降序排序; (2)可以按名稱進行升序或降序排序; (3)可以按名次進行升序或降序排序; (4)如果屬于選擇錯誤,可以立即退出排序; (5)更新存儲標志。 11.頭文件 (1)使用條件編譯定義頭文件; (2)函數(shù)原型聲明; (3)數(shù)據(jù)結構及包含文件。 12.測試程序 (1)應列出測試大綱對程序進行測試; (2)應保證測試用例測試到程序的各種邊緣情況。 以上是基本要求,希望通過對本題設計的理解,重新考慮如何改進設計。 二.總體設計 最初的整體規(guī)劃只是說明它們的可行性,不要求制定函數(shù)的具體實現(xiàn),甚至不需要考慮函數(shù)原型。完成整體規(guī)劃后,可以按照流程描述各個模塊之間的接口功能。 本課程設計對模塊設計的要求如下: (1)要求使用多文件方式實現(xiàn)設計; (2)要求在各個文件內(nèi)實現(xiàn)結構化設計 (3)每個模塊作為一個單獨的C文件,每個文件內(nèi)的函數(shù)如表12-1所示,表中給出了各個函數(shù)的功能說明; (4)宏和數(shù)據(jù)結構等放在頭文件中,并使用條件編譯。 本設計有5個C 文件(17個函數(shù))和一個頭文件組成,每個C文件都代表著某特定的功能,它們的關系如表12-1所示。本章的設計將更加注意模塊化,以便展示C 語言的編程風格。  程序包含文件的存、取過程。它的功能就是按輸入順序建立記錄。如果原來沒有記錄文件,可以重新建立一個文件;如果已經(jīng)有記錄,可以先把文件內(nèi)容輸入,然后把新記錄追加到原來記錄的尾部;也可以單獨建立新文件,以后再使用讀取文件的方法拼接。 由上述功能分析可以看到它的全貌。因為它有并列選擇,所以可以用選擇菜單方便地實現(xiàn)。這個菜單具有10個選擇項,用switch語句可以實現(xiàn)這些選擇。可以用簡潔的偽碼對它們進行描述,因為并不復雜,所以不再贅述。 三.函數(shù)設計 為一些函數(shù)設計兩個返回值一曲分歧執(zhí)行結果是否正確。每個學生信息資料用一個stuinfo結構來保存,用stuinfo數(shù)組全局變量records來保存一批學生的信息資料。 其中的宏定義INITIIAL-SIZE表示數(shù)組初始大小,當已經(jīng)分配的數(shù)組大小不夠用時,將真假數(shù)組的大小,INCR-SIZE為當每次增加的大小。全局變量numstus表示數(shù)組中記錄的學生數(shù),arraysize視為數(shù)組分配的空間大小。全局變量savedtag是信息是否已保存的標志,當屬組內(nèi)容被文件保存值文件后,設為“已保存”狀態(tài),當數(shù)組內(nèi)容被修改之后,設為“未保存”狀態(tài)。 下面分別描述這些函數(shù),建立它們的函數(shù)原型。 1.文件存儲操作函數(shù) 函數(shù)原型:int saverecords(void) 功能:將記錄存入默認文件stu_info或者指定文件。 參數(shù):void返回值:成功0,失敗-1 工作方式:數(shù)組records被保存至指定文件。 要求:報告是否有記錄可存、是否能正常建立或打開文件、根據(jù)要求執(zhí)行存 入操作并報告存入記錄的條數(shù)。 2.文件讀取操作函數(shù) 函數(shù)原型:int loadrecords(void) 功能:將默認文件stu_info或者指定文件里的記錄取入內(nèi)存。 參數(shù):void 返回值:成功0,失敗-1 工作方式:records將為從指定文件中讀取出的記錄。 要求:報告是否有記錄可存、能否能正常打開文件、是否覆蓋已有記錄以及讀取記錄的條數(shù)。 3.顯示所有學生信息的函數(shù) 函數(shù)原型:int display(void) 功能:顯示內(nèi)存里的記錄信息 參數(shù):void 返回值:void 工作方式:從頭部開始逐個顯示記錄內(nèi)容 要求:報告是否有記錄及記錄條數(shù)和內(nèi)容。 4.增加信息函數(shù) 函數(shù)原型:void addrecord(void) 功能:增加記錄 參數(shù):void 返回值:void 工作方式:從尾部開始逐個追加記錄。 要求:將新記錄追加在記錄尾部,并對記錄進行計數(shù)。 5.打印表頭函數(shù) 函數(shù)原型:void showtable(void) 功能: 打印表頭 參數(shù):void 返回值:void 工作方式:輸出一行表頭信息 要求:將表頭按制表符打印要求。 6.輸出在記錄中按升序排序的位置 函數(shù)原型:void getindex(float sum) 功能: 找出總分為sum在第0至numstus-1個記錄中按升序排序的 參數(shù):float,預找出其位置的總分 返回值:int,sum在第0至numstus-1個記錄中按升序排序的 工作方式:查找并計數(shù) 要求:輸出位置整數(shù) 7.刪除記錄函數(shù) 函數(shù)原型:void removerecord(void) 功能: 刪除內(nèi)存數(shù)組中的制定記錄 參數(shù):void 返回值:void 工作方式:根據(jù)給定的關鍵字,查找符合的記錄并刪除。 要求:將后面的記錄前移,同時改變名次并給出相關信息。 8.查找指定記錄函數(shù) 函數(shù)原型:void findrecord(char*,int,int) 功能:查找指定的記錄。 參數(shù):char*target:預查找記錄的某一項與target相同 intb targettype:表明通過哪一項來查找,0為學號,1為姓名,2為名次 int form:從第from個記錄開始找 返回值:int找到的記錄的序號,若找不到則返回-1。 工作方式: 根據(jù)給定的關鍵字,查找符合記錄的序號。 要求:找不到則返回-1。 9.查詢指定學生信息的函數(shù) 函數(shù)原型:void queryinfo(void) 功能: 將一個文件的內(nèi)容追加到另一個文件的尾部。 參數(shù):void 返回值:void 工作方式:可以按照學號、姓名或名次來查詢。 要求:打印查詢到的學生的信息或給出相關信息。 10.記錄復制函數(shù): 函數(shù)原型:void copyrecord(stuinfo*,stuinfo*) 功能: 將stc指向的一條記錄復制給dest指向的記錄。 參數(shù):stuinfo*src:源記錄stuinfo*dest:目的記錄。 返回值:void 工作方式:將源記錄逐條復制到目的記錄 要求:正確復制字符串。 11.修改指定學生信息函數(shù) 函數(shù)原型:void modifyrecord(void) 功能: 找到指定記錄并修改 參數(shù):void 返回值:void 工作方式: 可以按照學號、姓名或名次找到要修改的記錄,確認后方可修改。要求:同時需調(diào)整名次 12.學生信息排序函數(shù) 函數(shù)原型:void sortinfo(void) 功能:對記錄進行排序 參數(shù):void 返回值:void 工作方式: 可以按照學號、姓名或名次排序。 要求:升序或降序排序。 13.菜單處理函數(shù) 函數(shù)原型:void handle_menu(void) 功能:處理選擇的菜單命令。 參數(shù):void 返回值:void 工作方式:根據(jù)命令,調(diào)用相應函數(shù)。 要求:給出結束信息。 14.菜單選擇函數(shù) 函數(shù)原型:int menu_select(void) 功能:接受用戶選擇的命令代碼。 參數(shù):void 返回值:int 工作方式:返回命令代碼的整數(shù)值。 要求:只允許選擇規(guī)定鍵,如果輸入不合要求,則提醒用戶重新輸入。 15.新建學生信息記錄的函數(shù) 函數(shù)原型:void newrecords(void) 功能:重新建立輸入信息記錄。 參數(shù):void 返回值:void 工作方式:根據(jù)修要調(diào)用saverecords函數(shù)。 要求:若原來信息沒有保存,則保存原來的信息,然后重新輸入信息記錄。 16.結束程序運行函數(shù) 函數(shù)原型:void quit(addr*) 功能: 結束程序運行. 參數(shù):void 返回值:void 工作方式:根據(jù)要求決定在推出前是否將修改的記錄存入文件。 要求:結束運行之前,詢問是否對修改的記錄進行存儲。 17.主函數(shù) 函數(shù)原型:void main(void) 功能: 控制程序。 參數(shù):void 返回值:void 要求:管理菜單命令并完成初始化。 18.頭部文件 文件名稱:student.h 功能:聲明函數(shù)原型,包含文件及自定義宏和數(shù)據(jù)結構。 要求:報告是否能正常打開文件執(zhí)行存入操作及記錄的條數(shù)。 三.參考程序 1.student.h文件 #ifndef H_STUDENT_HH #define H_ STUDENT_HH #include #include #include #include #define INITIAL_SIZE 100 //樹組初始大小 #define INCR_SIZE 50 //數(shù)組每次增加的大小 #define NUM_SUBJECT 5 //科目數(shù) struct student_info char number[15]; //學號 char name[20]; //姓名 char gender[4]; //性別 float score[NUM_SUBJECT]; //分別為該學生5門課的成績 float sum; //總分 float average; //平均分 int index; //名次 ; typedef struct student_info stuinfo; extern int numstus; //記錄的學生數(shù) extern stuinfo*records; //記錄學生信息的數(shù)組 extern char savetag; //信息是否已保存的標志,0為以保存,1位未保存 extern int arraysize; //數(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); void sortinfo(void); int saverecords(void); int loadrecords(void); void newrecords(void); void quit(void); void showtable(void); int findrecord(char*target, int targettype, int from); int getindex(float sum); void copyrecord(stuinfo*src, stuinfo*dest); #endif //H_STUDENT_HH 2.student.c #include int numstus=0; stuinfo *records=null; char savedtag=0; int arraysize; char* subject[]=“語文”,“數(shù)學”,“英語”,“物理”,“化學”; int main() //初始化數(shù)組 records=(stuinfo*)malloc(stuinfo)*INITIAL_SIZE); if (records==null) printf(“memory fail!”); exit(-1); arraysize = INITIAL_SIZE; printf(“”); printf(“******************************”); printf(“* 這是一個*”); printf(“* 學生成績管理程序*”); printf(“可以對學生成績進行管理*”); printf(“歡迎使用管理程序*”); printf(“”); handle_menu(); void handle_menu(void) for( ; ; ) switch(menu_select()) case 0: addrecord(); break; case 1: modifyrecord(); break; case 2: display(); break; case 3: queryinfo(); break; case 4: removerecord(); break; case 5: sortinfo(); break; case 6: saverecords(); break; case 7: loadrecords(); break; case 8: newrecords(); break; case 9: quit(); int menu_select() char s[2]; int cn=0; printf(“”); printf(“.增加學生信息”); printf(“.修改學生信息”); printf(“.顯示學生信息”); printf(“.查詢學生信息”); printf(“.刪除學生信息”); printf(“.對學生信息進行排序”); printf(“.保存學生信息至記錄文件”); printf(“.從記錄文件讀取學生信息”); printf(“.新建學生信息文件”); printf(“.結束運行”); printf(“左邊數(shù)字對應功能選擇,請選0-9:”); for( ; ; ) gets(s); cn=atoi(s); if(cn==0&&(strcmp(s,”0”)!=0)) cn=11;//處理鍵入的非數(shù)字鍵,過濾出數(shù)字0 if(cn9) printf(“輸出錯誤,重選0—9:”); else break; return cn; //新建學生信息記錄 void newrecords(void) char str[5]; if(numstus!=0) printf(“現(xiàn)在已經(jīng)有記錄,選擇處理已有記錄的方法?!?; printf(“是否保存原來的記錄?(Y/n)”); gets(str); if(str[0]!=‘n’&&str[0]!=‘N’) saverecords(); numstus=0; addrecord(); //?áê???DD£?í?3? void quit(void) char str[5]; if (savedtag==1) gets(str); saverecords(); :free(records); exit(0); 3.add_disp.c #include void showtable(void) int j; for(j=0;j void display(void) int i,j; if(numstus==0) return; shoetable(); for (i=0;i printf((?°%s%s%s?±,records[i].number,records[i].name, records[i].gender); for(j=0;j printf(?°%.1f?±,records[i].score[j]); printf(?°%.1f%.1f%d?±,records[i].sum,records[i].average,records[i].index); if (i ==0&&i!=0) printf(?°ê?è?è?òa×???oó?ìD??-?±); getch(); printf(?°?±); showtable(); void addrecord(void) char str[10]; int j; float mark,sum; if(numstus==0) else while(1) gets(str); break£? if(records==NULL) printf(?°memory failed!?±); exit(-1); arraysize=arraysize INCR_SIZE; gets(records[numstus].number); gets(records[numstus].name); gets(str); if(str[0]==??0?ˉ) sum=0; for(j=0;j gets(str); mark=(float)atof(str); records[numstus].score[j]=mark; sum =mark; records[numstus].sum=sum; records[numstus].average=sum/NUM_SUBJECT; records[numstus].index=getindex(sum); numstus ; savedtag=1; int i; for (i=0;i if (records[i].sum else if (records[i].sum>sum) count ; return count 1
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com
|