數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 停車場管理系統(tǒng)_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 停車場管理系統(tǒng)_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 停車場管理系統(tǒng)_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 停車場管理系統(tǒng)_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 停車場管理系統(tǒng)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄1 實(shí)習(xí)目的12 問題描述13 需求分析23.1設(shè)計(jì)思想23.2實(shí)現(xiàn)方法24 概要設(shè)計(jì)34.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)34.4函數(shù)及功能要求35 總體設(shè)計(jì)45.1總體設(shè)計(jì)圖4車輛成批入站6車站內(nèi)信息顯示76 詳細(xì)設(shè)計(jì)86.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類型86.2 功能函數(shù)設(shè)計(jì)97 系統(tǒng)測試及其結(jié)果147.1 程序調(diào)試中的問題147.2 結(jié)果截圖16車輛成批入站16車輛出站188 心得體會19參考文獻(xiàn)21附錄22停車場管理系統(tǒng)1 實(shí)習(xí)目的通過實(shí)習(xí),了解并初步掌握設(shè)計(jì)、實(shí)現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設(shè)計(jì)、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計(jì)、實(shí)現(xiàn)以及操作方法,為進(jìn)一步的應(yīng)用開

2、發(fā)打好基礎(chǔ)。2 問題描述停車場是一條可以停放n輛車的狹窄通道,且只有一個(gè)大門汽車停放安到達(dá)時(shí)間的先后依次由北向南排列(大門在最南端,最先到達(dá)的第一輛車停在最北端)若停車場已經(jīng)停滿n輛車,后來的汽車在便道上等候,一旦有車開走,排在便道上的第一輛車可以開入;當(dāng)停車場的某輛車要離開時(shí),停在他后面的車要先后退為他讓路,等它開出后其他車在按照原次序開入車場,每兩停在車場的車要安時(shí)間長短繳費(fèi)。3 需求分析3.1設(shè)計(jì)思想此停車場管理系統(tǒng)是在一個(gè)狹長的通道上的,而且只有一個(gè)大門可以供車輛進(jìn)出,并且要實(shí)現(xiàn)停車場內(nèi)某輛車要離開時(shí),在它之后進(jìn)入停車場的車都必須先退出停車場為它讓路,待其開出停車場后,這些輛再依原來的

3、次序進(jìn)場的功能,就可以設(shè)計(jì)兩個(gè)堆棧,其中一個(gè)堆棧用來模擬停車場,另一個(gè)堆棧用來模擬臨時(shí)停車場,該臨時(shí)停車場用來存放當(dāng)有車輛離開時(shí),原來停車場內(nèi)為其讓路的車輛。至于當(dāng)停車場已滿時(shí),需要停放車輛的通道可以用一個(gè)循環(huán)隊(duì)列來實(shí)現(xiàn)。當(dāng)停車場內(nèi)開走一輛車時(shí),通道上便有一輛車進(jìn)入停車場,此時(shí)只需要改變通道上車輛結(jié)點(diǎn)的連接方式就可以了,使通道上第一輛車進(jìn)入停車場這個(gè)堆棧,并且使通道上原來的第二輛車成為通道上的第一輛車,此時(shí)只需將模擬通道的循環(huán)隊(duì)列的頭結(jié)點(diǎn)連到原來的第二輛車上就可以了。這個(gè)程序的關(guān)鍵是車輛的進(jìn)站和出站操作,以及車場和通道之間的相互關(guān)系。由于車站是一個(gè)很窄的、一邊開口的車道,先進(jìn)后出,類似數(shù)據(jù)結(jié)構(gòu)

4、中的棧結(jié)構(gòu),故車場用棧這種數(shù)據(jù)結(jié)構(gòu)來描述。外面的狹長的通道,先進(jìn)先出,故可用隊(duì)列結(jié)構(gòu)來描述??紤]到車場和通道在整個(gè)程序中都要用到。故把這兩個(gè)變量定義成全局變量。本程序中的數(shù)據(jù)對象是汽車,可以認(rèn)為車牌號是每個(gè)元素的關(guān)鍵項(xiàng),不能重復(fù),和現(xiàn)實(shí)中一樣,另外加了車主姓名這一數(shù)據(jù)項(xiàng),為表簡潔,其他相關(guān)信息如入場時(shí)間,車的類型,收取費(fèi)率等,都不再考慮,具體應(yīng)用的時(shí)候可以方便地修改得到。3.2實(shí)現(xiàn)方法對于此停車場管理系統(tǒng)的實(shí)現(xiàn),就是用兩個(gè)堆棧來分別模擬停車場以及停車場內(nèi)車輛為其它車輛讓路時(shí)退出停車的臨時(shí)停放地點(diǎn)。至于通道上車輛的停放則用一個(gè)循環(huán)隊(duì)列來實(shí)現(xiàn),此時(shí),通道上車輛的離開或者進(jìn)入停車場只需改變此循環(huán)隊(duì)列

