數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----學(xué)生成績管理系統(tǒng)_第1頁
已閱讀1頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p>  課 程 設(shè) 計 報 告</p><p><b>  學(xué)生成績管理系統(tǒng)</b></p><p>  學(xué) 院: 信 息 與 工 程 學(xué) 院 </p><p>  專 業(yè): 計算機科學(xué)與技術(shù) </p>

2、<p><b>  目 錄</b></p><p><b>  第一章 需求分析</b></p><p>  1.1課程設(shè)計題目及要求</p><p>  1.2課程設(shè)計思想及開發(fā)環(huán)境</p><p><b>  第二章 概要設(shè)計</b></p>&

3、lt;p><b>  2.1 總體方案</b></p><p>  2.2 模板功能分析及其外部設(shè)計</p><p>  2.3 主要數(shù)據(jù)結(jié)構(gòu)</p><p><b>  第三章 詳細(xì)設(shè)計</b></p><p>  第四章 調(diào)試與操作說明</p><p><b&

4、gt;  4.1主要模板調(diào)試</b></p><p>  4.2 系統(tǒng)缺陷及原因</p><p>  第五章 課程設(shè)計總結(jié)與體會</p><p><b>  第六章 參考文獻(xiàn)</b></p><p><b>  第一章 需求分析</b></p><p>  1.1

5、課程設(shè)計題目及要求</p><p>  題目:學(xué)生成績管理系統(tǒng)</p><p><b>  學(xué)生成績表:</b></p><p><b>  要求如下:</b></p><p>  1) 實現(xiàn)對兩個文件數(shù)據(jù)進行合并,生成新文件3.txt</p><p>  2)&#

6、160;抽取出三科成績中有補考的學(xué)生并保存在一個新文件4.txt</p><p>  3) 對合并后的文件3.txt中的數(shù)據(jù)按總分降序排序(至少采用兩種排序方法實現(xiàn))</p><p>  4) 輸入一個學(xué)生姓名后,能查找到此學(xué)生的信息并輸出結(jié)果(至少采用兩種查找方法實現(xiàn))</p><p>  5) 要求使用結(jié)構(gòu)體,鏈或數(shù)組等實現(xiàn)上述要求

7、.</p><p>  1.2課程設(shè)計思想及開發(fā)環(huán)境</p><p>  設(shè)計思想:本課題的實質(zhì)是完成對學(xué)生成績表的合并、提取、排序、查詢等功能,可以首先定義項目的數(shù)據(jù)結(jié)構(gòu),然后將每個功能寫成一個函數(shù)來完成對數(shù)據(jù)的操作,最后完成主函數(shù)以驗證各個函數(shù)功能并得出運行結(jié)果。可將此系統(tǒng)分為如下模塊,合并兩個信息表、從表中提取信息、降序排序模塊、按條件進行查詢、退出系統(tǒng)。</p>&l

8、t;p><b>  編寫語言: C語言</b></p><p>  開發(fā)工具: Visual C++ 6.0</p><p>  VC++是微軟公司開發(fā)的一個IDE(集成開發(fā)環(huán)境)。學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等的知識, VC基于C,C++語言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級,和低

9、級語言的雙重性,功能強大,靈活,執(zhí)行效率高,幾乎可說VC在 Windows平臺無所不能。 最大缺點是開發(fā)效率不高。</p><p><b>  第二章概要設(shè)計</b></p><p><b>  2.1 總體方案</b></p><p>  2.2 模板功能分析及其外部設(shè)計</p><p>  合并

10、兩個信息主要是將兩個成績表中的成績信息先讀取,然后寫進新的</p><p>  文本中,從而建立一個新的成績表;提取信息主要是在合并信息之后所得文本中,按要求提取出所需信息,并寫進新的文本中;降序排序主要用兩種方法進行降序排序,分別為冒泡排序和快速排序;查詢信息主要是按條件輸入信息,根據(jù)信息在文本中查詢所對應(yīng)的信息并輸出結(jié)果。</p><p>  程序的外部設(shè)計主要是通過寫一個功能菜單來實

