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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

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>  概要設計3</b></p><p>  1) 程序的模塊組成:4</p><p>  2) 各個函數(shù)的主要功能:4</p><p><b>  總體框架5<

3、/b></p><p><b>  詳細設計6</b></p><p><b>  主要功能的實現(xiàn)6</b></p><p><b>  函數(shù)明細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語言程序設計》課程設計是對學生的一種全面綜合訓練,它包括問題分析,總體結(jié)構(gòu)

8、設計,用戶界面設計,程序設計基本技能和技巧,多人合作,以至一整套軟件工作規(guī)范的訓練和科學作風的培養(yǎng)。是與課堂聽講、自學和練習相輔相成的必不可少的一個教學環(huán)節(jié)。通常,課程設計的課題比平時的習題復雜得多,也更接近實際。課程設計著眼于與應用的結(jié)合點,使學生學會如何把書上學到的知識用于解決實際問題,培養(yǎng)軟件工作所需要的動手能力;另一方面,能使書上的知識變“活”,使學生更好地深化理解和靈活掌握教學內(nèi)容。為了達到上述目的,本課程設計安排了四個設計課

9、題,訓練重點在于基本的程序設計方法和分析問題的能力,而不強調(diào)面面俱到。學生可任選其中一題進行設計,設計完畢寫出課程設計報告,用A4紙打印成冊;并將課程設計報告與源程序存盤。學習委員將課程設計報告與磁盤收齊后交指導老師。</p><p><b>  目的</b></p><p>  全面熟悉、掌握C語言基本知識,掌握C程序設計中的順序、分支、循環(huán)三種結(jié)構(gòu)及數(shù)組、函數(shù)和C

10、語言基本圖形編程等方法,把編程和實際結(jié)合起來,增強對不同的問題運用和靈活選擇合適的數(shù)據(jù)結(jié)構(gòu)以及算法描述的本領,熟悉編制和調(diào)試程序的技巧,掌握分析結(jié)果的若干有效方法,進一步提高上機動手能力,培養(yǎng)使用計算機解決實際問題的能力,養(yǎng)成提供文檔資料的習慣和規(guī)范編程的思想,為以后在專業(yè)課程中應用計算機系統(tǒng)解決計算、分析、實驗和設計等學習環(huán)節(jié)打下較扎實的基礎。</p><p><b>  需求分析 </b>

11、;</p><p><b>  1、問題描述:</b></p><p>  對一個有N個學生的班級,每個學生有M個課程。該系統(tǒng)能對成績的錄入和顯示,能計算每個學生的平均成績以及各個功課的平均成績,能根據(jù)學生的學號來查詢該學生的成績,能刪除該學生的記錄,能根據(jù)每個學生的平均成績來給他們進行排序,最后退出系統(tǒng)。</p><p><b> 

12、 2、功能要求:</b></p><p>  本系統(tǒng)采用一個結(jié)構(gòu)體數(shù)組,每個數(shù)據(jù)的結(jié)構(gòu)應當包括:學號、姓名、M門課程名稱。</p><p>  本系統(tǒng)顯示這樣的菜單: </p><p>  .a、每一條記錄包括一個學生的學號、姓名、平均成績。 b、顯示功能:完成全部學生記錄的顯示。c、查找功能:完成按姓名查找學生記錄,并顯示。d、排序功能:按

13、學生平均成績進行排序。e、插入功能:按平均成績高低插入一條學生記錄。f、保存功能:將學生記錄保存在任何自定義的文件中,</p><p>  g、讀取功能:將保存在文件中的學生記錄讀取出來。 </p><p>  h、統(tǒng)計功能:顯示每門課程成績的學生的基本信息,顯示每門課程的平均分。</p><p><b>  退出系統(tǒng)。</b></p

14、><p><b>  3、進度安排:</b></p><p>  第一周 星期四: 課題講解,查閱資料</p><p>  第二周 星期一: 總體設計,詳細設計</p><p>  星期二: 程,上機調(diào)試、修改程序</p><p>  星期三: 上機調(diào)試、完善程序</p><

15、;p>  星期四: 上機調(diào)試、完善程序</p><p><b>  星期五: 答辯</b></p><p>  星期六-星期天: 撰寫課程設計報告</p><p><b>  概要設計</b></p><p>  學生成績管理系統(tǒng)有13種功能。把這13個功能做成13個子函數(shù)。在主函當數(shù)中

