學(xué)生成績管理系統(tǒng)(2)_第1頁
學(xué)生成績管理系統(tǒng)(2)_第2頁
學(xué)生成績管理系統(tǒng)(2)_第3頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、設(shè)計(jì)題目:學(xué)生成績管理系統(tǒng)院系:電子工程系班級:電嵌Q0941實(shí)驗(yàn)人:趙婷婷學(xué)號:091602009實(shí)驗(yàn)指導(dǎo)老師:李俊目錄.課程設(shè)計(jì)任務(wù)Q書3*.內(nèi)容提要4三.正文51.設(shè)計(jì)目的-52.總體設(shè)計(jì)-53.詳細(xì)設(shè)計(jì)64.調(diào)試與測試35.源碼和運(yùn)1行結(jié)果13文獻(xiàn)四參考35五課 程 設(shè) 計(jì)35嵌入式程序課程設(shè)計(jì)任務(wù)書、題目:學(xué)生成績管理系統(tǒng)設(shè)計(jì)、內(nèi)容與要求學(xué)生成績信息包括:學(xué)期,學(xué)號,班別,姓名,四門課程成績(語文、數(shù)學(xué)、英語和計(jì)算機(jī))等。主要功能:(1)能按學(xué)期、按班級完成對學(xué)生成績的錄入、修改(2)能按班級統(tǒng)計(jì)學(xué)生的成績,求學(xué)生的總分及平均分(3)能查詢學(xué)生成績,不及格科目及學(xué)生名單(4)能按班級

2、輸出學(xué)生的成績單要求:使用二進(jìn)制文件方式存儲數(shù)據(jù)、三、地點(diǎn):實(shí)驗(yàn)2號樓4層硬件實(shí)驗(yàn)室四、時(shí)間安排:第6-18周星期五的12節(jié)五、班級與指導(dǎo)老師:六、參考資料電嵌Q0941班;指導(dǎo)教師:李?。ㄗ约貉a(bǔ)充)內(nèi)容提要學(xué)生成績管理系統(tǒng)可以說是每個(gè)教育單位的得力助手,它利用計(jì)算機(jī)對學(xué)生 成績進(jìn)行統(tǒng)一管理,實(shí)現(xiàn)學(xué)生成績信息管理工作流程的系統(tǒng)化、 規(guī)范化和自動(dòng)化, 提高了廣大教師的工作效率。該設(shè)計(jì)報(bào)告圍繞學(xué)生成績管理系統(tǒng)的源代碼,展開一系列豐富的功能介紹和 操作細(xì)節(jié)。其功能主要有五大板塊組成:輸入記錄模塊、查詢記錄模塊、更新記 錄模塊、統(tǒng)計(jì)記錄模塊和輸出記錄模塊。每一功能模塊中又包含一系列具體功能, 如:從文

3、件讀入或從鍵盤輸入學(xué)生的基本信息, 按學(xué)號或者姓名查找已存在的記 錄,對存在的記錄進(jìn)行修改、刪除、插入、排序,統(tǒng)計(jì)所有學(xué)生信息中的最高分、 不及格人數(shù)等,基本上涵蓋了學(xué)生成績管理系統(tǒng)所應(yīng)該具備的基本操作。為了使廣大讀者對該系統(tǒng)有更好的了解,此報(bào)告還列舉出了程序代碼中的一 系列具體函數(shù)以及它的作用及功能。下面列舉源代碼中的部分函數(shù):1) prin theader()函數(shù)原型:void prin theader()該函數(shù)用于在以表格形式顯示學(xué)生記錄時(shí),打印輸出表頭信息。2) stringinput()函數(shù)原型: void stri ngin put(char *t,i nt len s,char

4、*no tice)該函數(shù)用于輸入字符串,并進(jìn)行字符串長度驗(yàn)證。T用于保存輸入的字符串, 因?yàn)槭且灾羔樞问絺鬟f的,所以t相當(dāng)于該函數(shù)的返回值。3) Disp()函數(shù)原型:void Disp(li nk l)該函數(shù)用于顯示單鏈表l中存儲學(xué)生的記錄,內(nèi)容為student結(jié)構(gòu)中定義的 內(nèi)容。4) Add()函數(shù)原型:void Add(li nk l)該函數(shù)用于在單鏈表l中增加學(xué)生記錄的節(jié)點(diǎn)。整個(gè)分析過程可在后面內(nèi)容中詳細(xì)了解, 這里僅列舉幾個(gè)提供說明。該報(bào)告 同時(shí)含有源代碼的運(yùn)行結(jié)果以及調(diào)試和出錯(cuò)分析。 由于時(shí)間、經(jīng)驗(yàn)及水平的原因, 報(bào)告中難免有不足和錯(cuò)誤之處,敬請批評指正。一. 設(shè)計(jì)目的本程序旨在訓(xùn)

