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

下載本文檔

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

文檔簡介

1、<p><b>  C語言課程設計報告</b></p><p><b>  學生成績管理系統(tǒng) </b></p><p>  學 院 計算機學院 </p><p>  專 業(yè) 軟件工程(4)班 </p><p&g

2、t;  年 級 </p><p>  姓 名 </p><p>  學 號 </p><p>  教 師 </p><p><b>  一.設計題目

3、</b></p><p><b>  學生成績管理系統(tǒng)</b></p><p><b>  二.課程設計目的</b></p><p>  了解軟件工程中的一些系統(tǒng)分析,模塊分析,代碼設計的概念,利用WIN-TC實現(xiàn)學生成績管理系統(tǒng)的錄入、查詢、刪除、統(tǒng)計等基本操作,使用單鏈表結構實現(xiàn)學生成績管理,了解數(shù)據(jù)庫管理

4、的基本功能,掌握C語言中的結構體、指針、函數(shù)(系統(tǒng)函數(shù)、自定義函數(shù))、文件操作等知識。通過對系統(tǒng)的分析和設計,進一步鞏固C語言的學習,以提高對開發(fā)環(huán)境的進一步認識和綜合編程能力。</p><p><b>  系統(tǒng)功能</b></p><p>  1.學生基本情況錄入。</p><p>  2 能夠對已經錄入的數(shù)據(jù)進行顯示。</p>

5、<p>  3.能夠進行數(shù)據(jù)的插入。</p><p>  4.刪除基本數(shù)據(jù)的相關信息。</p><p>  5.復制基本數(shù)據(jù)的相關信息。</p><p>  6.能夠從文件中讀入記錄。</p><p>  7.對輸入的數(shù)據(jù)進行保存。</p><p>  8.可進行姓名的查詢。如:姓陳的同學。</p&

6、gt;<p>  9.可進行基本數(shù)據(jù)的統(tǒng)計計算。如:</p><p>  ①.統(tǒng)計每個學生各門功課的平均成績及總分,根據(jù)總分進行名次排列。</p><p> ?、冢畬?shù)據(jù)進行分類合計處理,統(tǒng)計個班級的總分,總平均分。</p><p>  四.系統(tǒng)功能模塊結構圖</p><p>  本程序利用單鏈表存儲結構完成對學生成績的動態(tài)管理

7、,其基本功能模塊如下圖所示:</p><p>  ︱            </p><p>  圖1 程序功能模塊結構圖</p><p>  五.程序設計及各模塊函數(shù)功能簡述</p><p><b>  1.數(shù)據(jù)結構</b></p><p>  鏈表是線形表的一種,線形表分為順序存儲結構和鏈式存

8、儲結構。線形表的順序存儲結構的特點是邏輯關系上相鄰的兩個元素物理位置上也相鄰,因此可以隨機存取表中任一元素。鏈式存儲結構的特點是用一組任意的存儲單元存儲線形表的數(shù)據(jù)元素。鏈表的最大的優(yōu)點是對表的添加、刪除、查找、排序等操作比較方便,因此采用鏈表來存儲學生相關信息。且對結點的定義如下:</p><p>  typedef struct z1 /*定義數(shù)據(jù)結構*/</p><p>&l

9、t;b>  {</b></p><p>  char no[11]; /*10位學號*/</p><p>  char name[15]; /*姓名*/</p><p>  int score[N]; /*成績*/</p><p>  float sum; /*總分*/</p>

10、<p>  float average; /*平均分*/ </p><p>  int order; /*排名*/</p><p>  struct z1 *next;</p><p><b>  }STUDENT;</b></p><p>  2.main()主函數(shù)</p>

11、<p>  主函數(shù)是程序入口,采用模塊化設計。首先在主程序中打印歡迎界面,聲明一些必要變量,作一無限循環(huán)程序,循環(huán)體為一開關語句,該語句設置一個斷點,其條件值是通過調用主菜單函數(shù)得到的返回值,根據(jù)該值,調用相應的功能函數(shù),同時設置一個斷點,當返回值為一定條件時結束程序。</p><p>  3.menu_select()主菜單</p><p>  為了美化界面,制作單邊框窗口,在

