c語言程序課程設(shè)計(jì)----學(xué)生成績管理系統(tǒng)_第1頁
已閱讀1頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論