5、上的結(jié)點(diǎn)而已。4 概要設(shè)計(jì)4.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)第一個(gè)定義汽車的信息:車牌號num10和車主姓名name10:typedef struct carchar num10;char name10;Car;第二個(gè)定義汽車場的結(jié)構(gòu),在這里我把它看成是一個(gè)棧,在這里定義棧的容量等信息:typedef struct Car datamaxsize; int n;/棧容量設(shè)定 int top;Stack;/順序棧 用來存放汽車場內(nèi)的車輛信息第三個(gè)定義通道的結(jié)構(gòu),在這里我把它看成是一個(gè)循環(huán)隊(duì)列,在這里定義隊(duì)列胡容量等信息:typedef struct Car datamaxsize; int n;/隊(duì)列容量設(shè)定

6、int num;/當(dāng)前通道上的車輛數(shù) int front,rear;Queue;/循環(huán)隊(duì)列 用來存放通道內(nèi)的車輛信息4.4函數(shù)及功能要求1. int Push(Stack *S,Car x):創(chuàng)建入棧的操作,以實(shí)現(xiàn)車輛進(jìn)入停車場的操作2. int Pop(Stack *S,Car *px):創(chuàng)建出棧的操作,以實(shí)現(xiàn)車輛離開停車場的操作3. int InsertQueue(Queue *Q,Car x):創(chuàng)建入隊(duì)的操作,以實(shí)現(xiàn)進(jìn)入臨時(shí)停車場的操作4. int DeleteQueue(Queue *Q,Car *x):創(chuàng)建出隊(duì)的操作,以實(shí)現(xiàn)離開臨時(shí)停車場的操作5. void ShowCar(void

7、):創(chuàng)建顯示車站內(nèi)信息的子程序。6. void InitCarpark(void):創(chuàng)建車輛成批入站的子程序。7. void InsertCar(void):創(chuàng)建單個(gè)車輛入站的子程序。8. void ExitCar(void):創(chuàng)建車輛出站的子程序。9. Pop(SCar,&x);:提供指定車輛出站的功能。10. void SetCar(void):提供車站模擬系統(tǒng)相關(guān)功能設(shè)定的功能。11. void carmenu(void):顯示出車站管理系統(tǒng)主菜單。12. void main(void):此為主函數(shù),調(diào)用其他子程序。5 總體設(shè)計(jì)5.1總體設(shè)計(jì)圖停車場車輛管理 系統(tǒng)車輛出站顯示車站

