數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---停車場管理_第1頁
已閱讀1頁,還剩57頁未讀, 繼續(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>  第1章 停車場管理問題- 1 -</p><p>  1.1 問題描述- 1 -</p><p>  1.2 需求分析- 1 -</p><p>  1.3 概要設(shè)計(jì)- 2 -</p><p>  1.3.1 棧的抽象數(shù)據(jù)

2、類型的定義- 2 -</p><p>  1.3.2 隊(duì)列的抽象數(shù)據(jù)類型的定義- 2 -</p><p>  1.3.3 程序模塊- 3 -</p><p>  1.4 詳細(xì)設(shè)計(jì)- 4 -</p><p>  1.4.1 主要函數(shù)思想- 4 -</p><p>  1.4.2 時(shí)間結(jié)點(diǎn)類型- 4 -<

3、/p><p>  1.4.3 車輛進(jìn)出站信息類型- 4 -</p><p>  1.4.4 停車場和便道信息類型- 4 -</p><p>  1.4.5 主函數(shù)和其它函數(shù)的偽碼算法- 5 -</p><p>  1.5 調(diào)試分析- 6 -</p><p>  1.5.1 程序改進(jìn)- 6 -</p>

4、<p>  1.5.2 測試結(jié)果- 6 -</p><p>  1.6 課設(shè)總結(jié)- 8 -</p><p>  第2章 運(yùn)動(dòng)會分?jǐn)?shù)統(tǒng)計(jì)問題- 9 -</p><p>  2.1 問題描述- 9 -</p><p>  2.2 需求分析- 9 -</p><p>  2.3 概要設(shè)計(jì)- 9 -&l

5、t;/p><p>  2.3.1 流程圖- 9 -</p><p>  2.3.2 程序功能說明- 10 -</p><p>  2.3.3 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)- 11 -</p><p>  2.3.4 函數(shù)及變量說明- 11 -</p><p>  2.4 詳細(xì)設(shè)計(jì)- 12 -</p><p&g

6、t;  2.4.1 系統(tǒng)功能模塊- 12 -</p><p>  2.4.2 算法原理- 13 -</p><p>  2.5 調(diào)試分析- 13 -</p><p>  2.5.1 調(diào)試過程中出現(xiàn)的問題及處理方式- 13 -</p><p>  2.5.2 運(yùn)行界面- 15 -</p><p>  2.6 課

7、設(shè)總結(jié)- 19 -</p><p>  參考文獻(xiàn)- 20 -</p><p>  附錄1:停車場管理問題- 21 -</p><p>  附錄2:運(yùn)動(dòng)會分?jǐn)?shù)統(tǒng)計(jì)問題- 33 -</p><p><b>  停車場管理問題</b></p><p><b>  問題描述</b&

8、gt;</p><p>  設(shè)有一個(gè)可以停放n輛汽車的狹長停車場,它只有一個(gè)大門可以供車輛進(jìn)出。車輛按到達(dá)停車場時(shí)間的早晚依次從停車場里面向大門口處停放(最先到大門的第一輛車停在車場的最里面)。如果停車場已放滿n輛車,則后開的車輛只能在停車場大門外的便道上等待,一旦停車場內(nèi)有車走開,則排在便道上的第一輛車就進(jìn)入停車場。停車場內(nèi)如有某兩車要走開,在它之后進(jìn)入停車場的車都必須退出停車場為它讓路,待其開出停車場后,這些

9、車輛再依原來的次序進(jìn)場。每輛車在離開停車場時(shí),都應(yīng)根據(jù)它在停車場內(nèi)停留的時(shí)間的長短交費(fèi)。如果停留在便道上的車未進(jìn)停車場就要離去,允許其離去,不收停車費(fèi),并且仍然保持便道上的車的次序。停車場示意圖如圖1-1所示:</p><p>  圖 1-1停車場示意圖</p><p><b>  需求分析</b></p><p>  根據(jù)車輛到達(dá)停車場,離開

10、停車場時(shí)所停留的時(shí)間進(jìn)行計(jì)時(shí)收費(fèi);</p><p>  當(dāng)有車輛從停車場離開時(shí),等待的車輛按順序進(jìn)入停車場停放,實(shí)現(xiàn)停車場的調(diào)度功能;</p><p>  用順序棧來表示停車場,鏈隊(duì)表示停車場外的便道;</p><p>  顯示停車場信息和便道信息。</p><p><b>  概要設(shè)計(jì)</b></p>&

11、lt;p>  這個(gè)程序的關(guān)鍵是車輛的進(jìn)站和出站操作,以及車場和通道之間的關(guān)系。由于停車場是一個(gè)狹長的,只有一個(gè)通道,先進(jìn)后出,類似數(shù)據(jù)結(jié)構(gòu)中的棧結(jié)構(gòu),所以停車場用棧這種數(shù)據(jù)結(jié)構(gòu)來描述。外面的狹長通道,先進(jìn)先出,所以用隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)來描述。</p><p>  棧的抽象數(shù)據(jù)類型的定義</p><p>  ADT stack{</p><p>  數(shù)據(jù)對象:D=

12、{ai|ai∈charset,i=1,2,……,n,n>=0}</p><p>  數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D,i=2……,n}</p><p><b>  基本操作:</b></p><p>  InitStack(&S)</p><p>  操作結(jié)果:構(gòu)造一個(gè)空

13、棧S。</p><p>  Push(&S,e)</p><p>  初始條件:棧S已經(jīng)存在。</p><p>  操作結(jié)果:在棧S的棧頂插入新的棧頂元素e。</p><p>  Pop(&S,&e)</p><p>  初始條件:棧S已經(jīng)存在。</p><p>  操作

