




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目 錄1 實(shí)習(xí)目的12 問(wèn)題描述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車(chē)輛成批入站6車(chē)站內(nèi)信息顯示76 詳細(xì)設(shè)計(jì)86.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類(lèi)型86.2 功能函數(shù)設(shè)計(jì)97 系統(tǒng)測(cè)試及其結(jié)果147.1 程序調(diào)試中的問(wèn)題147.2 結(jié)果截圖16車(chē)輛成批入站16車(chē)輛出站188 心得體會(huì)19參考文獻(xiàn)21附錄22停車(chē)場(chǎng)管理系統(tǒng)1 實(shí)習(xí)目的通過(guò)實(shí)習(xí),了解并初步掌握設(shè)計(jì)、實(shí)現(xiàn)較大系統(tǒng)的完整過(guò)程,包括系統(tǒng)分析、編碼設(shè)計(jì)、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計(jì)、實(shí)現(xiàn)以及操作方法,為進(jìn)一步的應(yīng)用開(kāi)
2、發(fā)打好基礎(chǔ)。2 問(wèn)題描述停車(chē)場(chǎng)是一條可以停放n輛車(chē)的狹窄通道,且只有一個(gè)大門(mén)汽車(chē)停放安到達(dá)時(shí)間的先后依次由北向南排列(大門(mén)在最南端,最先到達(dá)的第一輛車(chē)停在最北端)若停車(chē)場(chǎng)已經(jīng)停滿(mǎn)n輛車(chē),后來(lái)的汽車(chē)在便道上等候,一旦有車(chē)開(kāi)走,排在便道上的第一輛車(chē)可以開(kāi)入;當(dāng)停車(chē)場(chǎng)的某輛車(chē)要離開(kāi)時(shí),停在他后面的車(chē)要先后退為他讓路,等它開(kāi)出后其他車(chē)在按照原次序開(kāi)入車(chē)場(chǎng),每?jī)赏T谲?chē)場(chǎng)的車(chē)要安時(shí)間長(zhǎng)短繳費(fèi)。3 需求分析3.1設(shè)計(jì)思想此停車(chē)場(chǎng)管理系統(tǒng)是在一個(gè)狹長(zhǎng)的通道上的,而且只有一個(gè)大門(mén)可以供車(chē)輛進(jìn)出,并且要實(shí)現(xiàn)停車(chē)場(chǎng)內(nèi)某輛車(chē)要離開(kāi)時(shí),在它之后進(jìn)入停車(chē)場(chǎng)的車(chē)都必須先退出停車(chē)場(chǎng)為它讓路,待其開(kāi)出停車(chē)場(chǎng)后,這些輛再依原來(lái)的
3、次序進(jìn)場(chǎng)的功能,就可以設(shè)計(jì)兩個(gè)堆棧,其中一個(gè)堆棧用來(lái)模擬停車(chē)場(chǎng),另一個(gè)堆棧用來(lái)模擬臨時(shí)停車(chē)場(chǎng),該臨時(shí)停車(chē)場(chǎng)用來(lái)存放當(dāng)有車(chē)輛離開(kāi)時(shí),原來(lái)停車(chē)場(chǎng)內(nèi)為其讓路的車(chē)輛。至于當(dāng)停車(chē)場(chǎng)已滿(mǎn)時(shí),需要停放車(chē)輛的通道可以用一個(gè)循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)。當(dāng)停車(chē)場(chǎng)內(nèi)開(kāi)走一輛車(chē)時(shí),通道上便有一輛車(chē)進(jìn)入停車(chē)場(chǎng),此時(shí)只需要改變通道上車(chē)輛結(jié)點(diǎn)的連接方式就可以了,使通道上第一輛車(chē)進(jìn)入停車(chē)場(chǎng)這個(gè)堆棧,并且使通道上原來(lái)的第二輛車(chē)成為通道上的第一輛車(chē),此時(shí)只需將模擬通道的循環(huán)隊(duì)列的頭結(jié)點(diǎn)連到原來(lái)的第二輛車(chē)上就可以了。這個(gè)程序的關(guān)鍵是車(chē)輛的進(jìn)站和出站操作,以及車(chē)場(chǎng)和通道之間的相互關(guān)系。由于車(chē)站是一個(gè)很窄的、一邊開(kāi)口的車(chē)道,先進(jìn)后出,類(lèi)似數(shù)據(jù)結(jié)構(gòu)
4、中的棧結(jié)構(gòu),故車(chē)場(chǎng)用棧這種數(shù)據(jù)結(jié)構(gòu)來(lái)描述。外面的狹長(zhǎng)的通道,先進(jìn)先出,故可用隊(duì)列結(jié)構(gòu)來(lái)描述??紤]到車(chē)場(chǎng)和通道在整個(gè)程序中都要用到。故把這兩個(gè)變量定義成全局變量。本程序中的數(shù)據(jù)對(duì)象是汽車(chē),可以認(rèn)為車(chē)牌號(hào)是每個(gè)元素的關(guān)鍵項(xiàng),不能重復(fù),和現(xiàn)實(shí)中一樣,另外加了車(chē)主姓名這一數(shù)據(jù)項(xiàng),為表簡(jiǎn)潔,其他相關(guān)信息如入場(chǎng)時(shí)間,車(chē)的類(lèi)型,收取費(fèi)率等,都不再考慮,具體應(yīng)用的時(shí)候可以方便地修改得到。3.2實(shí)現(xiàn)方法對(duì)于此停車(chē)場(chǎng)管理系統(tǒng)的實(shí)現(xiàn),就是用兩個(gè)堆棧來(lái)分別模擬停車(chē)場(chǎng)以及停車(chē)場(chǎng)內(nèi)車(chē)輛為其它車(chē)輛讓路時(shí)退出停車(chē)的臨時(shí)停放地點(diǎn)。至于通道上車(chē)輛的停放則用一個(gè)循環(huán)隊(duì)列來(lái)實(shí)現(xiàn),此時(shí),通道上車(chē)輛的離開(kāi)或者進(jìn)入停車(chē)場(chǎng)只需改變此循環(huán)隊(duì)列
5、上的結(jié)點(diǎn)而已。4 概要設(shè)計(jì)4.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)第一個(gè)定義汽車(chē)的信息:車(chē)牌號(hào)num10和車(chē)主姓名name10:typedef struct carchar num10;char name10;Car;第二個(gè)定義汽車(chē)場(chǎng)的結(jié)構(gòu),在這里我把它看成是一個(gè)棧,在這里定義棧的容量等信息:typedef struct Car datamaxsize; int n;/棧容量設(shè)定 int top;Stack;/順序棧 用來(lái)存放汽車(chē)場(chǎng)內(nèi)的車(chē)輛信息第三個(gè)定義通道的結(jié)構(gòu),在這里我把它看成是一個(gè)循環(huán)隊(duì)列,在這里定義隊(duì)列胡容量等信息:typedef struct Car datamaxsize; int n;/隊(duì)列容量設(shè)定
6、int num;/當(dāng)前通道上的車(chē)輛數(shù) int front,rear;Queue;/循環(huán)隊(duì)列 用來(lái)存放通道內(nèi)的車(chē)輛信息4.4函數(shù)及功能要求1. int Push(Stack *S,Car x):創(chuàng)建入棧的操作,以實(shí)現(xiàn)車(chē)輛進(jìn)入停車(chē)場(chǎng)的操作2. int Pop(Stack *S,Car *px):創(chuàng)建出棧的操作,以實(shí)現(xiàn)車(chē)輛離開(kāi)停車(chē)場(chǎng)的操作3. int InsertQueue(Queue *Q,Car x):創(chuàng)建入隊(duì)的操作,以實(shí)現(xiàn)進(jìn)入臨時(shí)停車(chē)場(chǎng)的操作4. int DeleteQueue(Queue *Q,Car *x):創(chuàng)建出隊(duì)的操作,以實(shí)現(xiàn)離開(kāi)臨時(shí)停車(chē)場(chǎng)的操作5. void ShowCar(void
7、):創(chuàng)建顯示車(chē)站內(nèi)信息的子程序。6. void InitCarpark(void):創(chuàng)建車(chē)輛成批入站的子程序。7. void InsertCar(void):創(chuàng)建單個(gè)車(chē)輛入站的子程序。8. void ExitCar(void):創(chuàng)建車(chē)輛出站的子程序。9. Pop(SCar,&x);:提供指定車(chē)輛出站的功能。10. void SetCar(void):提供車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定的功能。11. void carmenu(void):顯示出車(chē)站管理系統(tǒng)主菜單。12. void main(void):此為主函數(shù),調(diào)用其他子程序。5 總體設(shè)計(jì)5.1總體設(shè)計(jì)圖停車(chē)場(chǎng)車(chē)輛管理 系統(tǒng)車(chē)輛出站顯示車(chē)站
8、內(nèi)汽車(chē)信息車(chē)站管理系統(tǒng)主菜單 函 數(shù)退出 系統(tǒng)車(chē)輛成批入站單個(gè)車(chē)輛入站圖2.1 功能模塊圖 運(yùn)行程序到系統(tǒng)界面,接著系統(tǒng)界面就會(huì)出現(xiàn)讓你能選擇的功能:【1】車(chē)輛成批入站【2】單個(gè)車(chē)輛入站【3】車(chē)輛出站【4】車(chē)站內(nèi)信息實(shí)時(shí)顯示【5】相關(guān)功能設(shè)定【0】退出本系統(tǒng)5.2模塊流程圖5.2.1車(chē)輛成批入站開(kāi) 始輸入汽車(chē)的車(chē)牌號(hào)還有車(chē)主姓名strcpy(pcar.num,pnum);strcpy(,pname);Push(SCar,pcar)=-1InsertQueue(QCar,pcar)=-1車(chē)站已滿(mǎn)!車(chē)輛已經(jīng)入通道!通道已滿(mǎn),進(jìn)入通道失敗!while(strcmp(pnum,&qu
9、ot;#")!=0)結(jié) 束這批汽車(chē)已經(jīng)成功進(jìn)入停車(chē)場(chǎng)nynyny圖2.2車(chē)輛成批入站流程圖5.2.2車(chē)站內(nèi)信息顯示開(kā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停車(chē)場(chǎng)內(nèi)信息顯示流程圖6 詳細(xì)設(shè)計(jì)6.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類(lèi)型前面提到,要用到棧和隊(duì)列的操作。這里,由于一個(gè)車(chē)場(chǎng)的最大容量是一定的,且車(chē)場(chǎng)最多執(zhí)行的操作是插入和刪除操作,所以用順序儲(chǔ)存結(jié)構(gòu)可以帶來(lái)更大益處。為了防止隊(duì)列中出現(xiàn)“假溢出”現(xiàn)象,這里采用了循環(huán)隊(duì)列。在模擬汽車(chē)這個(gè)對(duì)象時(shí),進(jìn)行了簡(jiǎn)化處理,只取得最核心的兩個(gè)數(shù)據(jù)項(xiàng):車(chē)牌號(hào)和車(chē)主姓名。具體數(shù)據(jù)結(jié)構(gòu)定義如下:首先定義maxsize為20:#define maxsize 20第二個(gè)再定義汽車(chē)的
11、信息:車(chē)牌號(hào)num10和車(chē)主姓名name10:typedef struct carchar num10;char name10;Car;第三個(gè)定義汽車(chē)場(chǎng)的結(jié)構(gòu),在這里我把它看成是一個(gè)棧,在這里定義棧的容量等信息:typedef struct Car datamaxsize; int n;/棧容量設(shè)定 int top;Stack;/順序棧 用來(lái)存放汽車(chē)場(chǎng)內(nèi)的車(chē)輛信息第四個(gè)定義通道的結(jié)構(gòu),在這里我把它看成是一個(gè)循環(huán)隊(duì)列,在這里定義隊(duì)列胡容量等信息:typedef struct Car datamaxsize; int n;/隊(duì)列容量設(shè)定 int num;/當(dāng)前通道上的車(chē)輛數(shù) int front,r
12、ear;Queue;/循環(huán)隊(duì)列 用來(lái)存放通道內(nèi)的車(chē)輛信息6.2 功能函數(shù)設(shè)計(jì)(1)車(chē)輛成批入站void InitCarpark(void)/車(chē)輛成批入站此函數(shù)也可以作為初始化車(chē)場(chǎng)的函數(shù),因?yàn)橐粋€(gè)車(chē)場(chǎng)剛開(kāi)始投入運(yùn)行的時(shí)候會(huì)有很多的車(chē)進(jìn)來(lái),這也是設(shè)計(jì)此函數(shù)最重要的一個(gè)原因。每行輸入一個(gè)汽車(chē)信息,最后結(jié)束的時(shí)候輸入“# #”即可。汽車(chē)信息中前面表示汽車(chē)的車(chē)牌號(hào),后面表示車(chē)主姓名,中間用空格隔開(kāi)。當(dāng)輸入汽車(chē)的數(shù)目超過(guò)規(guī)定的最大容量的時(shí)候(如果開(kāi)始不設(shè)置最大容量,默認(rèn)值為系統(tǒng)申請(qǐng)的最大值maxsize=20),自動(dòng)檢測(cè)條件,給出相關(guān)提示信息。程序如下:void InitCarpark(void)/車(chē)輛成
13、批入站char num8,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請(qǐng)輸入車(chē)子的信息(包括車(chē)牌號(hào)和車(chē)主姓名(兩者之間用空格隔開(kāi))(以'# #'這個(gè)符號(hào)結(jié)束):n");scanf("%s%s",pnum,pname);while(strcmp(pnum,"#")!=0)strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1) printf("n車(chē)站已滿(mǎn)!車(chē)輛
14、已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿(mǎn),進(jìn)入通道失敗!n");scanf("%s%s",pnum,pname);printf("這批汽車(chē)已經(jīng)成功進(jìn)入停車(chē)場(chǎng)n");getch();carmenu();(2)單個(gè)車(chē)輛入站void InsertCar(void)/單個(gè)車(chē)輛入站當(dāng)系統(tǒng)正常投入運(yùn)行后,會(huì)有零散的車(chē)輛進(jìn)進(jìn)出出,如還用成批輸入方式的話,將會(huì)帶來(lái)一定的麻煩。此函數(shù)具有函數(shù)InitCarpark()幾乎所有的功能,程序跟InitCarpark()這個(gè)差不多,同樣
15、先輸入,然后再判斷停車(chē)場(chǎng)是否滿(mǎn)了,通道是否滿(mǎn)了,最后執(zhí)行結(jié)果,程序如下:void InsertCar(void)/單個(gè)車(chē)輛入站char num10,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請(qǐng)輸入車(chē)子的信息(包括車(chē)牌號(hào)和車(chē)主姓名(兩者之間用空格隔開(kāi)):n");scanf("%s%s",pnum,pname);strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1)printf("n車(chē)站已滿(mǎn)!
16、車(chē)輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿(mǎn),進(jìn)入通道失敗!n");getch();(3)車(chē)輛內(nèi)信息顯示函數(shù)void ShowCar(void)/車(chē)站內(nèi)信息顯示如果車(chē)場(chǎng)本身是空的,沒(méi)有汽車(chē),那么也就不存在查看汽車(chē)信息了。故本函數(shù)一開(kāi)始進(jìn)行合理性檢查,如果條件不成立,拒絕執(zhí)行顯示信息操作,給出出錯(cuò)的信息后返回到主界面。前面提到,車(chē)站內(nèi)信息包括兩部分:車(chē)場(chǎng)內(nèi)停放的車(chē)輛,在外面通道上等停的車(chē)輛。因?yàn)橥ǖ郎弦膊灰欢ㄓ熊?chē),程序輸出車(chē)場(chǎng)內(nèi)的所有汽車(chē)信息后,自動(dòng)進(jìn)行判斷通道上是否有車(chē)輛。如果有車(chē)輛的話,繼續(xù)輸出停在
17、通道上的車(chē)子信息。程序如下:void ShowCar(void)/車(chē)站內(nèi)信息顯示int i,front,rear;if(SCar->top=-1)printf("nn這停車(chē)場(chǎng)是空的!n");getch();carmenu();printf("nn目前停車(chē)場(chǎng)的車(chē)有:n-車(chē)牌號(hào)-車(chē)主姓名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)有車(chē)輛front=QCar->front;rear=QCar->rear;printf("n通道信息:n-車(chē)牌號(hào)-車(chē)主姓名n");while(front!=rear)printf(" %-13s",QCar->datafront.num);printf("%18sn",QCar->);front=(front+1)%QCar->n;(4)車(chē)輛出站函數(shù)void ExitCar(void)/車(chē)輛出站同上,首先進(jìn)行和利息你給檢
19、查。這里的檢查包括兩個(gè)部分:車(chē)場(chǎng)非空且輸入的車(chē)牌號(hào)在車(chē)場(chǎng)中。如果一切條件滿(mǎn)足,則執(zhí)行推車(chē)操作。最后,檢查通道上是否有車(chē)輛等待。如果通道不為空,程序會(huì)自動(dòng)把排在通道最前面的車(chē)調(diào)入車(chē)場(chǎng)內(nèi)。其中,退車(chē)的算法過(guò)程如下:前面檢測(cè)條件滿(mǎn)足時(shí),執(zhí)行如下操作:由于車(chē)場(chǎng)很窄,當(dāng)一輛車(chē)要出場(chǎng)時(shí),排在它后面的車(chē)輛需要先出場(chǎng),等要退出的車(chē)開(kāi)走后,剛才為它讓道的那些車(chē)再按原次序進(jìn)入車(chē)場(chǎng)。不難看出,這里需要?jiǎng)?chuàng)建一個(gè)臨時(shí)棧,用于保存讓道車(chē)輛的信息。在前面的合理性檢查中,已經(jīng)定位到出場(chǎng)車(chē)輛所在位置,從棧頂開(kāi)始,到所在位置前一個(gè)結(jié)束,車(chē)場(chǎng)內(nèi)執(zhí)行出棧操作,臨時(shí)棧結(jié)構(gòu)執(zhí)行入棧操作。在當(dāng)前位置執(zhí)行出棧操作,即可實(shí)現(xiàn)指定的車(chē)輛出場(chǎng)。當(dāng)
20、臨時(shí)棧不為空時(shí),依次執(zhí)行:臨時(shí)棧退棧,車(chē)場(chǎng)內(nèi)入棧。(5)車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定函數(shù)void SetCar(void)/車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定此函數(shù)很簡(jiǎn)單,首先用一個(gè)do-while循環(huán),得到一個(gè)合理值,修改相關(guān)參數(shù)即可。這里有一個(gè)防錯(cuò)設(shè)計(jì):當(dāng)輸入的最大容量小于車(chē)場(chǎng)內(nèi)當(dāng)前的車(chē)輛數(shù)時(shí),拒絕執(zhí)行修改。程序如下:void SetCar(void)/車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定int b; printf("選擇1:修改停車(chē)場(chǎng)的容量n"); printf("選擇2:修改通道的容量n"); printf("請(qǐng)你選擇操作(1-2):n"); scan
21、f("%d",&b); /*讀入選擇*/ if(b=1)int n,flag=1;printf("nn目前停車(chē)場(chǎng)最大的容納量是:%dn",SCar->n);printf("n輸入您想要的停車(chē)場(chǎng)的最大容納量:(<=%d)n",maxsize);doprintf("請(qǐng)輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請(qǐng)重新輸入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ò)誤!車(chē)站車(chē)輛已經(jīng)超過(guò)此數(shù)!如要再輸,請(qǐng)?jiān)侔垂δ?n");getch();carmenu();if(b=2)int n,flag=1;printf("nn目前通道最大的容納量是:%dn",QCar->n-1);printf("n請(qǐng)輸入您想要的通道的最大容納量:(<=%d)n",maxsize);doprint
23、f("請(qǐng)輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請(qǐng)重新輸入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ò)誤!車(chē)站車(chē)輛已經(jīng)超過(guò)此數(shù)!如要再輸,請(qǐng)?jiān)侔垂δ?n");getch();carmenu()
24、;(6)車(chē)站管理系統(tǒng)主菜單函數(shù)void carmenu(void)/車(chē)站管理系統(tǒng)主菜單此函數(shù)是用戶(hù)與系統(tǒng)之間的一個(gè)窗口,用戶(hù)通過(guò)它來(lái)選擇相關(guān)操作。用printf語(yǔ)句打印出供選擇項(xiàng)目后,用不會(huì)顯的getch()得到一個(gè)字符,用開(kāi)關(guān)語(yǔ)句switch進(jìn)行分類(lèi),判斷用戶(hù)想要執(zhí)行的操作,然后執(zhí)行相關(guān)功能函數(shù)即可。(7)主函數(shù)void main(void)為分別表示車(chē)場(chǎng)和通道的兩個(gè)指針變量申請(qǐng)空間,分別調(diào)用相應(yīng)的初始化函數(shù),得到一個(gè)合理解,然后程序流向主供選菜單,供用戶(hù)選擇執(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)測(cè)試及其結(jié)果7.1 程序調(diào)試中的問(wèn)題調(diào)試過(guò)程中的主要問(wèn)題由于此停車(chē)場(chǎng)管理系統(tǒng)是分模塊設(shè)計(jì)的,而且在程序的實(shí)現(xiàn)過(guò)程中又使用了清屏函數(shù),所以,運(yùn)行時(shí)用戶(hù)選擇任務(wù)并且執(zhí)行完任務(wù)后,又會(huì)回到供用戶(hù)選擇功能的主界面,因此整個(gè)程序從整體上來(lái)講結(jié)構(gòu)清晰,使用方便。本程序的調(diào)試運(yùn)行,總體
26、上情況良好,但中間也出現(xiàn)了一些小問(wèn)題。其中比較有代表性的主要問(wèn)題有:(1)當(dāng)停車(chē)場(chǎng)已經(jīng)達(dá)到最大容量,但仍有車(chē)輛進(jìn)入停車(chē)場(chǎng)的時(shí)候,運(yùn)行界面上沒(méi)有出現(xiàn)或者說(shuō)出現(xiàn)了但又跳掉了“車(chē)站已滿(mǎn)!車(chē)輛已經(jīng)入通道!”的提示信息。在查閱了多種資料后,在那一個(gè)printf語(yǔ)句后加了一個(gè)getch(),此時(shí),程序運(yùn)行結(jié)果就符合要求了,看起來(lái)也比較清晰了。(2)使用getch()語(yǔ)句必須使用頭文件#include<conio.h>剛開(kāi)始因?yàn)闆](méi)有使用這個(gè)頭文件,所以會(huì)出現(xiàn)getch()這個(gè)無(wú)法辨別圖4.1 錯(cuò)誤報(bào)告1(3)在對(duì)字符型的數(shù)據(jù)進(jìn)行賦值的時(shí)候,要用strcpy,而不能直接用pcar.num=pnum
27、這樣的賦值形式,這樣子會(huì)產(chǎn)生如下的錯(cuò)誤:圖4.2 錯(cuò)誤報(bào)告2正確的形式應(yīng)該是這樣的:strcpy(pcar.num,pnum);(4)同時(shí),對(duì)字符型的數(shù)據(jù)進(jìn)行比較的時(shí)候,也需要用strcmp。不過(guò)我認(rèn)為用while(pnum="#")的形式也是可以的,我試驗(yàn)了一下,結(jié)果是可以的,所以不用strcmp這個(gè)東西也是可以的。注意呀,那個(gè)#符號(hào)必須加” ”號(hào),不加的話就有四個(gè)錯(cuò)誤了:圖4.3 錯(cuò)誤報(bào)告3(5)把通道看成是一個(gè)隊(duì)列,但在通道中的車(chē)輛數(shù)目總是少一輛,剛開(kāi)始總是感覺(jué)疑問(wèn),明明就是設(shè)定maxsize為20的,通道內(nèi)的車(chē)輛為什么就只有19輛呢,后來(lái),我突然想到原來(lái)隊(duì)列的Q-&
28、gt;front是不存放數(shù)據(jù)的,終于找到了錯(cuò)誤的地方了,所以我在定義數(shù)列的地方,把原來(lái)的Q->n=maxsize改成了Q->n=maxsize+1;結(jié)果是對(duì)的了。(6)采用清屏的功能:system("cls"); /*運(yùn)行前清屏*/剛開(kāi)始不知道有這個(gè)功能,在屏幕執(zhí)行的時(shí)候,總感覺(jué)屏幕非常的復(fù)雜雜亂,感覺(jué)不是很舒服,后來(lái)問(wèn)了同學(xué)一下,發(fā)現(xiàn)了這個(gè)功能,就馬上加上了這個(gè)功能,屏幕就看起來(lái)比較清晰和舒服了。(7)剛開(kāi)始的時(shí)候,程序的健壯性不是很強(qiáng),在主菜單函數(shù)中選擇case多少時(shí),如果不是規(guī)定的數(shù)字范圍內(nèi)的時(shí)候,它就會(huì)直接說(shuō)按任意鍵返回。所以為了增強(qiáng)程序的健壯性,在最后
29、加上default:ShowCar()這句話,在一開(kāi)始運(yùn)行程序的時(shí)候,由于此時(shí)停車(chē)場(chǎng)內(nèi)信息沒(méi)有輸入,認(rèn)為是空的,而當(dāng)用戶(hù)選擇了退出車(chē)站的時(shí)候,程序?qū)⒔o出出錯(cuò)的信息“這停車(chē)場(chǎng)是空的”。(8)在結(jié)構(gòu)化程序設(shè)計(jì)中一般不主張使用goto語(yǔ)句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難,所以盡量少用goto語(yǔ)句。因?yàn)樵诰W(wǎng)上看到了這段話,所以我就把那個(gè)車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定這個(gè)模塊改成用do-while語(yǔ)句的形式,其實(shí)我覺(jué)得do-while語(yǔ)句還是比較容易能實(shí)現(xiàn)的,而且程序也比較容易去檢測(cè)出錯(cuò)誤。(9)對(duì)于通道的假定,原本是沒(méi)有采用循環(huán)隊(duì)列的,只是采用了比較基本簡(jiǎn)單的順序存儲(chǔ)隊(duì)列,后來(lái)發(fā)現(xiàn),這
30、樣子會(huì)發(fā)生“假溢出”的現(xiàn)象,所謂的“假溢出” 顧名思義就是隊(duì)列出現(xiàn)了“假滿(mǎn)”的情況,而不是“真滿(mǎn)”,比如 設(shè)隊(duì)頭指針為front,隊(duì)尾指針是rear,約定front指向隊(duì)頭元素的前一位置,rear指向隊(duì)尾元素。當(dāng)front等于-1時(shí)隊(duì)空,rear等于m-1時(shí)為隊(duì)滿(mǎn)。由于隊(duì)列的性質(zhì)(“刪除”在隊(duì)頭而“插入”在隊(duì)尾),所以當(dāng)隊(duì)尾指針rear等于m-1時(shí),若front不等于-1,則隊(duì)列中仍有空閑單元,所以隊(duì)列并不是真滿(mǎn)。這時(shí)若再有入隊(duì)操作,會(huì)造成假“溢出”。7.2 結(jié)果截圖車(chē)輛成批入站待主界面顯示出來(lái)后,按1進(jìn)入輸入車(chē)輛的界面,然后輸入你想輸入的車(chē)輛信息,然后以“# #”號(hào)結(jié)束;在此之前,你還可以先
31、設(shè)定車(chē)站和通道的容量;如下圖:1:先修改停車(chē)場(chǎng)與通道的容量,都改成2;圖4.1先修改停車(chē)場(chǎng)與通道的容量截圖 2:成批輸入三輛汽車(chē)的信息,因?yàn)橥\?chē)場(chǎng)內(nèi)只能停兩輛汽車(chē),所以第三輛車(chē)要停放在通道上等停,一旦停車(chē)場(chǎng)內(nèi)有汽車(chē)開(kāi)走,通道上的車(chē)輛即可進(jìn)入;圖4.2車(chē)輛成批入站結(jié)果截圖3:待返回主界面后,按4,即會(huì)顯示出車(chē)站內(nèi)與通道上的車(chē)輛信息;圖4.3車(chē)輛成批入站結(jié)果截圖7.2.2車(chē)輛出站1:輸入想要出站的汽車(chē)牌號(hào),然后汽車(chē)出站,接著通道上的第一輛汽車(chē)進(jìn)入停車(chē)場(chǎng);圖4.4車(chē)輛出結(jié)果截圖(1)2:通道內(nèi)的車(chē)已經(jīng)進(jìn)入停車(chē)場(chǎng),如下圖:圖4.5車(chē)輛出結(jié)果截圖8 心得體會(huì)通過(guò)這次的課程設(shè)計(jì),我拓寬了知識(shí)面,鍛煉了能力
32、。比如對(duì)于隊(duì)列的隊(duì)滿(mǎn)或者隊(duì)空的狀態(tài)呀,或者隊(duì)列的長(zhǎng)度呀,記得我那時(shí)想了好久的一個(gè)問(wèn)題,我在上面程序的調(diào)試分析里有提過(guò),就是我明明定義maxsize等于20,可是通道內(nèi)汽車(chē)的數(shù)量卻只能輸進(jìn)19輛汽車(chē)的信息,我糾結(jié)了好久,后來(lái),我的腦袋中突然閃過(guò)一個(gè)循環(huán)隊(duì)列的圖,那個(gè)Q->front好像是不存放數(shù)據(jù)資料的,這個(gè)Q->front這個(gè)結(jié)點(diǎn)確實(shí)是不存放數(shù)據(jù)的,這樣子一想,問(wèn)題就游刃而解了,只要把原來(lái)的Q->n=maxsize改成了Q->n=maxsize+1就可以了。也許這就是課程設(shè)計(jì)的目的吧,在于把理論和實(shí)際相結(jié)合吧,把課堂上所學(xué)到的系統(tǒng)化的理論知識(shí)投到實(shí)際中,鞏固還沒(méi)有鞏固的
33、知識(shí)點(diǎn),也有助于我們提高觀察,分析和解決問(wèn)題的實(shí)際工作能力,就像那時(shí)我和趙老師在對(duì)問(wèn)題進(jìn)行分析時(shí),因?yàn)殡p方對(duì)汽車(chē)場(chǎng)通道的看法都是不同的,所以我們就進(jìn)行討論了,我覺(jué)得能和老師討論這很重要,特別是能找出程序上的不足,對(duì)完善我們的程序有著莫大的幫助,那天下午,我也改進(jìn)了程序,在程序上加上了一個(gè)選擇,就是停車(chē)場(chǎng)和通道的容量,可以由你更改,改變?cè)瓉?lái)的默認(rèn)值,但唯一的前提是不能比默認(rèn)值大。可以說(shuō)吧,數(shù)據(jù)結(jié)構(gòu)真的也比較難,特別是知識(shí)點(diǎn)非常的多,很容易看那個(gè)忘記了這個(gè),對(duì)于課設(shè)要用到的綜合知識(shí),那可是難上加上,不過(guò),這也才激發(fā)了我的興趣,有動(dòng)力比別人早完成程序。很開(kāi)心我做到了,既完成了課設(shè)也學(xué)到了好多知識(shí),經(jīng)
34、歷了這一個(gè)星期,我收獲了如下的幾點(diǎn):1. 程序的設(shè)計(jì)思想的精巧的重要性,是不管怎么說(shuō)都不為過(guò)的,好的程序可以讓大家很快的明白你的思想,而且很方便的來(lái)實(shí)現(xiàn)它。還有不管這程序有多長(zhǎng),只要你解釋了之后,別人很快就能明白,看程序也比較簡(jiǎn)單了。2.數(shù)據(jù)結(jié)構(gòu)是一門(mén)實(shí)踐性較強(qiáng)的課程,為了學(xué)好這門(mén)課程,必須在掌握理論知識(shí)的同時(shí),加強(qiáng)上機(jī)實(shí)踐。一個(gè)人的力量是有限的,要想把課程設(shè)計(jì)做的更好,就要學(xué)會(huì)參考一定的資料,要善于捕獲資料,吸取別人的經(jīng)驗(yàn),讓自己和別人的思想有機(jī)的結(jié)合起來(lái),得出屬于你自己的靈感。3.學(xué)會(huì)“遞進(jìn)”的思想:程序的編寫(xiě)需要有耐心,有些事情看起來(lái)很復(fù)雜,但問(wèn)題需要一點(diǎn)一點(diǎn)去解決,分析問(wèn)題,把問(wèn)題一個(gè)
35、一個(gè)劃分,劃分成小塊以后就逐個(gè)去解決。再總體解決大的問(wèn)題。這樣做起來(lái)不僅有條理也使問(wèn)題得到了輕松的解決。這次的程序訓(xùn)練培養(yǎng)了我實(shí)際分析問(wèn)題、編程和動(dòng)手能力,使我掌握了程序設(shè)計(jì)的基本技能,提高了我適應(yīng)實(shí)際,實(shí)踐編程的能力。這次的課程設(shè)計(jì)我對(duì)于專(zhuān)業(yè)課的學(xué)習(xí)有了更加深刻的認(rèn)識(shí),以為現(xiàn)在學(xué)的知識(shí)用不上就加以怠慢,等到想用的時(shí)候卻發(fā)現(xiàn)自己的學(xué)習(xí)原來(lái)是那么的不扎實(shí)。以后努力學(xué)好每門(mén)專(zhuān)業(yè)課,讓自己擁有更多的知識(shí),才能解決更多的問(wèn)題! 總的來(lái)說(shuō),這次課程設(shè)計(jì)讓我獲益匪淺,對(duì)數(shù)據(jù)結(jié)構(gòu)也有了進(jìn)一步的理解和認(rèn)識(shí),也讓我相信,只要你要做(just do it),沒(méi)有什么困難能難倒我們參考文獻(xiàn)【1】嚴(yán)蔚敏,吳偉民. 數(shù)
36、據(jù)結(jié)構(gòu)(C語(yǔ)言版).清華大學(xué)出版社,1997.【2】李春葆,曾慧,張植民. 數(shù)據(jù)結(jié)構(gòu)程序設(shè)計(jì)題典. 清華大學(xué)出版社,2002.【3】秦鋒,袁志祥. 數(shù)據(jù)結(jié)構(gòu)例題詳解與課程設(shè)計(jì)指導(dǎo). 中國(guó)科學(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)前通道上的車(chē)輛數(shù) int front,rear;Queue;/循環(huán)隊(duì)列Stack *SCar;/全局變量:車(chē)站內(nèi)車(chē)輛信息Queue *QCar;/全局變量:通道內(nèi)車(chē)輛信息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)/車(chē)站內(nèi)信息
40、顯示int i,front,rear;if(SCar->top=-1)printf("nn這停車(chē)場(chǎng)是空的!n");getch();carmenu();printf("nn目前停車(chē)場(chǎng)的車(chē)有:n-車(chē)牌號(hào)-車(chē)主姓名n");for(i=0;i<SCar->top+1;i+)printf(" %-13s",SCar->datai.num);printf("%18sn",SCar->);if(QCar->rear!=QCar->front)/通道內(nèi)有車(chē)輛front=
41、QCar->front;rear=QCar->rear;printf("n通道信息:n-車(chē)牌號(hào)-車(chē)主姓名n");while(front!=rear)printf(" %-13s",QCar->datafront.num);printf("%18sn",QCar->);front=(front+1)%QCar->n;getch();carmenu();void InitCarpark(void)/車(chē)輛成批入站char num8,*pnum,name10,*pname;Car pc
42、ar;pnum=num;pname=name;printf("nn請(qǐng)輸入車(chē)子的信息(包括車(chē)牌號(hào)和車(chē)主姓名(兩者之間用空格隔開(kāi))(以'# #'這個(gè)符號(hào)結(jié)束):n");scanf("%s%s",pnum,pname);while(strcmp(pnum,"#")!=0)strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1) printf("n車(chē)站已滿(mǎn)!車(chē)輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar
43、)=-1)printf("n通道已滿(mǎn),進(jìn)入通道失敗!n");scanf("%s%s",pnum,pname);printf("這批汽車(chē)已經(jīng)成功進(jìn)入停車(chē)場(chǎng)n");getch();carmenu();void InsertCar(void)/單個(gè)車(chē)輛入站char num10,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf("nn請(qǐng)輸入車(chē)子的信息(包括車(chē)牌號(hào)和車(chē)主姓名(兩者之間用空格隔開(kāi)):n");scanf("%s%s",pnum,pn
44、ame);strcpy(pcar.num,pnum);strcpy(,pname);if(Push(SCar,pcar)=-1)printf("n車(chē)站已滿(mǎn)!車(chē)輛已經(jīng)入通道!n");if(InsertQueue(QCar,pcar)=-1)printf("n通道已滿(mǎn),進(jìn)入通道失敗!n");getch();carmenu();void ExitCar(void)/車(chē)輛出站 int i,position,flag=0;Car x;Stack *S;char num10,*pnum;pnum=num;if(SCar->top=-1)/車(chē)站
45、不能為空printf("nn這停車(chē)場(chǎng)是空的!n");getch();carmenu();printf("nn請(qǐng)輸入車(chē)子的車(chē)牌號(hào):n");/輸入出站車(chē)輛的車(chē)牌號(hào)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("對(duì)不起,沒(méi)有找到該車(chē)的信息!");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);/車(chē)場(chǎng)出車(chē)Push(S,x);/通道入車(chē)Pop(SCar,&x);/所指定的車(chē)輛出站while(S->top!=-1)Pop(S,&x);/通道出車(chē)Push(SCar,x);/車(chē)場(chǎng)入車(chē)if(QCar->rear!=QCar->front)/通道內(nèi)有車(chē)輛DeleteQueue(QCar,&x);Push(SCar,x);pri
47、ntf("n退車(chē)成功!n");getch();carmenu();void SetCar(void)/車(chē)站模擬系統(tǒng)相關(guān)功能設(shè)定int b; printf("選擇1:修改停車(chē)場(chǎng)的容量n"); printf("選擇2:修改通道的容量n"); printf("請(qǐng)你選擇操作(1-2):n"); scanf("%d",&b); /*讀入選擇*/ if(b=1)int n,flag=1;printf("nn目前停車(chē)場(chǎng)最大的容納量是:%dn",SCar->n);printf("n請(qǐng)輸入您想要的停車(chē)場(chǎng)的最大容納量:(<=%d)n",maxsize);doprintf("請(qǐng)輸入數(shù)值:");scanf("%d",&n);if(n>maxsize)printf("輸入錯(cuò)誤,請(qǐng)重新輸入n");
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)業(yè)人士看2025年稅法試題及答案
- 2025年工業(yè)互聯(lián)網(wǎng)平臺(tái)TEE在智能工廠中的生產(chǎn)設(shè)備遠(yuǎn)程監(jiān)控與維護(hù)報(bào)告
- 2025年稅法考試難點(diǎn)突破試題及答案
- 工業(yè)互聯(lián)網(wǎng)平臺(tái)漏洞掃描技術(shù)2025年創(chuàng)新在智能交通信號(hào)控制系統(tǒng)中的應(yīng)用
- 企業(yè)內(nèi)部信息安全的制度建設(shè)與管理
- 掌握邏輯考試的解答技巧試題及答案
- 2025年稅法考生必看試題及答案
- 現(xiàn)代漢語(yǔ)的國(guó)際傳播試題及答案
- 現(xiàn)代漢語(yǔ)的聽(tīng)力訓(xùn)練試題及答案
- 文學(xué)體裁比較的關(guān)鍵試題及答案
- (完整版)農(nóng)業(yè)主要知識(shí)點(diǎn)
- 體育科研方法試卷試題答案
- 《國(guó)家電網(wǎng)公司十八項(xiàng)電網(wǎng)反事故措施(試行)》實(shí)施細(xì)則
- 射線檢測(cè)操作指導(dǎo)書(shū)
- 中國(guó)民主同盟入盟申請(qǐng)表(樣表)
- 國(guó)家標(biāo)準(zhǔn)色卡電子版(WORD版圖片)
- 9種基坑坍塌案例
- 《呼吸機(jī)的使用管理》PPT課件.ppt
- 《手機(jī)攝影》全套課件(完整版)
- 年產(chǎn)10萬(wàn)噸甲醇低壓羰基化合成醋酸精制工段工藝設(shè)計(jì)(共56頁(yè))
- 兒童相聲劇本43286
評(píng)論
0/150
提交評(píng)論