5、練讀者的基本編程能力,了解管理信息開發(fā)系統(tǒng)的開發(fā)流程,熟悉C語言的文件和單鏈表的各種基本操作。本程序中設(shè)計(jì)結(jié)構(gòu)體、單鏈表、文 件等方面的知識。通過本程序的訓(xùn)練,使讀者能對C語言的文件操作有一個(gè)更深 刻的了解,掌握利用單鏈表存儲結(jié)構(gòu)實(shí)現(xiàn)對學(xué)生成績管理的原理,為進(jìn)一步開發(fā)出高質(zhì)量的信息管理系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。二. 總體設(shè)計(jì)此成績管理系統(tǒng)主要利用單鏈表實(shí)現(xiàn),它有如下五大功能模塊組成。其功能 模塊圖如下所示。(1) 輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入單鏈表的工作中。在 此成績管理系統(tǒng)中,記錄可以從以二進(jìn)制形式存儲的數(shù)據(jù)文件中讀入,也可從鍵盤逐個(gè)輸入學(xué)生記錄。學(xué)生記錄由學(xué)生的基本信息和成績信息

6、字段組成。當(dāng)從數(shù) 據(jù)文件中讀入記錄時(shí),它就是在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復(fù) 制到單鏈表中。(2) 查詢記錄模塊。查詢記錄模塊主要完成在單鏈表中查找滿足相關(guān)條件的 學(xué)生記錄。在此成績管理系統(tǒng)中,用戶可以按照學(xué)生的學(xué)號獲姓名在單鏈表中進(jìn) 行查找。若找到該學(xué)生的記錄,則返回指向該學(xué)生的記錄的指針。否則,返回一 個(gè)值為NULL的空指針,并打印出未找到該學(xué)生記錄的信息。(3) 更新記錄模塊。更新記錄模塊主要完成對學(xué)生記錄的維護(hù)。在此成績管理系統(tǒng)中,它實(shí)現(xiàn)了對學(xué)生記錄的修改、刪除、插入和排序操作。一般而言,系 統(tǒng)進(jìn)行著修操作后,需要將修改的數(shù)據(jù)存入原數(shù)據(jù)文件。(4) 統(tǒng)計(jì)記錄模塊。統(tǒng)計(jì)記錄模

7、塊主要完成對個(gè)門功課最高分和不及格人數(shù) 的統(tǒng)計(jì)。(5) 輸出記錄模塊。輸出記錄模塊主要完成兩個(gè)任務(wù)。第一,它實(shí)現(xiàn)對學(xué)生 記錄的存盤操作,即將單鏈表中的各節(jié)點(diǎn)中存儲的學(xué)生記錄信息寫入數(shù)據(jù)文件中。第二,它實(shí)現(xiàn)將單鏈表中的學(xué)生記錄信息以表格的形式在屏幕上打印出來。三. 詳細(xì)設(shè)計(jì)1. 主控main()函數(shù)執(zhí)行流程本成績管理系統(tǒng)執(zhí)行流程如圖所示。它先以可讀寫的方式打開數(shù)據(jù)文件, 此文件默認(rèn)為“ c:student ” ,若干文件不存在,則新建此文件。當(dāng)打開文件操 作成功后,從文件中一次讀出一條記錄,添加到新建的單鏈表中,然后執(zhí)行顯示 主菜單和進(jìn)入主循環(huán)操作,進(jìn)行按鍵判斷。在判斷鍵值時(shí),有效的輸入為0至9