14、結(jié)果:刪除S的棧頂元素,并以e返回其值。</p><p>  StackTraverse(S,visit())</p><p>  初始條件:棧S已經(jīng)存在。</p><p>  操作結(jié)果:從棧底到棧頂依次對S中的每一個(gè)元素調(diào)用函數(shù)visit().</p><p>  }ADT stack</p><p>  隊(duì)列的抽象

15、數(shù)據(jù)類型的定義</p><p>  數(shù)據(jù)對象:D={ai|ai∈Elemset,i=1,2,……,n,n>=0}</p><p>  數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D,i=2……,n}</p><p>  約定其中ai為隊(duì)首,an為隊(duì)尾.</p><p><b>  基本操作:</b&

16、gt;</p><p>  InitQueue(&Q)</p><p>  操作結(jié)果:構(gòu)造一個(gè)空隊(duì)列Q.</p><p>  DestroyQueue(&Q)</p><p>  初始條件:隊(duì)列Q已存在.</p><p>  操作結(jié)果:隊(duì)列Q被銷毀,不再存在.</p><p> 

17、 ClearQueue(&Q)</p><p>  初始條件:隊(duì)列Q已存在.</p><p>  操作結(jié)果:將Q清為空隊(duì)列.</p><p>  QueueEmpty(Q)</p><p>  初始條件:隊(duì)列Q已存在.</p><p>  操作結(jié)果:若Q為空隊(duì)列,則返回True,否則返回False.</p

18、><p>  QueueLength(Q)</p><p>  初始條件:隊(duì)列Q已經(jīng)存在.</p><p>  操作結(jié)果:返回Q的元素個(gè)數(shù),即隊(duì)列的長度.</p><p>  GetHead(Q,&e)</p><p>  初始條件:Q為非空隊(duì)列.</p><p>  操作結(jié)果:用e返回Q的

19、對頭元素.</p><p>  EnQueue(&Q,e)</p><p>  初始條件:隊(duì)列Q已存在.</p><p>  操作結(jié)果:插入元素e為Q新的隊(duì)尾元素.</p><p>  DeleteQueue(&Q,&e)</p><p>  初始條件:Q為非空隊(duì)列.</p>&l

20、t;p>  操作結(jié)果:刪除Q的隊(duì)頭元素,并用e返回其值.</p><p>  QueueTraverse(Q,visit())</p><p>  初始條件:Q已存在且非空.</p><p>  操作結(jié)果:從隊(duì)頭到隊(duì)尾,依次對Q的每一個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit().一旦visit()失敗,則操作失敗.</p><p>  }ADT Q

21、ueue</p><p><b>  程序模塊</b></p><p><b>  1. 主程序模塊</b></p><p>  Void main()</p><p><b>  {</b></p><p><b>  聲明定義</b&

22、gt;</p><p><b>  調(diào)用棧與隊(duì)列的函數(shù)</b></p><p>  主信息(輸入初始操作信息)</p><p><b>  }</b></p><p>  2.棧模塊---實(shí)現(xiàn)棧抽象數(shù)據(jù)類型</p><p>  3.隊(duì)列模塊---實(shí)現(xiàn)隊(duì)列抽象數(shù)據(jù)類型</

23、p><p>  4.結(jié)構(gòu)體模塊---用于對對象及變量的管理。</p><p>  各模塊之間的調(diào)用關(guān)系如下: </p><p><b>  主程序模塊</b></p><p><b>  ↓</b></p><p><b>  結(jié)構(gòu)體模塊</b></p

24、><p><b>  ↓</b></p><p><b>  棧模塊</b></p><p><b>  ↓</b></p><p><b>  隊(duì)列模塊</b></p><p><b>  詳細(xì)設(shè)計(jì)</b><

25、;/p><p><b>  主要函數(shù)思想</b></p><p>  本程序是個(gè)簡單的棧與隊(duì)列的應(yīng)用程序,其所用的函數(shù)也是棧與隊(duì)列的基本函數(shù),但在編寫函數(shù)時(shí)應(yīng)特別注意它的面向?qū)ο笮耘c窗口化設(shè)計(jì),切身為使用者著想。所以在運(yùn)用一些函數(shù)時(shí)調(diào)用的基本語句有太多的重復(fù),其目的在于實(shí)現(xiàn)它本來的基本目的。</p><p><b>  時(shí)間結(jié)點(diǎn)類型<

26、;/b></p><p>  typedef struct time{ </p><p>  int hour; </p><p><b>  int min; </b></p><p>  }Time; /*時(shí)間結(jié)點(diǎn)*/</p><p><b>  車輛進(jìn)出站信息類型</b

27、></p><p>  typedef struct Node{ </p><p>  char num[10];</p><p>  Time reach; </p><p>  Time leave; </p><p>  }CarNode; /*車輛信息結(jié)點(diǎn)*/ </p><p> 

28、 停車場和便道信息類型</p><p>  typedef struct Node{ </p><p>  CarNode *stack[Max+1];</p><p><b>  int top; </b></p><p>  }SeqStackCar; /*模擬車站*/</p><p>  t

29、ypedef struct car{ </p><p>  CarNode *data;</p><p>  struct car *next; </p><p>  }QueueNode; </p><p>  typedef struct Node{ </p><p>  QueueNode *head; <

30、/p><p>  QueueNode *rear; </p><p>  }LinkQueueCar; /*模擬通道*/ </p><p>  void InitStack(SeqStackCar *,int n); /*聲明棧*/</p><p>  //初始化,創(chuàng)建兩個(gè)新棧S,S1</p><p>  int Init

31、Queue(LinkQueueCar *); /*聲明便道*/</p><p>  //初始化,創(chuàng)建一個(gè)隊(duì)列Q用于便道</p><p>  int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*車輛進(jìn)站*/</p><p>  void Leave(SeqStackCar *,SeqStackCar *,LinkQue

32、ueCar *,int n); /*車輛出站*/</p><p>  void List(SeqStackCar,LinkQueueCar); /*顯示存車信息*/ </p><p>  void InitStack(SeqStackCar *s,int n) /*初始化棧*/</p><p>  主函數(shù)和其它函數(shù)的偽碼算法</p><p>