8、內(nèi)汽車信息車站管理系統(tǒng)主菜單 函 數(shù)退出 系統(tǒng)車輛成批入站單個(gè)車輛入站圖2.1 功能模塊圖 運(yùn)行程序到系統(tǒng)界面,接著系統(tǒng)界面就會出現(xiàn)讓你能選擇的功能:【1】車輛成批入站【2】單個(gè)車輛入站【3】車輛出站【4】車站內(nèi)信息實(shí)時(shí)顯示【5】相關(guān)功能設(shè)定【0】退出本系統(tǒng)5.2模塊流程圖5.2.1車輛成批入站開 始輸入汽車的車牌號還有車主姓名strcpy(pcar.num,pnum);strcpy(,pname);Push(SCar,pcar)=-1InsertQueue(QCar,pcar)=-1車站已滿!車輛已經(jīng)入通道!通道已滿,進(jìn)入通道失敗!while(strcmp(pnum,&qu

9、ot;#")!=0)結(jié) 束這批汽車已經(jīng)成功進(jìn)入停車場nynyny圖2.2車輛成批入站流程圖5.2.2車站內(nèi)信息顯示開 始SCar->top=-1i=0i<SCar->top+1printf("%-13s",SCar->datai.num);printf("%18sn",SCar->);i+QCar->rear!=QCar->frontwhile(front!=rear)printf("%-13s",SCar->datai.num);printf("

10、%18sn",SCar->);front=(front+1)%QCar->n結(jié) 束ynnyyn圖2.3停車場內(nèi)信息顯示流程圖6 詳細(xì)設(shè)計(jì)6.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類型前面提到,要用到棧和隊(duì)列的操作。這里,由于一個(gè)車場的最大容量是一定的,且車場最多執(zhí)行的操作是插入和刪除操作,所以用順序儲存結(jié)構(gòu)可以帶來更大益處。為了防止隊(duì)列中出現(xiàn)“假溢出”現(xiàn)象,這里采用了循環(huán)隊(duì)列。在模擬汽車這個(gè)對象時(shí),進(jìn)行了簡化處理,只取得最核心的兩個(gè)數(shù)據(jù)項(xiàng):車牌號和車主姓名。具體數(shù)據(jù)結(jié)構(gòu)定義如下:首先定義maxsize為20:#define maxsize 20第二個(gè)再定義汽車的

11、信息:車牌號num10和車主姓名name10:typedef struct carchar num10;char name10;Car;第三個(gè)定義汽車場的結(jié)構(gòu),在這里我把它看成是一個(gè)棧,在這里定義棧的容量等信息:typedef struct Car datamaxsize; int n;/棧容量設(shè)定 int top;Stack;/順序棧 用來存放汽車場內(nèi)的車輛信息第四個(gè)定義通道的結(jié)構(gòu),在這里我把它看成是一個(gè)循環(huán)隊(duì)列,在這里定義隊(duì)列胡容量等信息:typedef struct Car datamaxsize; int n;/隊(duì)列容量設(shè)定 int num;/當(dāng)前通道上的車輛數(shù) int front,r

12、ear;Queue;/循環(huán)隊(duì)列 用來存放通道內(nèi)的車輛信息6.2 功能函數(shù)設(shè)計(jì)(1)車輛成批入站void InitCarpark(void)/車輛成批入站此函數(shù)也可以作為初始化車場的函數(shù),因?yàn)橐粋€(gè)車場剛開始投入運(yùn)行的時(shí)候會有很多的車進(jìn)來,這也是設(shè)計(jì)此函數(shù)最重要的一個(gè)原因。每行輸入一個(gè)汽車信息,最后結(jié)束的時(shí)候輸入“# #”即可。汽車信息中前面表示汽車的車牌號,后面表示車主姓名,中間用空格隔開。當(dāng)輸入汽車的數(shù)目超過規(guī)定的最大容量的時(shí)候(如果開始不設(shè)置最大容量,默認(rèn)值為系統(tǒng)申請的最大值maxsize=20),自動檢測條件,給出相關(guān)提示信息。程序如下:void InitCarpark(void)/車輛成

13、批入站char num8,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開)(以'# #'這個(gè)符號結(jié)束):n");scanf("%s%s",pnum,pname);while(strcmp(pnum,"#")!=0)strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1) printf("n車站已滿!車輛

14、已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿,進(jìn)入通道失敗!n");scanf("%s%s",pnum,pname);printf("這批汽車已經(jīng)成功進(jìn)入停車場n");getch();carmenu();(2)單個(gè)車輛入站void InsertCar(void)/單個(gè)車輛入站當(dāng)系統(tǒng)正常投入運(yùn)行后,會有零散的車輛進(jìn)進(jìn)出出,如還用成批輸入方式的話,將會帶來一定的麻煩。此函數(shù)具有函數(shù)InitCarpark()幾乎所有的功能,程序跟InitCarpark()這個(gè)差不多,同樣

15、先輸入,然后再判斷停車場是否滿了,通道是否滿了,最后執(zhí)行結(jié)果,程序如下:void InsertCar(void)/單個(gè)車輛入站char num10,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開):n");scanf("%s%s",pnum,pname);strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1)printf("n車站已滿!

16、車輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿,進(jìn)入通道失敗!n");getch();(3)車輛內(nèi)信息顯示函數(shù)void ShowCar(void)/車站內(nèi)信息顯示如果車場本身是空的,沒有汽車,那么也就不存在查看汽車信息了。故本函數(shù)一開始進(jìn)行合理性檢查,如果條件不成立,拒絕執(zhí)行顯示信息操作,給出出錯(cuò)的信息后返回到主界面。前面提到,車站內(nèi)信息包括兩部分:車場內(nèi)停放的車輛,在外面通道上等停的車輛。因?yàn)橥ǖ郎弦膊灰欢ㄓ熊?,程序輸出車場?nèi)的所有汽車信息后,自動進(jìn)行判斷通道上是否有車輛。如果有車輛的話,繼續(xù)輸出停在