12、窗口中顯示主菜單。通過putch()輸出圖形符號的ASCII碼值(十六進制),達到顯示的目的。</p><p>  利用Windows函數(shù)制作顯示窗口,該窗口與邊框位置,大小基本一致,通過過仔細計算且多次調試后得到其坐標值,用函數(shù)gotoxy()來實現(xiàn)光標的移動。設置文本和背景色輸出菜單項。恢復原窗口,設計輸入選擇項,返回主函數(shù)。相關的一些函數(shù)如下:</p><p>  window、te

13、xtbackground、clrscr、textcolor、cprintf、bioskey、gotoxy、gettext、puttext、putch。</p><p>  putch(0xda); /*輸出左上角邊框┏*/ </p><p>  putch(0xc4); /*輸出上邊框水平線*/</p><p>  putch(0xbf); /*輸出右上角邊框 ┓

14、*/ </p><p>  gotoxy(10,i);putch(0xb3); /*輸出左邊的垂直線*/</p><p>  gotoxy(63,i);putch(0xb3); /*輸出右邊的垂直線*/</p><p>  putch(0xc0); /*輸出左下角邊框┗*/</p><p>  putch(0xc4); /*輸出下邊框水平線

15、*/</p><p>  putch(0xd9); /*輸出右下角邊框┛*/</p><p>  對菜單選項的選擇是利用移動光標按回車鍵進行選擇。</p><p>  4.init()初始化</p><p>  單鏈表需要一個頭指針來指向表的第一個結點,對單鏈表的訪問是從頭指針開始的。初始化單鏈表為空,用NULL表示,該值在頭文件stdio

16、.h中定義為常數(shù)0。</p><p>  5.create()創(chuàng)建鏈表</p><p>  當用戶選擇輸入增加記錄后,進入該函數(shù),輸入學生信息,并把信息加入鏈表。在輸入過程中,有相關提示,如學號是十位,格式為字符型。同時對某些信息作了限定,如輸入分數(shù)(0—100) ,若輸入分數(shù)不在這個范圍內,則系統(tǒng) 提示重新輸入,但是要求輸入分數(shù)輸入了非數(shù)字的代碼,如“Z”,則會出現(xiàn)死循環(huán)。因此在輸入基本

17、信息時,若要返回主菜單,請在“enter no:”時輸入‘*’以便返回主菜單。當輸入結束后,系統(tǒng)自動計算該生的總分和平均分,并將名次置0,待排序結束后賦予新值。數(shù)據(jù)輸入結束后返回鏈表的頭指針到方函數(shù)。</p><p>  在生成鏈表時,每次新輸入的結點放在表頭,這樣最先輸入的結點存放在最后。</p><p>  6.delete()刪除結點</p><p>  刪除

18、指定學號的學生記錄。輸入要刪除的結點的學號,根據(jù)學號順序查找結點,如果沒找到,則輸出沒有找到的信息;否則顯示找到的結點信息。如果刪除的是頭結點,則修改頭指針,將該結點的前趨指針指向其后繼結點,然后釋放該結點。</p><p>  7.append()追加記錄到文件尾</p><p>  當想要在文件尾增加一條記錄時使用該函數(shù),首先輸入新結點信息,然后輸入要追加的文件名,按追加方式打開文件,

19、將新信息寫入文件。</p><p>  8.insert()插入結點</p><p>  在指定結點前面插入新結點,申請空間得到指針info,輸入新結點信息,存放info中,設鏈表頭指針為h,p為指定結點的指針,q為p的前趨指針。從頭結點開始循環(huán)移動指針p查找指定結點,查找和插入時分兩種情況處理:</p><p>  1).指針p為空,如果p等于h,說明鏈表為空,則

20、新結點即為頭結點,修改指針h=info。否則,說明表中沒有指定結點,則新結點插入在表尾部,此是q把指的結點是最后一個結點,所以修改指針q->next=info。</p><p>  2).指針p不為空,如果p等于h,說明新結點插入在當前第一個結點之前,為新的頭結點,修改指針info->next=p,h=info。否則,說明新結點的位置應在q和p兩個結點之間,修改指針info->next=p,q-

21、>next=info。</p><p>  9.print()顯示所有記錄</p><p>  采用順序訪問的方法顯示和查找記錄,定義一個指向結點的臨時變量p,初值為單鏈表的頭指針,輸出指針所記錄的數(shù)據(jù)后,將指針后移一個記錄,直到p指針值為空,則所有記錄輸出完畢。</p><p>  10.search()查找結點</p><p>  

