版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課 程 設(shè) 計 報 告</p><p> 課程名稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 </p><p> 課題名稱 停車場管理系統(tǒng) </p><p> 專 業(yè) 信息管理與信息系統(tǒng) </p><p> 班 級
2、 </p><p> 學(xué) 號 </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p> 2011年 1 月 9 日</p><p> 一、
3、設(shè)計內(nèi)容與設(shè)計要求</p><p><b> 1.設(shè)計內(nèi)容:</b></p><p> [問題描述] 設(shè)停車場只是一個可停放幾輛汽車的狹長通道,且只有一個大門可供汽車進(jìn)出,還有一個等停的的狹長通道。汽車在停車場內(nèi)按車輛的先后順序依次排列,若車站內(nèi)已停滿汽車,則后來的汽車只能在門外的通道上等停,一旦停車場內(nèi)有車開走,則排在通道上的第一輛車即可進(jìn)入;當(dāng)停車場內(nèi)某輛車要
4、離開時,由于停車場是狹長的通道,在它之后開入的車輛必須先退出車站為它讓路,待該車輛開出大門,為它讓路的車輛再按原來次序進(jìn)入車場。在這里假設(shè)汽車不能從便道上開走,試設(shè)計這樣一個停車場模擬管理程序。</p><p><b> [基本功能]</b></p><p> ?。?) 車輛成批入站。</p><p> 當(dāng)一個停車場剛開始投入運行的時候,會
5、有很多車進(jìn)來,因此,要設(shè)計一個函數(shù)來實現(xiàn)車輛批量進(jìn)站。并要檢測車輛的數(shù)目是否超過規(guī)定的最大容量,給出相關(guān)提示信息。</p><p> ?。?)單個車輛入站。</p><p> 當(dāng)系統(tǒng)正常投入運行后,會有零散的車輛進(jìn)進(jìn)出出,因此,設(shè)計一個函數(shù)實現(xiàn)單個車輛入站。</p><p> ?。?)車站內(nèi)信息實時顯示。</p><p> 車站內(nèi)信息包括
6、兩個部分:停車場內(nèi)停放的車輛以及在外面通道上等停的車輛。</p><p><b> ?。?)車輛出站。</b></p><p> 當(dāng)停車場內(nèi)車輛出站后,檢查通道上是否有車等停,如果有,則要把排在最前面的車調(diào)入停車場內(nèi)。</p><p><b> 2.設(shè)計要求:</b></p><p> 1).
7、設(shè)計正確,方案合理。</p><p> 2).界面友好,使用方便。</p><p> 3).程序精煉,結(jié)構(gòu)清晰。</p><p> 4).設(shè)計報告5000字以上,含程序設(shè)計說明、系統(tǒng)的功能框圖、流程圖、源程序清單等。</p><p> 5).實際操作過程中遇到的問題及解決方法:設(shè)計總結(jié)及心得體會。</p><p&g
8、t;<b> 6).上機演示。</b></p><p><b> 二、進(jìn)度安排</b></p><p> 第 19 周 星期一 8時:00分——11時:30分</p><p> 星期二 8時:00分——11時:30分</p><p> 星期三 14時:00分——17時:30分<
9、/p><p> 星期四 14時:00分——17時:30分</p><p> 星期五 8時:00分——11時:30分</p><p> 第 20 周 星期一 8時:00分——11時:30分 </p><p><b> 附:</b></p><p> 課程設(shè)計報告裝訂順序:封
10、面、任務(wù)書、目錄、正文、評分、附件(A4大小的圖紙及程序清單)。 </p><p> 正文的格式:一級標(biāo)題用3號黑體,二級標(biāo)題用四號宋體加粗,正文用小四號宋體;行距為22。</p><p> 正文的內(nèi)容:一、課題的主要功能;二、課題的功能模塊的劃分(要求畫出模塊圖);三、主要功能的實現(xiàn)(至少要有一個主要模塊的流程圖);四、程序調(diào)試;五、總結(jié);六、附件(所有程序的源代碼,要求對程序?qū)懗?/p>
11、必要的注釋)。</p><p> 正文總字?jǐn)?shù)要求在5000字以上(不含程序源代碼)。</p><p><b> 目 錄</b></p><p> 1 系統(tǒng)需求分析1</p><p><b> 1.1設(shè)計思想1</b></p><p><b> 1.2實
12、現(xiàn)方法1</b></p><p><b> 2 總體設(shè)計2</b></p><p> 2.1總體設(shè)計圖2</p><p> 2.2模塊流程圖3</p><p> 2.2.1:車輛成批入站3</p><p> 2.2.2:車站內(nèi)信息顯示4</p>&l
13、t;p><b> 3 詳細(xì)設(shè)計5</b></p><p> 3.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類型5</p><p> 3.2 功能函數(shù)設(shè)計6</p><p> 4 系統(tǒng)測試及其結(jié)果11</p><p> 4.1 程序調(diào)試中的問題11</p><p> 4.2 結(jié)果截圖
14、13</p><p> 4.2.1:case1:車輛成批入站13</p><p> 4.2.2:case3:車輛出站15</p><p><b> 5 心得體會16</b></p><p><b> 6 附錄18</b></p><p> 6.1源程序代碼
15、18</p><p> 6.2 參考文獻(xiàn)24</p><p><b> 7 評分表25</b></p><p><b> 1 系統(tǒng)需求分析</b></p><p><b> 1.1設(shè)計思想</b></p><p> 此停車場管理系統(tǒng)是在一個
16、狹長的通道上的,而且只有一個大門可以供車輛進(jìn)出,并且要實現(xiàn)停車場內(nèi)某輛車要離開時,在它之后進(jìn)入停車場的車都必須先退出停車場為它讓路,待其開出停車場后,這些輛再依原來的次序進(jìn)場的功能,就可以設(shè)計兩個堆棧,其中一個堆棧用來模擬停車場,另一個堆棧用來模擬臨時停車場,該臨時停車場用來存放當(dāng)有車輛離開時,原來停車場內(nèi)為其讓路的車輛。至于當(dāng)停車場已滿時,需要停放車輛的通道可以用一個循環(huán)隊列來實現(xiàn)。當(dāng)停車場內(nèi)開走一輛車時,通道上便有一輛車進(jìn)入停車場,
17、此時只需要改變通道上車輛結(jié)點的連接方式就可以了,使通道上第一輛車進(jìn)入停車場這個堆棧,并且使通道上原來的第二輛車成為通道上的第一輛車,此時只需將模擬通道的循環(huán)隊列的頭結(jié)點連到原來的第二輛車上就可以了。</p><p> 這個程序的關(guān)鍵是車輛的進(jìn)站和出站操作,以及車場和通道之間的相互關(guān)系。由于車站是一個很窄的、一邊開口的車道,先進(jìn)后出,類似數(shù)據(jù)結(jié)構(gòu)中的棧結(jié)構(gòu),故車場用棧這種數(shù)據(jù)結(jié)構(gòu)來描述。外面的狹長的通道,先進(jìn)先出
18、,故可用隊列結(jié)構(gòu)來描述??紤]到車場和通道在整個程序中都要用到。故把這兩個變量定義成全局變量。本程序中的數(shù)據(jù)對象是汽車,可以認(rèn)為車牌號是每個元素的關(guān)鍵項,不能重復(fù),和現(xiàn)實中一樣,另外加了車主姓名這一數(shù)據(jù)項,為表簡潔,其他相關(guān)信息如入場時間,車的類型,收取費率等,都不再考慮,具體應(yīng)用的時候可以方便地修改得到。</p><p><b> 1.2實現(xiàn)方法</b></p><p&
19、gt; 對于此停車場管理系統(tǒng)的實現(xiàn),就是用兩個堆棧來分別模擬停車場以及停車場內(nèi)車輛為其它車輛讓路時退出停車的臨時停放地點。至于通道上車輛的停放則用一個循環(huán)隊列來實現(xiàn),此時,通道上車輛的離開或者進(jìn)入停車場只需改變此循環(huán)隊列上的結(jié)點而已。</p><p><b> 2 總體設(shè)計</b></p><p><b> 2.1總體設(shè)計圖</b><
20、/p><p> 圖2.1 功能模塊圖 </p><p> 運行程序到系統(tǒng)界面,接著系統(tǒng)界面就會出現(xiàn)讓你能選擇的功能:</p><p><b> 【1】車輛成批入站</b></p><p><b> 【2】單個車輛入站</b></p><p><b> 【3】車
21、輛出站</b></p><p> 【4】車站內(nèi)信息實時顯示</p><p><b> 【5】相關(guān)功能設(shè)定</b></p><p><b> 【0】退出本系統(tǒng)</b></p><p><b> 2.2模塊流程圖</b></p><p>
22、 2.2.1:車輛成批入站</p><p> 圖2.2車輛成批入站流程圖</p><p> 2.2.2:車站內(nèi)信息顯示</p><p> 圖2.3停車場內(nèi)信息顯示流程圖</p><p><b> 3 詳細(xì)設(shè)計</b></p><p> 3.1 采用結(jié)構(gòu)體定義的相關(guān)數(shù)據(jù)類型</p&
23、gt;<p> 前面提到,要用到棧和隊列的操作。這里,由于一個車場的最大容量是一定的,且車場最多執(zhí)行的操作是插入和刪除操作,所以用順序儲存結(jié)構(gòu)可以帶來更大益處。為了防止隊列中出現(xiàn)“假溢出”現(xiàn)象,這里采用了循環(huán)隊列。在模擬汽車這個對象時,進(jìn)行了簡化處理,只取得最核心的兩個數(shù)據(jù)項:車牌號和車主姓名。具體數(shù)據(jù)結(jié)構(gòu)定義如下:</p><p> 首先定義maxsize為20:</p><
24、;p> #define maxsize 20</p><p> 第二個再定義汽車的信息:車牌號num[10]和車主姓名name[10]:</p><p> typedef struct car{</p><p> char num[10];</p><p> char name[10];</p><p>
25、;<b> }Car;</b></p><p> 第三個定義汽車場的結(jié)構(gòu),在這里我把它看成是一個棧,在這里定義棧的容量等信息:</p><p> typedef struct {</p><p> Car data[maxsize];</p><p> int n;//棧容量設(shè)定 </p><
26、;p><b> int top;</b></p><p> }Stack;//順序棧 用來存放汽車場內(nèi)的車輛信息</p><p> 第四個定義通道的結(jié)構(gòu),在這里我把它看成是一個循環(huán)隊列,在這里定義隊列胡容量等信息:</p><p> typedef struct {</p><p> Car data[
27、maxsize];</p><p> int n;//隊列容量設(shè)定</p><p> int num;//當(dāng)前通道上的車輛數(shù)</p><p> int front,rear;</p><p> }Queue;//循環(huán)隊列 用來存放通道內(nèi)的車輛信息</p><p> 3.2 功能函數(shù)設(shè)計</p>
28、<p> (1)車輛成批入站void InitCarpark(void)//車輛成批入站</p><p> 此函數(shù)也可以作為初始化車場的函數(shù),因為一個車場剛開始投入運行的時候會有很多的車進(jìn)來,這也是設(shè)計此函數(shù)最重要的一個原因。每行輸入一個汽車信息,最后結(jié)束的時候輸入“# #”即可。汽車信息中前面表示汽車的車牌號,后面表示車主姓名,中間用空格隔開。當(dāng)輸入汽車的數(shù)目超過規(guī)定的最大容量的時候(如果開始不
29、設(shè)置最大容量,默認(rèn)值為系統(tǒng)申請的最大值maxsize=20),自動檢測條件,給出相關(guān)提示信息。程序如下:</p><p> void InitCarpark(void)//車輛成批入站</p><p> {char num[8],*pnum,name[10],*pname;</p><p><b> Car pcar;</b></
30、p><p><b> pnum=num;</b></p><p> pname=name;</p><p> printf("\n\n請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開))(以'# #'這個符號結(jié)束):\n");</p><p> scanf("%
31、s%s",pnum,pname);</p><p> while(strcmp(pnum,"#")!=0)</p><p> {strcpy(pcar.num,pnum);</p><p> strcpy(pcar.name,pname);</p><p> if(Push(SCar,pcar)==-1
32、)</p><p> { printf("\n車站已滿!車輛已經(jīng)入通道!\n");</p><p> if(InsertQueue(QCar,pcar)==-1)</p><p> printf("\n通道已滿,進(jìn)入通道失敗!!\n");</p><p><b> }</b>
33、;</p><p> scanf("%s%s",pnum,pname);</p><p><b> }</b></p><p> printf("這批汽車已經(jīng)成功進(jìn)入停車場\n");</p><p><b> getch();</b></p>
34、;<p> carmenu();</p><p><b> }</b></p><p> (2)單個車輛入站void InsertCar(void)//單個車輛入站</p><p> 當(dāng)系統(tǒng)正常投入運行后,會有零散的車輛進(jìn)進(jìn)出出,如還用成批輸入方式的話,將會帶來一定的麻煩。此函數(shù)具有函數(shù)InitCarpark()幾乎所有的
35、功能,程序跟InitCarpark()這個差不多,同樣先輸入,然后再判斷停車場是否滿了,通道是否滿了,最后執(zhí)行結(jié)果,程序如下:</p><p> void InsertCar(void)//單個車輛入站</p><p> {char num[10],*pnum,name[10],*pname;</p><p><b> Car pcar;</
36、b></p><p><b> pnum=num;</b></p><p> pname=name;</p><p> printf("\n\n請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開)):\n");</p><p> scanf("%s%s",pn
37、um,pname);</p><p> strcpy(pcar.num,pnum);</p><p> strcpy(pcar.name,pname);</p><p> if(Push(SCar,pcar)==-1)</p><p> {printf("\n車站已滿!車輛已經(jīng)入通道!\n");</p>
38、<p> if(InsertQueue(QCar,pcar)==-1)</p><p> printf("\n通道已滿,進(jìn)入通道失敗!\n");</p><p><b> getch();</b></p><p><b> }</b></p><p> ?。?/p>
39、3)車輛內(nèi)信息顯示函數(shù)void ShowCar(void)//車站內(nèi)信息顯示</p><p> 如果車場本身是空的,沒有汽車,那么也就不存在查看汽車信息了。故本函數(shù)一開始進(jìn)行合理性檢查,如果條件不成立,拒絕執(zhí)行顯示信息操作,給出出錯的信息后返回到主界面。前面提到,車站內(nèi)信息包括兩部分:車場內(nèi)停放的車輛,在外面通道上等停的車輛。因為通道上也不一定有車,程序輸出車場內(nèi)的所有汽車信息后,自動進(jìn)行判斷通道上是否有車輛。
40、如果有車輛的話,繼續(xù)輸出停在通道上的車子信息。程序如下:</p><p> void ShowCar(void)//車站內(nèi)信息顯示</p><p> {int i,front,rear;</p><p> if(SCar->top==-1)</p><p> {printf("\n\n這停車場是空的!\n"
41、;);getch();carmenu();}</p><p> printf("\n\n目前停車場的車有:\n---車牌號-----------車主姓名\n");</p><p> for(i=0;i<SCar->top+1;i++)</p><p> {printf(" %-13s",SCar-&
42、gt;data[i].num);</p><p> printf("%18s\n",SCar->data[i].name);}</p><p> if(QCar->rear!=QCar->front)//通道內(nèi)有車輛</p><p> {front=QCar->front;rear=QCar->rear;<
43、;/p><p> printf("\n通道信息:\n---車牌號--------------車主姓名\n");</p><p> while(front!=rear)</p><p> {printf(" %-13s",QCar->data[front].num);</p><p>
44、 printf("%18s\n",QCar->data[front].name);</p><p> front=(front+1)%QCar->n;}</p><p><b> }</b></p><p><b> }</b></p><p> ?。?)車輛出
45、站函數(shù)void ExitCar(void)//車輛出站</p><p> 同上,首先進(jìn)行和利息你給檢查。這里的檢查包括兩個部分:車場非空且輸入的車牌號在車場中。如果一切條件滿足,則執(zhí)行推車操作。最后,檢查通道上是否有車輛等待。如果通道不為空,程序會自動把排在通道最前面的車調(diào)入車場內(nèi)。</p><p> 其中,退車的算法過程如下:</p><p> 前面檢測條件
46、滿足時,執(zhí)行如下操作:由于車場很窄,當(dāng)一輛車要出場時,排在它后面的車輛需要先出場,等要退出的車開走后,剛才為它讓道的那些車再按原次序進(jìn)入車場。不難看出,這里需要創(chuàng)建一個臨時棧,用于保存讓道車輛的信息。</p><p> 在前面的合理性檢查中,已經(jīng)定位到出場車輛所在位置,從棧頂開始,到所在位置前一個結(jié)束,車場內(nèi)執(zhí)行出棧操作,臨時棧結(jié)構(gòu)執(zhí)行入棧操作。</p><p> 在當(dāng)前位置執(zhí)行出棧操
47、作,即可實現(xiàn)指定的車輛出場。</p><p> 當(dāng)臨時棧不為空時,依次執(zhí)行:臨時棧退棧,車場內(nèi)入棧。</p><p> ?。?)車站模擬系統(tǒng)相關(guān)功能設(shè)定函數(shù)void SetCar(void)//車站模擬系統(tǒng)相關(guān)功能設(shè)定</p><p> 此函數(shù)很簡單,首先用一個do-while循環(huán),得到一個合理值,修改相關(guān)參數(shù)即可。這里有一個防錯設(shè)計:當(dāng)輸入的最大容量小于車場內(nèi)
48、當(dāng)前的車輛數(shù)時,拒絕執(zhí)行修改。程序如下:</p><p> void SetCar(void)//車站模擬系統(tǒng)相關(guān)功能設(shè)定</p><p><b> {int b; </b></p><p> printf("選擇1:修改停車場的容量\n");</p><p> printf("選
49、擇2:修改通道的容量\n");</p><p> printf("請你選擇操作(1-2):\n"); </p><p> scanf("%d",&b); /*讀入選擇*/ </p><p><b> if(b==1)</b></p><p> {int n
50、,flag=1;</p><p> printf("\n\n目前停車場最大的容納量是:%d\n",SCar->n);</p><p> printf("\n輸入您想要的停車場的最大容納量:(<=%d)\n",maxsize);</p><p> do{printf("請輸入數(shù)值:");
51、</p><p> scanf("%d",&n);</p><p> if(n>maxsize){printf("輸入錯誤,請重新輸入\n");}</p><p> if(n<SCar->top+1)</p><p><b> {flag=0;</b&
52、gt;</p><p> n=SCar->n;</p><p><b> break;</b></p><p><b> }</b></p><p> }while(n<0||n>maxsize);</p><p> SCar->n=n;&l
53、t;/p><p> if(flag!=0) printf("\n修改成功!\n");</p><p><b> else</b></p><p> printf("\n錯誤!車站車輛已經(jīng)超過此數(shù)!如要再輸,請再按功能5\n");</p><p><b> getch(
54、);</b></p><p> carmenu();}</p><p><b> if(b==2)</b></p><p> {int n,flag=1;</p><p> printf("\n\n目前通道最大的容納量是:%d\n",QCar->n-1);</p>
55、;<p> printf("\n請輸入您想要的通道的最大容納量:(<=%d)\n",maxsize);</p><p> do{printf("請輸入數(shù)值:");</p><p> scanf("%d",&n);</p><p> if(n>maxsize){pr
56、intf("輸入錯誤,請重新輸入\n");}</p><p> if(n<QCar->rear+1)</p><p><b> {flag=0;</b></p><p> n=QCar->n;</p><p><b> break;</b></p
57、><p><b> }</b></p><p> }while(n<0||n>maxsize);</p><p> QCar->n=n+1;</p><p> if(flag!=0) printf("\n修改成功!\n");</p><p><b&g
58、t; else</b></p><p> printf("\n錯誤!車站車輛已經(jīng)超過此數(shù)!如要再輸,請再按功能5\n");</p><p><b> getch();</b></p><p> carmenu();}}</p><p> ?。?)車站管理系統(tǒng)主菜單函數(shù)void ca
59、rmenu(void)//車站管理系統(tǒng)主菜單</p><p> 此函數(shù)是用戶與系統(tǒng)之間的一個窗口,用戶通過它來選擇相關(guān)操作。用printf語句打印出供選擇項目后,用不會顯的getch()得到一個字符,用開關(guān)語句switch進(jìn)行分類,判斷用戶想要執(zhí)行的操作,然后執(zhí)行相關(guān)功能函數(shù)即可。</p><p> (7)主函數(shù)void main(void)</p><p>
60、 為分別表示車場和通道的兩個指針變量申請空間,分別調(diào)用相應(yīng)的初始化函數(shù),得到一個合理解,然后程序流向主供選菜單,供用戶選擇執(zhí)行。</p><p> void main(void)</p><p> {if((SCar=(Stack *)malloc(sizeof(Stack)))==NULL)</p><p> { printf("Failed!&q
61、uot;);exit(1);}</p><p> if((QCar=(Queue *)malloc(sizeof(Queue)))==NULL)</p><p> {printf("Failed!");exit(1);}</p><p> InitStack(SCar);InitQueue(QCar);</p><p&g
62、t; carmenu();exit(0);</p><p><b> }</b></p><p> 4 系統(tǒng)測試及其結(jié)果</p><p> 4.1 程序調(diào)試中的問題</p><p> 調(diào)試過程中的主要問題</p><p> 由于此停車場管理系統(tǒng)是分模塊設(shè)計的,而且在程序的實現(xiàn)過程中又使
63、用了清屏函數(shù),所以,運行時用戶選擇任務(wù)并且執(zhí)行完任務(wù)后,又會回到供用戶選擇功能的主界面,因此整個程序從整體上來講結(jié)構(gòu)清晰,使用方便。本程序的調(diào)試運行,總體上情況良好,但中間也出現(xiàn)了一些小問題。其中比較有代表性的主要問題有:</p><p> ?。?)當(dāng)停車場已經(jīng)達(dá)到最大容量,但仍有車輛進(jìn)入停車場的時候,運行界面上沒有出現(xiàn)或者說出現(xiàn)了但又跳掉了“車站已滿!車輛已經(jīng)入通道!”的提示信息。在查閱了多種資料后,在那一個p
64、rintf語句后加了一個getch(),此時,程序運行結(jié)果就符合要求了,看起來也比較清晰了。</p><p> ?。?)使用getch()語句必須使用頭文件#include<conio.h></p><p> 剛開始因為沒有使用這個頭文件,所以會出現(xiàn)getch()這個無法辨別</p><p> 圖4.1 錯誤報告1</p><p&
65、gt; (3)在對字符型的數(shù)據(jù)進(jìn)行賦值的時候,要用strcpy,而不能直接用pcar.num=pnum這樣的賦值形式,這樣子會產(chǎn)生如下的錯誤:</p><p> 圖4.2 錯誤報告2</p><p> 正確的形式應(yīng)該是這樣的:strcpy(pcar.num,pnum);</p><p> (4)同時,對字符型的數(shù)據(jù)進(jìn)行比較的時候,也需要用strcmp。<
66、;/p><p> 不過我認(rèn)為用while(pnum=="#")的形式也是可以的,我試驗了一下,結(jié)果是可以的,所以不用strcmp這個東西也是可以的。</p><p> 注意呀,那個#符號必須加” ”號,不加的話就有四個錯誤了:</p><p> 圖4.3 錯誤報告3</p><p> ?。?)把通道看成是一個隊列,但在通
67、道中的車輛數(shù)目總是少一輛,剛開始總是感覺疑問,明明就是設(shè)定maxsize為20的,通道內(nèi)的車輛為什么就只有19輛呢,后來,我突然想到原來隊列的Q->front是不存放數(shù)據(jù)的,終于找到了錯誤的地方了,所以我在定義數(shù)列的地方,把原來的Q->n=maxsize改成了Q->n=maxsize+1;結(jié)果是對的了。</p><p> ?。?)采用清屏的功能:system("cls");
68、/*運行前清屏*/</p><p> 剛開始不知道有這個功能,在屏幕執(zhí)行的時候,總感覺屏幕非常的復(fù)雜雜亂,感覺不是很舒服,后來問了同學(xué)一下,發(fā)現(xiàn)了這個功能,就馬上加上了這個功能,屏幕就看起來比較清晰和舒服了。</p><p> (7)剛開始的時候,程序的健壯性不是很強,在主菜單函數(shù)中選擇case多少時,如果不是規(guī)定的數(shù)字范圍內(nèi)的時候,它就會直接說按任意鍵返回。所以為了增強程序的健壯性,
69、在最后加上default:ShowCar()這句話,在一開始運行程序的時候,由于此時停車場內(nèi)信息沒有輸入,認(rèn)為是空的,而當(dāng)用戶選擇了退出車站的時候,程序?qū)⒔o出出錯的信息“這停車場是空的”。</p><p> (8)在結(jié)構(gòu)化程序設(shè)計中一般不主張使用goto語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難,所以盡量少用goto語句。因為在網(wǎng)上看到了這段話,所以我就把那個車站模擬系統(tǒng)相關(guān)功能設(shè)定這個模塊改成
70、用do-while語句的形式,其實我覺得do-while語句還是比較容易能實現(xiàn)的,而且程序也比較容易去檢測出錯誤。</p><p> ?。?)對于通道的假定,原本是沒有采用循環(huán)隊列的,只是采用了比較基本簡單的順序存儲隊列,后來發(fā)現(xiàn),這樣子會發(fā)生“假溢出”的現(xiàn)象,所謂的“假溢出” 顧名思義就是隊列出現(xiàn)了“假滿”的情況,而不是“真滿”,比如 設(shè)隊頭指針為front,隊尾指針是rear,約定front指向隊頭元素的前一
71、位置,rear指向隊尾元素。當(dāng)front等于-1時隊空,rear等于m-1時為隊滿。由于隊列的性質(zhì)(“刪除”在隊頭而“插入”在隊尾),所以當(dāng)隊尾指針rear等于m-1時,若front不等于-1,則隊列中仍有空閑單元,所以隊列并不是真滿。這時若再有入隊操作,會造成假“溢出”。</p><p><b> 4.2 結(jié)果截圖</b></p><p> 4.2.1:case
72、1:車輛成批入站</p><p> 待主界面顯示出來后,按1進(jìn)入輸入車輛的界面,然后輸入你想輸入的車輛信息,然后以“# #”號結(jié)束;在此之前,你還可以先設(shè)定車站和通道的容量;如下圖:</p><p> 1:先修改停車場與通道的容量,都改成2;</p><p> 圖4.4車輛成批入站結(jié)果截圖(1)</p><p> 圖4.5車輛成批入站
73、結(jié)果截圖(2)</p><p> 2:成批輸入三輛汽車的信息,因為停車場內(nèi)只能停兩輛汽車,所以第三輛車要停放在通道上等停,一旦停車場內(nèi)有汽車開走,通道上的車輛即可進(jìn)入;</p><p> 圖4.6車輛成批入站結(jié)果截圖(3)</p><p> 3:待返回主界面后,按4,即會顯示出車站內(nèi)與通道上的車輛信息;</p><p> 圖4.7車輛
74、成批入站結(jié)果截圖(4)</p><p> 4.2.2:case3:車輛出站</p><p> 1:輸入想要出站的汽車牌號,然后汽車出站,接著通道上的第一輛汽車進(jìn)入停車場;</p><p> 圖4.8車輛出結(jié)果截圖(1)</p><p> 2:通道內(nèi)的車已經(jīng)進(jìn)入停車場,如下圖:</p><p> 圖4.9車輛出
75、結(jié)果截圖(2)</p><p><b> 5 心得體會</b></p><p> 2011年1月12日星期三,我終于把忙了一個星期的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計做完了,感覺有點累吧,這一個星期,幾乎每天都對著電腦,或者就是在圖書館的205借書室TP書柜那邊查閱相關(guān)的資料,還要被圖書館的老師說要關(guān)門啦,請自習(xí)的同學(xué)趕緊出去,可是因為沒有找到我想要的答案或者是資料,我就是想賴著不
76、想走,沒辦法,圖書館的老師比較大,我還是悶悶不樂的出去了。不過,今天看見我完成了的程序,我感到非常的高興,我全身的那種疲憊感嗖的一聲,全都不見了,身上的壓力感,責(zé)任感也變得輕了好多,整個人也感覺變輕松了,只因為我把程序改完了,臉上的表情也慢慢的從繃緊的狀態(tài)變成了松弛的狀態(tài),慢慢恢復(fù)原來的搞怪和喜歡幫人了(Ps:因為做這個程序有時候比較心煩,那時別人叫我?guī)退匆幌鲁绦?,因為自己的沒搞好,哪有心情看別人的呀,那種程序都好長的說,所以就拒絕了
77、,現(xiàn)在想起來,誒,只能說對不起嘍)。</p><p> 好嘍,廢話都說完了,還是切入正題要緊……</p><p> 話說這也是我第三次做課程設(shè)計了,第一次是做唐志航老師的《C語言課程設(shè)計》,第二次是做李峰老師的《計算機軟件與系統(tǒng)》的課程設(shè)計,這是第三次,名字是《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計之停車場管理系統(tǒng)》,剛開始拿到停車場系統(tǒng)這個題目的時候,我就有點迷茫了,我在想為什么我拿到的不是生死者游戲或者
78、是別的什么課程設(shè)計,偏偏讓我拿到了這個比較復(fù)雜的課程設(shè)計,沒辦法,學(xué)號是12號,左算右算除以5余數(shù)還是為2。不過也許是因為這個程序比較復(fù)雜,我學(xué)到了許多很重要的知識,除了鞏固設(shè)計語言外,而且了解了很多程序設(shè)計的實現(xiàn)方法,對《數(shù)據(jù)結(jié)構(gòu)》這本書有了更深程度的認(rèn)同。后來,我把程序給敲完了,我才發(fā)現(xiàn),其實你只要把這個程序分模塊完成,其實一點都不難,這好像《數(shù)據(jù)結(jié)構(gòu)》中所學(xué)的“遞進(jìn)”思想吧,先算簡單的,然后再返回再做比較復(fù)雜的。</p>
79、;<p> 通過這次的課程設(shè)計,我拓寬了知識面,鍛煉了能力。比如對于隊列的隊滿或者隊空的狀態(tài)呀,或者隊列的長度呀,記得我那時想了好久的一個問題,我在上面程序的調(diào)試分析里有提過,就是我明明定義maxsize等于20,可是通道內(nèi)汽車的數(shù)量卻只能輸進(jìn)19輛汽車的信息,我糾結(jié)了好久,后來,我的腦袋中突然閃過一個循環(huán)隊列的圖,那個Q->front好像是不存放數(shù)據(jù)資料的,后來我問了趙老師,也確認(rèn)了,這個Q->front這
80、個結(jié)點確實是不存放數(shù)據(jù)的,這樣子一想,問題就游刃而解了,只要把原來的Q->n=maxsize改成了Q->n=maxsize+1就OK了。</p><p> 也許這就是課程設(shè)計的目的吧,在于把理論和實際相結(jié)合吧,把課堂上所學(xué)到的系統(tǒng)化的理論知識投到實際中,鞏固還沒有鞏固的知識點,也有助于我們提高觀察,分析和解決問題的實際工作能力,就像那時我和趙老師在對問題進(jìn)行分析時,因為雙方對汽車場通道的看法都是不同
81、的,所以我們就進(jìn)行討論了,我覺得能和老師討論這很重要,特別是能找出程序上的不足,對完善我們的程序有著莫大的幫助,那天下午,我也改進(jìn)了程序,在程序上加上了一個選擇,就是停車場和通道的容量,可以由你更改,改變原來的默認(rèn)值,但唯一的前提是不能比默認(rèn)值大,所以,很謝謝趙老師。</p><p> 可以說吧,《數(shù)據(jù)結(jié)構(gòu)》真的也比較難,特別是知識點非常的多,很容易看那個忘記了這個,對于課設(shè)要用到的綜合知識,那可是難上加上,不
82、過,這也才激發(fā)了我的興趣,有動力比別人早完成程序。很開心我做到了,既完成了課設(shè)也學(xué)到了好多知識,經(jīng)歷了這一個星期,我收獲了如下的幾點:</p><p> 1. 程序的設(shè)計思想的精巧的重要性,是不管怎么說都不為過的,好的程序可以讓大家很快的明白你的思想,而且很方便的來實現(xiàn)它。還有不管這程序有多長,只要你解釋了之后,別人很快就能明白,看程序也比較簡單了。</p><p> 2.《數(shù)據(jù)結(jié)構(gòu)》
83、是一門實踐性較強的課程,為了學(xué)好這門課程,必須在掌握理論知識的同時,加強上機實踐。一個人的力量是有限的,要想把課程設(shè)計做的更好,就要學(xué)會參考一定的資料,要善于捕獲資料,吸取別人的經(jīng)驗,讓自己和別人的思想有機的結(jié)合起來,得出屬于你自己的靈感。</p><p> 3.學(xué)會“遞進(jìn)”的思想:程序的編寫需要有耐心,有些事情看起來很復(fù)雜,但問題需要一點一點去解決,分析問題,把問題一個一個劃分,劃分成小塊以后就逐個去解決。再
84、總體解決大的問題。這樣做起來不僅有條理也使問題得到了輕松的解決。</p><p> 這次的程序訓(xùn)練培養(yǎng)了我實際分析問題、編程和動手能力,使我掌握了程序設(shè)計的基本技能,提高了我適應(yīng)實際,實踐編程的能力。</p><p> 這次的課程設(shè)計我對于專業(yè)課的學(xué)習(xí)有了更加深刻的認(rèn)識,以為現(xiàn)在學(xué)的知識用不上就加以怠慢,等到想用的時候卻發(fā)現(xiàn)自己的學(xué)習(xí)原來是那么的不扎實。以后努力學(xué)好每門專業(yè)課,讓自己擁
85、有更多的知識,才能解決更多的問題! </p><p> 總的來說,這次課程設(shè)計讓我獲益匪淺,對數(shù)據(jù)結(jié)構(gòu)也有了進(jìn)一步的理解和認(rèn)識,也讓我相信,只要你要做(just do it),沒有什么困難能難倒我們……</p><p><b> 6 附錄</b></p><p><b> 6.1源程序代碼</b></p>
86、;<p> #include<stdio.h></p><p> #include<string.h></p><p> #include<conio.h></p><p> #include<stdlib.h></p><p> #define maxsize 20&l
87、t;/p><p> typedef struct car{</p><p> char num[10];</p><p> char name[10];</p><p><b> }Car;</b></p><p> typedef struct {</p><p>
88、 Car data[maxsize];</p><p> int n;//棧容量設(shè)定</p><p><b> int top;</b></p><p> }Stack;//順序棧</p><p> typedef struct {</p><p> Car data[maxsize]
89、;</p><p> int n;//隊列容量設(shè)定</p><p> int num;//當(dāng)前通道上的車輛數(shù)</p><p> int front,rear;</p><p> }Queue;//循環(huán)隊列</p><p> Stack *SCar;//全局變量:車站內(nèi)車輛信息</p><p
90、> Queue *QCar;//全局變量:通道內(nèi)車輛信息</p><p> void carmenu(void);</p><p> void InitStack(Stack *S)</p><p><b> {</b></p><p> S->top=-1;</p><p>
91、; S->n=maxsize;</p><p><b> }</b></p><p> void InitQueue(Queue *Q)</p><p> {Q->front=Q->rear=Q->num=0;</p><p> Q->n=maxsize+1;</p>
92、<p><b> }</b></p><p> int Push(Stack *S,Car x)//入棧操作</p><p> {if(S->top==S->n-1)</p><p> return(-1);</p><p><b> S->top++;</b&
93、gt;</p><p> S->data[S->top]=x;</p><p> return(0);</p><p><b> }</b></p><p> int Pop(Stack *S,Car *px)//出棧操作</p><p> {if(S->top==-
94、1)</p><p> return(-1);</p><p><b> S->top--;</b></p><p> *px=S->data[S->top+1];</p><p> return(0);</p><p><b> }</b><
95、;/p><p> int InsertQueue(Queue *Q,Car x)//入隊</p><p> {if(((Q->rear+1)%Q->n)==Q->front)</p><p> return(-1);</p><p><b> Q->num++;</b></p>
96、<p> Q->data[Q->rear]=x;</p><p> Q->rear=(Q->rear+1)%Q->n;</p><p> return(0);</p><p><b> }</b></p><p> int DeleteQueue(Queue *Q,Ca
97、r *x)//出隊</p><p> {if(Q->front==Q->rear)</p><p> return(-1);</p><p><b> Q->num--;</b></p><p> *x=Q->data[Q->front];</p><p>
98、 Q->front=(Q->front+1)%Q->n;</p><p> return(0);</p><p><b> }</b></p><p> void ShowCar(void)//車站內(nèi)信息顯示</p><p> {int i,front,rear;</p>&l
99、t;p> if(SCar->top==-1)</p><p> {printf("\n\n這停車場是空的!\n");</p><p><b> getch();</b></p><p> carmenu();}</p><p> printf("\n\n目前停車場的車
100、有:\n---車牌號--------------車主姓名\n");</p><p> for(i=0;i<SCar->top+1;i++)</p><p> {printf(" %-13s",SCar->data[i].num);</p><p> printf("%18s\n",S
101、Car->data[i].name);}</p><p> if(QCar->rear!=QCar->front)//通道內(nèi)有車輛</p><p> {front=QCar->front;</p><p> rear=QCar->rear;</p><p> printf("\n通道信息:\n-
102、--車牌號--------------車主姓名\n");</p><p> while(front!=rear)</p><p> {printf(" %-13s",QCar->data[front].num);</p><p> printf("%18s\n",QCar->data[fro
103、nt].name);</p><p> front=(front+1)%QCar->n;}</p><p><b> }</b></p><p><b> getch();</b></p><p> carmenu();</p><p><b> }
104、</b></p><p> void InitCarpark(void)//車輛成批入站</p><p> {char num[8],*pnum,name[10],*pname;</p><p><b> Car pcar;</b></p><p><b> pnum=num;</b
105、></p><p> pname=name;</p><p> printf("\n\n請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開))(以'# #'這個符號結(jié)束):\n");</p><p> scanf("%s%s",pnum,pname);</p><p>
106、; while(strcmp(pnum,"#")!=0)</p><p> {strcpy(pcar.num,pnum);</p><p> strcpy(pcar.name,pname);</p><p> if(Push(SCar,pcar)==-1)</p><p> { printf("\n車
107、站已滿!車輛已經(jīng)入通道!\n");</p><p> if(InsertQueue(QCar,pcar)==-1)</p><p> printf("\n通道已滿,進(jìn)入通道失敗!!\n");</p><p><b> }</b></p><p> scanf("%s%s&q
108、uot;,pnum,pname);</p><p><b> }</b></p><p> printf("這批汽車已經(jīng)成功進(jìn)入停車場\n");</p><p><b> getch();</b></p><p> carmenu();</p><p&
109、gt;<b> }</b></p><p> void InsertCar(void)//單個車輛入站</p><p> {char num[10],*pnum,name[10],*pname;</p><p><b> Car pcar;</b></p><p><b> p
110、num=num;</b></p><p> pname=name;</p><p> printf("\n\n請輸入車子的信息(包括車牌號和車主姓名(兩者之間用空格隔開)):\n");</p><p> scanf("%s%s",pnum,pname);</p><p> strcp
111、y(pcar.num,pnum);</p><p> strcpy(pcar.name,pname);</p><p> if(Push(SCar,pcar)==-1)</p><p> {printf("\n車站已滿!車輛已經(jīng)入通道!\n");</p><p> if(InsertQueue(QCar,pcar)
112、==-1)</p><p> printf("\n通道已滿,進(jìn)入通道失敗!\n");</p><p><b> getch();</b></p><p><b> }</b></p><p> carmenu();</p><p><b>
113、; }</b></p><p> void ExitCar(void)//車輛出站</p><p><b> { </b></p><p> int i,position,flag=0;</p><p><b> Car x;</b></p><p>
114、;<b> Stack *S;</b></p><p> char num[10],*pnum;</p><p><b> pnum=num;</b></p><p> if(SCar->top==-1)//車站不能為空</p><p> {printf("\n\n這停車場
115、是空的!\n");</p><p><b> getch();</b></p><p> carmenu();</p><p><b> }</b></p><p> printf("\n\n請輸入車子的車牌號:\n");//輸入出站車輛的車牌號</p&g
116、t;<p> scanf("%s",pnum);</p><p> for(i=0;i<SCar->top+1;i++)</p><p> if(strcmp(SCar->data[i].num,pnum)==0)</p><p> {position=i;</p><p><
117、;b> flag=1;</b></p><p><b> }</b></p><p><b> if(!flag)</b></p><p> {printf("對不起,沒有找到該車的信息!");</p><p><b> getch();&
118、lt;/b></p><p> carmenu();</p><p><b> }</b></p><p> if((S=(Stack *)malloc(sizeof(Stack)))==NULL)</p><p> {printf("Failed!");</p><
119、;p><b> exit(1);</b></p><p><b> }</b></p><p> InitStack(S);</p><p> for(i=SCar->top;i>position;i--)</p><p><b> {</b>&l
120、t;/p><p> Pop(SCar,&x);//車場出車</p><p> Push(S,x);//通道入車</p><p><b> }</b></p><p> Pop(SCar,&x);//所指定的車輛出站</p><p> while(S->top!=-1)&
121、lt;/p><p><b> {</b></p><p> Pop(S,&x);//通道出車</p><p> Push(SCar,x);//車場入車</p><p><b> }</b></p><p> if(QCar->rear!=QCar->
122、;front)//通道內(nèi)有車輛</p><p><b> {</b></p><p> DeleteQueue(QCar,&x);</p><p> Push(SCar,x);</p><p><b> }</b></p><p> printf(&quo
123、t;\n退車成功!\n");</p><p><b> getch();</b></p><p> carmenu();</p><p><b> }</b></p><p> void SetCar(void)//車站模擬系統(tǒng)相關(guān)功能設(shè)定</p><p>
124、<b> {int b; </b></p><p> printf("選擇1:修改停車場的容量\n");</p><p> printf("選擇2:修改通道的容量\n");</p><p> printf("請你選擇操作(1-2):\n"); </p><
125、p> scanf("%d",&b); /*讀入選擇*/ </p><p><b> if(b==1)</b></p><p> {int n,flag=1;</p><p> printf("\n\n目前停車場最大的容納量是:%d\n",SCar->n);</p>
126、<p> printf("\n請輸入您想要的停車場的最大容納量:(<=%d)\n",maxsize);</p><p> do{printf("請輸入數(shù)值:");</p><p> scanf("%d",&n);</p><p> if(n>maxsize){p
127、rintf("輸入錯誤,請重新輸入\n");}</p><p> if(n<SCar->top+1)</p><p><b> {flag=0;</b></p><p> n=SCar->n;</p><p><b> break;</b></p
128、><p><b> }</b></p><p> }while(n<0||n>maxsize);</p><p> SCar->n=n;</p><p> if(flag!=0) printf("\n修改成功!\n");</p><p><b>
129、 else</b></p><p> printf("\n錯誤!車站車輛已經(jīng)超過此數(shù)!如要再輸,請再按功能5\n");</p><p><b> getch();</b></p><p> carmenu();</p><p><b> }</b></
130、p><p><b> if(b==2)</b></p><p> {int n,flag=1;</p><p> printf("\n\n目前通道最大的容納量是:%d\n",QCar->n-1);</p><p> printf("\n請輸入您想要的通道的最大容納量:(<=
131、%d)\n",maxsize);</p><p> do{printf("請輸入數(shù)值:");</p><p> scanf("%d",&n);</p><p> if(n>maxsize){printf("輸入錯誤,請重新輸入\n");}</p><p&g
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 停車場管理系統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)停車場管理系統(tǒng)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)停車場管理系統(tǒng)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)停車場管理系統(tǒng)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--停車場管理系統(tǒng)報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計停車場管理報告
- 停車場管理-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---停車場管理
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----停車場管理系統(tǒng)設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計《停車場管理系統(tǒng)》
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計——停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--停車場管理系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-停車場管理
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--停車場管理
- 數(shù)據(jù)結(jié)構(gòu)停車場管理系統(tǒng)及課程設(shè)計報告
評論
0/150
提交評論