17、通道上的車子信息。程序如下:void ShowCar(void)/車站內(nèi)信息顯示int i,front,rear;if(SCar->top=-1)printf("nn這停車場是空的!n");getch();carmenu();printf("nn目前停車場的車有:n-車牌號-車主姓名n");for(i=0;i<SCar->top+1;i+)printf(" %-13s",SCar->datai.num);printf("%18sn",SCar->);if(QCar-

18、>rear!=QCar->front)/通道內(nèi)有車輛front=QCar->front;rear=QCar->rear;printf("n通道信息:n-車牌號-車主姓名n");while(front!=rear)printf(" %-13s",QCar->datafront.num);printf("%18sn",QCar->);front=(front+1)%QCar->n;(4)車輛出站函數(shù)void ExitCar(void)/車輛出站同上,首先進(jìn)行和利息你給檢

19、查。這里的檢查包括兩個(gè)部分:車場非空且輸入的車牌號在車場中。如果一切條件滿足,則執(zhí)行推車操作。最后,檢查通道上是否有車輛等待。如果通道不為空,程序會自動把排在通道最前面的車調(diào)入車場內(nèi)。其中,退車的算法過程如下:前面檢測條件滿足時(shí),執(zhí)行如下操作:由于車場很窄,當(dāng)一輛車要出場時(shí),排在它后面的車輛需要先出場,等要退出的車開走后,剛才為它讓道的那些車再按原次序進(jìn)入車場。不難看出,這里需要?jiǎng)?chuàng)建一個(gè)臨時(shí)棧,用于保存讓道車輛的信息。在前面的合理性檢查中,已經(jīng)定位到出場車輛所在位置,從棧頂開始,到所在位置前一個(gè)結(jié)束,車場內(nèi)執(zhí)行出棧操作,臨時(shí)棧結(jié)構(gòu)執(zhí)行入棧操作。在當(dāng)前位置執(zhí)行出棧操作,即可實(shí)現(xiàn)指定的車輛出場。當(dāng)

20、臨時(shí)棧不為空時(shí),依次執(zhí)行:臨時(shí)棧退棧,車場內(nèi)入棧。(5)車站模擬系統(tǒng)相關(guān)功能設(shè)定函數(shù)void SetCar(void)/車站模擬系統(tǒng)相關(guān)功能設(shè)定此函數(shù)很簡單,首先用一個(gè)do-while循環(huán),得到一個(gè)合理值,修改相關(guān)參數(shù)即可。這里有一個(gè)防錯(cuò)設(shè)計(jì):當(dāng)輸入的最大容量小于車場內(nèi)當(dāng)前的車輛數(shù)時(shí),拒絕執(zhí)行修改。程序如下:void SetCar(void)/車站模擬系統(tǒng)相關(guān)功能設(shè)定int b; printf("選擇1:修改停車場的容量n"); printf("選擇2:修改通道的容量n"); printf("請你選擇操作(1-2):n"); scan

21、f("%d",&b); /*讀入選擇*/ if(b=1)int n,flag=1;printf("nn目前停車場最大的容納量是:%dn",SCar->n);printf("n輸入您想要的停車場的最大容納量:(<=%d)n",maxsize);doprintf("請輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請重新輸入n");if(n<SCar->top+1)flag=0;n=S

22、Car->n;break;while(n<0|n>maxsize);SCar->n=n;if(flag!=0) printf("n修改成功!n");elseprintf("n錯(cuò)誤!車站車輛已經(jīng)超過此數(shù)!如要再輸,請?jiān)侔垂δ?n");getch();carmenu();if(b=2)int n,flag=1;printf("nn目前通道最大的容納量是:%dn",QCar->n-1);printf("n請輸入您想要的通道的最大容納量:(<=%d)n",maxsize);doprint

23、f("請輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請重新輸入n");if(n<QCar->rear+1)flag=0;n=QCar->n;break;while(n<0|n>maxsize);QCar->n=n+1;if(flag!=0) printf("n修改成功!n");elseprintf("n錯(cuò)誤!車站車輛已經(jīng)超過此數(shù)!如要再輸,請?jiān)侔垂δ?n");getch();carmenu()