22、按照 姓名 來查找記錄。從頭結點開始順序查找, 若沒有相同記錄顯示沒有,遇到 一個匹配的記錄則顯示此記錄, 后到尾結點結束。</p><p>  11.save()保存記錄到文件</p><p>  將學生信息保存到指定的文件中。按照文件讀寫要求,先定義一個指向文件的指針,輸入要保存的磁盤文件名,如果輸入的是絕對路徑,則文件保存到指定的位置;如果只要文件名,則文件保存在TC默認的路徑。如果

23、文件打不開,則退出程序,否則選擇一種寫文件方式,打開文件。如果文件打不開,則退出程序,否則選擇一種寫文件方式,從鏈表的頭指針</p><p>  開始,順序將記錄寫入文件,直到所有記錄寫完,標志就是移動指針為空。</p><p>  12.load()從文件中加載記錄</p><p>  按照文件讀寫要求,先定義一個指向文件的指針,輸入要讀入數(shù)據(jù)的磁盤文件名,然后確

24、定文件的打開方式。如果文件打不開,則退出函數(shù),否則選擇一種讀文件方式,從文件頭開始,將記錄讀入內存,直到文件尾。文件打開方式和讀入方式的確定要依據(jù)輸出文件的打開方式和寫入方式,以名數(shù)據(jù)讀入錯誤。如果輸出文件是二進制文件,塊寫操作,讀入也應設置為二進制打開方式,塊讀取方式。每讀入一條記錄,都要做好指針鏈接關系,本函數(shù)將新結點鏈接到當前鏈表的尾部,鏈表的順序和文件保存的順序一致。</p><p>  13.copy(

25、)備份文件</p><p>  將文件讀寫功能結合到一起,先輸入源文件名,再輸入目標文件名,然后利用文件讀寫函數(shù)將源文件中的信息寫到目標文件中,以達到備份文件的目的。</p><p>  14.computer()計算所有學生課程的總成績成績和總平均成績</p><p>  15.sort()排序</p><p>  本函數(shù)實現(xiàn)按總分排序的功

26、能。在算法上,選擇直接插入算法,即:每步將一個待排序的按其排序碼值的大小插到前面已經排好序的表中,直到全部插入為止。先將鏈表的頭結點看作是已經排好序的結點,然后取下一個結點作為待排序的結點,插入到已排好序的表中。其具體做法為:</p><p>  (1).先將原表頭結點作為新排好序表的頭結點h,原表下一個結點作為原表頭結點h1。</p><p>  (2).原表頭結點為待排序結點,將其總分

27、與新表結點的總分進行比較,如果待排序結點總分大,則插在表頭,否則插入在其后,原表頭結點后移一位。</p><p>  (3).重復第二步,即將原表頭結點的總分和新表結點的總分進行比較,如果待排序結點總分小,則移動新表指針,直到找到合適的位置將其插入。當原表為空時,所有結點排序完畢。</p><p>  排好序后,系統(tǒng)自動將名次數(shù)據(jù)寫入結點數(shù)據(jù)域的order中。</p><

28、;p>  16.index()索引</p><p>  定義臨時指針后,將原表的頭指針所指的下一個結點作頭指針,再使第一個結點定為新表的頭結點。當原表不為空時,進行排序。</p><p>  17.total()分類合計</p><p>  追加班別信息,對各班的總成績和總平均成績進行統(tǒng)計并顯示。</p><p>  18.exit(

29、)退出程序</p><p>  19.auther()版本信息</p><p>  顯示與本系統(tǒng)相關的信息。</p><p><b>  六.結果</b></p><p><b>  歡迎界面</b></p><p><b>  主菜單</b></

30、p><p><b>  輸入界面</b></p><p><b>  刪除界面</b></p><p><b>  顯示界面</b></p><p><b>  搜索界面</b></p><p><b>  加載界面</

31、b></p><p><b>  統(tǒng)計界面</b></p><p><b>  版本界面</b></p><p><b>  七.心得體會</b></p><p>  在本次課程設計中,先使用結構化分析方法對系統(tǒng)進行分析,將整個系統(tǒng)細分為幾個模塊,再針對每個小模塊編寫代碼