16、設計一個菜單對這13個子數(shù)進行管理。來實現(xiàn)對整個系統(tǒng)的操作。根據(jù)課題的要求。每一個學生的包括姓名(char)、學號(char)、M門課程的成績(float).再加上系統(tǒng)功能上的要求每一學生的信息還要總分和名次等。所以自然的想到要用結(jié)構(gòu)體來定義每一個學生的信息結(jié)構(gòu)。然后用鏈表把它們組成一個有序的整體。用對鏈表的操作來實現(xiàn)對所有學生信息的統(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>  計算總分和均分函數(shù): void computer(STUDENT *h)</p><p>  修改函數(shù): STUDENT *Modify(STUDENT *head,STUDENT *new)</p><p>  按學號排序函數(shù): STUDENT *index(STUDENT

20、*h)</p><p>  菜單函數(shù):int menu_select()</p><p>  2) 各個函數(shù)的主要功能:</p><p>  輸入函數(shù): 隨時輸入數(shù)據(jù)。</p><p>  菜單函數(shù):顯示系統(tǒng)主菜單。</p><p>  顯示函數(shù): 顯示所有學生的信息。</p><p>  尋找

21、函數(shù): 方便學生查找自己的成績。</p><p>  刪除函數(shù): 刪除某學生的信息。</p><p>  排序函數(shù): 按總成績排序。</p><p>  按學號排序函數(shù): 按學號排序。</p><p>  插入函數(shù): 可以插入新的信息。</p><p>  保存函數(shù): 保存好學生成績,以免丟失。</p>

22、<p><b>  統(tǒng)計函數(shù):</b></p><p>  顯示每門課程成績最高的學生的基本信息。</p><p>  顯示每門課程的平均成績。</p><p>  顯示超過某門課程平均成績的學生人數(shù)</p><p><b>  總體框架:</b></p><p>

23、<b>  詳細設計</b></p><p><b>  主要功能的實現(xiàn)</b></p><p><b>  函數(shù)明細:</b></p><p>  整個系統(tǒng)除了主函數(shù)外,另外還有14個函數(shù),實現(xiàn)八大功能:輸入功能、顯示功能、查找功能、排序功能、插入功能、保存功能、讀取功能。各個函數(shù)的詳細設計說明分別

24、如下:</p><p>  主函數(shù) main()</p><p>  利用無限次循環(huán)for(;;)和swithch()實現(xiàn)各函數(shù)的調(diào)用,系統(tǒng)根據(jù)輸入的數(shù)字選項來調(diào)用相應的函數(shù)。</p><p>  菜單選擇函數(shù) int menu_select()</p><p>  這是一個無參函數(shù),主要實現(xiàn)“功能選擇”的界面,在這個界面里有顯示系統(tǒng)的九大功

25、能,根據(jù)每個功能前面的序號進行選擇。等執(zhí)行完每一個函數(shù)功能后,再自行返回該函數(shù)。</p><p>  初始化函數(shù) STUDENT *init()</p><p>  這是一個無參函數(shù),里面只有兩個語句,它的作用是使鏈表初始化,使head的值為NULL和一個清屏語句。比如:沒有這個函數(shù)的話,在你沒有輸入任何數(shù)據(jù)的情況下,去執(zhí)行顯示功能的時候會顯示一些亂碼!</p><p

26、>  輸入記錄函數(shù) STUDENT *create()</p><p>  這是一個無參函數(shù),用來執(zhí)行第學生成績記錄的輸入,當學生為@時停止輸入,函數(shù)結(jié)束后,帶回一個指鏈表頭的指針向head。將下一個學生的信息插在表頭。</p><p><b>  N-S流程圖如下:</b></p><p>  顯示記錄函數(shù) void print(STU

27、DENT *h)</p><p>  這是一個不返回值的有參函數(shù),形參為“鏈表頭的指針”,負責對全部學生成績記錄的輸出,不足之處就是不能對學生成績進行分頁顯示。</p><p>  算法:先將p結(jié)點的指針指向第一個結(jié)點,將p結(jié)點(即第一個結(jié)點)的數(shù)據(jù)輸出。然后再將p結(jié)點的指針指向p指針的的指針(即下一結(jié)點),將p結(jié)點(即第一結(jié)點)的數(shù)據(jù)輸出。重復執(zhí)行此步聚直到p指針指向NULL為止。<

28、;/p><p><b>  N-S流程圖如下:</b></p><p>  保存數(shù)據(jù)到文件函數(shù) void save(STUDENT *h) </p><p>  這是一個不返回值的有參函數(shù),形參為“鏈表頭的指針”,可以把學生記錄保存在電腦上由自己任意命名的二進制文件。</p><p><b>  N-S流程圖如下

29、:</b></p><p>  查找記錄函數(shù) void search(STUDENT *h)</p><p>  這是一個不返回值的有參函數(shù),形參為“鏈表頭的指針”,實現(xiàn)按學號對某個學生進行查找,并顯示所查找到的記錄。</p><p>  算法:采用線性查找法往下一個結(jié)點查找。輸入所要查找的學生的學號s,設一個指針變量p,先指向第一個結(jié)點,當strcmp