24、;(6)車站管理系統(tǒng)主菜單函數(shù)void carmenu(void)/車站管理系統(tǒng)主菜單此函數(shù)是用戶與系統(tǒng)之間的一個(gè)窗口,用戶通過它來選擇相關(guān)操作。用printf語句打印出供選擇項(xiàng)目后,用不會顯的getch()得到一個(gè)字符,用開關(guān)語句switch進(jìn)行分類,判斷用戶想要執(zhí)行的操作,然后執(zhí)行相關(guān)功能函數(shù)即可。(7)主函數(shù)void main(void)為分別表示車場和通道的兩個(gè)指針變量申請空間,分別調(diào)用相應(yīng)的初始化函數(shù),得到一個(gè)合理解,然后程序流向主供選菜單,供用戶選擇執(zhí)行。void main(void)if(SCar=(Stack *)malloc(sizeof(Stack)=NULL) print

25、f("Failed!");exit(1);if(QCar=(Queue *)malloc(sizeof(Queue)=NULL)printf("Failed!");exit(1);InitStack(SCar);InitQueue(QCar);carmenu();exit(0);7 系統(tǒng)測試及其結(jié)果7.1 程序調(diào)試中的問題調(diào)試過程中的主要問題由于此停車場管理系統(tǒng)是分模塊設(shè)計(jì)的,而且在程序的實(shí)現(xiàn)過程中又使用了清屏函數(shù),所以,運(yùn)行時(shí)用戶選擇任務(wù)并且執(zhí)行完任務(wù)后,又會回到供用戶選擇功能的主界面,因此整個(gè)程序從整體上來講結(jié)構(gòu)清晰,使用方便。本程序的調(diào)試運(yùn)行,總體

26、上情況良好,但中間也出現(xiàn)了一些小問題。其中比較有代表性的主要問題有:(1)當(dāng)停車場已經(jīng)達(dá)到最大容量,但仍有車輛進(jìn)入停車場的時(shí)候,運(yùn)行界面上沒有出現(xiàn)或者說出現(xiàn)了但又跳掉了“車站已滿!車輛已經(jīng)入通道!”的提示信息。在查閱了多種資料后,在那一個(gè)printf語句后加了一個(gè)getch(),此時(shí),程序運(yùn)行結(jié)果就符合要求了,看起來也比較清晰了。(2)使用getch()語句必須使用頭文件#include<conio.h>剛開始因?yàn)闆]有使用這個(gè)頭文件,所以會出現(xiàn)getch()這個(gè)無法辨別圖4.1 錯(cuò)誤報(bào)告1(3)在對字符型的數(shù)據(jù)進(jìn)行賦值的時(shí)候,要用strcpy,而不能直接用pcar.num=pnum

27、這樣的賦值形式,這樣子會產(chǎn)生如下的錯(cuò)誤:圖4.2 錯(cuò)誤報(bào)告2正確的形式應(yīng)該是這樣的:strcpy(pcar.num,pnum);(4)同時(shí),對字符型的數(shù)據(jù)進(jìn)行比較的時(shí)候,也需要用strcmp。不過我認(rèn)為用while(pnum="#")的形式也是可以的,我試驗(yàn)了一下,結(jié)果是可以的,所以不用strcmp這個(gè)東西也是可以的。注意呀,那個(gè)#符號必須加” ”號,不加的話就有四個(gè)錯(cuò)誤了:圖4.3 錯(cuò)誤報(bào)告3(5)把通道看成是一個(gè)隊(duì)列,但在通道中的車輛數(shù)目總是少一輛,剛開始總是感覺疑問,明明就是設(shè)定maxsize為20的,通道內(nèi)的車輛為什么就只有19輛呢,后來,我突然想到原來隊(duì)列的Q-&

28、gt;front是不存放數(shù)據(jù)的,終于找到了錯(cuò)誤的地方了,所以我在定義數(shù)列的地方,把原來的Q->n=maxsize改成了Q->n=maxsize+1;結(jié)果是對的了。(6)采用清屏的功能:system("cls"); /*運(yùn)行前清屏*/剛開始不知道有這個(gè)功能,在屏幕執(zhí)行的時(shí)候,總感覺屏幕非常的復(fù)雜雜亂,感覺不是很舒服,后來問了同學(xué)一下,發(fā)現(xiàn)了這個(gè)功能,就馬上加上了這個(gè)功能,屏幕就看起來比較清晰和舒服了。(7)剛開始的時(shí)候,程序的健壯性不是很強(qiáng),在主菜單函數(shù)中選擇case多少時(shí),如果不是規(guī)定的數(shù)字范圍內(nèi)的時(shí)候,它就會直接說按任意鍵返回。所以為了增強(qiáng)程序的健壯性,在最后

29、加上default:ShowCar()這句話,在一開始運(yùn)行程序的時(shí)候,由于此時(shí)停車場內(nèi)信息沒有輸入,認(rèn)為是空的,而當(dāng)用戶選擇了退出車站的時(shí)候,程序?qū)⒔o出出錯(cuò)的信息“這停車場是空的”。(8)在結(jié)構(gòu)化程序設(shè)計(jì)中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難,所以盡量少用goto語句。因?yàn)樵诰W(wǎng)上看到了這段話,所以我就把那個(gè)車站模擬系統(tǒng)相關(guān)功能設(shè)定這個(gè)模塊改成用do-while語句的形式,其實(shí)我覺得do-while語句還是比較容易能實(shí)現(xiàn)的,而且程序也比較容易去檢測出錯(cuò)誤。(9)對于通道的假定,原本是沒有采用循環(huán)隊(duì)列的,只是采用了比較基本簡單的順序存儲隊(duì)列,后來發(fā)現(xiàn),這

