版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 需求分析</b></p><p> 隨著信息科技的發(fā)展,傳統(tǒng)的學(xué)校學(xué)生成績(jī)管理方法不適應(yīng)現(xiàn)代管理方法,且存在好多弊端。 使用計(jì)算機(jī)可以高速、快捷的完成各種工作。提高管理效率和水平。學(xué)生成績(jī)管理信息系統(tǒng),以計(jì)算機(jī)為工具通過(guò)對(duì)教務(wù)管理所需的信息管理,把管理人員從繁瑣的數(shù)據(jù)計(jì)算中解脫出來(lái),從而全面提高教學(xué)質(zhì)量。</p><p><b&g
2、t; 1.1文檔目的</b></p><p> 學(xué)校需要一套學(xué)生成績(jī)管理系統(tǒng)來(lái)對(duì)學(xué)生成績(jī)等情況進(jìn)行管理。建立該系統(tǒng)有利于教務(wù)處,學(xué)生處,院長(zhǎng)辦公室,各系輔導(dǎo)員對(duì)各自所需的及管理的學(xué)生信息進(jìn)行查閱和管理,同時(shí)有利于學(xué)生自己的學(xué)習(xí)情況查看,方便掌握子自己的學(xué)習(xí)信息。</p><p><b> 1.2 適用對(duì)象</b></p><p&g
3、t; 各大學(xué)校:教務(wù)處,學(xué)生工作處,院長(zhǎng)辦公室,各學(xué)院輔導(dǎo)員,學(xué)生等。</p><p><b> 1.3 配置要求</b></p><p><b> ?。?) 硬件平臺(tái) </b></p><p> cpu :酷睿 1.2GHz以上;</p><p> 內(nèi)存: 512M以上;</p>
4、;<p><b> (2) 軟件平臺(tái)</b></p><p> 操作系統(tǒng):Windows xp 以上,或者windows server 2003以上;</p><p><b> (3) 開(kāi)發(fā)工具</b></p><p> Linux 系統(tǒng)下IDE和Windows系統(tǒng)下vs2013</p>
5、<p> 1.4 系統(tǒng)功能分析</p><p> 1.4.1 系統(tǒng)概述</p><p> 本系統(tǒng)采用c語(yǔ)言設(shè)計(jì),運(yùn)行在windows系統(tǒng)下,用戶需要通過(guò)安裝本應(yīng)用才可以運(yùn)行。由于本系統(tǒng)有管理員功能,所以不同級(jí)別的用戶可以對(duì)本系統(tǒng)進(jìn)行不同的管理和操作。系統(tǒng)管理員對(duì)本系統(tǒng)進(jìn)行必要的維護(hù):對(duì)用戶信息的維護(hù)包括對(duì)學(xué)生用戶的增加、刪除、和修改、排序等操作和管理員用戶的修改等操作。一
6、般用戶只有查詢功能,不允許修改等操作。每個(gè)用戶在進(jìn)入系統(tǒng)之前必須登錄系統(tǒng),選擇管理員操作或者一般用戶。文件采用二進(jìn)制方式寫入,防止其他用戶盜取信息。</p><p> 1.4.2 系統(tǒng)功能分析</p><p> 通過(guò)進(jìn)行實(shí)際需求分析,本成績(jī)管理系統(tǒng)主要包括以下功能</p><p><b> ?。?)登錄模塊</b></p>&
7、lt;p> 登錄頁(yè)面上有一個(gè)角色選擇表單,包括管理員和來(lái)賓模式,管理員需要輸入帳號(hào)和密碼。登錄前選擇登錄的角色,輸入帳號(hào)和密碼,如果相應(yīng)的數(shù)據(jù)庫(kù)表中與輸入的帳號(hào)密碼相同則登錄成功,否則頁(yè)面上顯示錯(cuò)誤信息。系統(tǒng)第一次使用沒(méi)有管理員賬號(hào),它會(huì)提示讓你輸入賬號(hào)密碼,作為默認(rèn)賬號(hào)密碼。</p><p><b> (2)輸入成績(jī)</b></p><p> 該功能需要
8、管理員賬戶登錄才可以操作,增加安全性。提供學(xué)生信息和學(xué)生成績(jī)的錄入,包括學(xué)校、學(xué)院、專業(yè)、學(xué)號(hào)、姓名、各科成績(jī)等,自動(dòng)計(jì)算出總成績(jī)、平均分。輸入過(guò)程中對(duì)學(xué)號(hào)進(jìn)行檢查,不允許重復(fù),有位數(shù)限制等,防止學(xué)號(hào)出錯(cuò)。輸入成績(jī)時(shí)可以連續(xù)輸入,按0退出??梢院芊奖愕匿浫雽W(xué)生信息。</p><p><b> ?。?)刪除成績(jī)</b></p><p> 該功能需要管理員賬戶登錄才可以
9、操作,增加安全性。默認(rèn)按學(xué)號(hào)搜索進(jìn)行刪除,如果輸入錯(cuò)誤提示“沒(méi)有該記錄”。</p><p><b> ?。?)查詢成績(jī)</b></p><p> 該功能一般用戶和管理員用戶可以操作。提供學(xué)生信息的查詢和成績(jī)查詢??砂凑諏W(xué)號(hào)或者姓名進(jìn)行搜索。方便快捷,易于操作。</p><p><b> ?。?)修改成績(jī)</b></
10、p><p> 該功能需要管理員賬戶登錄才可以操作,增加安全性??赡艹煽?jī)?cè)阡浫脒^(guò)程中會(huì)出現(xiàn)錯(cuò)誤,或者老師判卷時(shí)出現(xiàn)錯(cuò)誤,造成學(xué)生成績(jī)有誤。該功能為了更加方便學(xué)生成績(jī)的管理而設(shè)計(jì)。</p><p><b> ?。?)排序成績(jī)</b></p><p> 該功能一般用戶和管理員用戶可以操作。成績(jī)默認(rèn)降序排列,可以很方便的查詢學(xué)生成績(jī)情況,與其他學(xué)生做比
11、較,找出自己的不足之處等。</p><p><b> ?。?)保存記錄</b></p><p> 該功能需要管理員用戶登錄才可以操作。學(xué)生成績(jī)輸入完畢后需要保存。此功能可保存新加所有學(xué)生記錄,并在保存完畢后輸出總共學(xué)生記錄</p><p><b> (8)顯示所有</b></p><p> 該
12、功能一般用戶和管理員用戶可以操作。顯示所有儲(chǔ)存的學(xué)生信息和學(xué)生成績(jī)成績(jī)。</p><p><b> ?。?)退出系統(tǒng)</b></p><p> 退出學(xué)生成績(jī)管理系統(tǒng),退出系統(tǒng)時(shí)會(huì)檢測(cè)成績(jī)是否有修改等操作,若被修改,會(huì)提示儲(chǔ)存信息,防止意外沒(méi)有儲(chǔ)存而退出系統(tǒng),造成學(xué)生信息有誤。</p><p> 2該系統(tǒng)所用的知識(shí)點(diǎn)</p>&
13、lt;p> 2.1結(jié)構(gòu)體(struct)</p><p> 結(jié)構(gòu)體可以看成一種自定義的數(shù)據(jù)類型,它還有一個(gè)很重要的特征就是結(jié)構(gòu)體可以嵌套使用,結(jié)構(gòu)體中可以包含結(jié)構(gòu)體指針,但不可包含結(jié)構(gòu)體變量。</p><p><b> 形式為:</b></p><p><b> struct 名</b></p>
14、<p><b> {</b></p><p><b> 數(shù)據(jù)類型 變量名</b></p><p><b> ……….</b></p><p><b> ………..</b></p><p><b> };</b>&
15、lt;/p><p> 2.2鏈表(Linked list)</p><p> 鏈表是一種常見(jiàn)的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的指針(Pointer)。由于 不必須按順序存儲(chǔ),鏈表在插入的時(shí)候可以達(dá)到O(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個(gè)節(jié)點(diǎn)或者訪問(wèn)特定編號(hào)的節(jié)點(diǎn)則需要O(n)的時(shí) 間,而順序表相應(yīng)的時(shí)間復(fù)雜度
16、分別是O(logn)和O(1)。</p><p> 使用鏈表結(jié)構(gòu)可以克服數(shù)組鏈表需要預(yù)先知道數(shù)據(jù)大小的缺點(diǎn),鏈表結(jié)構(gòu)可以充分利用計(jì)算機(jī)內(nèi)存空間,實(shí)現(xiàn)靈活的內(nèi)存動(dòng)態(tài)管理。但是鏈表失去了數(shù)組隨機(jī)讀取的優(yōu)點(diǎn),同時(shí)鏈表由于增加了結(jié)點(diǎn)的指針域,空間開(kāi)銷比較大。</p><p> 鏈表中有單向鏈表、雙向鏈表和循環(huán)鏈表等,本程序用的單向鏈表。</p><p><b>
17、; 2.2.1單向鏈表</b></p><p> 鏈表中最簡(jiǎn)單的一種是單向鏈表,它包含指針域和數(shù)據(jù)域。這個(gè)鏈表指向列表中的下一個(gè)節(jié)點(diǎn),最后一個(gè)節(jié)點(diǎn)指針為NULL。</p><p> 鏈表最基本的結(jié)構(gòu)是在每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和到下一個(gè)節(jié)點(diǎn)的地址,在最后一個(gè)節(jié)點(diǎn)保存一個(gè)特殊的結(jié)束標(biāo)記,另外在一個(gè)固定的位置保存指向第一個(gè)節(jié)點(diǎn)的指針,有 的時(shí)候也會(huì)同時(shí)儲(chǔ)存指向最后一個(gè)節(jié)點(diǎn)的指針。一般
18、查找一個(gè)節(jié)點(diǎn)的時(shí)候需要從第一個(gè)節(jié)點(diǎn)開(kāi)始每次訪問(wèn)下一個(gè)節(jié)點(diǎn),一直訪問(wèn)到需要的位置。但是也可以提前把一 個(gè)節(jié)點(diǎn)的位置另外保存起來(lái),然后直接訪問(wèn)。當(dāng)然如果只是訪問(wèn)數(shù)據(jù)就沒(méi)必要了,不如在鏈表上儲(chǔ)存指向?qū)嶋H數(shù)據(jù)的指針。這樣一般是為了訪問(wèn)鏈表中的下一個(gè)或者 前一個(gè)(需要儲(chǔ)存反向的指針,雙向鏈表)節(jié)點(diǎn)。</p><p><b> 2.3文件讀寫</b></p><p> 文件指
19、針FILE *fp;</p><p> 讀寫方式:rb 二進(jìn)制方式讀;</p><p> wb 二進(jìn)制方式寫入;</p><p><b> 用到語(yǔ)法:</b></p><p> fread(變量,字節(jié),次數(shù),文件指針);從文件中讀取。</p><p> fwrite(變量,字節(jié),次數(shù),文
20、件指針);向文件寫入。</p><p><b> 3.系統(tǒng)功能概述</b></p><p> 根據(jù)前面對(duì)學(xué)生成績(jī)管理系統(tǒng)的分析。主要功能模塊如下:</p><p><b> 3.1概要設(shè)計(jì)</b></p><p> 用struct 建立一個(gè)學(xué)生的結(jié)構(gòu)體struct student,然后用st
21、ruct定義一個(gè)鏈表,里面分別建立指針域和數(shù)據(jù)域。建立菜單函數(shù),一個(gè)是用戶菜單,一個(gè)是管理員菜單,不同菜單對(duì)應(yīng)不同操作。因?yàn)橐啻螖?shù)出表頭信息,為了方便,用#define定義了兩個(gè)宏,一個(gè)輸出表頭,另一個(gè)存儲(chǔ)輸出控制符。定義printheader()函數(shù)輸出表頭,定義printdata()函數(shù)輸出表中數(shù)據(jù),定義wrong()函數(shù)輸出按鍵錯(cuò)誤信息,定義disp()函數(shù)顯示鏈表中數(shù)據(jù),add()函數(shù)添加學(xué)生信息,qur()函數(shù)查詢學(xué)生信息,
22、del()函數(shù)刪除學(xué)生信息,modify()修改學(xué)生信息,sort()函數(shù)排序,save()函數(shù)儲(chǔ)存到文件中,</p><p> Login()登錄函數(shù)等。共同構(gòu)成了整個(gè)系統(tǒng)。</p><p><b> 4.詳細(xì)設(shè)計(jì)</b></p><p> 經(jīng)過(guò)上面的需求分析和總體設(shè)計(jì),對(duì)此學(xué)生成績(jī)管理系統(tǒng)有了詳細(xì)的了解。下面就幾個(gè)重要模塊,介紹一下詳
23、細(xì)設(shè)計(jì)。</p><p><b> 4.1登錄功能</b></p><p> 登錄功能分管理員和來(lái)賓用戶兩種角色,每一類用戶根據(jù)自己的角色擁有不同的權(quán)限菜單,不同類用戶只能訪問(wèn)各自工作領(lǐng)域內(nèi)的相關(guān)頁(yè)面。</p><p><b> 登錄流程圖如下:</b></p><p><b>
24、N</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> 4.2 添加功能</b></p><p> 為防止輸入錯(cuò)誤
25、,添加功能加入了學(xué)號(hào)檢查功能,如果學(xué)號(hào)重復(fù),或者位數(shù)不對(duì)會(huì)提示重新輸入,連續(xù)存儲(chǔ),按0退出。</p><p><b> 添加流程圖如下:</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> N</
26、b></p><p><b> 4.3 刪除功能</b></p><p> 為了方便數(shù)據(jù)管理,在刪除功能中有兩種選擇,1、通過(guò)學(xué)號(hào)刪除 2、通過(guò)姓名刪除。在鏈表中讀取,用free()釋放動(dòng)態(tài)內(nèi)存空間,然后保存。</p><p><b> 刪除流程圖如下:</b></p><p><
27、b> NN</b></p><p><b> YY</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> 5 測(cè)試結(jié)果</b></p><p>
28、;<b> 5.1登錄功能測(cè)試</b></p><p><b> 5.2添加功能測(cè)試</b></p><p><b> 5.3刪除功能測(cè)試</b></p><p><b> 5.4程序運(yùn)行截圖</b></p><p><b> 1.登錄
29、方式截圖</b></p><p><b> 2管理員登錄截圖</b></p><p><b> 3.來(lái)賓登錄截圖</b></p><p><b> 4.排序成績(jī)截圖</b></p><p><b> 6總結(jié)及經(jīng)驗(yàn)體會(huì)</b></p
30、><p> 在設(shè)計(jì)這個(gè)系統(tǒng)的過(guò)程中,遇到了很多麻煩,學(xué)習(xí)到很多以前沒(méi)有學(xué)到的知識(shí),也熟悉了以前的知識(shí)。每次遇到麻煩時(shí)都是上網(wǎng)查資料,或者問(wèn)身邊同學(xué)。通過(guò)這次程序設(shè)計(jì),溫習(xí)了函數(shù)調(diào)用,指針函數(shù),結(jié)構(gòu)體,文件等的基本操作。主要掌握了數(shù)據(jù)結(jié)構(gòu)中鏈表增、刪、改等知識(shí)點(diǎn)和文件的各種操作。知道了怎么用數(shù)據(jù)結(jié)構(gòu)和文件關(guān)聯(lián)起來(lái)使用,怎么用鏈表排序。通過(guò)與其他人交流,學(xué)到了很多其他人的思考問(wèn)題的方法??傊斋@好豐富。</p&g
31、t;<p><b> 7附錄</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p> #include <conio.h></p><p> #include <time.
32、h></p><p> #include <stdlib.h></p><p> #define HEADER2 " 學(xué)校 學(xué)院 班級(jí) 學(xué)號(hào) 姓名 英語(yǔ) 數(shù)學(xué) C語(yǔ)言 總分 平均\n"</p><p> #define FOR
33、MAT " %15s %20s %8s %8s %10s %4d %4d %4d %4d %.2f\n"</p><p> #define DATA p->data.school,p->data.xueyuan,p->data.classs,p->data.num,p->data.name,p->data.egrade,p->da
34、ta.mgrade,p->data.cgrade,p->data.total,p->data.ave</p><p> int saveflag = 0; /*是否需要存盤的標(biāo)志變量*/</p><p> struct student {</p><p> char school[50];</p><p> char
35、 xueyuan[50];</p><p> char classs[20];</p><p> char num[10]; /*學(xué)號(hào)*/</p><p> char name[15]; /*姓名*/</p><p> int cgrade; /*C語(yǔ)言成績(jī)*/</p><p> int mgra
36、de; /*數(shù)學(xué)成績(jī)*/</p><p> int egrade; /*英語(yǔ)成績(jī)*/</p><p> int total; /*總分*/</p><p> float ave; /*平均分*/</p><p><b> };</b></p><p>
37、 typedef struct node{ //定義每條記錄或結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)</p><p> struct student data; /*數(shù)據(jù)域*/</p><p> struct node *next; /*指針域*/</p><p> }Node, *Link; /*Node為node類型的結(jié)構(gòu)變量,*Link為node類型的指針變量
38、*/</p><p> void menu() {</p><p> time_t now;</p><p> now = time(NULL);</p><p> printf(" 學(xué)生成績(jī)管理系統(tǒng) \n");</p><p> prin
39、tf("\n");</p><p> printf(" *************************************************************\n");</p><p> printf(" *
40、 *\n");</p><p> printf(" * 1 輸入成績(jī) 2 刪除成績(jī) *\n");</p><p> printf(" *
41、 *\n");</p><p> printf(" * 3 查詢成績(jī) 4 修改成績(jī) *\n");</p><p> printf(" *
42、 *\n");</p><p> printf(" * 5 排序成績(jī) 6 保存記錄 *\n");</p><p> printf(" *
43、*\n");</p><p> printf(" * 7 顯示所有 0 退出系統(tǒng) *\n");</p><p> printf(" * *\n&
44、quot;);</p><p> printf(" *************************************************************\n");</p><p> printf(" * 8 切換登錄模式 9 修改管理員信息 *\n");&l
45、t;/p><p> printf(" *************************************************************\n");</p><p> printf(" Made by 徐海興, now time is %s\n ", ctime(&now));</p&g
46、t;<p> printf("\n請(qǐng)您選擇操作命令(0~9):"); /*顯示提示信息*/</p><p><b> }</b></p><p> void menu2(){</p><p> time_t now;</p><p> now = time(NULL);&
47、lt;/p><p> system("cls"); //清屏</p><p> printf("\n 來(lái)賓模式\n\n\n");</p><p> printf("
48、 學(xué)生成績(jī)管理系統(tǒng) \n");</p><p> printf("\n");</p><p> printf(" *************************************************************\n");</p><p&g
49、t; printf(" * *\n");</p><p> printf(" * 1 查詢成績(jī) 2 排序成績(jī) *\n");</p><p>
50、printf(" * *\n");</p><p> printf(" * 3 顯示所有 0 退出系統(tǒng) *\n");</p><p> prin
51、tf(" * *\n");</p><p> printf(" *************************************************************\n");</p><p>
52、printf(" * 4 切換登錄模式 *\n");</p><p> printf(" *************************************************************\n");</p><p> pr
53、intf(" Made by 徐海興, now time is %s\n ", ctime(&now));</p><p> printf("\n請(qǐng)您選擇操作命令(0~4):"); /*顯示提示信息*/</p><p><b> }</b></p><p> voi
54、d printheader(){ /*格式化輸出表頭*/</p><p> printf(HEADER2);</p><p><b> }</b></p><p> void printdata(Node *pp) {/*格式化輸出表中數(shù)據(jù)*/</p><p><b> Node* p;</b&g
55、t;</p><p><b> p = pp;</b></p><p> printf(FORMAT, DATA);</p><p><b> }</b></p><p> void Wrong() { /*輸出按鍵錯(cuò)誤信息*/</p><p> printf(&
56、quot;\n\n\n\n\n**********錯(cuò)誤:輸入不合法!!!**********\a\n");</p><p><b> getch();</b></p><p><b> }</b></p><p> void Nofind(){ /*輸出未查找此學(xué)生的信息*/</p><
57、p> printf("\n沒(méi)有該學(xué)生!!\n");</p><p><b> }</b></p><p> void Disp(Link l){ /*顯示單鏈表l中存儲(chǔ)的學(xué)生記錄,內(nèi)容為student結(jié)構(gòu)中定義的內(nèi)容*/</p><p> system("cls");</p>
58、<p><b> Node *p;</b></p><p> p = l->next; /*l存儲(chǔ)的是單鏈表中頭結(jié)點(diǎn)的指針,該頭結(jié)點(diǎn)沒(méi)有存儲(chǔ)學(xué)生信息,指針域指向的后繼結(jié)點(diǎn)才有學(xué)生信息*/</p><p> if (!p) /*p==NULL,NUll在stdlib中定義為0*/</p><p><b> {&l
59、t;/b></p><p> printf("\n目前無(wú)學(xué)生成績(jī)記錄!!\n");</p><p><b> getch();</b></p><p><b> return;</b></p><p><b> }</b></p>
60、<p> printf("\n\n");</p><p> printheader(); /*輸出表格頭部*/</p><p> while (p) /*逐條輸出鏈表中存儲(chǔ)的學(xué)生信息*/</p><p><b> {</b></p><p> printdata(p);&l
61、t;/p><p> p = p->next; /*移動(dòng)直下一個(gè)結(jié)點(diǎn)*/</p><p><b> }</b></p><p><b> }</b></p><p> Node* Locate(Link l, char findmess[], char nameornum[]){</p
62、><p><b> Node *r;</b></p><p> if (strcmp(nameornum, "num") == 0) /*按學(xué)號(hào)查詢*/</p><p><b> {</b></p><p> r = l->next;</p><p&
63、gt;<b> while (r)</b></p><p><b> {</b></p><p> if (strcmp(r->data.num, findmess) == 0) /*若找到findmess值的學(xué)號(hào)*/</p><p><b> return r;</b></p&g
64、t;<p> r = r->next;</p><p><b> }</b></p><p><b> }</b></p><p> else if (strcmp(nameornum, "name") == 0) /*按姓名查詢*/</p><p>
65、<b> {</b></p><p> r = l->next;</p><p><b> while (r)</b></p><p><b> {</b></p><p> if (strcmp(r->data.name, findmess) == 0)
66、 /*若找到findmess值的學(xué)生姓名*/</p><p><b> return r;</b></p><p> r = r->next;</p><p><b> }</b></p><p><b> }</b></p><p>
67、; return 0; /*若未找到,返回一個(gè)空指針*/</p><p><b> }</b></p><p> void stringinput(char *t, int lens, char *notice){</p><p> char n[255];</p><p><b> do</b
68、></p><p><b> {</b></p><p> printf(notice); /*顯示提示信息*/</p><p> scanf("%s", n); /*輸入字符串*/</p><p> if (strlen(n)>lens)printf("\n 超出長(zhǎng)度!
69、!!\n"); /*進(jìn)行長(zhǎng)度校驗(yàn),超過(guò)lens值重新輸入*/</p><p> } while (strlen(n)>lens);</p><p> strcpy(t, n); /*將輸入的字符串拷貝到字符串t中*/</p><p><b> }</b></p><p> int numberin
70、put(char *notice){</p><p> int t = 0;</p><p><b> do</b></p><p><b> {</b></p><p> printf(notice); /*顯示提示信息*/</p><p> scanf(&quo
71、t;%d", &t); /*輸入分?jǐn)?shù)*/</p><p> if (t>100 || t<0) printf("\n 分?jǐn)?shù)必須在0~100之間!!! \n"); //分?jǐn)?shù)校驗(yàn)</p><p> } while (t>100 || t<0);</p><p><b> return t;&l
72、t;/b></p><p><b> }</b></p><p> void Add(Link l){</p><p> Node *p, *r, *s;</p><p> char ch, flag = 0, num[10];</p><p><b> r = l;&l
73、t;/b></p><p> system("cls");</p><p> Disp(l); /*先打印出已有的學(xué)生信息*/</p><p> while (r->next != NULL)</p><p> r = r->next; /*將指針移至于鏈表最末尾,準(zhǔn)備添加記錄*/</p&g
74、t;<p> while (1) /*一次可輸入多條記錄,直至輸入學(xué)號(hào)為0的記錄結(jié)點(diǎn)添加操作*/</p><p><b> {</b></p><p> s = l->next;</p><p><b> while (1)</b></p><p><b>
75、{</b></p><p> stringinput(num, 10, "學(xué)號(hào)(按0退出):"); /*格式化輸入學(xué)號(hào)并檢驗(yàn)*/</p><p><b> flag = 0;</b></p><p> if (strcmp(num, "0") == 0) /*輸入為0,則退出添加操作,返
76、回主界面*/</p><p><b> return;</b></p><p> s = l->next;</p><p> while (s) /*查詢?cè)搶W(xué)號(hào)是否已經(jīng)存在,若存在則要求重新輸入一個(gè)未被占用的學(xué)號(hào)*/</p><p><b> {</b></p><
77、p> if (strcmp(s->data.num, num) == 0)</p><p><b> {</b></p><p><b> flag = 1;</b></p><p><b> break;</b></p><p><b> }&
78、lt;/b></p><p> s = s->next;</p><p><b> }</b></p><p> if (flag == 1) /*提示用戶是否重新輸入*/</p><p><b> {</b></p><p> getchar();&l
79、t;/p><p> printf("=====>學(xué)號(hào)%s已存在,是否重新輸入?(y/n)\a:", num);</p><p> scanf("%c", &ch);</p><p> if (ch == 'y' || ch == 'Y')</p><p>
80、<b> continue;</b></p><p><b> else</b></p><p><b> return;</b></p><p><b> }</b></p><p><b> else</b></p
81、><p><b> break;</b></p><p><b> }</b></p><p> p = (Node *)malloc(sizeof(Node));</p><p> strcpy(p->data.num, num); /*將字符串num拷貝到p->data.num中
82、*/</p><p> stringinput(p->data.name, 15, "Name:");</p><p> stringinput(p->data.school, 50, "學(xué)校:");</p><p> stringinput(p->data.xueyuan, 50, "學(xué)院:
83、");</p><p> stringinput(p->data.classs, 20, "班級(jí):");</p><p> p->data.cgrade = numberinput("C語(yǔ)言0-100]:");</p><p> p->data.mgrade = numberinput(&qu
84、ot;數(shù)學(xué)[0-100]:");</p><p> p->data.egrade = numberinput("英語(yǔ)[0-100]:");</p><p> p->data.total = p->data.egrade + p->data.cgrade + p->data.mgrade; /*計(jì)算總分*/</p>
85、<p> p->data.ave = (float)(p->data.total / 3); /*計(jì)算平均分*/</p><p> p->next = NULL;</p><p> while (r->next != NULL)</p><p> r = r->next;</p><p>
86、r->next = p;</p><p> saveflag = 1;</p><p><b> }</b></p><p><b> }</b></p><p> void Qur(Link l){ /*按學(xué)號(hào)或姓名,查詢學(xué)生記錄*/</p><p> sy
87、stem("cls");</p><p> int select; /*1:按學(xué)號(hào)查,2:按姓名查,其他:返回主界面(菜單)*/</p><p> char searchinput[20]; /*保存用戶輸入的查詢內(nèi)容*/</p><p><b> Node *p;</b></p><p>
88、if (!l->next) /*若鏈表為空*/</p><p><b> {</b></p><p> printf("\n暫無(wú)學(xué)生記錄!!!\n");</p><p><b> return;</b></p><p><b> }</b>&l
89、t;/p><p> printf("\n =====>1 通過(guò)學(xué)號(hào)查找 =====>2 通過(guò)姓名查找\n");</p><p> printf(" 請(qǐng)選擇[1,2]:");</p><p> scanf("%d", &select);</p><p
90、> if (select == 1) /*按學(xué)號(hào)查詢*/</p><p><b> {</b></p><p> stringinput(searchinput, 10, "請(qǐng)輸入要查找的學(xué)號(hào):");</p><p> p = Locate(l, searchinput, "num");
91、/*在l中查找學(xué)號(hào)為searchinput值的節(jié)點(diǎn),并返回節(jié)點(diǎn)的指針*/</p><p> if (p) /*若p!=NULL*/</p><p><b> {</b></p><p> printheader();</p><p> printdata(p);</p><p><b
92、> }</b></p><p><b> else</b></p><p><b> Nofind();</b></p><p><b> }</b></p><p> else if (select == 2) /*按姓名查詢*/</p>
93、;<p><b> {</b></p><p> stringinput(searchinput, 15, "請(qǐng)輸入學(xué)生姓名:");</p><p> p = Locate(l, searchinput, "name");</p><p><b> if (p)</b
94、></p><p><b> {</b></p><p> printheader();</p><p> printdata(p);</p><p><b> }</b></p><p><b> else</b></p>
95、<p><b> Nofind();</b></p><p><b> }</b></p><p><b> else</b></p><p><b> Wrong();</b></p><p> system("PAUSE
96、");</p><p><b> }</b></p><p> void Del(Link l){//刪除學(xué)生記錄:先找到保存該學(xué)生記錄的節(jié)點(diǎn),然后刪除該節(jié)點(diǎn)</p><p><b> int sel;</b></p><p> Node *p, *r;</p>&l
97、t;p> char findmess[20];</p><p> if (!l->next)</p><p><b> {</b></p><p> system("cls");</p><p> printf("\n=====>暫無(wú)學(xué)生記錄!!\n")
98、;</p><p><b> getch();</b></p><p><b> return;</b></p><p><b> }</b></p><p> system("cls");</p><p><b>
99、 Disp(l);</b></p><p> printf("\n 1 通過(guò)學(xué)號(hào)刪除 2 通過(guò)姓名刪除\n");</p><p> printf(" 請(qǐng)選擇[1,2]:");</p><p> scanf("%d", &sel);&l
100、t;/p><p> if (sel == 1)</p><p><b> {</b></p><p> stringinput(findmess, 10, "請(qǐng)輸入學(xué)號(hào):");</p><p> p = Locate(l, findmess, "num");</p>
101、<p><b> if (p)</b></p><p><b> {</b></p><p><b> r = l;</b></p><p> while (r->next != p)</p><p> r = r->next;</p&
102、gt;<p> r->next = p->next;</p><p> free(p); /*釋放內(nèi)存空間*/</p><p> printf("\n刪除成功!\n");</p><p> saveflag = 1;</p><p><b> }</b></p
103、><p><b> else</b></p><p><b> Nofind();</b></p><p><b> }</b></p><p> else if (sel == 2) /*先按姓名查詢到該記錄所在的節(jié)點(diǎn)*/</p><p><
104、b> {</b></p><p> stringinput(findmess, 15, "請(qǐng)輸入學(xué)生姓名:");</p><p> p = Locate(l, findmess, "name");</p><p><b> if (p)</b></p><p&
105、gt;<b> {</b></p><p><b> r = l;</b></p><p> while (r->next != p)</p><p> r = r->next;</p><p> r->next = p->next;</p><
106、p><b> free(p);</b></p><p> printf("\n刪除成功!!!\n");</p><p> saveflag = 1;</p><p><b> }</b></p><p><b> else</b></p
107、><p><b> Nofind();</b></p><p><b> }</b></p><p><b> else</b></p><p><b> Wrong();</b></p><p><b> getc
108、h();</b></p><p><b> }</b></p><p> void Modify(Link l){//修改學(xué)生記錄.先按輸入的學(xué)號(hào)查詢到該記錄,然后提示用戶修改學(xué)號(hào)之外的值,學(xué)號(hào)不能修改</p><p><b> Node *p;</b></p><p> cha
109、r findmess[20];</p><p> if (!l->next)</p><p><b> {</b></p><p> system("cls");</p><p> printf("\n沒(méi)有該生記錄!\n");</p><p>
110、<b> getch();</b></p><p><b> return;</b></p><p><b> }</b></p><p> system("cls");</p><p> printf("修改學(xué)生記錄");&l
111、t;/p><p><b> Disp(l);</b></p><p> stringinput(findmess, 10, "請(qǐng)輸入學(xué)號(hào):"); /*輸入并檢驗(yàn)該學(xué)號(hào)*/</p><p> p = Locate(l, findmess, "num"); /*查詢到該節(jié)點(diǎn)*/</p><
112、;p> if (p) /*若p!=NULL,表明已經(jīng)找到該節(jié)點(diǎn)*/</p><p><b> {</b></p><p> printf("學(xué)號(hào):%s,\n", p->data.num);</p><p> printf("姓名:%s,", p->data.name);</
113、p><p> stringinput(p->data.name, 15, "輸入新姓名:");</p><p> printf("C語(yǔ)言:%d,", p->data.cgrade);</p><p> p->data.cgrade = numberinput("C語(yǔ)言[0-100]:")
114、;</p><p> printf("數(shù)學(xué):%d,", p->data.mgrade);</p><p> p->data.mgrade = numberinput("數(shù)學(xué)[0-100]:");</p><p> printf("英語(yǔ):%d,", p->data.egrade);&l
115、t;/p><p> p->data.egrade = numberinput("英語(yǔ)[0-100]:");</p><p> p->data.total = p->data.egrade + p->data.cgrade + p->data.mgrade;</p><p> p->data.ave = (fl
116、oat)(p->data.total / 3);</p><p> printf("\n=====>修改成功!\n");</p><p> saveflag = 1;</p><p><b> }</b></p><p><b> else</b></p
117、><p><b> Nofind();</b></p><p><b> getch();</b></p><p><b> }</b></p><p> void Sort(Link l){</p><p> system("cls&q
118、uot;);</p><p><b> Link ll;</b></p><p> Node *p, *rr, *s;</p><p> int i = 0;</p><p> if (l->next == NULL)</p><p><b> {</b>&l
119、t;/p><p> printf("\n暫無(wú)學(xué)生記錄!\n");</p><p><b> return;</b></p><p><b> }</b></p><p> ll = (Node*)malloc(sizeof(Node)); /*用于創(chuàng)建新的節(jié)點(diǎn)*/</p
120、><p> ll->next = NULL;</p><p> printf("當(dāng)前狀態(tài):\n");</p><p> // puts("錯(cuò)誤不在這!");</p><p> Disp(l); /*顯示排序前的所有學(xué)生記錄*/</p><p> // system
121、("PAUSE");</p><p> p = l->next;</p><p> while (p) /*p!=NULL*/</p><p><b> {</b></p><p> s = (Node*)malloc(sizeof(Node)); /*新建節(jié)點(diǎn)用于保存從原鏈表中取出的節(jié)
122、點(diǎn)信息*/</p><p> s->data = p->data; /*填數(shù)據(jù)域*/</p><p> s->next = NULL; /*指針域?yàn)榭?/</p><p><b> rr = ll;</b></p><p> /*rr鏈表于存儲(chǔ)插入單個(gè)節(jié)點(diǎn)后保持排序的鏈表,ll是這個(gè)鏈表的
123、頭指針,每次從頭開(kāi)始查找插入位置*/</p><p> while (rr->next != NULL && rr->next->data.total >= p->data.total)</p><p><b> {</b></p><p> rr = rr->next;</p&g
124、t;<p> } /*指針移至總分比p所指的節(jié)點(diǎn)的總分小的節(jié)點(diǎn)位置*/</p><p> if (rr->next == NULL)/*若新鏈表ll中的所有節(jié)點(diǎn)的總分值都比p->data.total大時(shí),就將p所指節(jié)點(diǎn)加入鏈表尾部*/</p><p> rr->next = s;</p><p> else /*否則將該節(jié)點(diǎn)插
125、入至第一個(gè)總分字段比它小的節(jié)點(diǎn)的前面*/</p><p><b> {</b></p><p> s->next = rr->next;</p><p> rr->next = s;</p><p><b> }</b></p><p> p =
126、p->next; /*原鏈表中的指針下移一個(gè)節(jié)點(diǎn)*/</p><p><b> }</b></p><p> l->next = ll->next; /*ll中存儲(chǔ)是的已排序的鏈表的頭指針*/</p><p> p = l->next; /*已排好序的頭指針賦給p,準(zhǔn)備填寫名次*/</p&
127、gt;<p> while (p != NULL) /*當(dāng)p不為空時(shí),進(jìn)行下列操作*/</p><p><b> {</b></p><p> i++; /*結(jié)點(diǎn)序號(hào)*/</p><p> p = p->next; /*指針后移*/</p><p><b> }&l
128、t;/b></p><p> printf("\n*********************************************\n");</p><p> // puts("錯(cuò)誤不在這!");</p><p><b> Disp(l);</b></p><p
129、> saveflag = 1;</p><p> printf("\n =====>排序完成!!\n");</p><p> system("PAUSE");</p><p><b> }</b></p><p> void Save(Link l){
130、 //數(shù)據(jù)存盤,若用戶沒(méi)有專門進(jìn)行此操作且對(duì)數(shù)據(jù)有修改,在退出系統(tǒng)時(shí),會(huì)提示用戶存盤</p><p><b> FILE* fp;</b></p><p><b> Node *p;</b></p><p> int count = 0;</p><p> fp = fopen("
131、;student.txt", "wb");/*以只寫方式打開(kāi)二進(jìn)制文件*/</p><p> p = l->next;</p><p><b> while (p)</b></p><p><b> {</b></p><p> if (fwrite(p,
132、 sizeof(Node), 1, fp) == 1)</p><p><b> {</b></p><p> p = p->next;</p><p><b> count++;</b></p><p><b> }</b></p><p&g
133、t;<b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> if (count>0)</p><p><b> {</b></p><p>
134、 printf("\n\n\n\n\n 保存完畢,當(dāng)前有%d名學(xué)生記錄\n", count);</p><p> saveflag = 0;</p><p><b> }</b></p><p><b> else</b></p><p> printf(
135、"空文件,保存失敗!!\n");</p><p> fclose(fp); //關(guān)閉此文件</p><p><b> getch();</b></p><p><b> }</b></p><p> int login(){</p><p> F
136、ILE *fp1, *fp2;</p><p> int state;</p><p> char str1[20], str2[20], str_z[20], str_m[20];</p><p> if ((fp1 = fopen("admin.txt", "rb")) == NULL)</p><
137、;p><b> {</b></p><p> printf("本系統(tǒng)無(wú)管理員,請(qǐng)創(chuàng)建!\n\n請(qǐng)輸入管理員賬號(hào):");</p><p> scanf("%s", str_z);</p><p> printf("請(qǐng)輸入密碼:");</p><p>
138、 scanf("%s", str_m);</p><p> fp2 = fopen("admin.txt", "wb");</p><p> fprintf(fp2, "%s%c", str_z, '\n');</p><p> fprintf(fp2, &quo
139、t;%s%c", str_m, ' ');</p><p> fclose(fp2);</p><p><b> }</b></p><p> fp1 = fopen("admin.txt", "rb");</p><p> fscanf(fp1,
140、 "%s", str1);</p><p> fscanf(fp1, "%s", str2);</p><p> fclose(fp1);</p><p><b> while (1)</b></p><p><b> {</b></p>
141、<p> printf("請(qǐng)選擇你的登錄方式:\n\n");</p><p> printf("1.管理員模式 0.來(lái)賓模式\n");</p><p> printf("請(qǐng)你選擇:(0-1)");</p><p> scanf("%d", &sta
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)——學(xué)生成績(jī)管理系統(tǒng)
- 課程設(shè)計(jì)---學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 學(xué)生成績(jī)管理系統(tǒng) 課程設(shè)計(jì)
- 課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 課程設(shè)計(jì)-- 學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)9
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)10
- vfp課程設(shè)計(jì)--- 學(xué)生成績(jī)管理系統(tǒng)
- java課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- vfp課程設(shè)計(jì)--學(xué)生成績(jī)管理系統(tǒng)
- 學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- vb課程設(shè)計(jì)---學(xué)生成績(jī)管理系統(tǒng)
- vb課程設(shè)計(jì)----學(xué)生成績(jī)管理系統(tǒng)
- web課程設(shè)計(jì).學(xué)生成績(jī)管理系統(tǒng)
評(píng)論
0/150
提交評(píng)論