33、;  void main()</p><p><b>  {//主程序</b></p><p>  initialization(); //初始化</p><p><b>  while(1){</b></p><p>  scanf(...................);//根據(jù)提示信息輸入

34、想要的操作</p><p>  switch(k){//根據(jù)輸入的數(shù)調(diào)用不同的函數(shù)</p><p><b>  case 1:</b></p><p><b>  case 2:</b></p><p>  ....................</p><p><b

35、>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  typedef struct **{</p><p>  //用于創(chuàng)建不同結(jié)構(gòu)體類型的指針與變量</p><p><b>  }&

36、lt;/b></p><p>  void PRINT(CarNode *p){</p><p><b>  //調(diào)用輸出函數(shù)</b></p><p>  Leave(*p,n)...................</p><p>  根據(jù)求解時(shí)間值來求得費(fèi)用,并通過收據(jù)打印出來</p><p

37、><b>  }</b></p><p><b>  調(diào)試分析</b></p><p><b>  程序改進(jìn)</b></p><p>  本次課程設(shè)計(jì),運(yùn)用到了棧和隊(duì)列,總的調(diào)試比較順利,只是在調(diào)用棧與隊(duì)列的函數(shù)時(shí)遇到一些問題,比如我想通過鍵盤輸入來確定停車場的停車數(shù),所以初始化時(shí)那些操作函數(shù)必

38、須帶有停車數(shù)這個(gè)參數(shù)。</p><p>  在定義棧的元素最大空間時(shí)如果使用順序棧必須先給它賦初值,但如果通過鏈表就可以實(shí)現(xiàn)動(dòng)態(tài)分配內(nèi)存,為棧動(dòng)態(tài)開辟新空間。</p><p><b>  測試結(jié)果</b></p><p>  輸入停車場的容量4,收費(fèi)3元/小時(shí),不足一小時(shí)的按一小時(shí)算,如圖1-2所示:</p><p> 

39、 圖 1-2 輸入停車場容量</p><p>  接著輸入4輛車的信息,然后查看停車場信息,如圖1-3所示:</p><p>  圖 1-3 查看停車場信息</p><p>  再輸入2輛車的信息,如圖1-4所示:</p><p>  圖 1-4 再輸入兩輛車</p><p>  最后選擇第2輛車離開,如圖1-5所示:

40、</p><p>  圖 1-5 第2輛車離開</p><p><b>  課設(shè)總結(jié)</b></p><p>  經(jīng)過這次課程設(shè)計(jì),通過對程序的編制,調(diào)試和運(yùn)行,使我更好的掌握了棧和隊(duì)列基本性質(zhì)和有關(guān)它們之間關(guān)系,得到了問題的解決方法,熟悉了各種調(diào)用的數(shù)據(jù)類型,在調(diào)試和運(yùn)行過程中使我更加的了解和熟悉程序運(yùn)行的環(huán)境,提高了我對程序調(diào)試分析的能力和

41、對錯(cuò)誤的糾正能力。這次數(shù)據(jù)結(jié)構(gòu)的程序設(shè)計(jì),對于我來說是一個(gè)挑戰(zhàn)。我對數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)在程序的設(shè)計(jì)中也有所體現(xiàn)。課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識、發(fā)現(xiàn)、提出、分析和解決實(shí)際問題,鍛煉實(shí)踐能力的重要環(huán)節(jié)。而且在這次課設(shè)中我還學(xué)到了許多關(guān)于電腦方面的知識,這是在課堂上無法學(xué)到的。</p><p><b>  運(yùn)動(dòng)會分?jǐn)?shù)統(tǒng)計(jì)問題</b></p><p><b>  

42、問題描述</b></p><p>  參加運(yùn)動(dòng)會有n個(gè)學(xué)校,學(xué)校編號為1……n。比賽分成m個(gè)男子項(xiàng)目,和w個(gè)女子項(xiàng)目。項(xiàng)目編號為男子1……m,女子m+1……m+w。不同的項(xiàng)目取前五名或前三名積分;取前五名的積分分別為:7、5、3、2、1;前三名的積分分別為:5、3、2;哪些取前五名或取前三名由學(xué)生自己設(shè)定。</p><p><b>  需求分析</b>&l

43、t;/p><p>  該系統(tǒng)具備的基本功能:該統(tǒng)計(jì)程序能產(chǎn)生各種成績單和得分報(bào)表:各校的成績單,內(nèi)容包括各學(xué)校所取得每項(xiàng)成績的項(xiàng)目號,名次(成績),姓名和得分;產(chǎn)生團(tuán)體總分報(bào)表,內(nèi)容包括校號,男子團(tuán)體總分,女子團(tuán)體總分和團(tuán)體總分。也能對其中的錯(cuò)誤項(xiàng)進(jìn)行修改或刪除。</p><p>  本課程設(shè)計(jì)主要解決在運(yùn)動(dòng)會上,將各個(gè)比賽項(xiàng)目所有獲得名次的同學(xué)的成績輸入;成績查詢;成績修改;成績刪除;以及成

44、績輸出。</p><p><b>  概要設(shè)計(jì)</b></p><p><b>  流程圖</b></p><p><b>  如圖2-1所示:</b></p><p>  圖 2-1 程序流程圖</p><p><b>  程序功能說明<