30、樣子會發(fā)生“假溢出”的現(xiàn)象,所謂的“假溢出” 顧名思義就是隊(duì)列出現(xiàn)了“假滿”的情況,而不是“真滿”,比如 設(shè)隊(duì)頭指針為front,隊(duì)尾指針是rear,約定front指向隊(duì)頭元素的前一位置,rear指向隊(duì)尾元素。當(dāng)front等于-1時(shí)隊(duì)空,rear等于m-1時(shí)為隊(duì)滿。由于隊(duì)列的性質(zhì)(“刪除”在隊(duì)頭而“插入”在隊(duì)尾),所以當(dāng)隊(duì)尾指針rear等于m-1時(shí),若front不等于-1,則隊(duì)列中仍有空閑單元,所以隊(duì)列并不是真滿。這時(shí)若再有入隊(duì)操作,會造成假“溢出”。7.2 結(jié)果截圖車輛成批入站待主界面顯示出來后,按1進(jìn)入輸入車輛的界面,然后輸入你想輸入的車輛信息,然后以“# #”號結(jié)束;在此之前,你還可以先

31、設(shè)定車站和通道的容量;如下圖:1:先修改停車場與通道的容量,都改成2;圖4.1先修改停車場與通道的容量截圖 2:成批輸入三輛汽車的信息,因?yàn)橥\噲鰞?nèi)只能停兩輛汽車,所以第三輛車要停放在通道上等停,一旦停車場內(nèi)有汽車開走,通道上的車輛即可進(jìn)入;圖4.2車輛成批入站結(jié)果截圖3:待返回主界面后,按4,即會顯示出車站內(nèi)與通道上的車輛信息;圖4.3車輛成批入站結(jié)果截圖7.2.2車輛出站1:輸入想要出站的汽車牌號,然后汽車出站,接著通道上的第一輛汽車進(jìn)入停車場;圖4.4車輛出結(jié)果截圖(1)2:通道內(nèi)的車已經(jīng)進(jìn)入停車場,如下圖:圖4.5車輛出結(jié)果截圖8 心得體會通過這次的課程設(shè)計(jì),我拓寬了知識面,鍛煉了能力

32、。比如對于隊(duì)列的隊(duì)滿或者隊(duì)空的狀態(tài)呀,或者隊(duì)列的長度呀,記得我那時(shí)想了好久的一個(gè)問題,我在上面程序的調(diào)試分析里有提過,就是我明明定義maxsize等于20,可是通道內(nèi)汽車的數(shù)量卻只能輸進(jìn)19輛汽車的信息,我糾結(jié)了好久,后來,我的腦袋中突然閃過一個(gè)循環(huán)隊(duì)列的圖,那個(gè)Q->front好像是不存放數(shù)據(jù)資料的,這個(gè)Q->front這個(gè)結(jié)點(diǎn)確實(shí)是不存放數(shù)據(jù)的,這樣子一想,問題就游刃而解了,只要把原來的Q->n=maxsize改成了Q->n=maxsize+1就可以了。也許這就是課程設(shè)計(jì)的目的吧,在于把理論和實(shí)際相結(jié)合吧,把課堂上所學(xué)到的系統(tǒng)化的理論知識投到實(shí)際中,鞏固還沒有鞏固的

