




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)報(bào)告專 業(yè): 軟 件 學(xué) 院 班 級(jí): 計(jì)HR-06-7班 姓 名: 李 政 源 指導(dǎo)教師: 李 建 中 學(xué) 號(hào): 0620010710 課程設(shè)計(jì)報(bào)告一、課程設(shè)計(jì)題目 基本要求題目:矩陣乘法。 綜合訓(xùn)練:學(xué)生成績(jī)管理系統(tǒng)二、設(shè)計(jì)要求矩陣乘法:編寫一個(gè)函數(shù)實(shí)現(xiàn)矩陣A(2行3列)與矩陣B 相乘(3行2列),乘積放在C數(shù)組中。在主函數(shù)中輸入相乘的兩數(shù)組,并輸出結(jié)果。學(xué)生成績(jī)管理:(結(jié)構(gòu)體數(shù)組、函數(shù)、指針、算法、流程結(jié)構(gòu)及文件等的綜合應(yīng)用)程序說明:有N個(gè)學(xué)生,每個(gè)學(xué)生的數(shù)據(jù)包含學(xué)號(hào)(不重復(fù))、姓名、三門課的成績(jī)及平均成績(jī),試設(shè)計(jì)一學(xué)生成績(jī)管理系統(tǒng),使之能提供以下功能:學(xué)生成績(jī)
2、管理系統(tǒng)1、 成績(jī)錄入2、 成績(jī)查詢3、 成績(jī)統(tǒng)計(jì)4、 退出(1)主菜單(2)各菜單項(xiàng)功能 成績(jī)錄入:輸入學(xué)生的學(xué)號(hào)、姓名及三門課的成績(jī); 成績(jī)查詢:(至少一種查詢方式)。v 按學(xué)號(hào)查詢學(xué)生記錄。v 查詢不及格學(xué)生的記錄。成績(jī)統(tǒng)計(jì):v 計(jì)算學(xué)生的平均分;v 根據(jù)學(xué)生的平均分高低,對(duì)學(xué)生的數(shù)據(jù)進(jìn)行排序后輸出;v 對(duì)學(xué)生單科成績(jī)排序,輸出學(xué)生姓名與該科成績(jī);退出系統(tǒng):退出整個(gè)系統(tǒng)(即主菜單)。(3)結(jié)構(gòu)體數(shù)組:define N 30struct studentint num; /* 定義學(xué)號(hào)*/ char name20; /* 定義姓名*/float score3; /* 定義存貯三門課成績(jī)的數(shù)組
3、*/float average; /* 定義平均成績(jī)*/;struct student stuN; /* 定義結(jié)構(gòu)體數(shù)組,存貯多個(gè)學(xué)生的記錄*/三、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)描述系統(tǒng)功能描述1能夠輸入學(xué)生的學(xué)號(hào)、姓名、三科成績(jī)并且計(jì)算出平均成績(jī)。2能夠以表格的形式輸出學(xué)生記錄3能夠按照學(xué)生三科的平均成績(jī)進(jìn)行排序4能夠按照學(xué)生的單科成績(jī)進(jìn)行排序5能夠按照學(xué)號(hào)查詢學(xué)生記錄6往表中插入學(xué)生記錄7從表中刪除學(xué)生記錄8存儲(chǔ)記錄到文件中9從文件中讀取記錄10退出數(shù)據(jù)字典1數(shù)據(jù)流條目數(shù)據(jù)流名稱:全部記錄別名:無簡(jiǎn)述:最新更新后所有關(guān)于學(xué)生成績(jī)的記錄來源:數(shù)據(jù)庫去向:加工“記錄篩選”數(shù)據(jù)流量:不限 組成:學(xué)號(hào)+姓名+SC1
4、+SC2+SC3+平均成績(jī)數(shù)據(jù)存儲(chǔ)條數(shù)據(jù)存儲(chǔ)名稱:學(xué)生成績(jī)記錄別名:無簡(jiǎn)述:存放學(xué)生所有可供查詢的信息組成:學(xué)號(hào)+姓名+SC1+SC2+SC3+平均成績(jī)組織方式:索引文件,以學(xué)學(xué)號(hào)為關(guān)鍵字查詢要求:要求能立即查詢2數(shù)據(jù)項(xiàng)條目數(shù)據(jù)項(xiàng)名稱:學(xué)號(hào)別名:無簡(jiǎn)述:所有學(xué)校學(xué)生的學(xué)號(hào)類型:字符串3加工條目加工名:更改的記錄激發(fā)條件:學(xué)生成績(jī)記錄被改動(dòng)優(yōu)先級(jí):普通輸入:新記錄輸出:更新數(shù)據(jù)、數(shù)據(jù)未改動(dòng)加工邏輯:根據(jù)現(xiàn)有學(xué)生成績(jī)記錄if 新記錄<>舊記錄then 更新數(shù)據(jù)else 數(shù)據(jù)未改動(dòng)endif設(shè)計(jì)測(cè)試流程1、進(jìn)入界面 2、輸入選項(xiàng)0,回車; 按提示輸入數(shù)據(jù)3、回到主菜單; 輸入選項(xiàng)8,回車
5、; 輸入文件名:data,回車; 出現(xiàn)成功提示,則讀入文件操作成功。4、回到主菜單,輸入1,回車 每10個(gè)暫停顯示數(shù)據(jù)5、回到主菜單,輸入2,回車 出現(xiàn)排序成功信息。6、回到主菜單,輸入3,回車 出現(xiàn)排序成功信息。7、回到主菜單,輸入5,回車 按提示插入一組數(shù)據(jù)8、回到主菜單,輸入6,回車 按提示輸入姓名,刪除數(shù)據(jù) 出現(xiàn)刪除成功的信息9、回到主菜單,輸入4,回車 輸入學(xué)號(hào)進(jìn)行查詢10、回到主菜單,輸入1,回車 出現(xiàn)統(tǒng)計(jì)信息11、回到主菜單,輸入7,回車輸入result,回車出現(xiàn)成功寫入文件的信息12、回到主菜單,輸入9,回車退出系統(tǒng)四、各變量的定義和作用#define N 3 定義常數(shù) typ
6、edef struct z1 定義數(shù)據(jù)結(jié)構(gòu) char no11; char name15; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT;char *menu 定義菜單字符串?dāng)?shù)組Enter list 輸入記錄Print list 顯示單鏈表中所有記錄 Sort to make new file 按照總成績(jī)排序 sort to Single course result 按照單科成績(jī)排序 Search record on ID 按照學(xué)號(hào)查找記錄 Insert record to list 插入記錄
7、到表中 Delete a record from list 從表中刪除記錄 Save the file 將單鏈表中記錄保存到文件中Load the file 從文件中讀入記錄*/ Quit 退出STUDENT *init() 初始化鏈表STUDENT *create()創(chuàng)建鏈表,完成數(shù)據(jù)錄入功能inputs(char *prompt, char *s, int count) 自定義輸入控制函數(shù)inputs五、系統(tǒng)各模塊(函數(shù))的組成。功能、參數(shù)說明、相互調(diào)用關(guān)系主函數(shù) main()利用無限次循環(huán)for(;)和swithch()實(shí)現(xiàn)各函數(shù)的調(diào)用,系統(tǒng)根據(jù)輸入的數(shù)字選項(xiàng)來調(diào)用相應(yīng)的函數(shù)。初始化函數(shù)
8、 STUDENT *init()這是一個(gè)無參函數(shù),里面只有一個(gè)語句,它的作用是使鏈表初始化,使head的值為NULL。比如:沒有這個(gè)函數(shù)的話,在你沒有輸入任何數(shù)據(jù)的情況下,去執(zhí)行顯示功能的時(shí)候會(huì)顯示一些亂碼!菜單選擇函數(shù) int menu_select();這是一個(gè)無參函數(shù),主要實(shí)現(xiàn)“功能選擇”的界面,在這個(gè)界面里有顯示系統(tǒng)的九大功能,根據(jù)每個(gè)功能前面的序號(hào)進(jìn)行選擇,中間還顯示系統(tǒng)當(dāng)前的時(shí)間。等執(zhí)行完每一個(gè)函數(shù)功能后,按任一鍵回到主界面也要通過這個(gè)函數(shù)來實(shí)現(xiàn)!輸入記錄函數(shù) STUDENT *create()這是一個(gè)無參函數(shù),用來執(zhí)行第學(xué)生成績(jī)記錄的輸入,當(dāng)學(xué)生為0時(shí)停止輸入,函數(shù)結(jié)束后,帶回一
9、個(gè)指向鏈表頭的指針head。輸入記錄函數(shù) STUDENT *create()這是一個(gè)無參函數(shù),用來執(zhí)行第學(xué)生成績(jī)記錄的輸入,當(dāng)學(xué)生為0時(shí)停止輸入,函數(shù)結(jié)束后,帶回一個(gè)指向鏈表頭的指針head。顯示記錄函數(shù) void print(STUDENT *head)這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,負(fù)責(zé)對(duì)全部學(xué)生成績(jī)記錄的輸出,不足之處就是不能對(duì)學(xué)生成績(jī)進(jìn)行分頁顯示。查找記錄函數(shù) void search(STUDENT *head)這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,實(shí)現(xiàn)按學(xué)號(hào)對(duì)某個(gè)學(xué)生進(jìn)行查找,并顯示所查找到的記錄。刪除記錄函數(shù) STUDENT *delete(STU
10、DENT *head)這是一個(gè)有參函數(shù),形參為“鏈表頭的指針”,先輸入要?jiǎng)h除的學(xué)生記錄的學(xué)號(hào),找到后顯示該學(xué)生信息,等確認(rèn)后便可按“Y”進(jìn)行刪除。排序函數(shù) STUDENT *sort(STUDENT *head)這是一個(gè)有參函數(shù),形參為“鏈表頭的指針”,按學(xué)生成績(jī)的平均分高低進(jìn)行排序,還可以顯示名次。插入函數(shù) STUDENT *insert(STUDENT *head,STUDENT *new)這是一個(gè)有參函數(shù),形參有兩個(gè),一個(gè)是“鏈表頭的指針”,一個(gè)是“待插入指針”,按照原來成績(jī)平均分的高低進(jìn)行插入,插入后會(huì)重新進(jìn)行排序,并返回。保存數(shù)據(jù)到文件函數(shù) void save(STUDENT *he
11、ad)這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,可以把學(xué)生記錄保存在電腦上由自己任意命名的二進(jìn)制文件。從文件讀數(shù)據(jù)函數(shù) STUDENT *load()這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,根據(jù)輸入的文件地址進(jìn)行讀取六、各功能模塊的算法處理流程圖及相關(guān)說明1、主函數(shù) main()2、初始化函數(shù) STUDENT *init()3、菜單選擇函數(shù) int menu_select();4、輸入記錄函數(shù) STUDENT *create()算法:先聲明一個(gè)首節(jié)點(diǎn)head,并將head->next設(shè)為NULL。每輸入一個(gè)數(shù)據(jù)就聲明一個(gè)新節(jié)點(diǎn)p,把p->next設(shè)為NULL,
12、并且鏈接到之前列表的尾端。N-S流程圖如下:head=NULLfor(;)指針p指向新開辟的單元指針p是否為空是否輸入學(xué)號(hào)p->num輸出p->num是否為0內(nèi)存是否溢出 輸入姓名p->name停止for(i=0;i<3;i+)輸入輸入成績(jī)返回 p->sum=s;菜單 p->average=(float)s/3; p->order=0; p->next=head;head=p;5、 記錄函數(shù) void print(STUDENT *head)算法:先將p結(jié)點(diǎn)的指針指向第一個(gè)結(jié)點(diǎn),將p結(jié)點(diǎn)(即第一個(gè)結(jié)點(diǎn))的數(shù)據(jù)輸出。然后再將p結(jié)點(diǎn)的指針指向p指針的
13、的指針(即下一結(jié)點(diǎn)),將p結(jié)點(diǎn)(即第一結(jié)點(diǎn))的數(shù)據(jù)輸出。重復(fù)執(zhí)行此步聚直到p指針指向NULL為止。N-S流程圖如下: p=head,使指向第一個(gè)結(jié)點(diǎn) 輸出p所指向的結(jié)點(diǎn)p指向一下個(gè)結(jié)點(diǎn)當(dāng)p指的不是表尾6、 找記錄函數(shù) void search(STUDENT *head)算法:采用線性查找法往下一個(gè)節(jié)點(diǎn)查找。輸入所要查找的學(xué)生的學(xué)號(hào)s,設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),當(dāng)strcmp(p->name,s) && p != NULL時(shí),使p后移一個(gè)結(jié)點(diǎn),如果p!=NULL,輸出p所指的結(jié)點(diǎn)。N-S流程圖如下:輸入要查找的學(xué)生的學(xué)號(hào)sp=head,使p指向第一結(jié)點(diǎn)當(dāng)記錄的學(xué)號(hào)
14、不是要找的,或指針不為空時(shí)p=p->next p!=NULL如果指針不為空是否顯示沒有該輸出p所指向的結(jié)點(diǎn)學(xué)生7、刪除記錄函數(shù) STUDENT *delete(STUDENT *head)算法:從p指向的第一個(gè)結(jié)點(diǎn)開始,檢查該結(jié)點(diǎn)中的num值是否等于輸入的要求刪除的那個(gè)學(xué)號(hào)。如果相等就將該結(jié)點(diǎn)刪除,如不相等,就將p后移一個(gè)結(jié)點(diǎn),再如此進(jìn)行下去,直到遇到表尾為止。N-S流程圖如下:p1=head;輸入入要?jiǎng)h除的學(xué)號(hào)s當(dāng)(strcmp(p1->num,s))&& p1 != NULLp2=p1 p1=p1->nextp1是要?jiǎng)h除的結(jié)點(diǎn)是否p1所指是頭結(jié)點(diǎn)是否輸出”
15、找不到”head=p1->nextp2->next=p1-next的信息“(刪除頭結(jié)點(diǎn))8、排序函數(shù) STUDENT *sort(STUDENT *head)N-S流程圖:temp=head->next,head->next=NULL 當(dāng)temp!=NULL時(shí)t=temp;temp=temp->next;p1=head;p2=head;當(dāng)t->average<p1->average&&p1!=NULL時(shí)p2=p1;p1=p1->next; p1=p2是否t->next=p1;t->next=p1;head=t;p
16、2->next=t;p1=head;當(dāng)p1!=NULL時(shí)i+;p1->order=i;p1=p1->next;輸出“排序成功”9、 入函數(shù) STUDENT *insert(STUDENT *head,STUDENT *new)算法:先將學(xué)生的成績(jī)按平均分由高分到低分進(jìn)行排序,再插入一個(gè)新生的結(jié)點(diǎn),要求按平均分的高低順序插入。先用指針變量p0指向待插入的結(jié)點(diǎn),p1指向第一個(gè)結(jié)點(diǎn)。如果p0->average<p1->average,則待插入的結(jié)點(diǎn)不應(yīng)插在p1所指的結(jié)點(diǎn)之前。此時(shí)將p1后移,并使p2指向剛才p1所指的結(jié)點(diǎn)。重復(fù)以上的步驟,直到p0->aver
17、age>=p1->average為止。這時(shí)將p0指向的結(jié)點(diǎn)插到p1所指結(jié)點(diǎn)之前。但是如果p1所指的已是表尾結(jié)點(diǎn),則p1就不應(yīng)后移了。如果p0->average比所有結(jié)點(diǎn)的average都小,則應(yīng)將p0所指的結(jié)點(diǎn)插到鏈表末尾。如果插入的位置既不在第一個(gè)結(jié)點(diǎn)之前,又不在表尾結(jié)點(diǎn)之后,則將p0的值賦給p2->,使p2->next指向待插入的結(jié)點(diǎn),然后將p1的值賦給p0->next,使得p0->next指向p1指向的變量。如果插入位置為第一個(gè)結(jié)點(diǎn)之前,則將p0賦給head,將p1賦給p0->next。如果要插到表尾之后,應(yīng)將p0賦給p1->next
18、,NULL賦給p0->next。最后再調(diào)用排序的函數(shù),將學(xué)生成績(jī)重新排序.N-S流程圖如下:P1=head, p0=new原來的鏈表是空表是否將p0所指當(dāng)p0->average<p1->average 以及p1所指向的不是表尾結(jié)的結(jié)點(diǎn)作為點(diǎn)唯一結(jié)點(diǎn)p2指向p1位置 p1向后移一個(gè)結(jié)點(diǎn)p0->average>=p1->average是 否p1指向頭結(jié)點(diǎn)p1->next=p0是否p0->next=NULLhead=p0p2->next=p0(插到表尾之后)p0 ->next=p1 p0->next=p1(插到表頭之前) (插到
19、表中間)n=n+1;(結(jié)點(diǎn)加1)head=sort(hear);(將成績(jī)重新排序)10、保存數(shù)據(jù)到文件函數(shù) void save(STUDENT *head)N-S流程圖如下:輸入要保存記錄的文件地址outfile文件不能打開否是p=head;輸出一個(gè)出錯(cuò)信當(dāng)p不為空時(shí)息,并返回菜單fwrite(p,LEN,1,fp); (寫入一條記錄)p=p->next; (指針后移)fclose(fp); (關(guān)閉文件)11、從文件讀數(shù)據(jù)函數(shù) STUDENT *load()N-S流程圖如下:定義兩個(gè)指針變量p1,p2輸入要打開的記錄文件地址infile文件不能打開否是開辟一個(gè)新單元指針p1是否為空返回菜
20、單否是 返回菜單讀入記錄fclose(fp); (關(guān)閉文件)七、課程設(shè)計(jì)過程中遇到的問題及解決過程(1)剛開始沒有那個(gè)初始化函數(shù),程序運(yùn)行后,沒有輸入任何數(shù)據(jù)就試得去執(zhí)行顯示功能,結(jié)果顯示的是一些亂碼!加入初始化函數(shù)后,這種現(xiàn)象也隨之消失。(2)剛開始執(zhí)行輸入函數(shù),按學(xué)號(hào)順序輸入十個(gè)學(xué)生的成績(jī),輸完后執(zhí)行顯示功能,學(xué)生成績(jī)記錄是按學(xué)號(hào)的反順序顯示的,試著在其中增加一些語句,希望能把學(xué)號(hào)按正常順序顯示,但暫時(shí)沒有成功,所以在輸入成績(jī)時(shí)只能按學(xué)號(hào)反順序輸入,最后就按學(xué)號(hào)正常順序輸出了。(3)剛開始時(shí),先把成績(jī)按平均分排序,再插入一個(gè)學(xué)生的成績(jī),執(zhí)行顯示功能,雖然插入的學(xué)生的成績(jī)能正常插入,但該學(xué)生
21、的名次為0。后來,在插入成績(jī)之后,調(diào)用排序函數(shù),把所有成績(jī)重新排序一次。(4)在輸入函數(shù)中設(shè)了一個(gè)無限循環(huán),可以輸入無數(shù)個(gè)學(xué)生的成績(jī)信息,當(dāng)學(xué)號(hào)為0的時(shí)候則停止輸入。(5)輸入太多個(gè)學(xué)生的成績(jī)時(shí),屏幕顯示不能控制為一頁一頁顯示,所以為了方便起見,不要輸入太多記錄,十七左右為最佳。(6)在沒有輸入任何信息的情況下,去執(zhí)行排序功能,最后顯示有一個(gè)記錄,學(xué)號(hào)、姓名為空白,成績(jī)都為0,名次為1。(7)在輸入選項(xiàng)時(shí)不能輸入字母,否則會(huì)死循環(huán),建議不要亂輸字母。八、課程設(shè)計(jì)心得體會(huì)經(jīng)過一個(gè)多星期的C語言課程設(shè)計(jì),感覺自己收獲不少!首先是:鏈表本來上課是沒有上的,但這個(gè)課程設(shè)計(jì)里面主要都是用鏈表,因?yàn)橐_(dá)到
22、這樣的功能,使用鏈表相當(dāng)方便,但不容易理解,所以在這方面我很了很多的時(shí)間看課本和參考課外書,使C語言的知識(shí)強(qiáng)化了不少。其次,在做課程設(shè)計(jì)的過程中,發(fā)現(xiàn)了平時(shí)很多沒有注意到的問題,例如:返回值函數(shù)和不返回值函數(shù)兩者在主函數(shù)中的調(diào)用是不同的更重要的是,這次課程設(shè)計(jì)雖然花了我不少時(shí)間,但正是這些時(shí)間,讓我見識(shí)到了C語言的重要性。這個(gè)學(xué)生成績(jī)管理系統(tǒng)都是在自己知識(shí)范圍內(nèi)完成的,所以界面清晰簡(jiǎn)單,可能不是很好看,但絕對(duì)實(shí)用!從這里我也得到一個(gè)體會(huì),做一個(gè)程序,或者開發(fā)一個(gè)軟件,應(yīng)該著重從它的后臺(tái)制作入手,不能做出一個(gè)中看不中用的程序或者軟件。相信這次的課程設(shè)計(jì)為我以后繼續(xù)從事計(jì)算機(jī)工作打了一個(gè)小小的開頭
23、。九、附源程序#include "stdio.h" /*I/O函數(shù)*/ #include "stdlib.h" /*其它說明*/ #include "string.h" /*字符串函數(shù)*/ #include "conio.h" /*屏幕操作函數(shù)*/ #include "mem.h" /*內(nèi)存操作函數(shù)*/ #include "ctype.h" /*字符操作函數(shù)*/ #include "alloc.h" /*動(dòng)態(tài)地址分配函數(shù)*/ #define N 3 /*定
24、義常數(shù)*/ #define M 30struct studenttypedef struct z1 /*定義數(shù)據(jù)結(jié)構(gòu)*/ char no11; char name15; int scoreN; float sum; float average; int order; struct z1 *next; STUDENT; /*菜單函數(shù),返回值為整數(shù)*/ menu_select() char *menu=" *MENU*", /*定義菜單字符串?dāng)?shù)組*/ " 0. Enter list", /*初始化*/ " 1. Print list",
25、/*輸入記錄*/ " 2. Sort to make new file ", /*顯示單鏈表中所有記錄*/ " 3. sort to Single course result", /*排序*/ " 4. Search record on ID", /*按照學(xué)號(hào)查找記錄*/ " 5. Insert record to list ", /*插入記錄到表中*/ " 6. Delete a record from list", /*從表中刪除記錄*/ " 7. Save the file&qu
26、ot;, /*將單鏈表中記錄保存到文件中*/ " 8. Load the file", /*從文件中讀入記錄*/ " 9. Quit", /*退出*/ " ", " ", /*屏幕調(diào)節(jié),沒有實(shí)際意義*/ " ", " *", " ", " ",; char s3; /*以字符形式保存選擇號(hào)*/ int c,i; /*定義整形變量*/ textbackground(YELLOW); /*設(shè)置背景顏色為黃色*/ gotoxy(1,25);
27、/*移動(dòng)光標(biāo)*/ printf("Press any key enter menu.n"); /*壓任一鍵進(jìn)入主菜單*/ getch(); /*輸入任一鍵*/ clrscr(); /*清屏*/ for(i=0;i<16;i+) /*輸出主菜單數(shù)組*/ gotoxy(10,i+1); cprintf("%s",menui); window(1,1,80,25); /*恢復(fù)原窗口大小*/ gotoxy(10,21); /*移動(dòng)光標(biāo)*/ doprintf("n Enter you choice(09):"); /*在菜單窗口外顯示提示
28、信息*/ scanf("%s",s); /*輸入選擇項(xiàng)*/ c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整形數(shù)*/ while(c<0|c>9); /*選擇項(xiàng)不在09之間重輸*/ return c; /*返回選擇項(xiàng),主程序根據(jù)該數(shù)調(diào)用相應(yīng)的函數(shù)*/ /*初始化鏈表,可以實(shí)現(xiàn)對(duì)另一組數(shù)據(jù)的處理*/ STUDENT *init() /*初始化鏈表*/ return NULL; /*創(chuàng)建鏈表,完成數(shù)據(jù)錄入功能*/ STUDENT *create() int i; int s; STUDENT *h=NULL,*info; /* STUDENT指向結(jié)構(gòu)體的指針*/ f
29、or(;) info=(STUDENT *)malloc(sizeof(STUDENT); /*申請(qǐng)空間*/ if(!info) /*如果指針info為空*/ printf("nOut of memory"); /*輸出內(nèi)存溢出*/ return NULL; /*返回空指針*/ printf("Input imformation as follow.n"); printf("Press '#'after'Enter NO'to end the input.n"); inputs("Enter
30、NO.:",info->no,11); /*輸入學(xué)號(hào)并校驗(yàn)*/ if(info->no0='#') break; /*如果學(xué)號(hào)首字符為#則結(jié)束輸入*/ inputs("Enter name:",info->name,15); /*輸入姓名,并進(jìn)行校驗(yàn)*/ printf("Please input %d scores n",N); /*提示開始輸入成績(jī)*/ s=0; /*計(jì)算每個(gè)學(xué)生的總分,初值為0*/ for(i=0;i<N;i+) /*N門課程循環(huán)N次*/ do printf("score%d
31、:",i+1); /*提示輸入第幾門課程*/ scanf("%d",&info->scorei); /*輸入成績(jī)*/ if(info->scorei>100|info->scorei<0)/*確保成績(jī)?cè)?100之間*/ printf("Bad data,repeat inputn"); /*出錯(cuò)提示信息*/ while(info->scorei>100|info->scorei<0); s=s+info->scorei; /*累加各門課程成績(jī)*/ info->sum=s;
32、 /*將總分保存*/ info->average=(float)s/N; /*求出平均值*/ info->order=0; /*未排序前此值為0*/ info->next=h; /*將頭結(jié)點(diǎn)做為新輸入結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/ h=info; /*新輸入結(jié)點(diǎn)為新的頭結(jié)點(diǎn)*/*沒排序前,后輸入的數(shù)據(jù)將排在最上*/ return(h); /*返回頭指針*/ /*自定義輸入控制函數(shù)inputs*/ inputs(char *prompt, char *s, int count) char p255; doprintf(prompt); /*顯示提示信息*/ scanf("%s&q
33、uot;,p); /*輸入字符串*/ if(strlen(p)>count)printf("n Too long! n"); /*進(jìn)行長(zhǎng)度校驗(yàn),超過count值重輸入*/ while(strlen(p)>count); strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/ /*顯示模塊*/ void print(STUDENT *h) int i=0; /* 統(tǒng)計(jì)記錄條數(shù)*/ STUDENT *p; /*移動(dòng)指針*/ clrscr(); /*清屏*/ p=h; /*初值為頭指針*/ printf("nnn*STUDENT*n");
34、 printf("|rec|NO. | name | sc1| sc2| sc3| ave |order|n"); printf("|-|-|-|-|-|-|-|-|n"); while(p!=NULL) i+; if(i%15=0)getch();clrscr(); printf("nnnn"); /*否則什么也不做*/ else; printf("|%2d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n", i, p->no,p->name,p->score0
35、,p->score1, p->score2,p->average,p->order); p=p->next; printf("*end*n"); /*排序模塊*/ STUDENT *sort(STUDENT *h) int i=0; /*用來保存名次*/ STUDENT *p,*q,*t,*h1; /*定義臨時(shí)指針*/ h1=h->next; /*將原表的頭指針?biāo)傅南乱粋€(gè)結(jié)點(diǎn)作頭指針*/ h->next=NULL; /*斷開原來鏈表頭結(jié)點(diǎn)與其它結(jié)點(diǎn)的連接*/ while(h1!=NULL) /*當(dāng)原表不為空時(shí),進(jìn)行排序*/ t=h
36、1; /*取原表的頭結(jié)點(diǎn)*/ h1=h1->next; /*原表頭結(jié)點(diǎn)指針后移*/ p=h; /*設(shè)定移動(dòng)指針p,從頭指針開始*/ q=h; /*設(shè)定移動(dòng)指針q做為p的前驅(qū),初值為頭指針*/ while(t->sum<p->sum&&p!=NULL) /*作總分比較*/ q=p; /*待插入點(diǎn)值小,則新表指針后移*/ p=p->next; if(p=q) /*p=q,上面的while沒有執(zhí)行,也即插入點(diǎn)大于頭指針,此點(diǎn)應(yīng)排在首位*/ t->next=p; /*待排序點(diǎn)的后繼為p*/ h=t; /*新頭結(jié)點(diǎn)為待排序點(diǎn)*/ else /*待排序點(diǎn)
37、應(yīng)插入在q和p之間,如p為空則是尾部*/ t->next=p; /*t的后繼是p*/ q->next=t; /*q的后繼是t*/ p=h; /*已排好序的頭指針賦給p*/ while(p!=NULL) /*賦予各組數(shù)據(jù)排序號(hào)*/ i+; /*結(jié)點(diǎn)序號(hào)*/ p->order=i; /*將名次賦值*/ p=p->next; /*指針后移*/ printf("Sort sucess!n"); /*排序成功*/ return (h); /*返回頭指針*/ /*查找記錄模塊*/ void search(STUDENT *h) STUDENT *p; /*移動(dòng)指
38、針*/ char s15; /*存放姓名的字符數(shù)組*/ clrscr(); /*清屏幕*/ printf("Input the ID that you want to search:n"); scanf("%s",s); /*輸入姓名*/ p=h; /*將頭指針賦給p*/ while(strcmp(p->no,s)&&p!=NULL)/*當(dāng)記錄的姓名不是要找的,并且指針不為空時(shí)*/ p=p->next; /*移動(dòng)指針,指向下一結(jié)點(diǎn),繼續(xù)查找*/ if(p=NULL) /*指針為空,說明未能找到所要的結(jié)點(diǎn)*/ printf(&q
39、uot;nCan find the student who ID is %sn",s); else /*顯示找到的記錄信息*/ printf("nn*havefound*n"); printf("|NO. | name | sc1| sc2| sc3| ave |order|n"); printf("|-|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n", p->no,p->name,p->score
40、0,p->score1,p->score2,p->average,p->order); printf("*end*n"); /*插入記錄模塊*/ STUDENT *insert(STUDENT *h) STUDENT *p,*q,*info,*k; /*p指向插入位置,q是其前驅(qū),info指新插入記錄*/ int s1,i,n=0; printf("nplease new recordn"); info=(STUDENT *)malloc(sizeof(STUDENT); /*申請(qǐng)空間*/ if(!info) printf(&qu
41、ot;Out of memory"); /*如沒有申請(qǐng)到,內(nèi)存溢出*/ return NULL; /*返回空指針*/ inputs("Enter NO.:",info->no,11); /*以下是待插入數(shù)據(jù)的錄入和處理,具體同創(chuàng)建模塊同*/ inputs("Enter name:",info->name,15); printf("Please input %d score n",N); s1=0; for(i=0;i<N;i+) do printf("score%d:",i+1); sc
42、anf("%d",&info->scorei); if(info->scorei>100|info->scorei<0) printf("bad data,repeat inputn"); while(info->scorei>100|info->scorei<0); s1=s1+info->scorei; info->sum=s1; info->average=(float)s1/N; info->next=NULL; /*設(shè)后繼指針為空*/ p=h; /*將指針賦值
43、給p*/ q=h; /*將指針賦值給q*/ if(h=NULL) /*鏈表為空*/ h=info;info->next=NULL; else while(info->sum<p->sum)&&(p->next!=NULL) q=p; /*使q指向p剛才的結(jié)點(diǎn)*/ p=p->next; /*使p后移一個(gè)結(jié)點(diǎn)*/ if(info->sum>=p->sum) if(h=p)h=info; info->next=p; /*info作為頭指針,p作為info的后繼指針*/ else q->next=info; /*q的后繼
44、指針是info*/ info->next=p; /*info的后繼指針是p*/ else p->next=info;info->next=NULL; /*p的后繼指針是info,info的后繼指針是空*/ k=h; while(k!=NULL) /*重新賦予排序號(hào)(排序號(hào)因?yàn)楸徊迦胄聰?shù)據(jù)而改變)*/ n+; k->order=n; k=k->next; printf("n -have inserted %s student-n",info->name); return(h); /*返回頭指針*/ /* ) */ /* 只是修改 將“)”
45、換成 “” 就可以了, 就這么一個(gè)錯(cuò)誤 */ /*刪除記錄模塊*/ STUDENT *delete(STUDENT *h) char k5; /*定義字符串?dāng)?shù)組,用來確認(rèn)刪除信息*/ STUDENT *p,*q; /*p為查找到要?jiǎng)h除的結(jié)點(diǎn)指針,q為其前驅(qū)指針*/ char s11; /*存放學(xué)號(hào)*/ clrscr(); /*清屏*/ printf("Please deleted non"); /*顯示提示信息*/ scanf("%s",s); /*輸入要?jiǎng)h除記錄的學(xué)號(hào)*/ q=p=h; /*給q和p賦初值頭指針*/ while(strcmp(p->
46、;no,s)&&p!=NULL) /*當(dāng)記錄的學(xué)號(hào)不是要找的,或指針不為空時(shí)*/ q=p; /*將p指針值賦給q作為p的前驅(qū)指針*/ p=p->next; /*將p指針指向下一條記錄*/ if(p=NULL) /*如果p為空,說明鏈表中沒有該結(jié)點(diǎn)*/ printf("nlist no %s studentn",s); else /*p不為空,顯示找到的記錄信息*/ printf("*have found*n"); printf("|no | name | sc1| sc2| sc3| ave |order|n")
47、; printf("|-|-|-|-|-|-|-|n"); printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %3d |n", p->no, p->name,p->score0,p->score1,p->score2,p->average,p->order); printf("*end*n"); doinputs("Do you really want to deleted?(y/n)",k,5); while(k0!='y'
48、;&&k0!='n'); if(k0!='n') /*刪除確認(rèn)判斷*/ if(p=h) /*如果p=h,說明被刪結(jié)點(diǎn)是頭結(jié)點(diǎn)*/ h=p->next; /*修改頭指針指向下一條記錄*/ else q->next=p->next; /*不是頭指針,將p的后繼結(jié)點(diǎn)作為q的后繼結(jié)點(diǎn)*/ free(p); /*釋放p所指結(jié)點(diǎn)空間*/ printf("n have deleted No %s studentn",s); return(h); /*返回頭指針*/ /*保存數(shù)據(jù)到文件模塊*/ void save(STUDE
49、NT *h) FILE *fp; /*定義指向文件的指針*/ STUDENT *p; /* 定義移動(dòng)指針*/ char outfile20; /*保存輸出文件名*/ printf("Enter outfile name,for example G:f1score.txt:n"); scanf("%s",outfile); if(fp=fopen(outfile,"wb")=NULL) /*為輸出打開一個(gè)二進(jìn)制文件,如沒有則建立*/ printf("Can not open filen"); exit(1); pri
50、ntf("nSaving file.n"); /*打開文件,提示正在保存*/ p=h; /*移動(dòng)指針從頭指針開始*/ while(p!=NULL) /*如p不為空*/ fwrite(p,sizeof(STUDENT),1,fp); /*寫入一條記錄*/ p=p->next; /*指針后移*/ fclose(fp); /*關(guān)閉文件*/ printf("-Save success!-n"); /*顯示保存成功*/ /*導(dǎo)入信息模塊*/ STUDENT *load() STUDENT *p,*q,*h=NULL; /*定義記錄指針變量*/ FILE *f
51、p; /* 定義指向文件的指針*/ char infile20; /*保存文件名*/ printf("Enter infile name,for example G:f1score.txt:n"); scanf("%s",infile); /*輸入文件名*/ if(fp=fopen(infile,"rb")=NULL) /*打開一個(gè)二進(jìn)制文件,為讀方式*/ printf("Can not open filen"); /*如不能打開,返回頭指針*/ return h; printf("n -Loading
52、file!-n"); p=(STUDENT *)malloc(sizeof(STUDENT); /*申請(qǐng)空間*/ if(!p) printf("Out of memory!n"); /*如沒有申請(qǐng)到,則內(nèi)存溢出*/ return h; /*返回空頭指針*/ h=p; /*申請(qǐng)到空間,將其作為頭指針*/ while(!feof(fp) /*循環(huán)讀數(shù)據(jù)直到文件尾結(jié)束*/ if(1!=fread(p,sizeof(STUDENT),1,fp) break; /*如果沒讀到數(shù)據(jù),跳出循環(huán)*/ p->next=(STUDENT *)malloc(sizeof(STUD
53、ENT); /*為下一個(gè)結(jié)點(diǎn)申請(qǐng)空間*/ if(!p->next) printf("Out of memory!n"); /*如沒有申請(qǐng)到,則內(nèi)存溢出*/ return h; q=p; /*保存當(dāng)前結(jié)點(diǎn)的指針,作為下一結(jié)點(diǎn)的前驅(qū)*/ p=p->next; /*指針后移,新讀入數(shù)據(jù)鏈到當(dāng)前表尾*/ q->next=NULL; /*最后一個(gè)結(jié)點(diǎn)的后繼指針為空*/ fclose(fp); /*關(guān)閉文件*/ printf("Load success!n"); return h; /*返回頭指針*/ /*單科排序模塊*/STUDENT *sort1(STUDENT *h) int i=0,j; /*用來保存名次*/STUDENT *p,*q,*t,*h1; /*定義臨時(shí)指針*/printf("Enter according to which the number of courses to be sorted :(0.sc1 1.sc2 2.sc3)n");/*選擇指定所要的單科成績(jī)進(jìn)行排序(0,1,2) */ scanf("%d",&j); /*進(jìn)行選擇*/h1=h->next; /*將原表的頭指針?biāo)傅南乱粋€(gè)結(jié)點(diǎn)作頭指針*/h->ne
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 室外燈具購銷合同范本
- 合同范本是規(guī)范
- 原告主張借款合同范本
- 專項(xiàng)稅務(wù)咨詢合同范本
- 企業(yè)勞動(dòng)合同范本
- 創(chuàng)業(yè)股權(quán)銷售合同范本
- 保潔器械購銷合同范本
- 二手奧迪車輛轉(zhuǎn)讓合同范本
- 包裝商業(yè)合同范本
- 烏梅飲采購合同范本
- 湖南非稅在線繳費(fèi)操作步驟
- GB∕Z 27735-2022 野營(yíng)帳篷
- 《法院執(zhí)行實(shí)務(wù)》單元三(上)(課堂PPT)課件
- 高分子材料研究方法 X 射線法
- 【課件】第二單元第三節(jié)漢族民歌課件-2021-2022學(xué)年高中音樂人音版(2019)必修音樂鑒賞
- 高中人音版必修 音樂鑒賞20人民音樂家課件
- 風(fēng)電齒輪箱講義(20151010)
- 小組合作學(xué)習(xí)評(píng)價(jià)量化表
- 石油化工行業(yè)典型事故案例
- 圓二色譜儀操作規(guī)程培訓(xùn)
- 德語A1單詞表
評(píng)論
0/150
提交評(píng)論