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