33、知識點(diǎn),也有助于我們提高觀察,分析和解決問題的實(shí)際工作能力,就像那時(shí)我和趙老師在對問題進(jìn)行分析時(shí),因?yàn)殡p方對汽車場通道的看法都是不同的,所以我們就進(jìn)行討論了,我覺得能和老師討論這很重要,特別是能找出程序上的不足,對完善我們的程序有著莫大的幫助,那天下午,我也改進(jìn)了程序,在程序上加上了一個(gè)選擇,就是停車場和通道的容量,可以由你更改,改變原來的默認(rèn)值,但唯一的前提是不能比默認(rèn)值大??梢哉f吧,數(shù)據(jù)結(jié)構(gòu)真的也比較難,特別是知識點(diǎn)非常的多,很容易看那個(gè)忘記了這個(gè),對于課設(shè)要用到的綜合知識,那可是難上加上,不過,這也才激發(fā)了我的興趣,有動力比別人早完成程序。很開心我做到了,既完成了課設(shè)也學(xué)到了好多知識,經(jīng)

34、歷了這一個(gè)星期,我收獲了如下的幾點(diǎn):1. 程序的設(shè)計(jì)思想的精巧的重要性,是不管怎么說都不為過的,好的程序可以讓大家很快的明白你的思想,而且很方便的來實(shí)現(xiàn)它。還有不管這程序有多長,只要你解釋了之后,別人很快就能明白,看程序也比較簡單了。2.數(shù)據(jù)結(jié)構(gòu)是一門實(shí)踐性較強(qiáng)的課程,為了學(xué)好這門課程,必須在掌握理論知識的同時(shí),加強(qiáng)上機(jī)實(shí)踐。一個(gè)人的力量是有限的,要想把課程設(shè)計(jì)做的更好,就要學(xué)會參考一定的資料,要善于捕獲資料,吸取別人的經(jīng)驗(yàn),讓自己和別人的思想有機(jī)的結(jié)合起來,得出屬于你自己的靈感。3.學(xué)會“遞進(jìn)”的思想:程序的編寫需要有耐心,有些事情看起來很復(fù)雜,但問題需要一點(diǎn)一點(diǎn)去解決,分析問題,把問題一個(gè)

35、一個(gè)劃分,劃分成小塊以后就逐個(gè)去解決。再總體解決大的問題。這樣做起來不僅有條理也使問題得到了輕松的解決。這次的程序訓(xùn)練培養(yǎng)了我實(shí)際分析問題、編程和動手能力,使我掌握了程序設(shè)計(jì)的基本技能,提高了我適應(yīng)實(shí)際,實(shí)踐編程的能力。這次的課程設(shè)計(jì)我對于專業(yè)課的學(xué)習(xí)有了更加深刻的認(rèn)識,以為現(xiàn)在學(xué)的知識用不上就加以怠慢,等到想用的時(shí)候卻發(fā)現(xiàn)自己的學(xué)習(xí)原來是那么的不扎實(shí)。以后努力學(xué)好每門專業(yè)課,讓自己擁有更多的知識,才能解決更多的問題! 總的來說,這次課程設(shè)計(jì)讓我獲益匪淺,對數(shù)據(jù)結(jié)構(gòu)也有了進(jìn)一步的理解和認(rèn)識,也讓我相信,只要你要做(just do it),沒有什么困難能難倒我們參考文獻(xiàn)【1】嚴(yán)蔚敏,吳偉民. 數(shù)

36、據(jù)結(jié)構(gòu)(C語言版).清華大學(xué)出版社,1997.【2】李春葆,曾慧,張植民. 數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)題典. 清華大學(xué)出版社,2002.【3】秦鋒,袁志祥. 數(shù)據(jù)結(jié)構(gòu)例題詳解與課程設(shè)計(jì)指導(dǎo). 中國科學(xué)技術(shù)大學(xué)出版社2007.【4】譚浩強(qiáng). C程序設(shè)計(jì). 清華大學(xué)出版社.2005.附錄/源代碼#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#define maxsize 20typedef struct carchar num10;char name10;Car;ty