45、;/b></p><p>  該程序用于運(yùn)動(dòng)會上,涉及到比賽項(xiàng)目成績的輸入,某個(gè)學(xué)校在某個(gè)項(xiàng)目中獲得成績的查詢,某個(gè)學(xué)校在某個(gè)運(yùn)動(dòng)項(xiàng)目中獲得的成績的修改,某個(gè)學(xué)校在某個(gè)運(yùn)動(dòng)項(xiàng)目中獲得的成績的刪除,以及某個(gè)學(xué)校所有獲得成績的得分報(bào)表以及團(tuán)體成績的得分報(bào)表。其中比賽成績的輸入可以按照運(yùn)動(dòng)項(xiàng)目舉行的次序輸入,也可以輸入自己指定的運(yùn)動(dòng)項(xiàng)目的成績;自己擴(kuò)展的功能是“某個(gè)學(xué)校在某個(gè)項(xiàng)目中獲得成績的查詢,某個(gè)學(xué)校在某個(gè)運(yùn)

46、動(dòng)項(xiàng)目中獲得的成績的修改,某個(gè)學(xué)校在某個(gè)運(yùn)動(dòng)項(xiàng)目中獲得的成績的刪除”三項(xiàng),這三項(xiàng)都要求輸入學(xué)校以及運(yùn)動(dòng)項(xiàng)目編號,通過這兩項(xiàng)作為參數(shù)具體的函數(shù)可以查詢、修改成績或者是刪除某項(xiàng)成績記錄,進(jìn)而影響到最后得分報(bào)表的輸出。</p><p><b>  數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></p><p>  創(chuàng)建了學(xué)生成績記錄結(jié)點(diǎn):</p><p>  struct R

47、E // 學(xué)生成績記錄</p><p><b>  {</b></p><p>  int iterm; //項(xiàng)目編號</p><p>  int pos; //名次</p><p>  int score; //成績</p><p>  int snum; //學(xué)校

48、編號</p><p>  char name[10]; //學(xué)生姓名</p><p><b>  RE *next;</b></p><p><b>  };</b></p><p>  RE sc[20]={0};</p><p>  其中具體的操作主要采用的是一個(gè)鏈表的

49、結(jié)構(gòu),涉及到了鏈表的插入,鏈表的查找,以及鏈表的刪除等知識點(diǎn)。鏈表的插入解決了各個(gè)項(xiàng)目中獲得名次的同學(xué)的成績的輸入問題;鏈表的查找解決了運(yùn)動(dòng)項(xiàng)目成績的查詢;成績的刪除,先查找到其所在的結(jié)點(diǎn),然后將該結(jié)點(diǎn)前后結(jié)點(diǎn)相連,再刪除該結(jié)點(diǎn)。</p><p><b>  函數(shù)及變量說明</b></p><p>  void insertlist(int iterm,int n);

50、該函數(shù)用來添加成績記錄,iterm 是運(yùn)動(dòng)項(xiàng)目的編號,n為參加比賽的學(xué)??倲?shù),需要注意地是根據(jù)運(yùn)動(dòng)項(xiàng)目是奇數(shù)還是偶數(shù)來判定最后結(jié)果取前三還是前五名,這里用(iterm%2)是否為零來判斷。</p><p>  RE *findlist(int snum,int fiterm);該函數(shù)用來查找指定的學(xué)校的某項(xiàng)目成績并返回該成績所在節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的地址,其中snum是要查找的學(xué)校的編號,而fiterm為要查找的運(yùn)動(dòng)

51、項(xiàng)目編號,返回一個(gè)指向RE型的指針,RE為定義的一個(gè)結(jié)構(gòu)體類型,用來存儲獲得名次的學(xué)生的基本信息(包括學(xué)生姓名,取得的名次,獲得的分?jǐn)?shù),所在的學(xué)校編號以及運(yùn)動(dòng)項(xiàng)目編號)。</p><p>  RE *findend(int snum); 查找并返回每個(gè)學(xué)校的最后一個(gè)數(shù)據(jù)節(jié)點(diǎn)的地址,函數(shù)返回類型同上,snum為學(xué)校編號。</p><p>  void printlist1(int snu

52、m); 輸出每項(xiàng)具體的成績,snum為學(xué)校編號。</p><p>  void printlist2(int snum,int m,int w); 輸出團(tuán)體成績 ,m為男生項(xiàng)目數(shù),w為女生項(xiàng)目數(shù)。</p><p>  void modlist(int snum,int miterm); 修改成績 miterm為要修改的項(xiàng)目編號。</p><p>  v

53、oid deletelist(int snum,int diterm); 刪除成績記錄,diterm為要?jiǎng)h除的項(xiàng)目編號。</p><p>  還有主函數(shù)void main( )里用一個(gè)嵌套在do—while循環(huán)語句中的switch語句來控制要執(zhí)行操作的編號,用戶可以有多種選擇,根據(jù)不同的需要選擇不同的操作,這個(gè)也很關(guān)鍵。</p><p><b>  詳細(xì)設(shè)計(jì)</b>

54、;</p><p>  根據(jù)題目要求及本次課程設(shè)計(jì)的目的,采用結(jié)構(gòu)體來存儲每組數(shù)據(jù),定義運(yùn)動(dòng)會類和調(diào)用庫函數(shù)進(jìn)行相應(yīng)的操作。現(xiàn)把相應(yīng)的設(shè)計(jì)思路及各個(gè)函數(shù)解析如下:</p><p><b>  系統(tǒng)功能模塊</b></p><p>  示意圖如圖2-2所示:</p><p>  圖 2-2 系統(tǒng)功能圖</p>

55、<p><b>  算法原理</b></p><p>  該程序先采用了一個(gè)嵌套在do—while循環(huán)語句中的switch語句來控制要執(zhí)行操作的編號,用戶可以有多種選擇,根據(jù)不同的需要選擇不同的操作。其中具體的操作主要采用的是一個(gè)鏈表的結(jié)構(gòu),涉及到了鏈表的插入,鏈表的查找,以及鏈表的刪除等知識點(diǎn)。鏈表的插入解決了各個(gè)項(xiàng)目中獲得名次的同學(xué)的成績的輸入問題,具體為:為每個(gè)學(xué)校建立一個(gè)