8、之間的任意數(shù)值,其他輸入都視為錯(cuò) 誤按鍵。若輸入為0 (即變量select=0),它會繼續(xù)判斷是否在對記錄進(jìn)行更新 操作之后進(jìn)行了存盤操作,若未存盤,則全局變量saveflag=1,系統(tǒng)會提示用戶 是否需要進(jìn)行存盤操作,用戶輸入 丫或y,系統(tǒng)會進(jìn)行存盤操作。最后,系統(tǒng)執(zhí) 行推出成績管理系統(tǒng)操作。若選擇1,則調(diào)用Add()函數(shù),執(zhí)行增加學(xué)生記錄操作;若選擇 2,則調(diào)用Del()函數(shù),執(zhí)行刪除學(xué)生記錄操作;若選擇3,貝碉用Qur()函數(shù),執(zhí)行查詢學(xué) 生記錄操作;若選擇4,則調(diào)用Modify(0函數(shù),執(zhí)行修改學(xué)生記錄操作;若選 擇5,則調(diào)用Insert()函數(shù),執(zhí)行插入學(xué)生記錄操作;若選擇6,則調(diào)用

9、Tongji() 函數(shù),執(zhí)行統(tǒng)計(jì)學(xué)生記錄操作;若選擇7,則調(diào)用Sort()函數(shù),執(zhí)行按降序排序 學(xué)生記錄的操作;若選擇8,則調(diào)用Save()函數(shù),執(zhí)行將學(xué)生記錄存入磁盤中的 數(shù)據(jù)文件的操作;若選擇9,則調(diào)用Disp()函數(shù),執(zhí)行將學(xué)生記錄以表格形式打 印輸出至屏幕的操作;若輸入為 09之外的值,則調(diào)用 Wrong()函數(shù),給出按鍵 錯(cuò)誤的提示。2. 輸入記錄模塊輸入記錄模塊主要實(shí)現(xiàn)將數(shù)據(jù)存入單鏈表中。這部分的操作較為簡單。當(dāng)從數(shù)據(jù)文件中讀出記錄時(shí),它調(diào)用fread(p,sizeof(Node),1,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條學(xué)生成績記錄信息存入指針變量P所指向節(jié)點(diǎn)中的操作,并

10、且這個(gè)操作在main()中執(zhí)行,即當(dāng)成績管理系統(tǒng)進(jìn)入顯示菜單界面時(shí), 該操作已經(jīng)執(zhí)行了。若該文件中沒有數(shù)據(jù),系統(tǒng)會提示單鏈表為空,沒有任何學(xué) 生記錄可操作,此時(shí),用戶應(yīng)選擇 1,調(diào)用Add(1)函數(shù),進(jìn)行學(xué)生記錄的輸入, 即完成在單鏈表1中添加節(jié)點(diǎn)的操作。3. 查詢記錄模塊查詢記錄模塊主要實(shí)現(xiàn)了在單鏈表中按學(xué)號或姓名查找滿足相關(guān)條件的學(xué) 生記錄。在查詢函數(shù)Qur中,1為指向保存了學(xué)生成績信息的單鏈表的首地址 的指針變量。為了遵循模塊化編程的原則,我們將在單鏈表中進(jìn)行的指針定位操 作設(shè)計(jì)成了一個(gè)單獨(dú) 的函數(shù) Node* Locate(Link 1,char findmess,char nameo

11、rnum),參數(shù)findmess保存到要查找的具體內(nèi)容,nameornum保存要 查找的字段(值為字符串類型的num或者name ,若找到該記錄,則返回指向該 節(jié)點(diǎn)的指針;否則,返回一個(gè)空指針。4. 更新記錄模塊此模塊主要實(shí)現(xiàn)了對學(xué)生記錄的修改、 刪除、插入和排序操作。因?yàn)閷W(xué)生記 錄是以單鏈表的結(jié)構(gòu)形式存儲的,所以這些操作都在單鏈表中完成。下面分別介 紹這四個(gè)功能模塊。1) 修改記錄修改記錄操作需要對單鏈表中目標(biāo)節(jié)點(diǎn)的數(shù)據(jù)域中的值進(jìn)行修改,它分兩步 完成。第一步,輸入要修改的學(xué)號,輸入后調(diào)用定位函數(shù)Locate()在單鏈表 中逐個(gè)對節(jié)點(diǎn)數(shù)據(jù)域中學(xué)好字段的值進(jìn)行比較,直到找到該學(xué)好的學(xué)生記錄;

12、第二步,若找到該學(xué)生記錄,修改除學(xué)號之外的各字段的值,并將存盤標(biāo)記 變量saveflag置1,表示已經(jīng)對記錄進(jìn)行了修改,但還未執(zhí)行存盤操作。2)刪除記錄刪除記錄操作完成刪除制定學(xué)號或姓名的學(xué)生記錄,它也分兩步完成。第一 步,輸入要?jiǎng)h除的學(xué)號或姓名,輸入后調(diào)用定位函數(shù)Locate()在單鏈表中逐 個(gè)對節(jié)點(diǎn)數(shù)據(jù)域中的學(xué)號或姓名字段的值進(jìn)行比較,知道找到該學(xué)號或姓名 的記錄,返回指向該學(xué)生記錄的節(jié)點(diǎn)指針;第二步,若找到該學(xué)生記錄,將 該學(xué)生記錄所在節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)的指針域指向目標(biāo)節(jié)點(diǎn)后的后繼節(jié)點(diǎn)。3)插入記錄插入學(xué)生記錄操作完成在制定學(xué)號的隨后位置插入新的學(xué)生記錄。首先,它要求用戶輸入某個(gè)學(xué)生的學(xué)號,

13、新的記錄將插入在該學(xué)生記錄之后;然后, 提示用戶輸入一條新的學(xué)生記錄的信息,這些信息保存在新節(jié)點(diǎn)的數(shù)據(jù)域中; 最后,將該節(jié)點(diǎn)插入在指定位置學(xué)號之后。它的就具體插入執(zhí)行過程如圖6.3 所示,圖中q為位置學(xué)號所在節(jié)點(diǎn)的指針變量,其中,p為q所指節(jié)點(diǎn)的后 繼節(jié)點(diǎn)的指針變量,q >next=p,指針變量i指向新記錄所在的節(jié)點(diǎn),為插入 節(jié)點(diǎn)i,依次執(zhí)行的操作為:i->next=q->next;q->next=i。4)排序記錄有關(guān)排序的算法有很多,如冒泡排序、插入排序等。針對單鏈表結(jié)構(gòu)的特點(diǎn), 我們用插入排序算法實(shí)現(xiàn)按總分的從高到低對學(xué)生記錄進(jìn)行排序,排序完成 之后,即可按順序給名