37、pedef struct Car datamaxsize; int n;/棧容量設(shè)定 int top;Stack;/順序棧typedef struct Car datamaxsize; int n;/隊(duì)列容量設(shè)定 int num;/當(dāng)前通道上的車輛數(shù) int front,rear;Queue;/循環(huán)隊(duì)列Stack *SCar;/全局變量:車站內(nèi)車輛信息Queue *QCar;/全局變量:通道內(nèi)車輛信息void carmenu(void);void InitStack(Stack *S)S->top=-1;S->n=maxsize;void InitQueue(Queue *Q)Q-

38、>front=Q->rear=Q->num=0;Q->n=maxsize+1;int Push(Stack *S,Car x)/入棧操作if(S->top=S->n-1)return(-1);S->top+;S->dataS->top=x;return(0);int Pop(Stack *S,Car *px)/出棧操作if(S->top=-1)return(-1);S->top-;*px=S->dataS->top+1;return(0);int InsertQueue(Queue *Q,Car x)/入隊(duì)if(Q-

39、>rear+1)%Q->n)=Q->front)return(-1);Q->num+;Q->dataQ->rear=x;Q->rear=(Q->rear+1)%Q->n;return(0);int DeleteQueue(Queue *Q,Car *x)/出隊(duì)if(Q->front=Q->rear)return(-1);Q->num-;*x=Q->dataQ->front;Q->front=(Q->front+1)%Q->n;return(0);void ShowCar(void)/車站內(nèi)信息

40、顯示int i,front,rear;if(SCar->top=-1)printf("nn這停車場是空的!n");getch();carmenu();printf("nn目前停車場的車有:n-車牌號-車主姓名n");for(i=0;i<SCar->top+1;i+)printf(" %-13s",SCar->datai.num);printf("%18sn",SCar->);if(QCar->rear!=QCar->front)/通道內(nèi)有車輛front=

41、QCar->front;rear=QCar->rear;printf("n通道信息:n-車牌號-車主姓名n");while(front!=rear)printf(" %-13s",QCar->datafront.num);printf("%18sn",QCar->);front=(front+1)%QCar->n;getch();carmenu();void InitCarpark(void)/車輛成批入站char num8,*pnum,name10,*pname;Car pc

42、ar;pnum=num;pname=name;printf("nn請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開)(以'# #'這個(gè)符號結(jié)束):n");scanf("%s%s",pnum,pname);while(strcmp(pnum,"#")!=0)strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1) printf("n車站已滿!車輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar

43、)=-1)printf("n通道已滿,進(jìn)入通道失敗!n");scanf("%s%s",pnum,pname);printf("這批汽車已經(jīng)成功進(jìn)入停車場n");getch();carmenu();void InsertCar(void)/單個(gè)車輛入站char num10,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開):n");scanf("%s%s",pnum,pn

44、ame);strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1)printf("n車站已滿!車輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿,進(jìn)入通道失敗!n");getch();carmenu();void ExitCar(void)/車輛出站 int i,position,flag=0;Car x;Stack *S;char num10,*pnum;pnum=num;if(SCar->top=-1)/車站

45、不能為空printf("nn這停車場是空的!n");getch();carmenu();printf("nn請輸入車子的車牌號:n");/輸入出站車輛的車牌號scanf("%s",pnum);for(i=0;i<SCar->top+1;i+)if(strcmp(SCar->datai.num,pnum)=0)position=i;flag=1;if(!flag)printf("對不起,沒有找到該車的信息!");getch();carmenu();if(S=(Stack *)malloc(sizeo

46、f(Stack)=NULL)printf("Failed!");exit(1);InitStack(S);for(i=SCar->top;i>position;i-)Pop(SCar,&x);/車場出車Push(S,x);/通道入車Pop(SCar,&x);/所指定的車輛出站while(S->top!=-1)Pop(S,&x);/通道出車Push(SCar,x);/車場入車if(QCar->rear!=QCar->front)/通道內(nèi)有車輛DeleteQueue(QCar,&x);Push(SCar,x);pri

47、ntf("n退車成功!n");getch();carmenu();void SetCar(void)/車站模擬系統(tǒng)相關(guān)功能設(shè)定int b; printf("選擇1:修改停車場的容量n"); printf("選擇2:修改通道的容量n"); printf("請你選擇操作(1-2):n"); scanf("%d",&b); /*讀入選擇*/ if(b=1)int n,flag=1;printf("nn目前停車場最大的容納量是:%dn",SCar->n);printf("n請輸入您想要的停車場的最大容納量:(<=%d)n",maxsize);doprintf("請輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請重新輸入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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論