學(xué)生成績(jī)管理系統(tǒng)
本題目設(shè)計(jì)目的是訓(xùn)練學(xué)生的基本編程能力,了解管理信息系統(tǒng)的開(kāi)發(fā)流程,熟悉C語(yǔ)言的文件和單鏈表的各種基本操作。本程序中涉及結(jié)構(gòu)體、單鏈表、文件等方面的知識(shí)。通過(guò)本程序的訓(xùn)練,使學(xué)生能對(duì)C語(yǔ)言的文件操作有一個(gè)更深刻的了解,掌握利用單鏈表存儲(chǔ)結(jié)構(gòu)實(shí)現(xiàn)對(duì)學(xué)生成績(jī)管理的原理,為進(jìn)一步開(kāi)發(fā)出高質(zhì)量的管理信息系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。
1、問(wèn)題定義
創(chuàng)建一個(gè)學(xué)生成績(jī)管理系統(tǒng)。假設(shè)系統(tǒng)中每個(gè)學(xué)生記錄只包括學(xué)號(hào)、姓名、數(shù)學(xué)成績(jī)、英語(yǔ)成績(jī)、C語(yǔ)言成績(jī)、總分、平均分、名次等信息。程序的運(yùn)行效果如下圖所示,選擇任意菜單后,實(shí)現(xiàn)相應(yīng)功能。
圖1.1? 學(xué)生成績(jī)管理系統(tǒng)功能需求
在問(wèn)題定義階段要考慮題目的可行性和需求分析,接下來(lái)進(jìn)入開(kāi)發(fā)階段,完成系統(tǒng)設(shè)計(jì)和系統(tǒng)實(shí)現(xiàn)的任務(wù)。
2、系統(tǒng)設(shè)計(jì)
2.1 總體設(shè)計(jì)
采用模塊化的程序設(shè)計(jì)方法,即將較大的任務(wù)按照一定的原則分為一個(gè)個(gè)較小的任務(wù),然后分別設(shè)計(jì)各個(gè)小任務(wù)。需要注意的是劃分出來(lái)的模塊應(yīng)該相對(duì)獨(dú)立但又相關(guān),且容易理解??梢杂媚K化層次結(jié)構(gòu)圖(即模塊圖)來(lái)分析其任務(wù)的劃分,一般從上到下進(jìn)行,最上面一層是主模塊,下面各層是其上一層模塊的逐步細(xì)化描述。
本成績(jī)管理系統(tǒng)要求采用單鏈表實(shí)現(xiàn),如圖2.1所示,它由如下五大功能模塊組成:
- 輸入記錄模塊。完成將數(shù)據(jù)存入單鏈表的工作。記錄可以從以二進(jìn)制形式存儲(chǔ)的數(shù)據(jù)文件中讀入,也可從鍵盤(pán)逐個(gè)輸入學(xué)生記錄。學(xué)生記錄由學(xué)生的基本信息和成績(jī)信息字段構(gòu)成。當(dāng)從數(shù)據(jù)文件中讀入記錄時(shí),也就是把在以記錄為單位存儲(chǔ)的數(shù)據(jù)文件中,將記錄逐條復(fù)制到單鏈表中。
- 查詢記錄模塊。完成在單鏈表中查找滿足相關(guān)條件的學(xué)生記錄。在此成績(jī)管理系統(tǒng)中,用戶可以按照學(xué)生的學(xué)號(hào)或姓名在單鏈表中進(jìn)行查找。若找到該學(xué)生的記錄,則返回指向該學(xué)生的記錄的指針。否則返回一個(gè)值為NULL的空指針,并打印出未找到該學(xué)生記錄的提示信息。
- 更新記錄模塊。完成對(duì)學(xué)生記錄的維護(hù)。在此成績(jī)管理系統(tǒng)中,它實(shí)現(xiàn)了對(duì)學(xué)生記錄的修改、刪除、插入和排序操作,并將修改后的數(shù)據(jù)存入源數(shù)據(jù)文件。
- 統(tǒng)計(jì)記錄模塊。完成對(duì)各門功課最高分和不及格人數(shù)的統(tǒng)計(jì)。
- 輸出記錄模塊。一是實(shí)現(xiàn)對(duì)學(xué)生記錄的存盤(pán),即將記錄寫(xiě)入數(shù)據(jù)文件中;二是實(shí)現(xiàn)將記錄信息以表格的形式在屏幕上打印出來(lái)。
2.2 詳細(xì)設(shè)計(jì)
2.2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
- 學(xué)生成績(jī)信息結(jié)構(gòu)體
struct student
{
char num[10];?? /*學(xué)號(hào)*/
char name[15];? /*姓名*/
int cgrade;???? /*C語(yǔ)言成績(jī)*/
int mgrade;???? /*數(shù)學(xué)成績(jī)*/
int egrade;???? /*英語(yǔ)成績(jī)*/
int total;????? /*總分*/
float ave;????? /*平均分*/
int mingci;???? /*名次*/
};
結(jié)構(gòu)體struct student將用于存儲(chǔ)學(xué)生的基本信息,它將作為單鏈表的數(shù)據(jù)域。為了簡(jiǎn)化程序,只取了3門成績(jī)。
- 單鏈表node結(jié)構(gòu)體
typedef struct node
{
struct student data;? /*數(shù)據(jù)域*/
struct node *next;??? /*指針域*/
}Node,*Link;
這樣就定義了一個(gè)單鏈表的結(jié)構(gòu),data為struct student結(jié)構(gòu)類型的數(shù)據(jù),作為單鏈表結(jié)構(gòu)中的數(shù)據(jù)域,next為單鏈表中的指針域,用來(lái)存儲(chǔ)其直接節(jié)點(diǎn)的地址。
2.2.2 主控main()函數(shù)執(zhí)行流程
本成績(jī)管理系統(tǒng)執(zhí)行主流程如圖2.2所示。它先以可讀寫(xiě)的方式打開(kāi)數(shù)據(jù)文件,此文件默認(rèn)為“D:student”,若該文件不存在,則新建此文件。當(dāng)打開(kāi)文件操作成功后,從文件中一次讀出一條記錄,添加到新建的單薄鏈表中,然后執(zhí)行顯示主菜單和進(jìn)入主循環(huán)操作,進(jìn)行按鍵判斷。
在判斷鍵值時(shí),有效的輸入為本0至9之間的任意數(shù)值,其他輸入都被視為錯(cuò)誤按鍵。若輸入為0(即變量select=0),它會(huì)繼續(xù)判斷,如果對(duì)記錄進(jìn)行過(guò)更新操作,那么是否已經(jīng)保存過(guò)新的數(shù)據(jù),若沒(méi)有,則全局變量saveflage=1,系統(tǒng)會(huì)提示用戶是否需要進(jìn)行數(shù)據(jù)存盤(pán)操作,用戶輸入Y或y,系統(tǒng)會(huì)自動(dòng)進(jìn)行存盤(pán)操作后再執(zhí)行退出成績(jī)管理系統(tǒng)的操作。
若選擇1,則調(diào)用Add()函數(shù),執(zhí)行增加學(xué)生記錄操作;若選擇2,則調(diào)用Del()函數(shù),執(zhí)行刪除學(xué)生記錄操作;若選擇3,則調(diào)用Qur()函數(shù),執(zhí)行查詢學(xué)生記錄操作;若選擇4,則調(diào)用Modify()函數(shù),執(zhí)行修改學(xué)生記錄操作;若選擇5,則調(diào)用Insert()函數(shù),執(zhí)行插入學(xué)生記錄操作;若選擇6,則調(diào)用Tongji()函數(shù),執(zhí)行統(tǒng)計(jì)學(xué)生記錄操作;若選擇7,則調(diào)用Sort()函數(shù),執(zhí)行按降序排序?qū)W生記錄操作;若選擇8,則調(diào)用Save()函數(shù),執(zhí)行將學(xué)生記錄存入數(shù)據(jù)文件的操作;若選擇9,則調(diào)用Disp()函數(shù),執(zhí)行將學(xué)生記錄以表格形式打印輸出至屏幕的操作;若輸入為0~9之外的值,則調(diào)用Wrong()函數(shù),給出按鍵錯(cuò)誤的提示。
-
-
- 輸入記錄模塊
-
輸入記錄模塊主要實(shí)現(xiàn)將數(shù)據(jù)存入單鏈表中。當(dāng)從數(shù)據(jù)文件中讀出記錄時(shí),調(diào)用fread(p,sizeof(Node),1,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條學(xué)生成績(jī)記錄信息存入指針變量p所指的節(jié)點(diǎn)中的操作,并且該操作在main()函數(shù)中執(zhí)行,即當(dāng)成績(jī)管理系統(tǒng)進(jìn)入顯示菜單界面時(shí),該操作已經(jīng)執(zhí)行了。若該文件中沒(méi)有數(shù)據(jù),系統(tǒng)會(huì)提示單鏈表為空,沒(méi)有任何學(xué)生記錄可操作,此時(shí),用戶應(yīng)選擇1,調(diào)用Add()函數(shù),進(jìn)行學(xué)生記錄的輸入,即完成在單鏈表l中添加記錄的操作。值得一提的是,這里的字符串和數(shù)值的輸入分別采用了函數(shù)來(lái)實(shí)現(xiàn),在函數(shù)中完成輸入數(shù)據(jù)任務(wù),并對(duì)數(shù)據(jù)進(jìn)行條件判斷,直到滿足條件為止,這樣一來(lái),大大減少了代碼的重復(fù)和冗余,符合模塊化程序設(shè)計(jì)的特點(diǎn)。
-
-
- 查詢記錄模塊
-
查詢記錄模塊主要實(shí)現(xiàn)了在單鏈表中按學(xué)號(hào)或姓名查找滿足相關(guān)條件的學(xué)生記錄。在查詢函數(shù)Qur(l)中,l為指向保存了學(xué)生成績(jī)信息的單鏈表的首地址的指針變量。為了遵循模塊化編程的原則,我們將在單鏈表中進(jìn)行的指針定位操作,設(shè)計(jì)成了一個(gè)單獨(dú)的函數(shù)
Node *Locate(Link l,char findmess[],char nameornum[]),參數(shù)findmess[]保存要查找的具體內(nèi)容,nameornum[]保存要查找的字段(值為字符串類型的name或者num),若找到該記錄,則返回指向該節(jié)點(diǎn)的指針;否則,返回一個(gè)空指針。
資料借鑒于此?紛傳