14、次字段賦值。在單鏈表中,實(shí)現(xiàn)插入排序的基本步驟如下。(1) 新建一個(gè)單鏈表1,用來保存排序結(jié)果,其初始值為待排序單鏈表中 的頭節(jié)點(diǎn)。(2) 從待排序鏈表中取出下一個(gè)節(jié)點(diǎn),將其總分字段值與單鏈表1中的各節(jié)點(diǎn)中總分字段的值進(jìn)行比較,知道在鏈表 1中找到總分小于它的節(jié) 點(diǎn)。若找到如此節(jié)點(diǎn),系統(tǒng)將待排序鏈表中取出的節(jié)點(diǎn)插入此節(jié)點(diǎn)前, 作為其前驅(qū)。否則,將取出的節(jié)點(diǎn)放在單鏈表1的尾部。(3) 重復(fù)第(2)步,知道從待排序鏈表取出的節(jié)點(diǎn)的指針域?yàn)镹ULL即此節(jié)點(diǎn)為鏈表的尾部節(jié)點(diǎn),排序完成5. 統(tǒng)計(jì)記錄模塊該模塊的實(shí)現(xiàn)比較簡單,它主要通過循環(huán)讀取指針變量p所指的當(dāng)前節(jié)點(diǎn)的 數(shù)據(jù)域中各字段的值,并對各個(gè)成績字

15、段進(jìn)行逐個(gè)判斷的形式, 完成單科成績最 高分學(xué)生的查找和各科不及格人數(shù)的統(tǒng)計(jì)。6. 輸出記錄模塊當(dāng)把記錄輸出至文件時(shí),調(diào)用fwrite(p,sizeof(Node),1,fp) 函數(shù),將p指 針?biāo)腹?jié)點(diǎn)中的各字段值,寫入文件指針fp所指的文件。當(dāng)把記錄輸出值屏幕時(shí),調(diào)用void Disp(Link l)函數(shù),將單鏈表1中存儲的學(xué)生記錄信息以表格的 形式在屏幕上打印出來。7. 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)學(xué)生成績信息結(jié)構(gòu)體typedef struct stude nt保存學(xué)號保存姓名 保存C語言成績 保存數(shù)學(xué)成績 保存英語成績保存總分 保存平均分 保存名次char num10; /char n ame15; /

16、int cgrade; /int mgrade; /int egrade;int total;float ave;int min gci;單鏈表node結(jié)構(gòu)體typedef struct nodestruct stude nt data;struct node *n ext;Node,*Li nk;這里定義了一個(gè)單鏈表的結(jié)構(gòu),結(jié)構(gòu)標(biāo)記為node,data為student結(jié)構(gòu)類型 的數(shù)據(jù),作為單鏈表結(jié)構(gòu)中的數(shù)據(jù)域,next為單鏈表中的指針域,用來存儲其 直接后繼節(jié)點(diǎn)的地址。Node為node類型的結(jié)構(gòu)變量,*Link為node類型的指針 變量。具體函數(shù)功能描述1) printheader()函數(shù)

17、原型:void prin theader()prin theader()函數(shù)用于在以表格形式顯示學(xué)生記錄時(shí),打印輸出表頭信息。2) printdata()函數(shù)原型:void prin tdata(Node *pp)printdata()函數(shù)用于以表格形式顯示學(xué)生記錄時(shí),打印輸出單鏈表pp中的學(xué)生 信息。3) stringinput()函數(shù)原型: void stri ngin put(char *t,i nt lens, char *no tice)stringinput() 函數(shù)用于輸入字符串,并進(jìn)行字符串長度驗(yàn)證(長度<lens )。t用于保存輸入的字符串,因?yàn)槭且灾羔樞问絺鬟f的,所以

18、t相當(dāng)于該函數(shù)的返回 值。notice用于保存printf()中輸出的提示信息。4) Numberi nput()函數(shù)原型:int nu mberi nput(char *no tice)numberinput()函數(shù)用于輸入數(shù)值型數(shù)據(jù),notice用于保存printf() 中輸出的提示信息,該函數(shù)返回用戶輸入的整型數(shù)據(jù)。5) Disp()函數(shù)原型:void Disp(Li nk l)Disp()函數(shù)用于顯示單鏈表l中存儲的學(xué)生記錄,內(nèi)容為student結(jié)構(gòu)中定義的 內(nèi)容。6) Locate()函數(shù)原型: Node* Locate(Link l,char findmess,char nameo

19、rnum)Locate()函數(shù)用于定位鏈表中符合要求的節(jié)點(diǎn),并返回指向該節(jié)點(diǎn)的指針。參數(shù) findmess保存要查找的具體內(nèi)容,nameornum保存按什么字段在單鏈表l中 查找。7) Add()函數(shù)原型:void Add(Li nk l)Qur()函數(shù)用于在單鏈表l中增加學(xué)生記錄的節(jié)點(diǎn)。8) Qur()函數(shù)原型:void Qur(Li nk l)Qur()函數(shù)用于先在單鏈表I中按學(xué)號或姓名查找滿足條件的記錄,并顯示出來。9) Del()函數(shù)原型:void DeI(L ink I)Del()函數(shù)用于先在單鏈表I中找到滿足條件的學(xué)生記錄的節(jié)點(diǎn),然后刪除該節(jié) 點(diǎn)。10) Modify()函數(shù)原型:

20、void Modify(Li nk I)Modify()函數(shù)用于在單鏈表I中修改學(xué)生記錄。11) 1 nsert()函數(shù)原型:void In sert(Li nk I)Insert()函數(shù)用于在單鏈表I中插入學(xué)生記錄。12) To ngji()函數(shù)原型:void Tongji(Link I)Tongji()函數(shù)用于在單鏈表I中完成學(xué)生記錄的統(tǒng)計(jì)工作,統(tǒng)計(jì)該班的總分第一 名、單科第一名和各科不及格人數(shù)。13) Sort()函數(shù)原型:void Sort(Li nk I)Sort()函數(shù)用于在單鏈表I中完成利用插入排序算法實(shí)現(xiàn)單鏈表的按總分字段 的降序排序。14) Save()函數(shù)原型:void S

21、ave(Li nk I)Save()函數(shù)用于在單鏈表I中的數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件。15) 主函數(shù)main()整個(gè)成績管理系統(tǒng)控制部分。四. 調(diào)試與測試打開隨書光盤,將光盤中的學(xué)生成績管理系統(tǒng)源代碼轉(zhuǎn)至運(yùn)行環(huán)境中,開始運(yùn)行測試,運(yùn)行過程中出現(xiàn)兩個(gè)問題,問題描述及解決方法如下:1. 源代碼中出現(xiàn)兩個(gè)系統(tǒng)無法調(diào)用的函數(shù)textcolor() 和gotoxy(),這兩個(gè)函數(shù)的作用是:在文本模式中選擇新的字符顏色和在文本窗口中設(shè)置光標(biāo)。 因?yàn)檫@兩個(gè)功能對系統(tǒng)影響不大,故可以將這兩個(gè)函數(shù)刪掉,使程序正常運(yùn)行。2. 進(jìn)入運(yùn)行結(jié)果界面,按代碼中的輸入順序?qū)δ硞€(gè)學(xué)生輸入計(jì)算機(jī)成績98,輸入英語成績86,打印結(jié)

22、果卻為:計(jì)算機(jī)成績 86,英語成績98。導(dǎo)致這種現(xiàn)象 發(fā)生,其原因很有可能是源代碼中的輸出模塊中的egrade和cgrade順序反了?;氐皆创a,仔細(xì)觀察輸出模塊,將會發(fā)現(xiàn)Disp()函數(shù)中調(diào)用了 printdata()函數(shù)用于輸出有效數(shù)據(jù),而prin tdata()函數(shù)中引用了預(yù)處理中的 DATA格式,而在宏定義DATA中 egrade和cgrade的順序果然反了,至此檢查出錯(cuò)誤的根本。 更正后,程序正常運(yùn)行。五. 源碼和運(yùn)行結(jié)果1. 源代碼#in clude "stdio.h" /*標(biāo)準(zhǔn)輸入輸出函數(shù)庫*/#include "stdlib.h" /*標(biāo)

23、準(zhǔn)函數(shù)庫*/#include "string.h" /*#in clude "con io.h" /*字符串函數(shù)庫*/屏幕操作函數(shù)庫*/#defi neHEADER1IISTUDENTn"#define HEADER2 | number | name |Comp|Math|Eng| yuw| sum|ave |mici|n"#defi neHEADER3"|1|-|-T-|-|-|-T-|n "#defi ne FORMAT "|%-10s|%-15s|%4d|%4d|%4d|%4d|%4d|%4.1f|

24、%4d|n"#defi neDATA p->data .nu m,p->data .n ame,p->data.cgrade,p->data.mgrade,p->data.egrade,p->data. yuw,p->data.total,p->data.ave,p->data. min gci#defi neENDn"int saveflag=0; /*是否需要存盤的標(biāo)志變量*/typedef struct stude nt/*char num10;/*char name15; /*標(biāo)記為student*/學(xué)號*/姓名