56、頭結(jié)點(diǎn),若該學(xué)校有同學(xué)取得名次,建立一個(gè)新的結(jié)點(diǎn)來存儲該同學(xué)的信息,并將其插到該學(xué)校所在鏈表的最后一個(gè)結(jié)點(diǎn)后面。鏈表的查找解決了運(yùn)動(dòng)項(xiàng)目成績的查詢,以及后面的成績的輸出、刪除都要用到鏈表的查找,查找時(shí)先將頭結(jié)點(diǎn)的地址賦給查找函數(shù),根據(jù)查找的條件依次與每個(gè)結(jié)點(diǎn)中相應(yīng)的比較,若相等則輸出所需要的信息,否則返回“查找的元素不存在”信息。而成績的刪除,先查找到其所在的結(jié)點(diǎn),然后將該結(jié)點(diǎn)前后結(jié)點(diǎn)相連,再刪除該結(jié)點(diǎn);成績的修改要先查找到其所在的結(jié)點(diǎn)

57、,然后再重新錄入數(shù)據(jù);至于學(xué)校所獲得的各項(xiàng)成績的輸出,將該校所在的頭結(jié)點(diǎn)的地址賦給控制輸出的函數(shù),利用指針的移動(dòng)依次將各項(xiàng)成績輸出,而團(tuán)體成績的輸出,先要根據(jù)運(yùn)動(dòng)項(xiàng)目編號來確定是男生還是女生項(xiàng)目,然后再依次累加,分別得到男女生的團(tuán)體得分</p><p><b>  調(diào)試分析</b></p><p>  調(diào)試過程中出現(xiàn)的問題及處理方式</p><p&

58、gt;  1、由于剛開始程序比較簡單,雖能運(yùn)行,但處理錯(cuò)誤的能力很低,后來經(jīng)過反復(fù)的添加修改,使程序能處理了錯(cuò)誤,提高了健壯性。</p><p>  2、開始編時(shí)由于不太規(guī)范,編譯出錯(cuò)后由于程序長,很難找到錯(cuò)誤,后來規(guī)范了格式,錯(cuò)誤容易找到了,以后編程要規(guī)范。</p><p>  3、算法的時(shí)間以及空間復(fù)雜度的分析:</p><p>  線性表使用的是順序結(jié)構(gòu),各種

59、算法的時(shí)間復(fù)雜度相對比較合理</p><p>  4、本程序相對來說比較容易看明白,其中涉及到的一些函數(shù)相對來說比較容易。通過調(diào)試,運(yùn)行,基本上達(dá)到了要求,但還存在一些缺點(diǎn)。如:不夠人性化等。</p><p>  另外在void printlist1(int snum)函數(shù)中,當(dāng)將要輸出成績的學(xué)校所在的鏈表的頭結(jié)點(diǎn)所指向的下一個(gè)結(jié)點(diǎn)的地址賦給temp的時(shí)候:</p><

60、p><b>  RE *temp;</b></p><p>  temp=&sc[snum-1];</p><p>  temp=temp->next;</p><p>  要檢測temp是否為NULL,如果為NULL會發(fā)生溢出,程序無法向下繼續(xù)進(jìn)行</p><p>  解決的方法是 加上 <

61、;/p><p>  if(temp==NULL) </p><p>  cout<<"該學(xué)校在該項(xiàng)目上沒有取得任何成績"<<endl;</p><p>  此句可以有效的防止溢出發(fā)生</p><p>  此類問題還發(fā)生在 void printlist2(int snum,int m,int w)和vo

62、id modlist(int snum,int miterm)里面,在后面的那個(gè)函數(shù)里面 RE *curr=findlist(snum,miterm);在這個(gè)賦值語句后面也要跟上 </p><p>  if(curr==NULL) return;</p><p>  curr=curr->next; </p><p>  i

63、f(curr==NULL){</p><p>  cout<<"該學(xué)校在該項(xiàng)目上沒有任何成績記錄"<<endl;</p><p><b>  return;}</b></p><p>  這也是為了防止溢出的發(fā)生而設(shè)定的條件。</p><p>  在插入結(jié)點(diǎn)的時(shí)候是將其直接插

64、到該學(xué)校所在鏈表的最后,因此需要找到每個(gè)學(xué)校所在鏈表的最后一個(gè)結(jié)點(diǎn)的地址,而函數(shù)RE *findlist(int snum,int fiterm); 只是返回需要查找的結(jié)點(diǎn)的地址,不一定是最后一個(gè)結(jié)點(diǎn),解決辦法是重新定義一個(gè)函數(shù),RE *findend(int snum);盡管這樣在效率上可能會有些差,因?yàn)槊看尾迦氲臅r(shí)候都要從頭結(jié)點(diǎn)開始查找,時(shí)間上的開銷會大一些,但還是可以解決上述問題的</p><p>  此外

65、,還有一些就是細(xì)節(jié)問題了,如:主函數(shù)中的</p><p>  if(num>6||num<0) {</p><p>  cout<<"輸入有誤,請重新輸入要操作的項(xiàng)目編號"<<endl;</p><p>  cin>>num;}</p><p>  這個(gè)if語句判斷輸入的操作

66、編號是否在目錄中,如果超出范圍重新輸入;</p><p>  還有函數(shù)void insertlist(int iterm,int n)里面在用new申請空間的時(shí)候?yàn)榉乐箖?nèi)存分配空間錯(cuò)誤用下面的語句來監(jiān)控 </p><p>  if(temp==NULL) </p><p>  cout<<"內(nèi)存分配錯(cuò)誤"<<endl;&

