版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 前 言1</b></p><p><b> 目的2</b></p><p><b> 需求分析2</b></p><p><b> 1、問題描述2<
2、/b></p><p><b> 2、功能要求2</b></p><p><b> 概要設(shè)計(jì)3</b></p><p> 1) 程序的模塊組成:4</p><p> 2) 各個(gè)函數(shù)的主要功能:4</p><p><b> 總體框架5<
3、/b></p><p><b> 詳細(xì)設(shè)計(jì)6</b></p><p><b> 主要功能的實(shí)現(xiàn)6</b></p><p><b> 函數(shù)明細(xì)6</b></p><p> 主函數(shù) main()7</p><p> 菜單選擇函數(shù) in
4、t menu_select()7</p><p> 初始化函數(shù) STUDENT *init()7</p><p> 輸入記錄函數(shù) STUDENT *create()7</p><p> 顯示記錄函數(shù) void print(STUDENT *h)8</p><p> 保存數(shù)據(jù)到文件函數(shù) void save(STUDENT *h
5、)9</p><p> 查找記錄函數(shù) void search(STUDENT *h)9</p><p> 刪除記錄函數(shù) STUDENT *delete(STUDENT *h)10</p><p> 修改函數(shù) STUDENT *Modify(STUDENT *h)11</p><p> 從文件讀數(shù)據(jù)函數(shù) STUDENT *loa
6、d()12</p><p> 按部分排序函數(shù) STUDENT *sort(STUDENT *head)13</p><p> 主要源程序代碼14</p><p> 調(diào)試分析過程描述28</p><p><b> 調(diào)試28</b></p><p><b> 部分截圖
7、29</b></p><p><b> 總結(jié)心得體會30</b></p><p><b> 參考資料33</b></p><p><b> 前 言</b></p><p> 《C語言程序設(shè)計(jì)》課程設(shè)計(jì)是對學(xué)生的一種全面綜合訓(xùn)練,它包括問題分析,總體結(jié)構(gòu)
8、設(shè)計(jì),用戶界面設(shè)計(jì),程序設(shè)計(jì)基本技能和技巧,多人合作,以至一整套軟件工作規(guī)范的訓(xùn)練和科學(xué)作風(fēng)的培養(yǎng)。是與課堂聽講、自學(xué)和練習(xí)相輔相成的必不可少的一個(gè)教學(xué)環(huán)節(jié)。通常,課程設(shè)計(jì)的課題比平時(shí)的習(xí)題復(fù)雜得多,也更接近實(shí)際。課程設(shè)計(jì)著眼于與應(yīng)用的結(jié)合點(diǎn),使學(xué)生學(xué)會如何把書上學(xué)到的知識用于解決實(shí)際問題,培養(yǎng)軟件工作所需要的動手能力;另一方面,能使書上的知識變“活”,使學(xué)生更好地深化理解和靈活掌握教學(xué)內(nèi)容。為了達(dá)到上述目的,本課程設(shè)計(jì)安排了四個(gè)設(shè)計(jì)課
9、題,訓(xùn)練重點(diǎn)在于基本的程序設(shè)計(jì)方法和分析問題的能力,而不強(qiáng)調(diào)面面俱到。學(xué)生可任選其中一題進(jìn)行設(shè)計(jì),設(shè)計(jì)完畢寫出課程設(shè)計(jì)報(bào)告,用A4紙打印成冊;并將課程設(shè)計(jì)報(bào)告與源程序存盤。學(xué)習(xí)委員將課程設(shè)計(jì)報(bào)告與磁盤收齊后交指導(dǎo)老師。</p><p><b> 目的</b></p><p> 全面熟悉、掌握C語言基本知識,掌握C程序設(shè)計(jì)中的順序、分支、循環(huán)三種結(jié)構(gòu)及數(shù)組、函數(shù)和C
10、語言基本圖形編程等方法,把編程和實(shí)際結(jié)合起來,增強(qiáng)對不同的問題運(yùn)用和靈活選擇合適的數(shù)據(jù)結(jié)構(gòu)以及算法描述的本領(lǐng),熟悉編制和調(diào)試程序的技巧,掌握分析結(jié)果的若干有效方法,進(jìn)一步提高上機(jī)動手能力,培養(yǎng)使用計(jì)算機(jī)解決實(shí)際問題的能力,養(yǎng)成提供文檔資料的習(xí)慣和規(guī)范編程的思想,為以后在專業(yè)課程中應(yīng)用計(jì)算機(jī)系統(tǒng)解決計(jì)算、分析、實(shí)驗(yàn)和設(shè)計(jì)等學(xué)習(xí)環(huán)節(jié)打下較扎實(shí)的基礎(chǔ)。</p><p><b> 需求分析 </b>
11、;</p><p><b> 1、問題描述:</b></p><p> 對一個(gè)有N個(gè)學(xué)生的班級,每個(gè)學(xué)生有M個(gè)課程。該系統(tǒng)能對成績的錄入和顯示,能計(jì)算每個(gè)學(xué)生的平均成績以及各個(gè)功課的平均成績,能根據(jù)學(xué)生的學(xué)號來查詢該學(xué)生的成績,能刪除該學(xué)生的記錄,能根據(jù)每個(gè)學(xué)生的平均成績來給他們進(jìn)行排序,最后退出系統(tǒng)。</p><p><b>
12、 2、功能要求:</b></p><p> 本系統(tǒng)采用一個(gè)結(jié)構(gòu)體數(shù)組,每個(gè)數(shù)據(jù)的結(jié)構(gòu)應(yīng)當(dāng)包括:學(xué)號、姓名、M門課程名稱。</p><p> 本系統(tǒng)顯示這樣的菜單: </p><p> .a、每一條記錄包括一個(gè)學(xué)生的學(xué)號、姓名、平均成績。 b、顯示功能:完成全部學(xué)生記錄的顯示。c、查找功能:完成按姓名查找學(xué)生記錄,并顯示。d、排序功能:按
13、學(xué)生平均成績進(jìn)行排序。e、插入功能:按平均成績高低插入一條學(xué)生記錄。f、保存功能:將學(xué)生記錄保存在任何自定義的文件中,</p><p> g、讀取功能:將保存在文件中的學(xué)生記錄讀取出來。 </p><p> h、統(tǒng)計(jì)功能:顯示每門課程成績的學(xué)生的基本信息,顯示每門課程的平均分。</p><p><b> 退出系統(tǒng)。</b></p
14、><p><b> 3、進(jìn)度安排:</b></p><p> 第一周 星期四: 課題講解,查閱資料</p><p> 第二周 星期一: 總體設(shè)計(jì),詳細(xì)設(shè)計(jì)</p><p> 星期二: 程,上機(jī)調(diào)試、修改程序</p><p> 星期三: 上機(jī)調(diào)試、完善程序</p><
15、;p> 星期四: 上機(jī)調(diào)試、完善程序</p><p><b> 星期五: 答辯</b></p><p> 星期六-星期天: 撰寫課程設(shè)計(jì)報(bào)告</p><p><b> 概要設(shè)計(jì)</b></p><p> 學(xué)生成績管理系統(tǒng)有13種功能。把這13個(gè)功能做成13個(gè)子函數(shù)。在主函當(dāng)數(shù)中
16、設(shè)計(jì)一個(gè)菜單對這13個(gè)子數(shù)進(jìn)行管理。來實(shí)現(xiàn)對整個(gè)系統(tǒng)的操作。根據(jù)課題的要求。每一個(gè)學(xué)生的包括姓名(char)、學(xué)號(char)、M門課程的成績(float).再加上系統(tǒng)功能上的要求每一學(xué)生的信息還要總分和名次等。所以自然的想到要用結(jié)構(gòu)體來定義每一個(gè)學(xué)生的信息結(jié)構(gòu)。然后用鏈表把它們組成一個(gè)有序的整體。用對鏈表的操作來實(shí)現(xiàn)對所有學(xué)生信息的統(tǒng)一管理(成績顯示、成績排序、成績修改等)。最后為了以后按照處理后的順序保存到文件中。</p>
17、;<p><b> 各函數(shù)的功能:</b></p><p> 1) 程序的模塊組成:</p><p> 主 函 數(shù): int main()</p><p> 新建函數(shù):STUDENT *init()</p><p> 輸入函數(shù) :STUDENT *create()</p><
18、;p> 顯示函數(shù): void print(STUDENT *h)</p><p> 刪除函數(shù): STUDENT *delete(STUDENT *h)</p><p> 按名字尋找函數(shù): void search(STUDENT *h)</p><p> 保存函數(shù): void save(STUDENT *h)</p><p>
19、按總分排序函數(shù): STUDENT *sort(STUDENT *h)</p><p> 計(jì)算總分和均分函數(shù): void computer(STUDENT *h)</p><p> 修改函數(shù): STUDENT *Modify(STUDENT *head,STUDENT *new)</p><p> 按學(xué)號排序函數(shù): STUDENT *index(STUDENT
20、*h)</p><p> 菜單函數(shù):int menu_select()</p><p> 2) 各個(gè)函數(shù)的主要功能:</p><p> 輸入函數(shù): 隨時(shí)輸入數(shù)據(jù)。</p><p> 菜單函數(shù):顯示系統(tǒng)主菜單。</p><p> 顯示函數(shù): 顯示所有學(xué)生的信息。</p><p> 尋找
21、函數(shù): 方便學(xué)生查找自己的成績。</p><p> 刪除函數(shù): 刪除某學(xué)生的信息。</p><p> 排序函數(shù): 按總成績排序。</p><p> 按學(xué)號排序函數(shù): 按學(xué)號排序。</p><p> 插入函數(shù): 可以插入新的信息。</p><p> 保存函數(shù): 保存好學(xué)生成績,以免丟失。</p>
22、<p><b> 統(tǒng)計(jì)函數(shù):</b></p><p> 顯示每門課程成績最高的學(xué)生的基本信息。</p><p> 顯示每門課程的平均成績。</p><p> 顯示超過某門課程平均成績的學(xué)生人數(shù)</p><p><b> 總體框架:</b></p><p>
23、<b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 主要功能的實(shí)現(xiàn)</b></p><p><b> 函數(shù)明細(xì):</b></p><p> 整個(gè)系統(tǒng)除了主函數(shù)外,另外還有14個(gè)函數(shù),實(shí)現(xiàn)八大功能:輸入功能、顯示功能、查找功能、排序功能、插入功能、保存功能、讀取功能。各個(gè)函數(shù)的詳細(xì)設(shè)計(jì)說明分別
24、如下:</p><p> 主函數(shù) main()</p><p> 利用無限次循環(huán)for(;;)和swithch()實(shí)現(xiàn)各函數(shù)的調(diào)用,系統(tǒng)根據(jù)輸入的數(shù)字選項(xiàng)來調(diào)用相應(yīng)的函數(shù)。</p><p> 菜單選擇函數(shù) int menu_select()</p><p> 這是一個(gè)無參函數(shù),主要實(shí)現(xiàn)“功能選擇”的界面,在這個(gè)界面里有顯示系統(tǒng)的九大功
25、能,根據(jù)每個(gè)功能前面的序號進(jìn)行選擇。等執(zhí)行完每一個(gè)函數(shù)功能后,再自行返回該函數(shù)。</p><p> 初始化函數(shù) STUDENT *init()</p><p> 這是一個(gè)無參函數(shù),里面只有兩個(gè)語句,它的作用是使鏈表初始化,使head的值為NULL和一個(gè)清屏語句。比如:沒有這個(gè)函數(shù)的話,在你沒有輸入任何數(shù)據(jù)的情況下,去執(zhí)行顯示功能的時(shí)候會顯示一些亂碼!</p><p
26、> 輸入記錄函數(shù) STUDENT *create()</p><p> 這是一個(gè)無參函數(shù),用來執(zhí)行第學(xué)生成績記錄的輸入,當(dāng)學(xué)生為@時(shí)停止輸入,函數(shù)結(jié)束后,帶回一個(gè)指鏈表頭的指針向head。將下一個(gè)學(xué)生的信息插在表頭。</p><p><b> N-S流程圖如下:</b></p><p> 顯示記錄函數(shù) void print(STU
27、DENT *h)</p><p> 這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,負(fù)責(zé)對全部學(xué)生成績記錄的輸出,不足之處就是不能對學(xué)生成績進(jìn)行分頁顯示。</p><p> 算法:先將p結(jié)點(diǎn)的指針指向第一個(gè)結(jié)點(diǎn),將p結(jié)點(diǎn)(即第一個(gè)結(jié)點(diǎn))的數(shù)據(jù)輸出。然后再將p結(jié)點(diǎn)的指針指向p指針的的指針(即下一結(jié)點(diǎn)),將p結(jié)點(diǎn)(即第一結(jié)點(diǎn))的數(shù)據(jù)輸出。重復(fù)執(zhí)行此步聚直到p指針指向NULL為止。<
28、;/p><p><b> N-S流程圖如下:</b></p><p> 保存數(shù)據(jù)到文件函數(shù) void save(STUDENT *h) </p><p> 這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,可以把學(xué)生記錄保存在電腦上由自己任意命名的二進(jìn)制文件。</p><p><b> N-S流程圖如下
29、:</b></p><p> 查找記錄函數(shù) void search(STUDENT *h)</p><p> 這是一個(gè)不返回值的有參函數(shù),形參為“鏈表頭的指針”,實(shí)現(xiàn)按學(xué)號對某個(gè)學(xué)生進(jìn)行查找,并顯示所查找到的記錄。</p><p> 算法:采用線性查找法往下一個(gè)結(jié)點(diǎn)查找。輸入所要查找的學(xué)生的學(xué)號s,設(shè)一個(gè)指針變量p,先指向第一個(gè)結(jié)點(diǎn),當(dāng)strcmp
30、(p->name,s) && p != NULL時(shí),使p后移一個(gè)結(jié)點(diǎn),如果p!=NULL,輸出p所指的結(jié)點(diǎn)。</p><p><b> N-S流程圖如下:</b></p><p> 刪除記錄函數(shù) STUDENT *delete(STUDENT *h)</p><p> 這是一個(gè)有返回值的有參函數(shù)。形參為“鏈表頭的指針
31、”,在核對密碼后。實(shí)現(xiàn)對所要刪除學(xué)生按學(xué)號進(jìn)行查找。找到后顯示該學(xué)生的信息。按任意鍵進(jìn)行刪除。</p><p> 算法:主函數(shù)鏈表的頭指針,用一個(gè)輸出語句printf("Input your password:");</p><p> 提示用戶輸入密碼。在輸入過程中如果需要用到退格。putchar(8);putchar(' '); putchar(8
32、);來達(dá)到視覺和功能上的要求。如果密碼錯誤,則兩秒后自動返回主菜單。正確后輸入要刪除的學(xué)生學(xué)號,進(jìn)行刪除。</p><p><b> N-S流程圖如下:</b></p><p> 修改函數(shù) STUDENT *Modify(STUDENT *h)</p><p> 這是一個(gè)有參函數(shù),一個(gè)是“鏈表頭的指針”修改之后,并返回鏈表的頭指針。<
33、;/p><p><b> 算法:</b></p><p> 首先向系統(tǒng)申請一塊空間,用于存放輸入的信息。程序會根據(jù)用戶輸入的學(xué)號。采用線性查找法往下一個(gè)結(jié)點(diǎn)查找。設(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)。如果有該學(xué)生就修改。并出現(xiàn)提
34、示信息"***Modify success!***"。如果沒有該學(xué)生則出現(xiàn)“***Find out No.%s student***”提示。并2秒后返回主菜單。</p><p><b> N-S流程圖如下:</b></p><p> 從文件讀數(shù)據(jù)函數(shù) STUDENT *load()</p><p> 這是一個(gè)不返回值的
35、有參函數(shù),形參為“鏈表頭的指針”,根據(jù)輸入的文件地址進(jìn)行讀取。</p><p><b> N-S流程圖如下:</b></p><p> 按部分排序函數(shù) STUDENT *sort(STUDENT *head)</p><p> 這是一個(gè)有參函數(shù),形參為“鏈表頭的指針”,按學(xué)生成績的平均分高低進(jìn)行排序,還可以顯示名次。</p>
36、<p><b> N-S流程圖:</b></p><p><b> 主要源程序代碼</b></p><p> /* 學(xué)生成績管理源程序*/</p><p> /***********xuesheng.c********** /*I/O函數(shù)*/</p><p> #inc
37、lude "stdlib.h" /*其它說明*/</p><p> #include "string.h" /*字符串函數(shù)*/</p><p> #include "conio.h" /*屏幕操作函數(shù)*/</p><p> #include "mem.h" /*內(nèi)存
38、操作函數(shù)*/</p><p> #include "ctype.h" /*字符操作函數(shù)*/*/</p><p> /******頭文件(.h)***********/</p><p> #include "stdio.h"</p><p> #include "alloc.h&qu
39、ot; /*動態(tài)地址分配函數(shù)*/</p><p> #define N 3 /*定義常數(shù)*/</p><p> typedef struct z1 /*定義數(shù)據(jù)結(jié)構(gòu)*/</p><p><b> {</b></p><p> char no[11];</p><p>
40、 char name[15];</p><p> int score[N];</p><p> float sum;</p><p> float average;</p><p> int order;</p><p> struct z1 *next;</p><p><b&
41、gt; }STUDENT;</b></p><p> /*以下是函數(shù)原型*/</p><p> STUDENT *init(); /*初始化函數(shù)*/</p><p> STUDENT *create(); /*創(chuàng)建鏈表*/</p><p> STUDENT *delete(STUDENT *h); /
42、*刪除記錄*/</p><p> void print(STUDENT *h); /* 顯示所有記錄*/</p><p> void search(STUDENT *h); /*查找*/</p><p> void save(STUDENT *h); /*保存*/</p><p> STUDENT *load();
43、 /*讀入記錄*/</p><p> void computer(STUDENT *h); /*計(jì)算總分和均分*/</p><p> STUDENT *insert(STUDENT *h); /*插入記錄*/</p><p> void append(); /*追加記錄*/</p><p> v
44、oid copy(); /*復(fù)制文件*/</p><p> STUDENT *sort(STUDENT *h); /*排序*/</p><p> STUDENT *index(STUDENT *h); /*索引*/</p><p> void total(STUDENT *h); /*分類合計(jì)*/</p>
45、<p> int menu_select(); /*菜單函數(shù)*/</p><p> /******主函數(shù)開始*******/</p><p><b> main()</b></p><p><b> {</b></p><p><b> int
46、i;</b></p><p> STUDENT *head; /*鏈表定義頭指針*/</p><p> head=init(); /*初始化鏈表*/</p><p> clrscr(); /*清屏*/</p><p> for(;;) /*無限循環(huán)*/
47、</p><p><b> {</b></p><p> switch(menu_select()) /*調(diào)用主菜單函數(shù),返回值整數(shù)作開關(guān)語句的條件*/</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><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*菜單函數(shù),返回值為整數(shù)*/</p><p> menu_select()</p><p>&l
53、t;b> {</b></p><p> char *menu[]={"***************MENU***************", /*定義菜單字符串?dāng)?shù)組*/</p><p> " 0. init list", /*初始化*/</p><p> " 1. Enter li
54、st", /*輸入記錄*/</p><p> " 2. Delete a record from list", /*從表中刪除記錄*/</p><p> " 3. print list ", /*顯示單鏈表中所有記錄*/</p><p> " 4. Search record on
55、name", /*按照姓名查找記錄*/</p><p> " 5. Save the file", /*將單鏈表中記錄保存到文件中*/</p><p> " 6. Load the file", /*從文件中讀入記錄*/</p><p> " 7. compute
56、the score", /*計(jì)算所有學(xué)生的總分和均分*/</p><p> " 8. insert record to list ", /*插入記錄到表中*/</p><p> " 9. copy the file to new file", /*復(fù)制文件*/</p><p> " 10
57、. sort to make new file", /*排序*/</p><p> " 11. append record to file", /*追加記錄到文件中*/</p><p> " 12. index on nomber", /*索引*/</p><p> " 13.
58、total on nomber", /*分類合計(jì)*/</p><p> " 14. Quit"}; /*退出*/</p><p> char s[3]; /*以字符形式保存選擇號*/</p><p> int c,i; /*定義整形變量*/</p><
59、;p> gotoxy(1,25); /*移動光標(biāo)*/</p><p> printf("press any key enter menu......\n"); /*壓任一鍵進(jìn)入主菜單*/</p><p> getch(); /*輸入任一鍵*/</p><p> clrsc
60、r(); /*清屏幕*/</p><p> gotoxy(1,1); /*移動光標(biāo)*/</p><p> textcolor(YELLOW); /*設(shè)置文本顯示顏色為黃色*/</p><p> textbackground(BLUE); /*設(shè)置背景顏色為藍(lán)色*/</p>&
61、lt;p> gotoxy(10,2); /*移動光標(biāo)*/</p><p> putch(0xc9); /*輸出左上角邊框┏*/</p><p> for(i=1;i<44;i++)</p><p> putch(0xcd); /*輸出上邊框水平線*/</p><p> putch(0
62、xbb); /*輸出右上角邊框 ┓*/</p><p> for(i=3;i<20;i++)</p><p><b> {</b></p><p> gotoxy(10,i);putch(0xba); /*輸出左垂直線*/</p><p> gotoxy(54,i);putch(
63、0xba);</p><p> } /*輸出右垂直線*/</p><p> gotoxy(10,20);putch(0xc8); /*輸出左上角邊框┗*/</p><p> for(i=1;i<44;i++)</p><p> putch(0xcd); /*輸出下邊框水平線*/</p><p&
64、gt; putch(0xbc); /*輸出右下角邊框┛*/</p><p> window(11,3,53,19); /* 制作顯示菜單的窗口,大小根據(jù)菜單條數(shù)設(shè)計(jì)*/</p><p> clrscr(); /*清屏*/</p><p> for(i=0;i<16;i++)
65、 /*輸出主菜單數(shù)組*/</p><p><b> {</b></p><p> gotoxy(10,i+1);</p><p> cprintf("%s",menu[i]);</p><p><b> }</b></p><p> textb
66、ackground(BLACK); /*設(shè)置背景顏色為黑色*/</p><p> window(1,1,80,25); /*恢復(fù)原窗口大小*/</p><p> gotoxy(10,21); /*移動光標(biāo)*/</p><p><b> do{</b></p><p> printf(&
67、quot;\n Enter you choice(0~14):"); /*在菜單窗口外顯示提示信息*/</p><p> scanf("%s",s); /*輸入選擇項(xiàng)*/</p><p> c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整形數(shù)*/</p><p> }while(c
68、<0||c>14); /*選擇項(xiàng)不在0~14之間重輸*/</p><p> return c; /*返回選擇項(xiàng),主程序根據(jù)該數(shù)調(diào)用相應(yīng)的函數(shù)*/</p><p><b> }</b></p><p> STUDENT *init()</p><p><b>
69、{</b></p><p> return NULL;</p><p><b> }</b></p><p><b> /*創(chuàng)建鏈表*/</b></p><p> STUDENT *create()</p><p><b> {</b&g
70、t;</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><p>
71、info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/</p><p> if(!info) /*如果指針info為空*/</p><p><b> {</b></p><p> printf("\nout of memory"); /*輸出內(nèi)存溢出*/</p
72、><p> return NULL; /*返回空指針*/</p><p><b> }</b></p><p> inputs("enter no:",info->no,11); /*輸入學(xué)號并校驗(yàn)*/</p><p> if(info->no[0]=='
73、;@') break; /*如果學(xué)號首字符為@則結(jié)束輸入*/</p><p> inputs("enter name:",info->name,15); /*輸入姓名,并進(jìn)行校驗(yàn)*/</p><p> printf("please input %d score \n",N); /*提示開始輸入成績*/</p>
74、<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> printf(&q
75、uot;score%d:",i+1); /*提示輸入第幾門課程*/</p><p> scanf("%d",&info->score[i]); /*輸入成績*/</p><p> if(info->score[i]>100||info->score[i]<0) /*確保成績在0~100之間*/</p&
76、gt;<p> printf("bad data,repeat input\n"); /*出錯提示信息*/</p><p> }while(info->score[i]>100||info->score[i]<0);</p><p> s=s+info->score[i]; /*累加各門課程成績*/</p&g
77、t;<p><b> }</b></p><p> info->sum=s; /*將總分保存*/</p><p> info->average=(float)s/N; /*求出平均值*/</p><p> info->order=0; /*未排序前此值為0*/</p><
78、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><b> }<
79、/b></p><p> /*輸入字符串,并進(jìn)行長度驗(yàn)證*/</p><p> inputs(char *prompt, char *s, int count)</p><p><b> {</b></p><p> char p[255];</p><p><b> d
80、o{</b></p><p> printf(prompt); /*顯示提示信息*/</p><p> scanf("%s",p); /*輸入字符串*/</p><p> if(strlen(p)>count)printf("\n too long! \n"); /*進(jìn)行長度校驗(yàn),超過count值重
81、輸入*/</p><p> }while(strlen(p)>count);</p><p> strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/</p><p><b> }</b></p><p> /*輸出鏈表中結(jié)點(diǎn)信息*/</p><p> void prin
82、t(STUDENT *h)</p><p><b> {</b></p><p> int i=0; /* 統(tǒng)計(jì)記錄條數(shù)*/</p><p> STUDENT *p; /*移動指針*/</p><p> clrscr(); /*清屏*/</p><p> p=h;
83、 /*初值為頭指針*/</p><p> printf("\n\n\n****************************STUDENT********************************\n");</p><p> printf("|rec|nO | name | sc1| sc2| sc3| su
84、m | ave |order|\n");</p><p> printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");</p><p> while(p!=NULL)</p><p><b> {</b
85、></p><p><b> i++;</b></p><p> printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],</p><p&g
86、t; p->score[2],p->sum,p->average,p->order);</p><p> p=p->next;</p><p><b> }</b></p><p> printf("**********************************end************
87、*********************\n");</p><p><b> }</b></p><p><b> /*刪除記錄*/</b></p><p> STUDENT *delete(STUDENT *h)</p><p><b> {</b><
88、;/p><p> STUDENT *p,*q; /*p為查找到要刪除的結(jié)點(diǎn)指針,q為其前驅(qū)指針*/</p><p> char s[11]; /*存放學(xué)號*/</p><p> clrscr(); /*清屏*/</p><p> printf("please deleted no\n");
89、 /*顯示提示信息*/</p><p> scanf("%s",s); /*輸入要刪除記錄的學(xué)號*/</p><p> q=p=h; /*給q和p賦初值頭指針*/</p><p> while(strcmp(p->no,s)&&p!=NULL) /*當(dāng)記錄的學(xué)號不是要找的,或指針不為空時(shí)*/</p
90、><p><b> {</b></p><p> q=p; /*將p指針值賦給q作為p的前驅(qū)指針*/</p><p> p=p->next; /*將p指針指向下一條記錄*/</p><p><b> }</b></p><p> if(p==
91、NULL) /*如果p為空,說明鏈表中沒有該結(jié)點(diǎn)*/</p><p> printf("\nlist no %s student\n",s);</p><p> else /*p不為空,顯示找到的記錄信息*/</p><p><b> {</b></p><p> prin
92、tf("*****************************have found***************************\n");</p><p> printf("|no | name | sc1| sc2| sc3| sum | ave |order|\n");</p><p>
93、printf("|----------|---------------|----|----|----|--------|-------|-----|\n");</p><p> printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,</p><p> p->
94、name,p->score[0],p->score[1],p->score[2],p->sum,</p><p> p->average,p->order);</p><p> printf("********************************end*******************************\n"
95、);</p><p> getch(); /*壓任一鍵后,開始刪除*/</p><p> if(p==h) /*如果p==h,說明被刪結(jié)點(diǎn)是頭結(jié)點(diǎn)*/</p><p> h=p->next; /*修改頭指針指向下一條記錄*/</p><p><b> else</b></p&g
96、t;<p> 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> pri
97、ntf("Don't forget save\n");/*提示刪除后不要忘記保存文件*/</p><p><b> }</b></p><p> return(h); /*返回頭指針*/</p><p><b> }</b></p><p><b&g
98、t; /*查找記錄*/</b></p><p> void search(STUDENT *h)</p><p><b> {</b></p><p> STUDENT *p; /* 移動指針*/</p><p> char s[15]; /*存放姓名的字符數(shù)組*/</p>
99、<p> clrscr(); /*清屏幕*/</p><p> printf("please enter name for search\n");</p><p> scanf("%s",s); /*輸入姓名*/</p><p> p=h; /*將頭指針賦給p*/</p>
100、<p> while(strcmp(p->name,s)&&p!=NULL) /*當(dāng)記錄的姓名不是要找的,或指針不為空時(shí)*/</p><p> p=p->next; /*移動指針,指向下一結(jié)點(diǎn)*/</p><p> if(p==NULL) /*如果指針為空*/</p><p> printf(&
101、quot;\nlist no %s student\n",s); /*顯示沒有該學(xué)生*/</p><p> else /*顯示找到的記錄信息*/</p><p><b> {</b></p><p> printf("\n\n*****************************havefo
102、und***************************\n");</p><p> printf("|nO | name | sc1| sc2| sc3| sum | ave |order|\n");</p><p> printf("|----------|---------------|----
103、|----|----|--------|-------|-----|\n");</p><p> printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,</p><p> p->name,p->score[0],p->score[1],p->scor
104、e[2],p->sum,p->average,p->order);</p><p> printf("********************************end*******************************\n");</p><p><b> }</b></p><p>&l
105、t;b> }</b></p><p><b> /*插入記錄*/</b></p><p> STUDENT *insert(STUDENT *h)</p><p><b> {</b></p><p> STUDENT *p,*q,*info; /*p指向插入位置,q是
106、其前驅(qū),info指新插入記錄*/</p><p> char s[11]; /*保存插入點(diǎn)位置的學(xué)號*/</p><p><b> int s1,i;</b></p><p> printf("please enter location before the no\n");</p><p>
107、 scanf("%s",s); /*輸入插入點(diǎn)學(xué)號*/</p><p> printf("\nplease new record\n"); /*提示輸入記錄信息*/</p><p> info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/</p><p>&l
108、t;b> if(!info)</b></p><p><b> {</b></p><p> printf("\nout of memory"); /*如沒有申請到,內(nèi)存溢出*/</p><p> return NULL; /*返回空指針*/</p><
109、;p><b> }</b></p><p> inputs("enter no:",info->no,11); /*輸入學(xué)號*/</p><p> inputs("enter name:",info->name,15); /*輸入姓名*/</p><p> printf(&quo
110、t;please input %d score \n",N); /*提示輸入分?jǐn)?shù)*/</p><p> s1=0; /*保存新記錄的總分,初值為0*/</p><p> for(i=0;i<N;i++) /*N門課程循環(huán)N次輸入成績*/</p><p><b> {</b></p><p&
111、gt; do{ /*對數(shù)據(jù)進(jìn)行驗(yàn)證,保證在0~100之間*/</p><p> printf("score%d:",i+1);</p><p> scanf("%d",&info->score[i]);</p><p> if(info->score[i]>100||info-&
112、gt;score[i]<0)</p><p> printf("bad data,repeat input\n");</p><p> }while(info->score[i]>100||info->score[i]<0);</p><p> s1=s1+info->score[i]; /*計(jì)算總
113、分*/</p><p><b> }</b></p><p> info->sum=s1; /*將總分存入新記錄中*/</p><p> info->average=(float)s1/N; /*計(jì)算均分*/</p><p> info->order=0; /*名次賦值0
114、*/</p><p> info->next=NULL; /*設(shè)后繼指針為空*/</p><p> p=h; /*將指針賦值給p*/</p><p> q=h; /*將指針賦值給q*/</p><p> while(strcmp(p->no,s)&&
115、;p!=NULL) /*查找插入位置*/</p><p><b> {</b></p><p> q=p; /*保存指針p,作為下一個(gè)p的前驅(qū)*/</p><p> p=p->next; /*將指針p后移*/</p><p><b> }&l
116、t;/b></p><p> if(p==NULL) /*如果p指針為空,說明沒有指定結(jié)點(diǎn)*/</p><p> if(p==h) /*同時(shí)p等于h,說明鏈表為空*/</p><p> h=info; /*新記錄則為頭結(jié)點(diǎn)*/</p><p><b> else</b></p&
117、gt;<p> q->next=info; /*p為空,但p不等于h,將新結(jié)點(diǎn)插在表尾*/</p><p><b> else</b></p><p> if(p==h) /*p不為空,則找到了指定結(jié)點(diǎn)*/</p><p><b> {</b></p><p>
118、 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> }</b></p><p><b> else</b></p><p><b> {</b&
119、gt;</p><p> info->next=p; /*不是頭結(jié)點(diǎn),則是中間某個(gè)位置,新結(jié)點(diǎn)的后繼為p*/</p><p> q->next=info; /*新結(jié)點(diǎn)作為q的后繼結(jié)點(diǎn)*/</p><p><b> }</b></p><p> printf("\n ----have i
120、nserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存盤*/</p><p> return(h); /*返回頭指針*/</p><p><b> }</b></p>&
121、lt;p> /*保存數(shù)據(jù)到文件*/</p><p> void save(STUDENT *h)</p><p><b> {</b></p><p> FILE *fp; /*定義指向文件的指針*/</p><p> STUDENT *p; /* 定義移動指針*/</p>
122、;<p> char outfile[10]; /*保存輸出文件名*/</p><p> printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/</p><p> scanf("%s",outfile);</p><p
123、> if((fp=fopen(outfile,"wb"))==NULL) /*為輸出打開一個(gè)二進(jìn)制文件,如沒有則建立*/</p><p><b> {</b></p><p> printf("can not open file\n");</p><p><b> exit(1);
124、</b></p><p><b> }</b></p><p> printf("\nSaving file......\n"); /*打開文件,提示正在保存*/</p><p> p=h; /*移動指針從頭指針開始*/</p><p> w
125、hile(p!=NULL) /*如p不為空*/</p><p><b> {</b></p><p> fwrite(p,sizeof(STUDENT),1,fp);/*寫入一條記錄*/</p><p> p=p->next; /*指針后移*/</p><p><b>
126、 }</b></p><p> fclose(fp); /*關(guān)閉文件*/</p><p> printf("-----save success!!-----\n"); /*顯示保存成功*/</p><p><b> }</b></p><p> /* 從文件讀數(shù)據(jù)*/&
127、lt;/p><p> STUDENT *load()</p><p><b> {</b></p><p> STUDENT *p,*q,*h=NULL; /*定義記錄指針變量*/</p><p> FILE *fp; /* 定義指向文件的指針*/</p><p>
128、 char infile[10]; /*保存文件名*/</p><p> printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*輸入文件名*/</p><p> if((fp=fopen(infile,
129、"rb"))==NULL) /*打開一個(gè)二進(jìn)制文件,為讀方式*/</p><p><b> {</b></p><p> printf("can not open file\n"); /*如不能打開,則結(jié)束程序*/</p><p><b> exit(1);</b>&
130、lt;/p><p><b> }</b></p><p> printf("\n -----Loading file!-----\n");</p><p> p=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/</p><p><b> if(
131、!p)</b></p><p><b> {</b></p><p> printf("out of memory!\n"); /*如沒有申請到,則內(nèi)存溢出*/</p><p> return h; /*返回空頭指針*/</p><p><b> }&l
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言程序課程設(shè)計(jì)--學(xué)生成績管理系統(tǒng)設(shè)計(jì)
- c語言程序設(shè)計(jì)課程設(shè)計(jì)---學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)---學(xué)生成績管理系統(tǒng)程序設(shè)計(jì)
- c語言課程設(shè)計(jì)--學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)---學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)-學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)----學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)-學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)-學(xué)生成績管理系統(tǒng)
- 學(xué)生成績管理系統(tǒng)--c語言課程設(shè)計(jì)
- c語言課程設(shè)計(jì)--學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)--學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)---學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)-學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)———學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)學(xué)生成績管理系統(tǒng)
- c語言課程設(shè)計(jì)---學(xué)生成績管理系統(tǒng)
評論
0/150
提交評論