25、*/int cgrade;/*Cint mgrade;/*int egrade;/*int yuw;/*int total;/*float ave; /*int mi ngci; /*語言成績*/數(shù)學(xué)成績*/英語成績*/ 語文成績*/總分*/平均分*/名次*/int clas; /*班級*/stude nt;/*定義每條記錄或結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu),標(biāo)記為:node*/typedef struct nodestruct student data; /*數(shù)據(jù)域 */struct node *next; /*指針域 */Node,*Link; /*Node 為node類型的結(jié)構(gòu)變量,*Link為node類

26、型的指針變量*/void menu() /* 主菜單 */system("cls"); /* 調(diào)用 DOS命令,清屏.與 clrscr()功能相同 */cpri ntf(”The Stude nts' Grade Man ageme nt System n ”);cpri ntf(”*Me nu *n")cpri ntf(”*1 in putrecord2 deleterecord*n ”);cpri ntf(”*3 searchrecord4 modifyrecord*n ”);cpri ntf(”*5 in sertrecord6 cou ntreco

27、rd*n ”);cpri ntf(”*7 sortreord8 saverecord*n ”);cpri ntf(”*9 display record0 quitsystem*n ”);cpri ntf(”格式化輸出表頭*/*n") void prin theader() /*prin tf(HEADER1);prin tf(HEADER2);prin tf(HEADER3); void prin tdata(Node *pp)/*格式化輸出表中數(shù)據(jù) */Node* p;P=PP;prin tf(FORMAT,DATA);void Wron g() /* 輸出按鍵錯(cuò)誤信息*/prin

28、 tf("nnnnn *Error:i nputhas wrong! press any key tocontinu e*n");getchar();void Nofi nd() /* 輸出未查找此學(xué)生的信息 */prin tf("n=>Not find this stude nt!n");void Disp(Link l) /*顯示單鏈表I中存儲的學(xué)生記錄,內(nèi)容為 student結(jié)構(gòu)中定義的內(nèi)容*/Node *p;p=l-> next; /*l存儲的是單鏈表中頭結(jié)點(diǎn)的指針,該頭結(jié)點(diǎn)沒有存儲學(xué)生信息,指針域指向的后繼結(jié)點(diǎn)才有學(xué)生信息*/if(

29、!p) /*p=NULL,NUII 在 stdlib 中定義為 0*/prin tf("n=>Not stude nt record!n");getchar();return;prin tf("nn");printheader(); /* 輸出表格頭部*/while(p) /*逐條輸出鏈表中存儲的學(xué)生信息*/prin tdata(p);p=p-> next; /*移動(dòng)直下一個(gè)結(jié)點(diǎn)*/prin tf(HEADER3);getchar();/*作用:用于定位鏈表中符合要求的節(jié)點(diǎn),并返回指向該節(jié)點(diǎn)的指針參數(shù):findmess保存要查找的具體內(nèi)容 ;

30、nameornum保存按什么查找;在單鏈表I中查找;*/Node* Locate(Link l,char findmess,char nameornum)Node *r;if(strcmp(nameornum,"num")=0) /*按學(xué)號查詢 */r=l->n ext;while(r)if(strcmp(r->data.num,findmess)=0) /*若找至U findmess 值的學(xué)號 */return r;r=r->n ext;else if(strcmp(nameornum,"name")=0) /*按姓名查詢 */r=l

31、->n ext;while(r)if(strcmp(r->,findmess)=0) /*若找至U findmess 值的學(xué)生姓名*/ return r;r=r->n ext;return 0; /*若未找到,返回一個(gè)空指針*/*輸入字符串,并進(jìn)行長度驗(yàn)證(長度<lens)*/void stri ngin put(char *t,i nt le ns,char *no tice)char n255;doprintf(notice); /*顯示提示信息 */scanf("%s",n); /*輸入字符串 */if(strle n(n)

32、>le ns) prin tf("n exceed the required len gth! n ”); /*行長度校驗(yàn),超過lens值重新輸入*/while(strle n(n )>le ns);strcpy(t,n); /*將輸入的字符串拷貝到字符串t中*/*輸入分?jǐn)?shù),0< =分?jǐn)?shù)<=100)*/int nu mberi nput(char *no tice)int t=0;doprintf(notice); /*顯示提示信息 */scanf("%d",&t); /*輸入分?jǐn)?shù) */if(t>100 | t<0) p

33、rin tf("n score must in 0,100! n"); /*進(jìn)行分?jǐn)?shù)校驗(yàn)*/while(t>100 | t<0);return t;/*增加學(xué)生記錄*/void Add(Li nk l)Node *p,*r,*s; /*實(shí)現(xiàn)添加操作的臨時(shí)的結(jié)構(gòu)體指針變量*/char ch,flag=0,nu m10;r=l;s=l->n ext;system("cls");Disp(l); /*先打印出已有的學(xué)生信息*/while(r-> next!=NULL)r=r-> next; /*將指針移至于鏈表最末尾,準(zhǔn)備添加記錄

34、 */while(1) /*一次可輸入多條記錄,直至輸入學(xué)號為0的記錄結(jié)點(diǎn)添加操作*/while(1) /*輸入學(xué)號,保證該學(xué)號沒有被使用,若輸入學(xué)號為0,則退出添加記錄操作*/stri ngin put (nu m,10,"nin put nu mber(press '0'retur n menu):") ;/*格式化輸入學(xué)號并檢驗(yàn)*/flag=0;if(strcmp(num,"0")=0)/*輸入為0,則退出添加操作,返回主界面*/return; s=l->n ext;while(s) /*查詢該學(xué)號是否已經(jīng)存在,若存在則要求重

35、新輸入一個(gè)未被占用的學(xué)號*/if(strcmp(s->data. nu m, nu m)=0)flag=1;break;s=s->n ext;if(flag=1)/*提示用戶是否重新輸入*/getchar();prin tf("=>The agai n?(y/n):", num);nu mber %s isnot existi ng,try elsescan f("%c",&ch); if(ch='y'|ch='Y') con ti nue;elsereturn;break;p=(Node *)m

36、alloc(sizeof(Node); /*申請內(nèi)存空間 */if(!p)prin tf("n allocate memory failure "); /*如沒有申請到,打印提示信息*/return ;/*返回主界面*/strcpy(p->data.num,num); /*將字符串 num拷貝至U p->data.num 中*/stri ngin put(p->data .n ame,15,"Name:");p->data.cgrade=nu mberi nput("C Ian guage Score0-100:&quo

37、t;); /*輸入并檢驗(yàn)分?jǐn)?shù),分?jǐn)?shù)必須在0100之間*/p->data.mgrade=n umberi nput("Math Score0-100:"); /*分?jǐn)?shù)必須在0 100之間*/p->data.egrade=numberinput("English Score0-100:"); /*分?jǐn)?shù)必須在0 100之間*/輸入并檢驗(yàn)分?jǐn)?shù),輸入并檢驗(yàn)分?jǐn)?shù),p->data.yuw=nu mberi nput("yuw Score0-100:");/*輸入并檢驗(yàn)分?jǐn)?shù),分?jǐn)?shù)必須在0-100之間*/p->data.tota