11、現(xiàn)每個功能模板的調(diào)用,從而更好的協(xié)調(diào)各個功能之間的關(guān)系和使用。</p><p>  2.3 主要數(shù)據(jù)結(jié)構(gòu)</p><p>  學(xué)生數(shù)據(jù)是用鏈表存放的,因為學(xué)生的人數(shù)是不定的,若用一個數(shù)組存放數(shù)據(jù)時,有固定長度限制,若太大則可能導(dǎo)致內(nèi)存浪費,太小就不夠用。而鏈表可動態(tài)分配內(nèi)存,根據(jù)需要而開辟內(nèi)存單元,這是本程序的鏈表數(shù)據(jù)結(jié)構(gòu),相關(guān)學(xué)生需要儲存的信息也如下;</p><p&

12、gt;  typedef struct </p><p>  { char name[8];</p><p>  char id[2];</p><p>  int chinese;</p><p>  int math;</p><p>  int english;</p><p>&l

13、t;b>  int sum;</b></p><p><b>  };student</b></p><p><b>  第三章 詳細(xì)設(shè)計</b></p><p>  本程序分為合并模板、提取模板、排序模板、查詢模板。在合并兩個信息表是,采用Unitedfile()來實現(xiàn),調(diào)用該函數(shù)打開文件1.txt并讀

14、取,再打開3.txt將從1.txt中讀取的信息寫入,完成后關(guān)閉1.txt;然后打開2.txt讀取,并寫入3.txt,完成后輸出并關(guān)閉兩個文本。</p><p>  void Unitedfile()//合并1.txt和2.txt為3.txt</p><p>  { FILE *fp,*p;</p><p>  Student studd; </p>

15、<p>  fp=fopen("1.txt","r"); /*以讀的方式打開1.txt*/</p><p>  p=fopen("3.txt","w"); /*以寫的方式打開3.txt*/</p><p>  while( fscanf(fp,&q

16、uot;%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english )!=EOF)</p><p><b>  {</b></p><p>  fprintf(p,"%-6s %-6s %-6d %-6d %-6d\n",st

17、udd.name,studd.id,studd.chinese,studd.math,studd.english );</p><p>  printf("%-6s %-6s %-6d %-6d %-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english );</p><p>  }

18、 /*讀取1.txt的數(shù)據(jù)寫入3.txt,繼續(xù)讀取直結(jié)束*/</p><p>  fclose(fp); /*關(guān)閉文件1.txt*/</p><p>  fp=fopen("2.txt","r"); /*以寫的方式打

19、開2.txt*/</p><p>  while( fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chinese,&studd.math,&studd.english )!=EOF)</p><p><b>  {</b></p><p>  fp

20、rintf(p,"%-6s %-6s %-6d %-6d %-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english );</p><p>  printf("%-6s %-6s %-6d %-6d %-6d\n",studd.name,studd.id,studd.chinese,s

21、tudd.math,studd.english );</p><p>  /*輸出文本3.txt中的信息*/</p><p><b>  }</b></p><p>  fclose(fp); /*關(guān)閉文件2.txt*/</p><p>  fclose(p);

22、 /*關(guān)閉文件3.txt*/</p><p><b>  }</b></p><p>  在提取信息模板中,主要是從合成后的3.txt文本中提取,先打開3.txt文本并讀取,再開打4.txt文本并寫入,通過if語句都讀取的信息進行判斷,是否符合,符合的就寫入4.txt文本中,不符合的就跳過,繼續(xù)讀取下一個信息,一次進行,知道文本結(jié)

23、束,輸出文本4.txt的信息,并關(guān)閉兩個文本。</p><p>  void findout() /*提取有補考學(xué)生的信息寫入4.txt中*/</p><p><b>  {</b></p><p>  FILE *fp,*p;</p><p>  Student studd;</p&g

24、t;<p>  fp=fopen("3.txt","r");</p><p>  p=fopen("4.txt","w");</p><p>  while( fscanf(fp,"%s%s%d%d%d",studd.name,studd.id,&studd.chine

25、se,&studd.math,&studd.english )!=EOF)</p><p><b>  {</b></p><p>  if(studd.chinese<60||studd.math<60||studd.english<60)</p><p><b>  {</b><

26、/p><p>  fprintf(p,"%-6s %-6s %-6d %-6d %-6d\n",studd.name,studd.id,studd.chinese,studd.math,studd.english );</p><p>  printf("%-6s %-6s %-6d %-6d %-6d\n",studd.name,stu

27、dd.id,studd.chinese,studd.math,studd.english );</p><p>  /*輸出文本4.txt中的信息*/</p><p><b>  }</b></p><p><b>  }</b></p><p>  fclose(fp);</p>&

28、lt;p>  fclose(p);</p><p><b>  }</b></p><p>  在降序排序模塊中,有兩種排序方法;一種是冒泡排序,一種是快速排序;兩種排序方法都是采用先定義函數(shù)排序方法,然后再后面調(diào)用該函數(shù)進行排順序,在此之前都會將成績信息總分計算出來,然后按總分進行降序排序,然后將排序后的信息寫入到3.txt中,并輸出,最后關(guān)閉文本。</

