摘 要:學(xué)生成績管理系統(tǒng)是學(xué)校用于管理學(xué)生成績的一個很重要的工具,設(shè)計學(xué)生管理系統(tǒng)是對C語言多方面知識的綜合訓(xùn)練。本文將運用C語言的知識建立一個簡易的學(xué)生管理系統(tǒng),旨在提高C語言編程能力以及通過編程解決實際問題的能力。該系統(tǒng)主要采用了結(jié)構(gòu)體來建立和存儲學(xué)生的學(xué)號、成績等個人信息,并用鏈表與指針的知識,結(jié)合冒泡排序的思想方法,設(shè)計函數(shù),使其具有新建、排序、查詢、插入與刪除等多個功能。同時,該系統(tǒng)操作簡便,只需用戶輸入學(xué)生的相關(guān)信息,并輸入所選操作的序號即可進行相關(guān)操作。
關(guān)鍵詞:學(xué)生成績管理;C語言;程序設(shè)計;C-Free
一、設(shè)計目的
1.鞏固和加深對c語言知識的理解和掌握
2.提高利用c語言進行編程和運行的能力
3.學(xué)會利用編程解決實際問題
二、功能模塊介紹
本學(xué)生成績管理系統(tǒng)主要包括以下幾點功能:
1.新建數(shù)據(jù)2.添加數(shù)據(jù)3.刪除數(shù)據(jù)4.排序5.查詢6.退出
其中新建數(shù)據(jù)用于用戶輸入學(xué)生的個人信息(學(xué)號和名字)及成績(數(shù)學(xué)和程序設(shè)計兩科成績);添加數(shù)據(jù)和刪除數(shù)據(jù)便于用戶對數(shù)據(jù)的增刪;而排序(包括數(shù)學(xué)成績、程序設(shè)計成績以及總分成績)可以通過不同的排序依據(jù)使用戶更方便了解學(xué)生各科總體水平以及高分和低分;查詢則包括按學(xué)號查詢、姓名查詢、成績查詢,其中成績查詢還有統(tǒng)計的功能,即輸入指定分數(shù),程序運行后顯示該科目中考試成績大于等于指定分數(shù)的學(xué)生并統(tǒng)計滿足條件的人數(shù)。
三、數(shù)據(jù)結(jié)構(gòu)描述
本系統(tǒng)采用結(jié)構(gòu)體的形式和鏈表的數(shù)據(jù)結(jié)構(gòu)建立學(xué)生的個人信息檔案,主要內(nèi)容如下:
struct student
{
char num[20];
char name[20];
int math_score;
int program_score;
int sum_score;
struct student *next;
}stu[N];
其中學(xué)號和姓名為字符串類型,方便輸入;成績?yōu)檎?,?shù)學(xué)成績和程序設(shè)計成績由用戶輸入,總分由系統(tǒng)根據(jù)用戶所輸計算;N為符號常量和全局變量,用戶可隨時改變學(xué)生人數(shù)。采用結(jié)構(gòu)體的形式,適應(yīng)了學(xué)生數(shù)據(jù)類型多樣性的特點,鏈表類型的數(shù)據(jù)結(jié)構(gòu)可以方便的插入或刪除數(shù)據(jù),較為靈活方便。
四、函數(shù)程序介紹
程序按照系統(tǒng)功能分為七大模塊,分別是:主函數(shù),新建數(shù)據(jù)函數(shù),添加數(shù)據(jù)函數(shù),刪除數(shù)據(jù)函數(shù),排序函數(shù),查詢函數(shù)以及輸出函數(shù)。
主函數(shù):在主函數(shù)中對各函數(shù)進行聲明,顯示系統(tǒng)主界面,根據(jù)用戶的不同選擇調(diào)用不同的函數(shù)。同時對主函數(shù)采用do while的循環(huán),使系統(tǒng)執(zhí)行完一次操作后自動跳出主菜單,方便用戶使用。
新建函數(shù):用malloc函數(shù)創(chuàng)建鏈表空間,提示用戶輸入學(xué)生數(shù)據(jù),讀入鏈表。
添加數(shù)據(jù)函數(shù):提示用戶輸入添加的數(shù)據(jù),根據(jù)學(xué)號從小到大排序的原則,用strcmp函數(shù)對添加的學(xué)號和已有的學(xué)號比較,定位后用鏈表指針插入。完成后提示添加數(shù)據(jù)成功。該函數(shù)有兩個參數(shù),head為已創(chuàng)建的鏈表的頭指針,stud是用戶要插入的數(shù)據(jù)的指針。
刪除數(shù)據(jù)函數(shù):與添加數(shù)據(jù)類似,讓用戶輸入想要刪除的數(shù)據(jù)的學(xué)號,用strcmp函數(shù)對想刪除的學(xué)號和已有的學(xué)號比較,相等時通過改變指針方向同時用free函數(shù)釋放所刪除數(shù)據(jù)的空間實現(xiàn)刪除功能。完成后提示刪除數(shù)據(jù)成功。該函數(shù)有兩個參數(shù),head為已創(chuàng)建的鏈表的頭指針,num是用戶想要刪除的數(shù)據(jù)的學(xué)號,用num與已有數(shù)據(jù)的學(xué)號進行比對、定位。
排序函數(shù):結(jié)合了冒泡排序和鏈表,將學(xué)生的成績降序排列,最后用輸出函數(shù)輸出。該函數(shù)的參數(shù)是已有鏈表的頭指針,將鏈表排序后,仍返回頭指針,用輸出函數(shù)輸出。
查詢函數(shù):按學(xué)號和姓名查詢時,用strcmp函數(shù)對字符串進行比較,相等時輸入該學(xué)號或姓名所對應(yīng)的學(xué)生的全部信息;按成績查詢函數(shù),在前兩個的基礎(chǔ)上,添加了統(tǒng)計功能。因此定義一個計算個數(shù)的變量,在循環(huán)結(jié)束后輸出。該函數(shù)的參數(shù)是已有鏈表的頭指針,根據(jù)用戶的查詢要求,找到符合要求的數(shù)據(jù)后,返回頭指針,用輸出函數(shù)輸出。
輸出函數(shù):所有子函數(shù)的返回值都由輸出函數(shù)輸出。輸出函數(shù)有兩個,一個是用循環(huán)輸出鏈表所有數(shù)據(jù),用于新建數(shù)據(jù)和排序結(jié)果的輸出;一個只輸出鏈表中一個成員的數(shù)據(jù),用于添加、刪除數(shù)據(jù)以及查詢函數(shù)的返回值的輸出。其他函數(shù)通過返回頭指針,傳到該函數(shù)的參數(shù)head中,并輸出鏈表中的信息。
五、系統(tǒng)調(diào)試的重點與難點
該系統(tǒng)主要運用了結(jié)構(gòu)體、函數(shù)、動態(tài)鏈表與指針的知識,都屬于C語言中較難的知識,也是運用C語言編程的必備知識,同時對于冒泡排序的思想與系統(tǒng)的整體設(shè)計也要有一個清晰的結(jié)構(gòu)框架,這些都是這個系統(tǒng)的核心部分。
以下是在調(diào)試中遇到的具體問題(節(jié)選):
①輸入函數(shù)中輸出的結(jié)構(gòu)體指針所指向的內(nèi)容(非數(shù)組)沒有加取地址符,導(dǎo)致程序停止運行;
②輸出函數(shù)中輸出的結(jié)構(gòu)體指針所指向的內(nèi)容(非數(shù)組)沒有加取地址符,導(dǎo)致輸出一串亂碼;
③插入函數(shù)沒有用循環(huán)而是選擇進行數(shù)據(jù)定位,導(dǎo)致函數(shù)功能無法實現(xiàn);
④忽略了學(xué)號和姓名是字符數(shù)組,直接用等于號進行賦值而不是strcpy或strcmp等字符串處理函數(shù),編譯過程出現(xiàn)錯誤;
六、系統(tǒng)設(shè)計的體會與總結(jié)
通過做這個學(xué)生成績管理系統(tǒng),我對結(jié)構(gòu)體、鏈表、指針、函數(shù)等知識有了更深的領(lǐng)悟。
手指在鍵盤上飛快劃過,看著一個個字符,一條條程序語句,一塊塊函數(shù)模塊從屏幕中閃現(xiàn);與此同時,一次次錯誤,一次次盯著代碼找原因,一次次失敗也讓人接近崩潰,但當一個函數(shù)成功實現(xiàn)某種功能,或者某個很難發(fā)現(xiàn)的錯誤在經(jīng)歷了無數(shù)次的檢查與校對終于被發(fā)現(xiàn)并被正確改正后,那種喜悅感與成就感是別人無法體會的。
當然,由于本人所學(xué)有限,做的成績系統(tǒng)也只是初步的,功能不夠齊全,界面也不夠完善。以后會學(xué)到更難的知識,遇到更復(fù)雜的編程系統(tǒng),希望以后也能不急不躁,耐心編碼。
作者簡介
唐葉爾(1999—),女,漢族,浙江溫州人,學(xué)生,本科,浙江師范大學(xué)初陽學(xué)院,軟件工程專業(yè)。
(作者單位:浙江師范大學(xué)初陽學(xué)院)