30、(p->name,s) && p != NULL時,使p后移一個結(jié)點,如果p!=NULL,輸出p所指的結(jié)點。</p><p><b>  N-S流程圖如下:</b></p><p>  刪除記錄函數(shù) STUDENT *delete(STUDENT *h)</p><p>  這是一個有返回值的有參函數(shù)。形參為“鏈表頭的指針

31、”,在核對密碼后。實現(xiàn)對所要刪除學生按學號進行查找。找到后顯示該學生的信息。按任意鍵進行刪除。</p><p>  算法:主函數(shù)鏈表的頭指針,用一個輸出語句printf("Input your password:");</p><p>  提示用戶輸入密碼。在輸入過程中如果需要用到退格。putchar(8);putchar(' '); putchar(8

32、);來達到視覺和功能上的要求。如果密碼錯誤,則兩秒后自動返回主菜單。正確后輸入要刪除的學生學號,進行刪除。</p><p><b>  N-S流程圖如下:</b></p><p>  修改函數(shù) STUDENT *Modify(STUDENT *h)</p><p>  這是一個有參函數(shù),一個是“鏈表頭的指針”修改之后,并返回鏈表的頭指針。<

33、;/p><p><b>  算法:</b></p><p>  首先向系統(tǒng)申請一塊空間,用于存放輸入的信息。程序會根據(jù)用戶輸入的學號。采用線性查找法往下一個結(jié)點查找。設一個指針變量p,先指向第一個結(jié)點,當strcmp(p->name,s) && p != NULL時,使p后移一個結(jié)點,如果p!=NULL,輸出p所指的結(jié)點。如果有該學生就修改。并出現(xiàn)提

34、示信息"***Modify success!***"。如果沒有該學生則出現(xiàn)“***Find out No.%s student***”提示。并2秒后返回主菜單。</p><p><b>  N-S流程圖如下:</b></p><p>  從文件讀數(shù)據(jù)函數(shù) STUDENT *load()</p><p>  這是一個不返回值的

35、有參函數(shù),形參為“鏈表頭的指針”,根據(jù)輸入的文件地址進行讀取。</p><p><b>  N-S流程圖如下:</b></p><p>  按部分排序函數(shù) STUDENT *sort(STUDENT *head)</p><p>  這是一個有參函數(shù),形參為“鏈表頭的指針”,按學生成績的平均分高低進行排序,還可以顯示名次。</p>

36、<p><b>  N-S流程圖:</b></p><p><b>  主要源程序代碼</b></p><p>  /* 學生成績管理源程序*/</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); /*計算總分和均分*/</p><p>  STUDENT *insert(STUDENT *h); /*插入記錄*/</p><p>  void append(); /*追加記錄*/</p><p>  v

44、oid copy(); /*復制文件*/</p><p>  STUDENT *sort(STUDENT *h); /*排序*/</p><p>  STUDENT *index(STUDENT *h); /*索引*/</p><p>  void total(STUDENT *h); /*分類合計*/</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ù)作開關語句的條件*/</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、計算總分和均分*/</p><p>  case 8:head=insert(head); break; /*插入記錄*/</p><p>  case 9:copy();break; /*復制文件*/</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; /*分類合計*/</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***************", /*定義菜單字符串數(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", /*計算所有學生的總分和均分*/</p><p>  " 8. insert record to list ", /*插入記錄到表中*/</p><p>  " 9. copy the file to new file", /*復制文件*/</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", /*分類合計*/</p><p>  " 14. Quit"}; /*退出*/</p><p>  char s[3]; /*以字符形式保存選擇號*/</p><p>  int c,i; /*定義整形變量*/</p><

59、;p>  gotoxy(1,25); /*移動光標*/</p><p>  printf("press any key enter menu......\n"); /*壓任一鍵進入主菜單*/</p><p>  getch(); /*輸入任一鍵*/</p><p>  clrsc

60、r(); /*清屏幕*/</p><p>  gotoxy(1,1); /*移動光標*/</p><p>  textcolor(YELLOW); /*設置文本顯示顏色為黃色*/</p><p>  textbackground(BLUE); /*設置背景顏色為藍色*/</p>&