32、。通過本次課程設計的學習,學會了很多東西,了解了開發(fā)一個系統(tǒng)的一些步驟。盡管大部分都參考權威書籍的代碼,但是在編寫代碼過程中還是加深了對鏈表的了解程度。開發(fā)工具用的是WIN-TC ,而目前用得比較多的應用程序的開發(fā)系統(tǒng)都是可視化的集成開發(fā)環(huán)境,比如Visual C++等,但是在底層開發(fā)比如硬件驅動程序的開發(fā)上,直接寫出優(yōu)秀的源代碼還是一個程序員必須掌握的。所以 ,作為計算機軟件專業(yè)的學生,我們都應該努力去做好!</p>

33、<p><b>  源代碼</b></p><p>  /*11.3.2 源程序*/</p><p>  /***********xue sheng guan li xi tong.c***********/</p><p>  /******頭文件(.h)***********/</p><p>  #inc

34、lude "stdio.h" /*I/O函數(shù)*/</p><p>  # include "bios.h" /*ROM基本輸入輸出函數(shù)*/</p><p>  #include "stdlib.h" /*其它說明*/</p><p>  #include "dos.h"

35、 /*dos接口函數(shù)*/</p><p>  #include "string.h" /*字符串函數(shù)*/</p><p>  #include "conio.h" /*屏幕操作函數(shù)*/</p><p>  #include "mem.h" /*內存操作函數(shù)*/</p><p&

36、gt;  #include "ctype.h" /*字符操作函數(shù)*/</p><p>  #include "alloc.h" /*動態(tài)地址分配函數(shù)*/</p><p>  #define N 3 /*定義常數(shù)*/</p><p>  typedef struct z1 /*定義數(shù)據(jù)結構*/</p

37、><p><b>  {</b></p><p>  char no[11];</p><p>  char name[15];</p><p>  int score[N];</p><p>  float sum;</p><p>  float average;</

38、p><p>  int order;</p><p>  struct z1 *next;</p><p><b>  }STUDENT;</b></p><p>  /*以下是函數(shù)原型*/</p><p>  STUDENT *init(); /*初始化函數(shù)*/</p>&

39、lt;p>  STUDENT *create(); /*創(chuàng)建鏈表*/</p><p>  STUDENT *delete(STUDENT *h); /*刪除記錄*/</p><p>  void print(STUDENT *h); /* 顯示所有記錄*/</p><p>  void search(STUDENT *h); /*查找*/&l

40、t;/p><p>  void save(STUDENT *h); /*保存*/</p><p>  STUDENT *load(); /*讀入記錄*/</p><p>  void computer(STUDENT *h); /*計算總分和平均分*/</p><p>  STUDENT *insert(STUDENT *

41、h); /*插入記錄*/</p><p>  void append(); /*追加記錄*/</p><p>  void copy(); /*復制文件*/</p><p>  STUDENT *sort(STUDENT *h); /*排序*/</p><p>  STUDENT *ind

42、ex(STUDENT *h); /*索引*/</p><p>  void auther(); /*版本信息*/ </p><p>  void total(STUDENT *h); /*分類合計*/</p><p>  int menu_select(); /*菜單函數(shù)*/</p><p>