38、l=p->data.egrade+p->data.cgrade+p->data.mgrade+p->data.yuw;/*計(jì)算總分*/p->data.ave=(float)(p->data.total/4); /*計(jì)算平均分 */p->data. min gci=0;p-> next=NULL; /* 表明這是鏈表的尾部結(jié)點(diǎn)*/r->n ext=p; /*將新建的結(jié)點(diǎn)加入鏈表尾部中*/r=p; saveflag=1;return ;void Qur(Li nk I) /*按學(xué)號或姓名,查詢學(xué)生記錄*/int select; /*1:按學(xué)號查

39、,2:按姓名查,其他:返回主界面(菜單) */char search in put20; /*保存用戶輸入的查詢內(nèi)容*/Node *p;if(!l->next) /*若鏈表為空 */system("cls");printf("n=>No student record!n");getchar();return;system("cls");prin tf("n=>1 Search by nu mber =>2 Search by n amen");prin tf(" please ch

40、oice1,2:");scan f("%d", &select);if(select=1) /*按學(xué)號查詢 */stringinput(searchinput,10,"input the existing student number:");p=Locate(l,searchinput,"num");/*在 I 中查找學(xué)號為 searchinput值的節(jié)點(diǎn),并返回節(jié)點(diǎn)的指針*/if(p) /* 若 p!=NULL*/prin theader();prin tdata(p);prin tf(END);prin tf(&

41、quot;press any key to retur n");getchar();elseNofi nd();getchar();else if(select=2) /* 按姓名查詢 */stri ngin put(search in put,15,"i nput the existi ng stude nt n ame:");p=Locate(l,search in put," name");if(p)prin theader();prin tdata(p);prin tf(END);prin tf("press any key

42、to retur n");getchar();elseNofi nd();getchar();elseWron g();getchar();/*刪除學(xué)生記錄:先找到保存該學(xué)生記錄的節(jié)點(diǎn),然后刪除該節(jié)點(diǎn)*/void Del(Li nk l)int sel;Node *p,*r;char fin dmess20;if(!l-> next)system("cls");printf("n=>No student record!n”);getchar();return;system("cls");Disp(l);prin tf(&q

43、uot;n=>1 Delete by nu mber =>2 Delete by n amen");printf(" please choice1,2:");scan f("%d", &sel);if(sel=1)stringinput(findmess,10,"input the existing student number:"); p=Locate(l,fi ndmess," nu m");if(p) /*p!=NULL*/r=l;while(r- >n ext!=p)r=

44、r->n ext;r->next=p->next;/*將p所指節(jié)點(diǎn)從鏈表中去除 */free(p); /* 釋放內(nèi)存空間*/ prin tf("n=>delete success!n");getchar();saveflag=1;elseNofi nd();getchar();else if(sel=2) /*先按姓名查詢到該記錄所在的節(jié)點(diǎn)*/stri ngin put(fi ndmess,15,"i nput the existi ng stude nt n ame");p=Locate(l,fi ndmess," n

45、ame");if(p)r=l;while(r- >n ext!=p)r=r->n ext;r->n ext=p->n ext;free(p);prin tf("n=>delete success!n");getchar();saveflag=1;elseNofi nd();getchar();elseWron g();getchar();/*修改學(xué)生記錄。先按輸入的學(xué)號查詢到該記錄,然后提示用戶修改學(xué)號之外的值,學(xué)號 不能修改*/void Modify(Li nk l)Node *p;char fin dmess20;if(!l-&g

46、t; next)system("cls");printf("n=>No student record!n”);getchar();return;system("cls");prin tf("modify stude nt recorder");Disp(l);stringinput(findmess,10,"input the existing student number:"); /*輸入并檢驗(yàn)該學(xué)號*/p=Locate(l,findmess,"num"); /*查詢至U該節(jié)點(diǎn)

47、 */if(p) /* 若p!=NULL,表明已經(jīng)找到該節(jié)點(diǎn) */prin tf("Number:%s,n",p->data .nu m);prin tf("Name:%s,",p->data .n ame);stri ngin put(p->data .n ame,15,"i nput new n ame:");printf("C Ian guage score:%d,",p->data.cgrade);p->data.cgrade=nu mberi nput("C Ian

48、 guage Score0-100:");prin tf("Math score:%d,",p->data.mgrade);p->data.mgrade=nu mberi nput("Math Score0-100:");prin tf("E nglish score:%d,",p->data.egrade);p->data.egrade=nu mberi nput("E nglish Score0-100:");prin tf("yuw score:%d,",

49、p->data.yuw); p->data.yuw=nu mberi nput("yuw Score0-100:");p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade+p->data.yuw; p->data.ave=(float)(p->data.total/4);p->data. min gci=0;prin tf("n=>modify success!n");Disp(l);saveflag=1;elseNofi n

50、d();getchar();/*插入記錄:按學(xué)號查詢到要插入的節(jié)點(diǎn)的位置,然后在該學(xué)號之后插入一個(gè)新節(jié)點(diǎn)。*/void In sert(L ink l)Link p,v,newinfo; /*p指向插入位置,newinfo 指新插入記錄 */char ch,num10,s10; /*s保存插入點(diǎn)位置之前的學(xué)號,num保存輸入的新記錄的學(xué)號*/int flag=0;v=l->n ext;system("cls");Disp(l);while(1)stri ngin put(s,10,"please in put in sert locati on after

51、the Number:"); flag=O;v=l->n ext;while(v)/*查詢該學(xué)號是否存在,flag=1表示該學(xué)號存在*/if(strcmp(v->data .nu m,s)=O) flag=1;break;v=v- >n ext;if(flag=1)break; /*若學(xué)號存在,則進(jìn)行插入之前的新記錄的輸入操作*/elsegetchar();printf("n=>The number %s is not existing,try again?(y/n):",s);scan f("%c", &ch)

52、;if(ch='y'|ch='Y')con ti nu e;elsereturn;/*以下新記錄的輸入操作與Add()相同*/stringinput(num,10,"input new student Number:");v=l->n ext;while(v)if(strcmp(v->data .num,num)=0)printf("=>Sorry,the new number:'%s' is existing !n",num);prin theader();prin tdata(v);p

53、rin tf("n");getchar();return;v=v- >n ext;n ewi nfo=(Node *)malloc(sizeof(Node);if(! newi nfo)prin tf("n allocate memory failure "); /*如沒有申請到,打印提示信息*/return ;/*返回主界面*/strcpy( newi nfo->data. nu m, nu m);stri ngi nput( newi nfo->data. name,15,"Name:");newin fo-&g

54、t;data.cgrade=nu mberi nput("C Ian guage Score0-100:");newi nfo->data.mgrade=nu mberi nput("Math Score0-100:");newin fo->data.egrade=nu mberi nput("E nglish Score0-100:");newinfo->data.yuw=numberinput("yuw Score0-100:");newin fo->data.total=newin f

55、o->data.egrade+newin fo->data.cgrade+newin fo->dat a.mgrade+newin fo->data.yuw;newin fo->data.ave=(float) (newin fo->data.total/4);newin fo->data. min gci=0; newinfo->n ext=NULL;saveflag=1; /* 在main()有對該全局變量的判斷,若為1,則進(jìn)行存盤操作*/*將指針賦值給p,因?yàn)镮中的頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)才實(shí)際保存著學(xué)生的記錄*/p=l->n ext;wh

56、ile(1)if(strcmp(p->data. nu m,s)=O)/*在鏈表中插入一個(gè)節(jié)點(diǎn) */newinfo->n ext=p->n ext;p->n ext =newinfo;break;p=p->n ext;Disp(l);prin tf("nn");getchar();/*統(tǒng)計(jì)該班的總分第一名和單科第一,和各科不及格人數(shù)*/ void Ton gji(L ink l)用于指向分?jǐn)?shù)最高的節(jié)點(diǎn)*/保存四門成績中不及格的人數(shù)*/Node *pm,*pe,*pc,*pt,*pk,*p1,*p2,*p3,*p4; /*Node *r=l->n ext;int coun tc=0,co un tm=0,co un te=0,co un ty=0; /* if(!r)system("cls");prin tf("n=>Not stude nt record!' n"); getchar();return ;system("

溫馨提示

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

最新文檔

評論

0/150

提交評論