61、lt;p>  gotoxy(10,2); /*移動光標*/</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ù)設計*/</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); /*設置背景顏色為黑色*/</p><p>  window(1,1,80,25); /*恢復原窗口大小*/</p><p>  gotoxy(10,21); /*移動光標*/</p><p><b>  do{</b></p><p>  printf(&

67、quot;\n Enter you choice(0~14):"); /*在菜單窗口外顯示提示信息*/</p><p>  scanf("%s",s); /*輸入選擇項*/</p><p>  c=atoi(s); /*將輸入的字符串轉(zhuǎn)化為整形數(shù)*/</p><p>  }while(c

68、<0||c>14); /*選擇項不在0~14之間重輸*/</p><p>  return c; /*返回選擇項,主程序根據(jù)該數(shù)調(diào)用相應的函數(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); /*輸入學號并校驗*/</p><p>  if(info->no[0]=='

73、;@') break; /*如果學號首字符為@則結(jié)束輸入*/</p><p>  inputs("enter name:",info->name,15); /*輸入姓名,并進行校驗*/</p><p>  printf("please input %d score \n",N); /*提示開始輸入成績*/</p>

74、<p>  s=0; /*計算每個學生的總分,初值為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é)點做為新輸入結(jié)點的后繼結(jié)點*/</p><p>  h=info; /*新輸入結(jié)點為新的頭結(jié)點*/</p><p><b>  }</b></p><p>  return(h); /*返回頭指針*/</p><p><b>  }<

79、/b></p><p>  /*輸入字符串,并進行長度驗證*/</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"); /*進行長度校驗,超過count值重

81、輸入*/</p><p>  }while(strlen(p)>count);</p><p>  strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/</p><p><b>  }</b></p><p>  /*輸出鏈表中結(jié)點信息*/</p><p>  void prin

82、t(STUDENT *h)</p><p><b>  {</b></p><p>  int i=0; /* 統(tǒng)計記錄條數(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é)點指針,q為其前驅(qū)指針*/</p><p>  char s[11]; /*存放學號*/</p><p>  clrscr(); /*清屏*/</p><p>  printf("please deleted no\n");

89、 /*顯示提示信息*/</p><p>  scanf("%s",s); /*輸入要刪除記錄的學號*/</p><p>  q=p=h; /*給q和p賦初值頭指針*/</p><p>  while(strcmp(p->no,s)&&p!=NULL) /*當記錄的學號不是要找的,或指針不為空時*/</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é)點*/</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é)點是頭結(jié)點*/</p><p>  h=p->next; /*修改頭指針指向下一條記錄*/</p><p><b>  else</b></p&g

96、t;<p>  q->next=p->next; /*不是頭指針,將p的后繼結(jié)點作為q的后繼結(jié)點*/</p><p>  free(p); /*釋放p所指結(jié)點空間*/</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) /*當記錄的姓名不是要找的,或指針不為空時*/</p><p>  p=p->next; /*移動指針,指向下一結(jié)點*/</p><p>  if(p==NULL) /*如果指針為空*/</p><p>  printf(&

101、quot;\nlist no %s student\n",s); /*顯示沒有該學生*/</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]; /*保存插入點位置的學號*/</p><p><b>  int s1,i;</b></p><p>  printf("please enter location before the no\n");</p><p>

107、  scanf("%s",s); /*輸入插入點學號*/</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); /*輸入學號*/</p><p>  inputs("enter name:",info->name,15); /*輸入姓名*/</p><p>  printf(&quo

110、t;please input %d score \n",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ù)進行驗證,保證在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]; /*計算總

113、分*/</p><p><b>  }</b></p><p>  info->sum=s1; /*將總分存入新記錄中*/</p><p>  info->average=(float)s1/N; /*計算均分*/</p><p>  info->order=0; /*名次賦值0

114、*/</p><p>  info->next=NULL; /*設后繼指針為空*/</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,作為下一個p的前驅(qū)*/</p><p>  p=p->next; /*將指針p后移*/</p><p><b>  }&l

116、t;/b></p><p>  if(p==NULL) /*如果p指針為空,說明沒有指定結(jié)點*/</p><p>  if(p==h) /*同時p等于h,說明鏈表為空*/</p><p>  h=info; /*新記錄則為頭結(jié)點*/</p><p><b>  else</b></p&

117、gt;<p>  q->next=info; /*p為空,但p不等于h,將新結(jié)點插在表尾*/</p><p><b>  else</b></p><p>  if(p==h) /*p不為空,則找到了指定結(jié)點*/</p><p><b>  {</b></p><p>

118、  info->next=p; /*如果p等于h,則新結(jié)點插入在第一個結(jié)點之前*/</p><p>  h=info; /*新結(jié)點為新的頭結(jié)點*/</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

119、gt;</p><p>  info->next=p; /*不是頭結(jié)點,則是中間某個位置,新結(jié)點的后繼為p*/</p><p>  q->next=info; /*新結(jié)點作為q的后繼結(jié)點*/</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) /*為輸出打開一個二進制文件,如沒有則建立*/</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); /*關閉文件*/</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) /*打開一個二進制文件,為讀方式*/</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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論