67、lt;/p><p>  以及函數(shù)void insertlist(int iterm,int n)里面在輸入學(xué)校編號的時(shí)候用下面的if語句判斷輸入的學(xué)校編號是否符合要求,如果超出范圍重新輸入</p><p>  if(temp->snum>n) {</p><p>  cout<<"輸入的學(xué)校編號有誤,請重新輸入"<<

68、;endl;</p><p>  cin>>temp->snum;}</p><p><b>  運(yùn)行界面</b></p><p>  首先運(yùn)行文件運(yùn)動(dòng)會分?jǐn)?shù)統(tǒng)計(jì)系統(tǒng)。如圖2-3所示:</p><p>  圖 2-3 程序界面</p><p>  輸入信息相關(guān)信息:添加學(xué)校如圖2

69、-4所示:</p><p>  圖 2-4 添加學(xué)校名稱</p><p>  輸入學(xué)校名稱和運(yùn)動(dòng)會的項(xiàng)目后如圖2-5所示:</p><p>  圖 2-5 添加學(xué)校后的界面</p><p>  學(xué)校編號查詢分?jǐn)?shù)如圖2-6所示:</p><p>  圖 2-6 按學(xué)校編號查詢分?jǐn)?shù)</p><p>

70、  按運(yùn)動(dòng)項(xiàng)目輸出各個(gè)學(xué)校的名次如圖2-7所示:</p><p>  圖 2-7 按項(xiàng)目輸出學(xué)校的名次</p><p>  按女團(tuán)體總分排序如圖2-8所示:</p><p>  圖 2-8 按女團(tuán)體成績排序</p><p>  按總成績輸出個(gè)學(xué)校如圖2-9所示:</p><p>  圖 2-9 按總成績排序</p

71、><p><b>  課設(shè)總結(jié)</b></p><p>  1.存在問題:程序有待簡化。</p><p>  2.提高:錯(cuò)誤處理比較全面,而且能及時(shí)應(yīng)對處理。</p><p>  3.這次課程設(shè)計(jì)使我對做系統(tǒng)的認(rèn)識深刻了許多。雖然在整個(gè)設(shè)計(jì)過程中遇到很多問題不會解決,但在自己的努力以及同學(xué)老師的幫助下,最終完成了該系統(tǒng)。當(dāng)看

72、到自己做的程序能運(yùn)行時(shí),心中充滿了成就感。在克服困難的過程中,對自己所學(xué)知識的掌握程度也有了比較清楚的了解。綜合起來,主要體現(xiàn)在以下幾個(gè)方面:首先,對數(shù)據(jù)結(jié)構(gòu)的掌握還不夠。雖然完成了程序,但是只用到了基本的結(jié)點(diǎn)以及鏈表,在數(shù)據(jù)結(jié)構(gòu)的選擇上避重就輕,覆蓋面較小,不能很好的體現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)的掌握度,同時(shí)也缺少了適當(dāng)?shù)腻憻挘谶@方面還需要自己主動(dòng)去提高。</p><p>  其次,在程序整體的設(shè)計(jì)上還不夠完善,各模塊可

73、以適當(dāng)增加內(nèi)容,界面還可以更加的人性化些,同時(shí)可考慮從面向?qū)ο蠓矫嫒胧?,這樣整個(gè)程序才具有更強(qiáng)的美觀性與實(shí)用性。</p><p>  最后,我覺得該程序還有很大的改進(jìn)空間,譬如可以用多文件做,這樣功能更強(qiáng)大,也便于以后更好地改進(jìn)和完善程序;而在程序的內(nèi)容方面,還能增加更多功能,以滿足不同需要的各種要求。</p><p>  但是,值得欣慰的是,該程序基本完成里設(shè)計(jì)要求,并能順利運(yùn)行,界面清

74、晰易理解,且具備各項(xiàng)基本功能,易于操作;而且代碼部分有注釋,簡單易懂。</p><p>  總而言之,這次課程設(shè)計(jì)給了我很大啟發(fā),我明白了,不管遇到什么問題,只要抓住根源,不氣餒,從不同方面去攻破它,終究會成功,生活也是如此。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 譚浩強(qiáng). C++程序設(shè)計(jì). 北京:清華大學(xué)出

75、版社,2004.</p><p>  [2] 王翠茹.劉軍. 數(shù)據(jù)結(jié)構(gòu). 北京:中國電力出版社,2006.</p><p>  [3] 蘇仕華.賈伯琪,黃學(xué)俊. 數(shù)據(jù)結(jié)構(gòu)解析. 安徽:中國科學(xué)技術(shù)大學(xué)出版社,2009.</p><p>  [4] 秦峰.袁志祥. 數(shù)據(jù)結(jié)構(gòu)例題詳解與課程設(shè)計(jì)指導(dǎo). 北京:中國科學(xué)技術(shù)出版社,2009.</p><p

76、>  附錄1:停車場管理問題</p><p>  /*停車場管理系統(tǒng)*/</p><p>  #include<stdio.h></p><p>  #include<stdlib.h> </p><p>  #include<string.h></p><p>  #incl

77、ude<malloc.h></p><p>  /*------------------------------------------------------------------------------*/ </p><p>  #define Max 10</p><p>  int getn()</p><p><

78、b>  {</b></p><p><b>  int n;</b></p><p>  printf("歡迎您光臨吉林市停車場,");</p><p>  printf("本停車場每小時(shí)3元,不足一小時(shí)按一小時(shí)算.\n");</p><p>  printf(&

79、quot;請輸入停車場可容納的車(最多20輛):");</p><p>  scanf("%d",&n);</p><p>  fflush(stdin);</p><p><b>  do{</b></p><p>  if(n<1 || n>10)</p>

80、<p><b>  {</b></p><p>  printf("輸入的車輛數(shù)不在要求范圍內(nèi),請重新輸入!");</p><p>  scanf("%d",&n);</p><p>  fflush(stdin);</p><p><b>  }&

81、lt;/b></p><p>  else break;</p><p>  }while(n<1 || n>10);</p><p><b>  return n;</b></p><p><b>  }</b></p><p>  typedef str

