版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> C語(yǔ)言課程設(shè)計(jì)報(bào)告</b></p><p><b> 學(xué)生成績(jī)管理系統(tǒng) </b></p><p> 學(xué) 院 計(jì)算機(jī)學(xué)院 </p><p> 專 業(yè) 軟件工程(4)班 </p><p&g
2、t; 年 級(jí) 2007級(jí) </p><p> 姓 名 </p><p> 學(xué) 號(hào) </p><p> 教 師 </p><p><b> 一.設(shè)計(jì)題
3、目</b></p><p><b> 學(xué)生成績(jī)管理系統(tǒng)</b></p><p><b> 二.課程設(shè)計(jì)目的</b></p><p> 了解軟件工程中的一些系統(tǒng)分析,模塊分析,代碼設(shè)計(jì)的概念,利用WIN-TC實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的錄入、查詢、刪除、統(tǒng)計(jì)等基本操作,使用單鏈表結(jié)構(gòu)實(shí)現(xiàn)學(xué)生成績(jī)管理,了解數(shù)據(jù)庫(kù)管
4、理的基本功能,掌握C語(yǔ)言中的結(jié)構(gòu)體、指針、函數(shù)(系統(tǒng)函數(shù)、自定義函數(shù))、文件操作等知識(shí)。通過(guò)對(duì)系統(tǒng)的分析和設(shè)計(jì),進(jìn)一步鞏固C語(yǔ)言的學(xué)習(xí),以提高對(duì)開發(fā)環(huán)境的進(jìn)一步認(rèn)識(shí)和綜合編程能力。</p><p><b> 系統(tǒng)功能</b></p><p> 1.學(xué)生基本情況錄入。</p><p> 2 能夠?qū)σ呀?jīng)錄入的數(shù)據(jù)進(jìn)行顯示。</p>
5、;<p> 3.能夠進(jìn)行數(shù)據(jù)的插入。</p><p> 4.刪除基本數(shù)據(jù)的相關(guān)信息。</p><p> 5.復(fù)制基本數(shù)據(jù)的相關(guān)信息。</p><p> 6.能夠從文件中讀入記錄。</p><p> 7.對(duì)輸入的數(shù)據(jù)進(jìn)行保存。</p><p> 8.可進(jìn)行姓名的查詢。如:姓陳的同學(xué)。</p
6、><p> 9.可進(jìn)行基本數(shù)據(jù)的統(tǒng)計(jì)計(jì)算。如:</p><p> ?、伲y(tǒng)計(jì)每個(gè)學(xué)生各門功課的平均成績(jī)及總分,根據(jù)總分進(jìn)行名次排列。</p><p> ②.對(duì)數(shù)據(jù)進(jìn)行分類合計(jì)處理,統(tǒng)計(jì)個(gè)班級(jí)的總分,總平均分。</p><p> 四.系統(tǒng)功能模塊結(jié)構(gòu)圖</p><p> 本程序利用單鏈表存儲(chǔ)結(jié)構(gòu)完成對(duì)學(xué)生成績(jī)的動(dòng)態(tài)管
7、理,其基本功能模塊如下圖所示:</p><p> ︱ </p><p> 圖1 程序功能模塊結(jié)構(gòu)圖</p><p> 五.程序設(shè)計(jì)及各模塊函數(shù)功能簡(jiǎn)述</p><p><b> 1.?dāng)?shù)據(jù)結(jié)構(gòu)</b></p><p> 鏈表是線形表的一種,線形表分為順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)?/p>
8、存儲(chǔ)結(jié)構(gòu)。線形表的順序存儲(chǔ)結(jié)構(gòu)的特點(diǎn)是邏輯關(guān)系上相鄰的兩個(gè)元素物理位置上也相鄰,因此可以隨機(jī)存取表中任一元素。鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn)是用一組任意的存儲(chǔ)單元存儲(chǔ)線形表的數(shù)據(jù)元素。鏈表的最大的優(yōu)點(diǎn)是對(duì)表的添加、刪除、查找、排序等操作比較方便,因此采用鏈表來(lái)存儲(chǔ)學(xué)生相關(guān)信息。且對(duì)結(jié)點(diǎn)的定義如下:</p><p> typedef struct z1 /*定義數(shù)據(jù)結(jié)構(gòu)*/</p><p>&
9、lt;b> {</b></p><p> char no[11]; /*10位學(xué)號(hào)*/</p><p> char name[15]; /*姓名*/</p><p> int score[N]; /*成績(jī)*/</p><p> float sum; /*總分*/</p>
10、<p> float average; /*平均分*/ </p><p> int order; /*排名*/</p><p> struct z1 *next;</p><p><b> }STUDENT;</b></p><p> 2.main()主函數(shù)</p>
11、<p> 主函數(shù)是程序入口,采用模塊化設(shè)計(jì)。首先在主程序中打印歡迎界面,聲明一些必要變量,作一無(wú)限循環(huán)程序,循環(huán)體為一開關(guān)語(yǔ)句,該語(yǔ)句設(shè)置一個(gè)斷點(diǎn),其條件值是通過(guò)調(diào)用主菜單函數(shù)得到的返回值,根據(jù)該值,調(diào)用相應(yīng)的功能函數(shù),同時(shí)設(shè)置一個(gè)斷點(diǎn),當(dāng)返回值為一定條件時(shí)結(jié)束程序。</p><p> 3.menu_select()主菜單</p><p> 為了美化界面,制作單邊框窗口,
12、在窗口中顯示主菜單。通過(guò)putch()輸出圖形符號(hào)的ASCII碼值(十六進(jìn)制),達(dá)到顯示的目的。</p><p> 利用Windows函數(shù)制作顯示窗口,該窗口與邊框位置,大小基本一致,通過(guò)過(guò)仔細(xì)計(jì)算且多次調(diào)試后得到其坐標(biāo)值,用函數(shù)gotoxy()來(lái)實(shí)現(xiàn)光標(biāo)的移動(dòng)。設(shè)置文本和背景色輸出菜單項(xiàng)?;謴?fù)原窗口,設(shè)計(jì)輸入選擇項(xiàng),返回主函數(shù)。相關(guān)的一些函數(shù)如下:</p><p> window、t
13、extbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、gettext、puttext、putch。</p><p> putch(0xda); /*輸出左上角邊框┏*/ </p><p> putch(0xc4); /*輸出上邊框水平線*/</p><p> putch(0xbf); /*輸出右上角邊框
14、┓*/ </p><p> gotoxy(10,i);putch(0xb3); /*輸出左邊的垂直線*/</p><p> gotoxy(63,i);putch(0xb3); /*輸出右邊的垂直線*/</p><p> putch(0xc0); /*輸出左下角邊框┗*/</p><p> putch(0xc4); /*輸出下邊框水平
15、線*/</p><p> putch(0xd9); /*輸出右下角邊框┛*/</p><p> 對(duì)菜單選項(xiàng)的選擇是利用移動(dòng)光標(biāo)按回車鍵進(jìn)行選擇。</p><p> 4.init()初始化</p><p> 單鏈表需要一個(gè)頭指針來(lái)指向表的第一個(gè)結(jié)點(diǎn),對(duì)單鏈表的訪問是從頭指針開始的。初始化單鏈表為空,用NULL表示,該值在頭文件stdi
16、o.h中定義為常數(shù)0。</p><p> 5.create()創(chuàng)建鏈表</p><p> 當(dāng)用戶選擇輸入增加記錄后,進(jìn)入該函數(shù),輸入學(xué)生信息,并把信息加入鏈表。在輸入過(guò)程中,有相關(guān)提示,如學(xué)號(hào)是十位,格式為字符型。同時(shí)對(duì)某些信息作了限定,如輸入分?jǐn)?shù)(0—100) ,若輸入分?jǐn)?shù)不在這個(gè)范圍內(nèi),則系統(tǒng) 提示重新輸入,但是要求輸入分?jǐn)?shù)輸入了非數(shù)字的代碼,如“Z”,則會(huì)出現(xiàn)死循環(huán)。因此在輸入基
17、本信息時(shí),若要返回主菜單,請(qǐng)?jiān)凇癳nter no:”時(shí)輸入‘*’以便返回主菜單。當(dāng)輸入結(jié)束后,系統(tǒng)自動(dòng)計(jì)算該生的總分和平均分,并將名次置0,待排序結(jié)束后賦予新值。數(shù)據(jù)輸入結(jié)束后返回鏈表的頭指針到方函數(shù)。</p><p> 在生成鏈表時(shí),每次新輸入的結(jié)點(diǎn)放在表頭,這樣最先輸入的結(jié)點(diǎn)存放在最后。</p><p> 6.delete()刪除結(jié)點(diǎn)</p><p> 刪
18、除指定學(xué)號(hào)的學(xué)生記錄。輸入要?jiǎng)h除的結(jié)點(diǎn)的學(xué)號(hào),根據(jù)學(xué)號(hào)順序查找結(jié)點(diǎn),如果沒找到,則輸出沒有找到的信息;否則顯示找到的結(jié)點(diǎn)信息。如果刪除的是頭結(jié)點(diǎn),則修改頭指針,將該結(jié)點(diǎn)的前趨指針指向其后繼結(jié)點(diǎn),然后釋放該結(jié)點(diǎn)。</p><p> 7.a(chǎn)ppend()追加記錄到文件尾</p><p> 當(dāng)想要在文件尾增加一條記錄時(shí)使用該函數(shù),首先輸入新結(jié)點(diǎn)信息,然后輸入要追加的文件名,按追加方式打開文件
19、,將新信息寫入文件。</p><p> 8.insert()插入結(jié)點(diǎn)</p><p> 在指定結(jié)點(diǎn)前面插入新結(jié)點(diǎn),申請(qǐng)空間得到指針info,輸入新結(jié)點(diǎn)信息,存放info中,設(shè)鏈表頭指針為h,p為指定結(jié)點(diǎn)的指針,q為p的前趨指針。從頭結(jié)點(diǎn)開始循環(huán)移動(dòng)指針p查找指定結(jié)點(diǎn),查找和插入時(shí)分兩種情況處理:</p><p> 1).指針p為空,如果p等于h,說(shuō)明鏈表為空,
20、則新結(jié)點(diǎn)即為頭結(jié)點(diǎn),修改指針h=info。否則,說(shuō)明表中沒有指定結(jié)點(diǎn),則新結(jié)點(diǎn)插入在表尾部,此是q把指的結(jié)點(diǎn)是最后一個(gè)結(jié)點(diǎn),所以修改指針q->next=info。</p><p> 2).指針p不為空,如果p等于h,說(shuō)明新結(jié)點(diǎn)插入在當(dāng)前第一個(gè)結(jié)點(diǎn)之前,為新的頭結(jié)點(diǎn),修改指針info->next=p,h=info。否則,說(shuō)明新結(jié)點(diǎn)的位置應(yīng)在q和p兩個(gè)結(jié)點(diǎn)之間,修改指針info->next=p,q
21、->next=info。</p><p> 9.print()顯示所有記錄</p><p> 采用順序訪問的方法顯示和查找記錄,定義一個(gè)指向結(jié)點(diǎn)的臨時(shí)變量p,初值為單鏈表的頭指針,輸出指針?biāo)涗浀臄?shù)據(jù)后,將指針后移一個(gè)記錄,直到p指針值為空,則所有記錄輸出完畢。</p><p> 10.search()查找結(jié)點(diǎn)</p><p>
22、 按照 姓名 來(lái)查找記錄。從頭結(jié)點(diǎn)開始順序查找, 若沒有相同記錄顯示沒有,遇到 一個(gè)匹配的記錄則顯示此記錄, 后到尾結(jié)點(diǎn)結(jié)束。</p><p> 11.save()保存記錄到文件</p><p> 將學(xué)生信息保存到指定的文件中。按照文件讀寫要求,先定義一個(gè)指向文件的指針,輸入要保存的磁盤文件名,如果輸入的是絕對(duì)路徑,則文件保存到指定的位置;如果只要文件名,則文件保存在TC默認(rèn)的路徑。如
23、果文件打不開,則退出程序,否則選擇一種寫文件方式,打開文件。如果文件打不開,則退出程序,否則選擇一種寫文件方式,從鏈表的頭指針</p><p> 開始,順序?qū)⒂涗泴懭胛募?,直到所有記錄寫完,?biāo)志就是移動(dòng)指針為空。</p><p> 12.load()從文件中加載記錄</p><p> 按照文件讀寫要求,先定義一個(gè)指向文件的指針,輸入要讀入數(shù)據(jù)的磁盤文件名,然后
24、確定文件的打開方式。如果文件打不開,則退出函數(shù),否則選擇一種讀文件方式,從文件頭開始,將記錄讀入內(nèi)存,直到文件尾。文件打開方式和讀入方式的確定要依據(jù)輸出文件的打開方式和寫入方式,以名數(shù)據(jù)讀入錯(cuò)誤。如果輸出文件是二進(jìn)制文件,塊寫操作,讀入也應(yīng)設(shè)置為二進(jìn)制打開方式,塊讀取方式。每讀入一條記錄,都要做好指針鏈接關(guān)系,本函數(shù)將新結(jié)點(diǎn)鏈接到當(dāng)前鏈表的尾部,鏈表的順序和文件保存的順序一致。</p><p> 13.copy
25、()備份文件</p><p> 將文件讀寫功能結(jié)合到一起,先輸入源文件名,再輸入目標(biāo)文件名,然后利用文件讀寫函數(shù)將源文件中的信息寫到目標(biāo)文件中,以達(dá)到備份文件的目的。</p><p> 14.computer()計(jì)算所有學(xué)生課程的總成績(jī)成績(jī)和總平均成績(jī)</p><p> 15.sort()排序</p><p> 本函數(shù)實(shí)現(xiàn)按總分排序的
26、功能。在算法上,選擇直接插入算法,即:每步將一個(gè)待排序的按其排序碼值的大小插到前面已經(jīng)排好序的表中,直到全部插入為止。先將鏈表的頭結(jié)點(diǎn)看作是已經(jīng)排好序的結(jié)點(diǎn),然后取下一個(gè)結(jié)點(diǎn)作為待排序的結(jié)點(diǎn),插入到已排好序的表中。其具體做法為:</p><p> (1).先將原表頭結(jié)點(diǎn)作為新排好序表的頭結(jié)點(diǎn)h,原表下一個(gè)結(jié)點(diǎn)作為原表頭結(jié)點(diǎn)h1。</p><p> (2).原表頭結(jié)點(diǎn)為待排序結(jié)點(diǎn),將其總
27、分與新表結(jié)點(diǎn)的總分進(jìn)行比較,如果待排序結(jié)點(diǎn)總分大,則插在表頭,否則插入在其后,原表頭結(jié)點(diǎn)后移一位。</p><p> (3).重復(fù)第二步,即將原表頭結(jié)點(diǎn)的總分和新表結(jié)點(diǎn)的總分進(jìn)行比較,如果待排序結(jié)點(diǎn)總分小,則移動(dòng)新表指針,直到找到合適的位置將其插入。當(dāng)原表為空時(shí),所有結(jié)點(diǎn)排序完畢。</p><p> 排好序后,系統(tǒng)自動(dòng)將名次數(shù)據(jù)寫入結(jié)點(diǎn)數(shù)據(jù)域的order中。</p>&l
28、t;p> 16.index()索引</p><p> 定義臨時(shí)指針后,將原表的頭指針?biāo)傅南乱粋€(gè)結(jié)點(diǎn)作頭指針,再使第一個(gè)結(jié)點(diǎn)定為新表的頭結(jié)點(diǎn)。當(dāng)原表不為空時(shí),進(jìn)行排序。</p><p> 17.total()分類合計(jì)</p><p> 追加班別信息,對(duì)各班的總成績(jī)和總平均成績(jī)進(jìn)行統(tǒng)計(jì)并顯示。</p><p> 18.exit
29、()退出程序</p><p> 19.auther()版本信息</p><p> 顯示與本系統(tǒng)相關(guān)的信息。</p><p><b> 六.結(jié)果</b></p><p><b> 歡迎界面</b></p><p><b> 主菜單</b><
30、/p><p><b> 輸入界面</b></p><p><b> 刪除界面</b></p><p><b> 顯示界面</b></p><p><b> 搜索界面</b></p><p><b> 加載界面<
31、/b></p><p><b> 統(tǒng)計(jì)界面</b></p><p><b> 版本界面</b></p><p><b> 七.心得體會(huì)</b></p><p> 在本次課程設(shè)計(jì)中,先使用結(jié)構(gòu)化分析方法對(duì)系統(tǒng)進(jìn)行分析,將整個(gè)系統(tǒng)細(xì)分為幾個(gè)模塊,再針對(duì)每個(gè)小模塊編寫代
32、碼。通過(guò)本次課程設(shè)計(jì)的學(xué)習(xí),學(xué)會(huì)了很多東西,了解了開發(fā)一個(gè)系統(tǒng)的一些步驟。盡管大部分都參考權(quán)威書籍的代碼,但是在編寫代碼過(guò)程中還是加深了對(duì)鏈表的了解程度。開發(fā)工具用的是WIN-TC ,而目前用得比較多的應(yīng)用程序的開發(fā)系統(tǒng)都是可視化的集成開發(fā)環(huán)境,比如Visual C++等,但是在底層開發(fā)比如硬件驅(qū)動(dòng)程序的開發(fā)上,直接寫出優(yōu)秀的源代碼還是一個(gè)程序員必須掌握的。所以 ,作為計(jì)算機(jī)軟件專業(yè)的學(xué)生,我們都應(yīng)該努力去做好!</p>
33、<p><b> 源代碼</b></p><p> /*11.3.2 源程序*/</p><p> /***********xue sheng guan li xi tong.c***********/</p><p> /******頭文件(.h)***********/</p><p> #in
34、clude "stdio.h" /*I/O函數(shù)*/</p><p> # include "bios.h" /*ROM基本輸入輸出函數(shù)*/</p><p> #include "stdlib.h" /*其它說(shuō)明*/</p><p> #include "dos.h"
35、 /*dos接口函數(shù)*/</p><p> #include "string.h" /*字符串函數(shù)*/</p><p> #include "conio.h" /*屏幕操作函數(shù)*/</p><p> #include "mem.h" /*內(nèi)存操作函數(shù)*/</p><p
36、> #include "ctype.h" /*字符操作函數(shù)*/</p><p> #include "alloc.h" /*動(dòng)態(tài)地址分配函數(shù)*/</p><p> #define N 3 /*定義常數(shù)*/</p><p> typedef struct z1 /*定義數(shù)據(jù)結(jié)構(gòu)*/</
37、p><p><b> {</b></p><p> char no[11];</p><p> char name[15];</p><p> int score[N];</p><p> float sum;</p><p> float average;<
38、/p><p> int order;</p><p> struct z1 *next;</p><p><b> }STUDENT;</b></p><p> /*以下是函數(shù)原型*/</p><p> STUDENT *init(); /*初始化函數(shù)*/</p>
39、<p> STUDENT *create(); /*創(chuàng)建鏈表*/</p><p> STUDENT *delete(STUDENT *h); /*刪除記錄*/</p><p> void print(STUDENT *h); /* 顯示所有記錄*/</p><p> void search(STUDENT *h); /*查找*/&
40、lt;/p><p> void save(STUDENT *h); /*保存*/</p><p> STUDENT *load(); /*讀入記錄*/</p><p> void computer(STUDENT *h); /*計(jì)算總分和平均分*/</p><p> STUDENT *insert(STUDENT
41、*h); /*插入記錄*/</p><p> void append(); /*追加記錄*/</p><p> void copy(); /*復(fù)制文件*/</p><p> STUDENT *sort(STUDENT *h); /*排序*/</p><p> STUDENT *in
42、dex(STUDENT *h); /*索引*/</p><p> void auther(); /*版本信息*/ </p><p> void total(STUDENT *h); /*分類合計(jì)*/</p><p> int menu_select(); /*菜單函數(shù)*/</p><p>
43、; /******主函數(shù)開始*******/</p><p><b> main()</b></p><p><b> {</b></p><p><b> int i;</b></p><p> STUDENT *head; /*鏈表定義頭指針*/</
44、p><p> head=init(); /*初始化鏈表*/</p><p> printf("\n\n\n\n\n\n\n\n\n");</p><p> printf("\t\t \4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4
45、\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");</p><p> printf("\t\t \6 Welcome to the students-score System! \6 \n");</p><p> printf("\t\t \6 ---Chen Tian Lin---
46、 \6 \n");</p><p> printf("\t\t \4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");</p><p> for(;;) /*無(wú)限循環(huán)*/
47、</p><p><b> {</b></p><p> switch(menu_select()) /*調(diào)用主菜單函數(shù),返回值整數(shù)作開關(guān)語(yǔ)句的條件*/</p><p> { /*值不同,執(zhí)行的函數(shù)不同,break 不能省略*/</p><p> case 0:he
48、ad=init();break; /*執(zhí)行初始化*/</p><p> case 1:head=create();break; /*創(chuàng)建鏈表*/</p><p> case 2:head=delete(head);break; /*刪除記錄*/</p><p> case 3:print(head);break; /*顯示全部記錄*/</p>
49、;<p> case 4:search(head);break; /*查找記錄*/</p><p> case 5:save(head);break; /*保存文件*/</p><p> case 6:head=load(); break; /*讀文件*/</p><p> case 7:computer(head);break; /*
50、計(jì)算總分和均分*/</p><p> case 8:head=insert(head); break; /*插入記錄*/</p><p> case 9:copy();break; /*復(fù)制文件*/</p><p> case 10:head=sort(head);break; /*排序*/</p><p> case 11
51、:append();break; /*追加記錄*/</p><p> case 12:head=index(head);break; /*索引*/</p><p> case 13:total(head);break; /*分類合計(jì)*/</p><p> case 14:exit(0); /*如菜單返回值為14程序結(jié)束*/</p
52、><p> case 15:auther(); /*版本信息*/</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*菜單函數(shù),返回值為整數(shù)*/</p
53、><p> menu_select()</p><p><b> {</b></p><p> char *f[]={"\2\2\1\1\1\1\1\1\1\1\1 SCORES MENU \1\1\1\1\1\1\1\1\1\2\2", /*定義菜單字符串?dāng)?shù)組*/</p><p> "
54、; 0. init list ", /*初始化*/</p><p> " 1. Enter list ", /*輸入記錄*/</p><p> " 2. Delete a record from list ", /*從表中刪除記錄*/</p><p> " 3. prin
55、t list ", /*顯示單鏈表中所有記錄*/</p><p> " 4. Search record on name ", /*按照姓名查找記錄*/</p><p> " 5. Save the file ", /*將單鏈表中記錄保存到文件中*/<
56、/p><p> " 6. Load the file ", /*從文件中讀入記錄*/</p><p> " 7. computer the score", /*計(jì)算所有學(xué)生的總分和均分*/</p><p> " 8. insert record to list
57、 ", /*插入記錄到表中*/</p><p> " 9. copy the file to new file", /*復(fù)制文件*/</p><p> "10. sort to make new file", /*排序*/</p><p> "11. append record to f
58、ile", /*追加記錄到文件中*/</p><p> "12. index on nomber", /*索引*/</p><p> "13. total on nomber", /*分類合計(jì)*/</p><p> "14. Quit " ,
59、 /*退出*/</p><p> "15. auther ", /*版本信息*/</p><p> "\5\3\5 Enter the * to return when need ! \5\3\5",</p><p><b> };</b></p><p> c
60、har s[80]; /*以字符形式保存選擇號(hào)*/</p><p><b> int i;</b></p><p> int key=0; /*記錄所壓鍵值*/</p><p><b> int c=0;</b></p><p> gotoxy(25,25); /*移動(dòng)光標(biāo)*/<
61、;/p><p> printf("press any key enter menu......\n");/*壓任意鍵進(jìn)入主菜單*/</p><p><b> getch();</b></p><p> clrscr(); /*清屏*/</p><p> textcolor(YELLOW ); /
62、*設(shè)置文本顏色為黃色*/</p><p> textbackground(BLUE ); /*設(shè)置背景顏色為藍(lán)色*/</p><p> gotoxy(10,2);</p><p> putch(0xda); /*輸出左上角邊框┏*/</p><p> for(i=1;i<53;i++)</p><p>
63、 putch(0xc4); /*輸出上邊框水平線*/</p><p> putch(0xbf); /*輸出右上角邊框 ┓*/</p><p> for(i=3;i<22;i++)/*輸出左右兩邊的垂直線*/</p><p><b> {</b></p><p> gotoxy(10,i);putch(0
64、xb3);</p><p> gotoxy(63,i);putch(0xb3);</p><p><b> }</b></p><p> gotoxy(10,22);putch(0xc0); /*輸出左下角邊框┗*/</p><p> for(i=1;i<53;i++)</p><p&g
65、t; putch(0xc4); /*輸出下邊框水平線*/</p><p> putch(0xd9); /*輸出右下角邊框┛*/</p><p> window(11,3,62,21); /* 制作顯示菜單的窗口,大小根據(jù)菜單條數(shù)設(shè)計(jì)*/</p><p> clrscr(); /*清屏*/</p><p> for(i=0;i
66、<18;i++)</p><p><b> {</b></p><p> gotoxy(10,i+1);</p><p> cprintf("%s",f[i]); /*輸出菜單項(xiàng)數(shù)組*/</p><p><b> }</b></p><p>
67、<b> i=1;</b></p><p> gotoxy(10,2); /*設(shè)置默認(rèn)選項(xiàng)在第一項(xiàng)*/</p><p> textbackground(BLINK );/*設(shè)置背景顏色為淺綠*/</p><p> cprintf("%s",f[1]); /*輸出菜單項(xiàng),表示選中*/</p><
68、p> gotoxy(10,2); /*移動(dòng)光標(biāo)到菜單的第一項(xiàng)*/</p><p> while(key!=13) /*所壓鍵不是回車鍵時(shí)*/</p><p><b> {</b></p><p> while(bioskey(1)==0); /*查詢是否壓下了一個(gè)鍵*/</p><p> key=
69、bioskey(0); /*返回下一個(gè)在鍵盤壓下的鍵*/</p><p> key=key&0xff?key&0xff:key>>8; /*對(duì)所壓的鍵進(jìn)行判斷*/</p><p> gotoxy(10,i+1);</p><p> textbackground(BLUE);/*設(shè)置背景顏色為藍(lán)色*/</p><
70、;p> cprintf("%s",f[i]); /*輸出菜單項(xiàng)*/</p><p> if(key==72) i=i==1?16:i-1; /*如壓向上光標(biāo)鍵↑,i減1,如已到第一行再上移,則到最后一行*/</p><p> if(key==80)i=i==16?1:i+1; /*如壓向下光標(biāo)鍵↓,i加1,如已到最后一行再下移,則到第一行*/</p&
71、gt;<p> gotoxy(10,i+1); /*光標(biāo)移動(dòng)i的下一項(xiàng)*/</p><p> textbackground(LIGHTRED); /*將背景顏色設(shè)為淺紅*/</p><p> cprintf("%s",f[i]); /*輸出菜單項(xiàng)*/</p><p> c=i-1; /*給代表菜單選項(xiàng)的整數(shù)賦值*/<
72、;/p><p><b> }</b></p><p> textbackground(CYAN ); /*設(shè)置背景顏色為青色*/</p><p> window(1,1,80,25); /*恢復(fù)原窗口大小*/</p><p> return c; /*返回代表菜單選項(xiàng)的整數(shù)值*/</p><
73、p><b> }</b></p><p> STUDENT *init()</p><p> { return NULL;}</p><p><b> /*1創(chuàng)建鏈表*/</b></p><p> STUDENT *create()</p><p><b
74、> {</b></p><p> int i; int s;</p><p> STUDENT *h=NULL,*info; /* STUDENT指向結(jié)構(gòu)體的指針*/</p><p><b> for(;;)</b></p><p><b> {</b></p&g
75、t;<p> info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請(qǐng)空間*/</p><p> if(!info) /*如果指針info為空*/</p><p><b> {</b></p><p> printf("\nout of memory"); /
76、*輸出內(nèi)存溢出*/</p><p> return NULL; /*返回空指針*/</p><p><b> }</b></p><p> inputs("enter no:",info->no,11); /*輸入學(xué)號(hào)并校驗(yàn)*/</p><p> if(info-
77、>no[0]=='*') break; /*如果學(xué)號(hào)首字符為@則結(jié)束輸入*/</p><p> inputs("enter name:",info->name,15); /*輸入姓名,并進(jìn)行校驗(yàn)*/</p><p> printf("please input %d score \n",N); /*提示開始輸入成
78、績(jī)*/</p><p> s=0; /*計(jì)算每個(gè)學(xué)生的總分,初值為0*/</p><p> for(i=0;i<N;i++) /*N門課程循環(huán)N次*/</p><p><b> {</b></p><p><b> do{</b></p><p
79、> printf("score%d:",i+1); /*提示輸入第幾門課程*/</p><p> scanf("%d",&info->score[i]); /*輸入成績(jī)*/</p><p> if(info->score[i]>100||info->score[i]<0) /*確保成績(jī)?cè)?
80、~100之間*/</p><p> printf("bad data,repeat input\n"); /*出錯(cuò)提示信息*/ </p><p> }while(info->score[i]>100||info->score[i]<0);</p><p> s=s+info->score[i]; /*累
81、加各門課程成績(jī)*/</p><p><b> }</b></p><p> info->sum=s; /*將總分保存*/</p><p> info->average=(float)s/N; /*求出平均值*/</p><p> info->order=0; /*未排序前此值為0*
82、/</p><p> info->next=h; /*將頭結(jié)點(diǎn)做為新輸入結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/</p><p> h=info; /*新輸入結(jié)點(diǎn)為新的頭結(jié)點(diǎn)*/</p><p><b> }</b></p><p> return(h); /*返回頭指針*/</p><p>
83、;<b> }</b></p><p> /*2輸入字符串,并進(jìn)行長(zhǎng)度驗(yàn)證*/</p><p> inputs(char *prompt, char *s, int count)</p><p><b> {</b></p><p> char p[255];</p><
84、;p> clrscr(); /*清屏*/</p><p> do{printf("No. name yu wen shu xue ying yu /Enter the * to return when need\n");</p><p> printf(prompt); /*顯示提示信息*/</p><p> scan
85、f("%s",p); /*輸入字符串*/</p><p> if(strlen(p)>count)printf("\n too long! \n"); /*進(jìn)行長(zhǎng)度校驗(yàn),超過(guò)count值重輸入*/</p><p> }while(strlen(p)>count);</p><p> strcpy(s,p);
86、 /*將輸入的字符串拷貝到字符串s中*/</p><p><b> }</b></p><p> /*3輸出鏈表中結(jié)點(diǎn)信息*/</p><p> void print(STUDENT *h)</p><p><b> {</b></p><p> int i=0;
87、 /* 統(tǒng)計(jì)記錄條數(shù)*/</p><p> STUDENT *p; /*移動(dòng)指針*/</p><p> clrscr(); /*清屏*/</p><p> p=h; /*初值為頭指針*/</p><p> printf("\n\n\n***************************STUDEN
88、T SCORES**************************************\n");</p><p> printf("| rec|nO | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p> printf("|--
89、--|----------|---------------|------|-------|-------|--------|-------|-----|\n");</p><p> while(p!=NULL)</p><p><b> {</b></p><p><b> i++;</b></p&g
90、t;<p> printf("|%3d |%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],</p><p> p->score[2],p->sum,p->average,p->order);&l
91、t;/p><p> p=p->next;</p><p><b> }</b></p><p> printf("**********************************end******************************************\n");</p><p&
92、gt;<b> }</b></p><p><b> /*4刪除記錄*/</b></p><p> STUDENT *delete(STUDENT *h)</p><p><b> {</b></p><p> STUDENT *p,*q; /*p為查找到要?jiǎng)h除的結(jié)
93、點(diǎn)指針,q為其前驅(qū)指針*/</p><p> char s[11]; /*存放學(xué)號(hào)*/</p><p> clrscr(); /*清屏*/</p><p> printf("please deleted no \n"); /*顯示提示信息*/</p><p> scanf("
94、;%s",s); /*輸入要?jiǎng)h除記錄的學(xué)號(hào)*/</p><p> q=p=h; /*給q和p賦初值頭指針*/</p><p> while(strcmp(p->no,s)&&p!=NULL) /*當(dāng)記錄的學(xué)號(hào)不是要找的,或指針不為空時(shí)*/</p><p><b> {</b></p>
95、;<p> q=p; /*將p指針值賦給q作為p的前驅(qū)指針*/</p><p> p=p->next; /*將p指針指向下一條記錄*/</p><p><b> }</b></p><p> if(p==NULL) /*如果p為空,說(shuō)明鏈表中沒有該結(jié)點(diǎn)*/</p><
96、p> printf("\nlist no %s student\n",s);</p><p> else /*p不為空,顯示找到的記錄信息*/</p><p><b> {</b></p><p> printf("*****************************have fou
97、nd***********************************\n");</p><p> printf("|no | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p> printf("|----------|-----
98、----------|------|-------|-------|--------|-------|-----|\n");</p><p> printf("|%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", p->no,</p><p> p->name,p->score[0],p-
99、>score[1],p->score[2],p->sum,</p><p> p->average,p->order);</p><p> printf("********************************end***************************************\n");</p>
100、<p> getch(); /*壓任一鍵后,開始刪除*/</p><p> if(p==h) /*如果p==h,說(shuō)明被刪結(jié)點(diǎn)是頭結(jié)點(diǎn)*/</p><p> h=p->next; /*修改頭指針指向下一條記錄*/</p><p><b> else</b></p><p>
101、 q->next=p->next; /*不是頭指針,將p的后繼結(jié)點(diǎn)作為q的后繼結(jié)點(diǎn)*/</p><p> free(p); /*釋放p所指結(jié)點(diǎn)空間*/</p><p> printf("\n have deleted No %s student\n",s);</p><p> printf("Don&
102、#39;t forget save\n");/*提示刪除后不要忘記保存文件*/</p><p><b> }</b></p><p> return(h); /*返回頭指針*/</p><p><b> }</b></p><p><b> /*5查找記錄*/&
103、lt;/b></p><p> void search(STUDENT *h)</p><p><b> {</b></p><p> STUDENT *p; /* 移動(dòng)指針*/</p><p> char s[15]; /*存放姓名的字符數(shù)組*/</p><p>
104、clrscr(); /*清屏幕*/</p><p> printf("please enter name for search\n");</p><p> scanf("%s",s); /*輸入姓名*/</p><p> p=h; /*將頭指針賦給p*/</p><p> wh
105、ile(strcmp(p->name,s)&&p!=NULL) /*當(dāng)記錄的姓名不是要找的,或指針不為空時(shí)*/</p><p> p=p->next; /*移動(dòng)指針,指向下一結(jié)點(diǎn)*/</p><p> if(p==NULL) /*如果指針為空*/</p><p> printf("\nlist n
106、o %s student\n",s); /*顯示沒有該學(xué)生*/</p><p> else /*顯示找到的記錄信息*/</p><p><b> {</b></p><p> printf("\n\n*****************************havefound**********
107、**************************\n");</p><p> printf("|nO | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p> printf("|----------|---------------|
108、------|-------|-------|--------|-------|-----|\n");</p><p> printf("|%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", p->no,</p><p> p->name,p->score[0],p->score[1
109、],p->score[2],p->sum,p->average,p->order);</p><p> printf("********************************end***************************************\n");</p><p><b> }</b><
110、;/p><p><b> }</b></p><p><b> /*6插入記錄*/</b></p><p> STUDENT *insert(STUDENT *h)</p><p><b> {</b></p><p> STUDENT *p,*
111、q,*info; /*p指向插入位置,q是其前驅(qū),info指新插入記錄*/</p><p> char s[11]; /*保存插入點(diǎn)位置的學(xué)號(hào)*/</p><p><b> int s1,i;</b></p><p> clrscr(); /*清屏幕*/</p><p> printf("plea
112、se enter location before the no /Enter the * to return when need\n");</p><p> scanf("%s",s); /*輸入插入點(diǎn)學(xué)號(hào)*/</p><p> printf("\nplease new record\n"); /*提示輸入記錄信息*/&
113、lt;/p><p> info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請(qǐng)空間*/</p><p><b> if(!info)</b></p><p><b> {</b></p><p> printf("\nout of memory&q
114、uot;); /*如沒有申請(qǐng)到,內(nèi)存溢出*/</p><p> return NULL; /*返回空指針*/</p><p><b> }</b></p><p> inputs("enter no:",info->no,11); /*輸入學(xué)號(hào)*/</p><p&g
115、t; inputs("enter name:",info->name,15); /*輸入姓名*/</p><p> printf("please input %d score \n",N); /*提示輸入分?jǐn)?shù)*/</p><p> s1=0; /*保存新記錄的總分,初值為0*/</p><p> for(
116、i=0;i<N;i++) /*N門課程循環(huán)N次輸入成績(jī)*/</p><p><b> {</b></p><p> do{ /*對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,保證在0~100之間*/</p><p> printf("score%d:",i+1);</p><p> scanf(&
117、quot;%d",&info->score[i]);</p><p> if(info->score[i]>100||info->score[i]<0)</p><p> printf("bad data,repeat input\n");</p><p> }while(info->s
118、core[i]>100||info->score[i]<0);</p><p> s1=s1+info->score[i]; /*計(jì)算總分*/</p><p><b> }</b></p><p> info->sum=s1; /*將總分存入新記錄中*/</p><p>
119、 info->average=(float)s1/N; /*計(jì)算均分*/</p><p> info->order=0; /*名次賦值0*/</p><p> info->next=NULL; /*設(shè)后繼指針為空*/</p><p> p=h; /*將指針賦值給p*/</p>
120、<p> q=h; /*將指針賦值給q*/</p><p> while(strcmp(p->no,s)&&p!=NULL) /*查找插入位置*/</p><p><b> {</b></p><p> q=p; /*保存指針p,作為下一個(gè)p
121、的前驅(qū)*/</p><p> p=p->next; /*將指針p后移*/</p><p><b> }</b></p><p> if(p==NULL) /*如果p指針為空,說(shuō)明沒有指定結(jié)點(diǎn)*/</p><p> if(p==h) /*同時(shí)p等于h,說(shuō)明鏈表為空*/&l
122、t;/p><p> h=info; /*新記錄則為頭結(jié)點(diǎn)*/</p><p><b> else</b></p><p> q->next=info; /*p為空,但p不等于h,將新結(jié)點(diǎn)插在表尾*/</p><p><b> else</b></p><p>
123、 if(p==h) /*p不為空,則找到了指定結(jié)點(diǎn)*/</p><p><b> {</b></p><p> info->next=p; /*如果p等于h,則新結(jié)點(diǎn)插入在第一個(gè)結(jié)點(diǎn)之前*/</p><p> h=info; /*新結(jié)點(diǎn)為新的頭結(jié)點(diǎn)*/</p><p><b> }
124、</b></p><p><b> else</b></p><p><b> {</b></p><p> info->next=p; /*不是頭結(jié)點(diǎn),則是中間某個(gè)位置,新結(jié)點(diǎn)的后繼為p*/</p><p> q->next=info; /*新結(jié)點(diǎn)作為q的后繼
125、結(jié)點(diǎn)*/</p><p><b> }</b></p><p> printf("\n ----have inserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存盤*/</p>
126、<p> return(h); /*返回頭指針*/</p><p><b> }</b></p><p> /*7保存數(shù)據(jù)到文件*/</p><p> void save(STUDENT *h)</p><p><b> {</b></p><
127、;p> FILE *fp; /*定義指向文件的指針*/</p><p> STUDENT *p; /* 定義移動(dòng)指針*/</p><p> char outfile[10]; /*保存輸出文件名*/</p><p> clrscr(); /*清屏*/</p><p> printf
128、("Enter outfile name,for example c:\\f1\\te.txt: /Enter the * to return when need \n"); /*提示文件名格式信息*/</p><p> scanf("%s",outfile);</p><p> if((fp=fopen(outfile,"wb&quo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告----學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告-學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)報(bào)告--學(xué)生成績(jī)管理系統(tǒng)
- 課程設(shè)計(jì)報(bào)告(學(xué)生成績(jī)管理系統(tǒng)c語(yǔ)言)
- c語(yǔ)言課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)---學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)-學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)----學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言課程設(shè)計(jì)-學(xué)生成績(jī)管理系統(tǒng)
- c語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- c語(yǔ)言課程設(shè)計(jì)-學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)--c語(yǔ)言課程設(shè)計(jì)
- c語(yǔ)言課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
評(píng)論
0/150
提交評(píng)論