29、p><p><b>  冒泡排序:</b></p><p>  void Bsort(int R[],int n)</p><p><b>  {</b></p><p>  int t, flag=1; /*當(dāng)flag為0時則停止排序*/</p>

30、<p>  for(int j=1;j<n;i++) </p><p><b>  { </b></p><p><b>  flag=0;</b></p><p>  for(int k=n-1;k>=j;k--)</p><p>  if(R[k]>R[k-1])&

31、lt;/p><p><b>  {</b></p><p><b>  t=R[k];</b></p><p>  R[k]=R[k-1];</p><p>  R[k-1]=t;flag=1;</p><p><b>  }</b></p>

32、<p>  if(flag==0)</p><p><b>  return;</b></p><p><b>  } }</b></p><p>  void maopao()</p><p>  { int i,n;</p><p><b&g

33、t;  FILE *fp;</b></p><p>  fp=fopen("3.txt","r");</p><p><b>  i=0;</b></p><p>  while(fscanf(fp,"%s%s%d%d%d",stud[i].name,stud[i].id,

34、&stud[i].chinese,&stud[i].math,&stud[i].english )!=EOF)</p><p><b>  {</b></p><p>  stud[i].sum=stud[i].english+stud[i].chinese+stud[i].math;</p><p><b>

35、  i++;</b></p><p><b>  }</b></p><p>  fclose(fp);</p><p><b>  n=i-1;</b></p><p>  Bsort(stud,n); /*冒泡排序*/</p><

36、p>  fp=fopen("3.txt","w"); /*將信息寫入3.txt中*/</p><p>  for(int m=0;m<i;m++)</p><p><b>  {</b></p><p>  fprintf(fp,"%-8s %-8s %-8d

37、 %-8d %-8d %-8d\n",stud[m].name,stud[m].id,stud[m].chinese,stud[m].math,stud[m].english,stud[m].sum );</p><p><b>  }</b></p><p>  fclose(fp);</p><p><b>  

38、};</b></p><p><b>  快速排序:</b></p><p>  int Partition(int low,int high)</p><p>  { int pivotkey;</p><p>  Student temp;</p><p>  temp=stu

39、d[low];</p><p>  pivotkey=stud[low].sum;</p><p>  while(low<high)</p><p>  { while(low<high&&stud[high].sum<=pivotkey)--high;</p><p>  stud[low]=stud

40、[high];</p><p>  while(low<high&&stud[low].sum>=pivotkey)++low;</p><p>  stud[high]=stud[low]; }</p><p>  stud[low]=temp;</p><p>  return low;

41、 }</p><p>  void QSort(int low,int high) /*快速排序*/</p><p>  { int privotloc;</p><p>  if(low<high) {</p><p>  privotloc=Partition(low,high);&

42、lt;/p><p>  QSort(low,privotloc-1);</p><p>  QSort(privotloc+1,high); } }</p><p>  void kuaisu() /*讀取文件排序后將結(jié)果寫入3.txt*/</p><p>  { int i,low,high;<

43、;/p><p><b>  FILE *fp;</b></p><p>  fp=fopen("3.txt","r");</p><p><b>  i=0;</b></p><p>  while(fscanf(fp,"%s%s%d%d%d"

44、,stud[i].name,stud[i].id,&stud[i].chinese,&stud[i].math,&stud[i].english )!=EOF)</p><p>  { stud[i].sum=stud[i].english+stud[i].chinese+stud[i].math;</p><p><b>  i++; }<

45、;/b></p><p>  fclose(fp);low=0; high=i-1;</p><p>  QSort(low,high); /*快速排序*/</p><p>  fp=fopen("3.txt","w"); /*將排序后的數(shù)據(jù)寫入3.txt中*/</p&

46、gt;<p>  for(int j=0;j<i;j++)</p><p>  { fprintf(fp,"%-8s %-8s %-8d %-8d %-8d %-8d\n",stud[j].name,stud[j].id,stud[j].chinese,stud[j].math,stud[j].english,stud[j].sum );</p>

47、<p>  }fclose(fp); }</p><p>  在查詢模板中,也存在兩種查詢方式;一種是在排序之后查詢,一種是在排序之前的信息中查詢;兩種方法效果相同,都是輸入一個姓名然后根據(jù)信息在信息表中查找改學(xué)生的信息,并輸出信息。</p><p>  void autofindoutstudent()/</p><p><b> 

48、 {</b></p><p>  int n,flag=0,k;</p><p>  char Name[30];</p><p><b>  n=i-1;</b></p><p>  cin>>Name;</p><p>  for(k=1;k<=n;k++)<

49、;/p><p><b>  {</b></p><p>  if(strcmp(stud[k].name,Name)==0)</p><p><b>  {</b></p><p><b>  flag=1;</b></p><p>  cout<&l

50、t;"-------姓名-------學(xué)號-------語文-------數(shù)學(xué)-------英語-------總分--------"<<endl;</p><p>  cout<<" "<<stud[k].name<<" "<<stud[k].id<<"

51、; ";</p><p>  cout<<stud[k].chinese<<" "<<stud[k].math<<" "<<stud[k].english<<" "<<stud[k].sum<&

52、lt;endl;</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(flag==0)</p><p>  cout<<"無此學(xué)

53、生相關(guān)信息"<<endl;</p><p><b>  }</b></p><p>  要實現(xiàn)各個功能之間的調(diào)用,在主函數(shù)中使用while、if、case等語句進行調(diào)用是各個功能之間串聯(lián)起來,把各個功能看成單個的事件,利用case語句來對各個事件進行選擇;利用printf輸出語句來形成主菜單界面。</p><p>  in

54、t main() </p><p><b>  { </b></p><p>  int choice; </p><p><b>  while(1) </b></p><p><b>  { </b></p><p><b>  /*主菜

55、單*/</b></p><p>  if(sign3==0)</p><p><b>  {</b></p><p>  printf("*******************************************************************************\n");<

56、/p><p>  printf("***************************** 學(xué)生成績管理系統(tǒng) ******************************\n");</p><p>  printf("********************* 1. 合并1和2得3 *************

57、****\n"); </p><p>  printf("********************* 2. 把3中有成績不及格的放入新文件4中 *****************\n"); </p><p>  printf("********************* 3. 把3中成績總分按降序排列 ******

58、***********\n"); </p><p>  printf("********************* 4. 輸入姓名,查找該成績信息并輸出結(jié)果 *****************\n");</p><p>  printf("********************* 5. 退出系統(tǒng)

59、 *****************\n");</p><p>  printf("*******************************************************************************\n");</p><p>  printf("請輸入(1-5)選擇要使用的功能:"); &

60、lt;/p><p><b>  }</b></p><p><b>  sign3=1;</b></p><p>  scanf("%d",&choice);</p><p>  switch(choice) </p><p>  {

61、 </p><p><b>  case 1: </b></p><p>  Unitedfile();</p><p><b>  sign=1;</b></p><p>  cout<<"

62、;1和2合并成功!"<<endl;</p><p>  cout<<"請選擇下一步操作:"<<endl;</p><p><b>  break; </b></p><p><b>  case 2: </b></p><p>  

63、if(sign==0)</p><p><b>  {</b></p><p>  cout<<"請執(zhí)行操作1后再執(zhí)行此項操作!"<<endl;</p><p>  cout<<"請選擇下一步操作:"<<endl;</p><p>&

64、lt;b>  break;</b></p><p><b>  }</b></p><p>  cout<<"4.txt生成成功!"<<endl;;</p><p>  findout();</p><p>  cout<<"請選擇下一步

65、操作:"<<endl;</p><p><b>  break; </b></p><p><b>  case 3:</b></p><p>  if(sign==0)</p><p><b>  {</b></p><p>  

66、cout<<"請執(zhí)行操作1后再執(zhí)行此項操作!"<<endl;</p><p>  cout<<"請選擇下一步操作:"<<endl;</p><p><b>  break;</b></p><p><b>  }</b></p&g

67、t;<p>  sortfile();</p><p>  cout<<"降序排列成功!"<<endl;</p><p>  cout<<"請選擇下一步操作:"<<endl;</p><p><b>  sign1=1;</b></p&g

68、t;<p><b>  break; </b></p><p><b>  case 4:</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  char

69、c;</b></p><p>  findoutstudent();</p><p>  cout<<"繼續(xù)查找或返回主菜單請輸入Y/N:"<<endl;</p><p><b>  cin>>c;</b></p><p>  if(c=='N&

70、#39;||c=='n')break;</p><p><b>  }</b></p><p>  system("cls");</p><p><b>  sign3=0;</b></p><p><b>  break;</b></

71、p><p><b>  case 5:</b></p><p><b>  exit(0);</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  } &

72、lt;/b></p><p><b>  return 0;</b></p><p><b>  } </b></p><p>  第四章 調(diào)試與操作說明</p><p><b>  4.1主要模板調(diào)式</b></p><p><b&g

73、t;  菜單顯示圖:</b></p><p>  合并兩個成績表,選擇菜單1,調(diào)試結(jié)果:</p><p>  提取有成績不及格學(xué)生的信息,選擇功能2,調(diào)試結(jié)果:</p><p>  降序排序,將3.txt中學(xué)生成績總分計算出,選擇功能1和功能2,調(diào)試結(jié)果一樣:</p><p><b>  選擇1時:</b>&

74、lt;/p><p><b>  選擇2時:</b></p><p>  排序后,進行查詢功能,都是輸入姓名查找,選擇功能1和功能2,調(diào)試完成后,如果還要繼續(xù)查詢選擇Y,不查詢選擇N退到主菜單:</p><p><b>  選擇1:</b></p><p><b>  選擇2時:</b&g

75、t;</p><p><b>  選擇Y繼續(xù)查詢時:</b></p><p><b>  不查詢退到主菜單。</b></p><p>  退出系統(tǒng),選擇5,調(diào)試之后按任意鍵關(guān)閉界面:</p><p>  4.2 系統(tǒng)缺陷及原因</p><p>  缺陷:該系統(tǒng)功能存在一些缺陷

76、,在第一步到第二步過程中,沒有對成績的總分進行計算,所以在第三部排序時,用第一種方法排序過后,再用第二種繼續(xù)排一次,查看輸出結(jié)構(gòu),在結(jié)果中出現(xiàn)亂碼現(xiàn)像。</p><p>  原因:因為在排序過程中讀取信息的順序是按照沒用總分的樣子讀取,當(dāng)排序過后,成績總分計算出來了,在繼續(xù)第二次排序,讀取存在總分的信息表使得之前都去順序方法變得混亂,有些讀取信息與定義的類型發(fā)生沖突,導(dǎo)致出現(xiàn)亂碼。</p><

77、p>  第五章課程設(shè)計總結(jié)與體會</p><p>  本系統(tǒng)設(shè)計是為了合并兩個信息表,然后對信息表進行排序,從信息中查詢信息。</p><p>  由于C語言學(xué)的不扎實,編程時遇到了很多困難,翻了很久的資料才完成,開始調(diào)試的時候經(jīng)常出現(xiàn)很多的錯誤,經(jīng)常容易煩躁,但是經(jīng)過一段的時間的鍛煉使得我更有信息和勇氣去面對困難,并一步一步的解決困難。當(dāng)整個程序開始運行的時候,是非常有成就感的。整

78、個程序還有很多不足的地方。在程序設(shè)計方面,逐漸感覺到模塊化設(shè)計的重要性,應(yīng)該分析出功能塊,然后對其細(xì)節(jié)中的共性和特性作分析。</p><p>  這次的設(shè)計,讓我大大地感覺到,對于程序設(shè)計中,對語言再熟悉也比不過在設(shè)計中算法和結(jié)構(gòu)分析的真知灼見。當(dāng)然,成功的程序設(shè)計是要建立在熟悉語言的基礎(chǔ)之上的。平時語言的基本功要扎實。而每一次程序設(shè)計的經(jīng)營能大大地增加對語言的熟悉和感知。程序設(shè)計的技能來自多方面,每一次的親自實

79、踐、思考揣摩、刨根問底就會讓自己更加清楚所欠缺的是什么。所以,現(xiàn)在覺得在設(shè)計實踐中作為參考的書冊閱讀和研究遠(yuǎn)遠(yuǎn)比過單純的閱讀,因為它是在最緊迫的時間上填補自己最緊迫的不足。 </p><p><b>  第六章參考文獻(xiàn)</b></p><p>  譚浩強 《C程序設(shè)計(第三版)》,北京:清華大學(xué)出版社</p><p>  李根強 《數(shù)據(jù)結(jié)構(gòu)(C

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論