82、uct time{ </p><p>  int hour; </p><p><b>  int min; </b></p><p>  }Time; /*時(shí)間結(jié)點(diǎn)*/ </p><p>  typedef struct node{ </p><p>  char num[10];</p&

83、gt;<p>  Time reach; </p><p>  Time leave; </p><p>  }CarNode; /*車輛信息結(jié)點(diǎn)*/ </p><p>  typedef struct NODE{ </p><p>  CarNode *stack[Max+1];</p><p><

84、;b>  int top; </b></p><p>  }SeqStackCar; /*模擬車站*/</p><p>  typedef struct car{ </p><p>  CarNode *data;</p><p>  struct car *next; </p><p>  }Que

85、ueNode; </p><p>  typedef struct Node{ </p><p>  QueueNode *head; </p><p>  QueueNode *rear; </p><p>  }LinkQueueCar; /*模擬通道*/ </p><p>  void InitStack(Seq

86、StackCar *,int n); /*聲明棧*/</p><p>  int InitQueue(LinkQueueCar *); /*聲明便道*/</p><p>  int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*車輛進(jìn)站*/</p><p>  void Leave(SeqStackCar *,SeqS

87、tackCar *,LinkQueueCar *,int n); /*車輛出站*/</p><p>  void List(SeqStackCar,LinkQueueCar); /*顯示存車信息*/ </p><p>  void InitStack(SeqStackCar *s,int n) /*初始化棧*/</p><p><b>  { <

88、/b></p><p><b>  int i; </b></p><p>  s->top=0; </p><p>  for(i=0;i<=n;i++)</p><p>  s->stack[s->top]=NULL; </p><p><b>  }