43、  /******主函數(shù)開始*******/</p><p><b>  main()</b></p><p><b>  {</b></p><p><b>  int i;</b></p><p>  STUDENT *head; /*鏈表定義頭指針*/</p

44、><p>  head=init(); /*初始化鏈表*/</p><p>  printf("\n\n\n\n\n\n\n\n\n");</p><p>  printf("\t\t \4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\

45、4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");</p><p>  printf("\t\t \6 Welcome to the students-score System! \6 \n");</p><p>  printf("\t\t \6 ---Chen Tian Lin---

46、 \6 \n");</p><p>  printf("\t\t \4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\4\n");</p><p>  for(;;) /*無限循環(huán)*/&

47、lt;/p><p><b>  {</b></p><p>  switch(menu_select()) /*調用主菜單函數(shù),返回值整數(shù)作開關語句的條件*/</p><p>  { /*值不同,執(zhí)行的函數(shù)不同,break 不能省略*/</p><p>  case 0:hea

48、d=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程序結束*/</p&

52、gt;<p>  case 15:auther(); /*版本信息*/</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*菜單函數(shù),返回值為整數(shù)*/</p&

53、gt;<p>  menu_select()</p><p><b>  {</b></p><p>  char *f[]={"\2\2\1\1\1\1\1\1\1\1\1 SCORES MENU \1\1\1\1\1\1\1\1\1\2\2", /*定義菜單字符串數(shù)組*/</p><p>  "

54、 0. init list ", /*初始化*/</p><p>  " 1. Enter list ", /*輸入記錄*/</p><p>  " 2. Delete a record from list ", /*從表中刪除記錄*/</p><p>  " 3. print

55、 list ", /*顯示單鏈表中所有記錄*/</p><p>  " 4. Search record on name ", /*按照姓名查找記錄*/</p><p>  " 5. Save the file ", /*將單鏈表中記錄保存到文件中*/</

56、p><p>  " 6. Load the file ", /*從文件中讀入記錄*/</p><p>  " 7. computer the score", /*計算所有學生的總分和均分*/</p><p>  " 8. insert record to list

57、", /*插入記錄到表中*/</p><p>  " 9. copy the file to new file", /*復制文件*/</p><p>  "10. sort to make new file", /*排序*/</p><p>  "11. append record to fi

58、le", /*追加記錄到文件中*/</p><p>  "12. index on nomber", /*索引*/</p><p>  "13. total on nomber", /*分類合計*/</p><p>  "14. Quit " ,

59、 /*退出*/</p><p>  "15. auther ", /*版本信息*/</p><p>  "\5\3\5 Enter the * to return when need ! \5\3\5",</p><p><b>  };</b></p><p>  ch

60、ar s[80]; /*以字符形式保存選擇號*/</p><p><b>  int i;</b></p><p>  int key=0; /*記錄所壓鍵值*/</p><p><b>  int c=0;</b></p><p>  gotoxy(25,25); /*移動光標*/<

61、/p><p>  printf("press any key enter menu......\n");/*壓任意鍵進入主菜單*/</p><p><b>  getch();</b></p><p>  clrscr(); /*清屏*/</p><p>  textcolor(YELLOW ); /*

62、設置文本顏色為黃色*/</p><p>  textbackground(BLUE ); /*設置背景顏色為藍色*/</p><p>  gotoxy(10,2);</p><p>  putch(0xda); /*輸出左上角邊框┏*/</p><p>  for(i=1;i<53;i++)</p><p> 

63、 putch(0xc4); /*輸出上邊框水平線*/</p><p>  putch(0xbf); /*輸出右上角邊框 ┓*/</p><p>  for(i=3;i<22;i++)/*輸出左右兩邊的垂直線*/</p><p><b>  {</b></p><p>  gotoxy(10,i);putch(0x

64、b3);</p><p>  gotoxy(63,i);putch(0xb3);</p><p><b>  }</b></p><p>  gotoxy(10,22);putch(0xc0); /*輸出左下角邊框┗*/</p><p>  for(i=1;i<53;i++)</p><p>

65、;  putch(0xc4); /*輸出下邊框水平線*/</p><p>  putch(0xd9); /*輸出右下角邊框┛*/</p><p>  window(11,3,62,21); /* 制作顯示菜單的窗口,大小根據(jù)菜單條數(shù)設計*/</p><p>  clrscr(); /*清屏*/</p><p>  for(i=0;i&

66、lt;18;i++)</p><p><b>  {</b></p><p>  gotoxy(10,i+1);</p><p>  cprintf("%s",f[i]); /*輸出菜單項數(shù)組*/</p><p><b>  }</b></p><p>&

67、lt;b>  i=1;</b></p><p>  gotoxy(10,2); /*設置默認選項在第一項*/</p><p>  textbackground(BLINK );/*設置背景顏色為淺綠*/</p><p>  cprintf("%s",f[1]); /*輸出菜單項,表示選中*/</p><p

68、>  gotoxy(10,2); /*移動光標到菜單的第一項*/</p><p>  while(key!=13) /*所壓鍵不是回車鍵時*/</p><p><b>  {</b></p><p>  while(bioskey(1)==0); /*查詢是否壓下了一個鍵*/</p><p>  key=b

69、ioskey(0); /*返回下一個在鍵盤壓下的鍵*/</p><p>  key=key&0xff?key&0xff:key>>8; /*對所壓的鍵進行判斷*/</p><p>  gotoxy(10,i+1);</p><p>  textbackground(BLUE);/*設置背景顏色為藍色*/</p><

70、p>  cprintf("%s",f[i]); /*輸出菜單項*/</p><p>  if(key==72) i=i==1?16:i-1; /*如壓向上光標鍵↑,i減1,如已到第一行再上移,則到最后一行*/</p><p>  if(key==80)i=i==16?1:i+1; /*如壓向下光標鍵↓,i加1,如已到最后一行再下移,則到第一行*/</p&g

71、t;<p>  gotoxy(10,i+1); /*光標移動i的下一項*/</p><p>  textbackground(LIGHTRED); /*將背景顏色設為淺紅*/</p><p>  cprintf("%s",f[i]); /*輸出菜單項*/</p><p>  c=i-1; /*給代表菜單選項的整數(shù)賦值*/<

72、/p><p><b>  }</b></p><p>  textbackground(CYAN ); /*設置背景顏色為青色*/</p><p>  window(1,1,80,25); /*恢復原窗口大小*/</p><p>  return c; /*返回代表菜單選項的整數(shù)值*/</p><p

73、><b>  }</b></p><p>  STUDENT *init()</p><p>  { return NULL;}</p><p><b>  /*1創(chuàng)建鏈表*/</b></p><p>  STUDENT *create()</p><p><b&

74、gt;  {</b></p><p>  int i; int s;</p><p>  STUDENT *h=NULL,*info; /* STUDENT指向結構體的指針*/</p><p><b>  for(;;)</b></p><p><b>  {</b></p>

75、;<p>  info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/</p><p>  if(!info) /*如果指針info為空*/</p><p><b>  {</b></p><p>  printf("\nout of memory"); /*

76、輸出內存溢出*/</p><p>  return NULL; /*返回空指針*/</p><p><b>  }</b></p><p>  inputs("enter no:",info->no,11); /*輸入學號并校驗*/</p><p>  if(info-&

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

78、*/</p><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&

79、gt;  printf("score%d:",i+1); /*提示輸入第幾門課程*/</p><p>  scanf("%d",&info->score[i]); /*輸入成績*/</p><p>  if(info->score[i]>100||info->score[i]<0) /*確保成績在0~

80、100之間*/</p><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]; /*累加

81、各門課程成績*/</p><p><b>  }</b></p><p>  info->sum=s; /*將總分保存*/</p><p>  info->average=(float)s/N; /*求出平均值*/</p><p>  info->order=0; /*未排序前此值為0*/

82、</p><p>  info->next=h; /*將頭結點做為新輸入結點的后繼結點*/</p><p>  h=info; /*新輸入結點為新的頭結點*/</p><p><b>  }</b></p><p>  return(h); /*返回頭指針*/</p><p>

83、<b>  }</b></p><p>  /*2輸入字符串,并進行長度驗證*/</p><p>  inputs(char *prompt, char *s, int count)</p><p><b>  {</b></p><p>  char p[255];</p><

84、p>  clrscr(); /*清屏*/</p><p>  do{printf("No. name yu wen shu xue ying yu /Enter the * to return when need\n");</p><p>  printf(prompt); /*顯示提示信息*/</p><p>  scanf

85、("%s",p); /*輸入字符串*/</p><p>  if(strlen(p)>count)printf("\n too long! \n"); /*進行長度校驗,超過count值重輸入*/</p><p>  }while(strlen(p)>count);</p><p>  strcpy(s,p);

86、/*將輸入的字符串拷貝到字符串s中*/</p><p><b>  }</b></p><p>  /*3輸出鏈表中結點信息*/</p><p>  void print(STUDENT *h)</p><p><b>  {</b></p><p>  int i=0;

87、 /* 統(tǒng)計記錄條數(shù)*/</p><p>  STUDENT *p; /*移動指針*/</p><p>  clrscr(); /*清屏*/</p><p>  p=h; /*初值為頭指針*/</p><p>  printf("\n\n\n***************************STUDENT

88、 SCORES**************************************\n");</p><p>  printf("| rec|nO | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p>  printf("|---

89、-|----------|---------------|------|-------|-------|--------|-------|-----|\n");</p><p>  while(p!=NULL)</p><p><b>  {</b></p><p><b>  i++;</b></p>

90、;<p>  printf("|%3d |%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],</p><p>  p->score[2],p->sum,p->average,p->order);<

91、;/p><p>  p=p->next;</p><p><b>  }</b></p><p>  printf("**********************************end******************************************\n");</p><p&g

92、t;<b>  }</b></p><p><b>  /*4刪除記錄*/</b></p><p>  STUDENT *delete(STUDENT *h)</p><p><b>  {</b></p><p>  STUDENT *p,*q; /*p為查找到要刪除的結點

93、指針,q為其前驅指針*/</p><p>  char s[11]; /*存放學號*/</p><p>  clrscr(); /*清屏*/</p><p>  printf("please deleted no \n"); /*顯示提示信息*/</p><p>  scanf("

94、%s",s); /*輸入要刪除記錄的學號*/</p><p>  q=p=h; /*給q和p賦初值頭指針*/</p><p>  while(strcmp(p->no,s)&&p!=NULL) /*當記錄的學號不是要找的,或指針不為空時*/</p><p><b>  {</b></p>

95、<p>  q=p; /*將p指針值賦給q作為p的前驅指針*/</p><p>  p=p->next; /*將p指針指向下一條記錄*/</p><p><b>  }</b></p><p>  if(p==NULL) /*如果p為空,說明鏈表中沒有該結點*/</p><p

96、>  printf("\nlist no %s student\n",s);</p><p>  else /*p不為空,顯示找到的記錄信息*/</p><p><b>  {</b></p><p>  printf("*****************************have foun

97、d***********************************\n");</p><p>  printf("|no | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p>  printf("|----------|------

98、---------|------|-------|-------|--------|-------|-----|\n");</p><p>  printf("|%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", p->no,</p><p>  p->name,p->score[0],p-&

99、gt;score[1],p->score[2],p->sum,</p><p>  p->average,p->order);</p><p>  printf("********************************end***************************************\n");</p>&

100、lt;p>  getch(); /*壓任一鍵后,開始刪除*/</p><p>  if(p==h) /*如果p==h,說明被刪結點是頭結點*/</p><p>  h=p->next; /*修改頭指針指向下一條記錄*/</p><p><b>  else</b></p><p>  

101、q->next=p->next; /*不是頭指針,將p的后繼結點作為q的后繼結點*/</p><p>  free(p); /*釋放p所指結點空間*/</p><p>  printf("\n have deleted No %s student\n",s);</p><p>  printf("Don&#

102、39;t forget save\n");/*提示刪除后不要忘記保存文件*/</p><p><b>  }</b></p><p>  return(h); /*返回頭指針*/</p><p><b>  }</b></p><p><b>  /*5查找記錄*/&l

103、t;/b></p><p>  void search(STUDENT *h)</p><p><b>  {</b></p><p>  STUDENT *p; /* 移動指針*/</p><p>  char s[15]; /*存放姓名的字符數(shù)組*/</p><p>  c

104、lrscr(); /*清屏幕*/</p><p>  printf("please enter name for search\n");</p><p>  scanf("%s",s); /*輸入姓名*/</p><p>  p=h; /*將頭指針賦給p*/</p><p>  whi

105、le(strcmp(p->name,s)&&p!=NULL) /*當記錄的姓名不是要找的,或指針不為空時*/</p><p>  p=p->next; /*移動指針,指向下一結點*/</p><p>  if(p==NULL) /*如果指針為空*/</p><p>  printf("\nlist no

106、 %s student\n",s); /*顯示沒有該學生*/</p><p>  else /*顯示找到的記錄信息*/</p><p><b>  {</b></p><p>  printf("\n\n*****************************havefound***********

107、*************************\n");</p><p>  printf("|nO | name |yu wen|shu xue|ying yu| sum | ave |order|\n");</p><p>  printf("|----------|---------------|-

108、-----|-------|-------|--------|-------|-----|\n");</p><p>  printf("|%-10s|%-15s|%6d|%7d|%7d| %4.2f | %4.2f | %3d |\n", p->no,</p><p>  p->name,p->score[0],p->score[1]

109、,p->score[2],p->sum,p->average,p->order);</p><p>  printf("********************************end***************************************\n");</p><p><b>  }</b><

110、/p><p><b>  }</b></p><p><b>  /*6插入記錄*/</b></p><p>  STUDENT *insert(STUDENT *h)</p><p><b>  {</b></p><p>  STUDENT *p,*q

111、,*info; /*p指向插入位置,q是其前驅,info指新插入記錄*/</p><p>  char s[11]; /*保存插入點位置的學號*/</p><p><b>  int s1,i;</b></p><p>  clrscr(); /*清屏幕*/</p><p>  printf("pleas

112、e enter location before the no /Enter the * to return when need\n");</p><p>  scanf("%s",s); /*輸入插入點學號*/</p><p>  printf("\nplease new record\n"); /*提示輸入記錄信息*/&l

113、t;/p><p>  info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/</p><p><b>  if(!info)</b></p><p><b>  {</b></p><p>  printf("\nout of memory&qu

114、ot;); /*如沒有申請到,內存溢出*/</p><p>  return NULL; /*返回空指針*/</p><p><b>  }</b></p><p>  inputs("enter no:",info->no,11); /*輸入學號*/</p><p>

115、;  inputs("enter name:",info->name,15); /*輸入姓名*/</p><p>  printf("please input %d score \n",N); /*提示輸入分數(shù)*/</p><p>  s1=0; /*保存新記錄的總分,初值為0*/</p><p>  for(i

116、=0;i<N;i++) /*N門課程循環(huán)N次輸入成績*/</p><p><b>  {</b></p><p>  do{ /*對數(shù)據(jù)進行驗證,保證在0~100之間*/</p><p>  printf("score%d:",i+1);</p><p>  scanf(&q

117、uot;%d",&info->score[i]);</p><p>  if(info->score[i]>100||info->score[i]<0)</p><p>  printf("bad data,repeat input\n");</p><p>  }while(info->sc

118、ore[i]>100||info->score[i]<0);</p><p>  s1=s1+info->score[i]; /*計算總分*/</p><p><b>  }</b></p><p>  info->sum=s1; /*將總分存入新記錄中*/</p><p>  

119、info->average=(float)s1/N; /*計算均分*/</p><p>  info->order=0; /*名次賦值0*/</p><p>  info->next=NULL; /*設后繼指針為空*/</p><p>  p=h; /*將指針賦值給p*/</p>

120、<p>  q=h; /*將指針賦值給q*/</p><p>  while(strcmp(p->no,s)&&p!=NULL) /*查找插入位置*/</p><p><b>  {</b></p><p>  q=p; /*保存指針p,作為下一個p的

121、前驅*/</p><p>  p=p->next; /*將指針p后移*/</p><p><b>  }</b></p><p>  if(p==NULL) /*如果p指針為空,說明沒有指定結點*/</p><p>  if(p==h) /*同時p等于h,說明鏈表為空*/<

122、;/p><p>  h=info; /*新記錄則為頭結點*/</p><p><b>  else</b></p><p>  q->next=info; /*p為空,但p不等于h,將新結點插在表尾*/</p><p><b>  else</b></p><p> 

123、 if(p==h) /*p不為空,則找到了指定結點*/</p><p><b>  {</b></p><p>  info->next=p; /*如果p等于h,則新結點插入在第一個結點之前*/</p><p>  h=info; /*新結點為新的頭結點*/</p><p><b>  }&

124、lt;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  info->next=p; /*不是頭結點,則是中間某個位置,新結點的后繼為p*/</p><p>  q->next=info; /*新結點作為q的后繼結

125、點*/</p><p><b>  }</b></p><p>  printf("\n ----have inserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存盤*/</p>

126、<p>  return(h); /*返回頭指針*/</p><p><b>  }</b></p><p>  /*7保存數(shù)據(jù)到文件*/</p><p>  void save(STUDENT *h)</p><p><b>  {</b></p><

127、p>  FILE *fp; /*定義指向文件的指針*/</p><p>  STUDENT *p; /* 定義移動指針*/</p><p>  char outfile[10]; /*保存輸出文件名*/</p><p>  clrscr(); /*清屏*/</p><p>  printf(

128、"Enter outfile name,for example c:\\f1\\te.txt: /Enter the * to return when need \n"); /*提示文件名格式信息*/</p><p>  scanf("%s",outfile);</p><p>  if((fp=fopen(outfile,"wb"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論