89、</b></p><p>  int InitQueue(LinkQueueCar *Q) /*初始化便道*/ </p><p><b>  { </b></p><p>  Q->head=(QueueNode *)malloc(sizeof(QueueNode)); </p><p>  if(Q-

90、>head!=NULL) </p><p><b>  { </b></p><p>  Q->head->next=NULL; </p><p>  Q->rear=Q->head; </p><p>  return(1); </p><p><b> 

91、 } </b></p><p>  else return(-1); </p><p><b>  } </b></p><p>  void PRINT(CarNode *p) /*打印出站車的信息*/</p><p><b>  { </b></p><p>

92、  int A1,A2,B1,B2;</p><p>  int a,b,c; </p><p>  printf("\n請輸入離開的時(shí)間:/**:**/"); </p><p>  scanf("%d:%d",&(p->leave.hour),&(p->leave.min));</p>

93、<p>  fflush(stdin);</p><p><b>  do{</b></p><p>  if(p->leave.hour<p->reach.hour || (p->leave.hour==p->reach.hour && p->leave.min<p->reach.min)

94、)</p><p><b>  {</b></p><p>  printf("輸入離開時(shí)間比進(jìn)站時(shí)間早,請重新輸入!\n");</p><p>  scanf("%d:%d",&(p->leave.hour),&(p->leave.min));</p><

95、p>  fflush(stdin);</p><p><b>  }</b></p><p>  if(p->leave.hour<0 || p->leave.hour>=24 || p->leave.min<0 || p->leave.min>=60)</p><p><b> 

96、 {</b></p><p>  printf("輸入的時(shí)間格式有錯(cuò),請重新輸入!");</p><p>  scanf("%d:%d",&(p->leave.hour),&(p->leave.min));</p><p>  fflush(stdin);</p><

97、p><b>  }</b></p><p>  else break;</p><p>  }while(p->leave.hour<p->reach.hour || (p->leave.hour==p->reach.hour && p->leave.min<p->reach.min) || p-&

98、gt;leave.hour<0 || p->leave.hour>=24 || p->leave.min<0 || p->leave.min>=60);</p><p>  printf("車場現(xiàn)在有一輛車離開,請便道里的第一輛車進(jìn)入車場!\n");</p><p>  printf("出站的車的車牌號為:"

99、);</p><p>  puts(p->num);</p><p>  printf("\n");</p><p>  A1=p->reach.hour; </p><p>  A2=p->reach.min; </p><p>  B1=p->leave.hour; &l

100、t;/p><p>  B2=p->leave.min;</p><p>  a=(B1-A1)*60+B2-A2;</p><p><b>  if(a>=60)</b></p><p><b>  {</b></p><p><b>  b=a/60;&l

101、t;/b></p><p><b>  c=a-60*b;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>

102、;  b=0;</b></p><p><b>  c=a;</b></p><p><b>  }</b></p><p>  printf(" 謝謝光臨.");</p><p>  printf("\n 收

103、 據(jù)\n");</p><p>  printf("================================== 車牌號: ");</p><p>  puts(p->num);</p><p>  printf("\n");</p><p>  printf(&q

104、uot;===================================================\n");</p><p>  printf("|進(jìn)車場時(shí)刻 | 出車場時(shí)刻 | 停留時(shí)間 | 應(yīng)付(元)|\n");</p><p>  printf("===========================================

105、=========\n");</p><p>  printf("| %d:%d",p->reach.hour,p->reach.min);</p><p>  printf(" | %d:%d",p->leave.hour,p->leave.min);</p><p>  pr

106、intf(" | %d:%d",b,c);</p><p>  printf(" | %2.1f",0.1*a);</p><p>  printf(" |\n");</p><p>  printf("---------------------------------

107、--------------------\n");</p><p><b>  free(p);</b></p><p><b>  } </b></p><p>  int Arrival(SeqStackCar *Enter,LinkQueueCar *W,int n) /*車輛到達(dá)*/</p>

108、<p><b>  { </b></p><p>  CarNode *p; </p><p>  QueueNode *t; </p><p><b>  int a,b;</b></p><p>  p=(CarNode *)malloc(sizeof(CarNode)); <

109、;/p><p>  flushall(); </p><p>  printf("\n請輸入車牌號(例:吉B12345):\n");</p><p>  printf("請嚴(yán)格按照要求輸入車牌號,否則系統(tǒng)會出錯(cuò)!\n");</p><p><b>  do{</b></p>

110、<p>  a=strlen("陜A1234");</p><p>  b=strlen(gets(p->num));</p><p>  fflush(stdin);</p><p><b>  if(a!=b)</b></p><p><b>  {</b>

111、;</p><p>  printf("輸入車牌號格式錯(cuò)誤,請重新輸入!\n");</p><p>  gets(p->num);</p><p>  fflush(stdin);</p><p><b>  }</b></p><p>  else break;<

112、/p><p><b>  if(a!=b)</b></p><p>  printf("輸入車牌號格式錯(cuò)誤,請重新輸入!\n");</p><p>  }while(a!=b);</p><p>  if(Enter->top<n) /*車場未滿,車進(jìn)車場*/</p><p

113、><b>  { </b></p><p>  Enter->top++; </p><p>  printf("\n車輛在車場第%d位置.",Enter->top); </p><p>  fflush(stdin);</p><p>  printf("\n請輸入到達(dá)時(shí)

114、間:/**:**/"); </p><p>  scanf("%d:%d",&(p->reach.hour),&(p->reach.min));</p><p>  fflush(stdin);</p><p><b>  do{</b></p><p>  if

115、(p->reach.hour<0 || p->reach.hour>=24 || p->reach.min<0 || p->reach.min>=60)</p><p><b>  {</b></p><p>  printf("輸入的時(shí)間格式有錯(cuò),請重新輸入!");</p><p

116、>  scanf("%d:%d",&(p->reach.hour),&(p->reach.min));</p><p>  fflush(stdin);</p><p><b>  }</b></p><p><b>  else</b></p><

117、p><b>  break;</b></p><p>  }while(p->reach.hour<0 || p->reach.hour>=24 || p->reach.min<0 || p->reach.min>=60);</p><p>  Enter->stack[Enter->top]=p; &

118、lt;/p><p>  return(1); </p><p><b>  } </b></p><p>  else /*車場已滿,車進(jìn)便道*/ </p><p><b>  { </b></p><p>  printf("\n請?jiān)撥囋诒愕郎宰鞯却?")

119、;</p><p>  t=(QueueNode *)malloc(sizeof(QueueNode)); </p><p>  t->data=p; </p><p>  t->next=NULL; </p><p>  W->rear->next=t; </p><p>  W->r

120、ear=t; </p><p>  return(1); </p><p><b>  } </b></p><p><b>  } </b></p><p>  void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W,int

121、n)</p><p>  { /*車輛離開*/ </p><p>  int i, room; </p><p>  CarNode *p,*t; </p><p>  QueueNode *q; </p><p>  /*判斷車場內(nèi)是否有車*/ </p><p>  if(Enter->

122、top>0) /*有車*/ </p><p><b>  { </b></p><p>  while(1) /*輸入離開車輛的信息*/ </p><p><b>  { </b></p><p>  printf("\n請輸入要離開的車在車場的位置/1--%d/:"

123、,Enter->top);</p><p>  scanf("%d",&room);</p><p>  fflush(stdin); </p><p>  if(room>=1&&room<=Enter->top) break; </p><p><b>  }

124、</b></p><p>  while(Enter->top>room) /*車輛離開*/ </p><p><b>  { </b></p><p>  Temp->top++; </p><p>  Temp->stack[Temp->top]=Enter->stac

125、k[Enter->top]; </p><p>  Enter->stack[Enter->top]=NULL; </p><p>  Enter->top--; </p><p><b>  } </b></p><p>  p=Enter->stack[Enter->top];

126、</p><p>  Enter->stack[Enter->top]=NULL; </p><p>  Enter->top--; </p><p>  while(Temp->top>=1) </p><p><b>  { </b></p><p>  Ente

127、r->top++; </p><p>  Enter->stack[Enter->top]=Temp->stack[Temp->top]; </p><p>  Temp->stack[Temp->top]=NULL; </p><p>  Temp->top--; </p><p><b

128、>  } </b></p><p><b>  PRINT(p);</b></p><p>  /*判斷通道上是否有車及車站是否已滿*/ </p><p>  if((W->head!=W->rear)&&Enter->top<n) /*便道的車輛進(jìn)入車場*/</p>&l

129、t;p><b>  {</b></p><p>  q=W->head->next; </p><p>  t=q->data; </p><p>  Enter->top++; </p><p>  printf("\n現(xiàn)在請便道上的車進(jìn)入車場.該車的車牌號為:");&

130、lt;/p><p>  puts(t->num);</p><p>  printf("\n該車進(jìn)入車場第%d位置.",Enter->top);</p><p>  printf("\n請輸入現(xiàn)在的時(shí)間(即該車進(jìn)站的時(shí)間)/**:**/:");</p><p>  scanf("%d:

131、%d",&(t->reach.hour),&(t->reach.min));</p><p>  fflush(stdin); </p><p><b>  do{</b></p><p>  if(t->reach.hour<0 || t->reach.hour>=24 || t-

132、>reach.min<0 || t->reach.min>=60)</p><p><b>  {</b></p><p>  printf("輸入的時(shí)間格式有錯(cuò),請重新輸入!");</p><p>  scanf("%d:%d",&(t->reach.hour),&

133、amp;(t->reach.min));</p><p>  fflush(stdin);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  break;</b></p><p>  

134、}while(t->reach.hour<0 || t->reach.hour>=24 || t->reach.min<0 || t->reach.min>=60);</p><p>  W->head->next=q->next; </p><p>  if(q==W->rear) W->rear=W->

135、head; </p><p>  Enter->stack[Enter->top]=t; </p><p><b>  free(q); </b></p><p><b>  } </b></p><p>  else printf("\n目前便道里沒有車.\n");

溫馨提示

  • 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

提交評論