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

下載本文檔

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

文檔簡介

1、停車場管理模擬一 . 需求分析1 .總體要求設(shè)停車場是一個可停放N 輛汽車的狹長通道,且只有一個大門可供汽車進(jìn)出。汽車在停車場內(nèi)按車輛到達(dá)時間的先后順序,依次由北向南排列(大門在南端,最先到達(dá)的第一輛車停放在停車場的最北端),若停車場內(nèi)已停了 n 輛汽車,則后來的汽車只能在門外的通道上等候,一旦有車開走,則排在通道上的第一輛車即可開入;當(dāng)停車場內(nèi)每輛車要離開時,在它之后進(jìn)入的車輛必須先退出停車場為其讓路,待該輛車開出大門,其他車輛再按原次序進(jìn)入停車場。請為停車場編寫按上述要求進(jìn)行管理的模擬程序。2 . 分析1 用棧來表示停車場,用隊(duì)列來表示停車道。2 用戶需輸入車輛的必要信息,如車輛的到達(dá)或離

2、開,汽車牌號以及到達(dá)或離去的時刻。停車場的容量及單位時間的停車費(fèi)由編程序者自行設(shè)置,結(jié)構(gòu)需輸出車輛停車所需繳納的費(fèi)用。3 本程序要求對車輛的動態(tài)能夠輸出具體的信息內(nèi)容,包括停車或離開的時間,位置,及所需繳納的停車費(fèi)。4 測試數(shù)據(jù)為:N=2 ,輸入數(shù)據(jù)為:( A ,1,5 ) ,( A ,2.,10), ( D ,1,15),( A ,3,20), ( A,4,25), ( A ,5,30),('D',2,35), ('D',4,40), ( 'E' ,0,0).其中:'A 表示到達(dá),D'表示離去, E 表示輸入結(jié)束。5 . 程序執(zhí)

3、行的命令為:1. 創(chuàng)建棧和隊(duì)列。 2. 對車輛的行為進(jìn)行相應(yīng)的處理。 3. 輸出車輛的信 息。三 概要設(shè)計(jì)1 、 本程序基本模塊( 1 ) 主程序部分:int main()/ 讀入文件數(shù)據(jù)/ 文件讀入判斷/ 第一次輸入數(shù)據(jù)不需要檢測/ 處理車輛到達(dá)模塊;/ 處理車輛離開模塊; 2. 停車場模擬的抽象數(shù)據(jù)類型定義typedef struct Elem/ 定義車輛數(shù)據(jù)結(jié)構(gòu)類型int carnum;/ 車牌號int time;/ 停車時刻Elem;typedef structElem *base;Elem *top;int stacksize;/ 棧大小Sqstack;void initStack(

4、Sqstack &S)/ 建一個停車場空棧/ 傳入?yún)?shù): stack 棧結(jié)構(gòu)/ 傳出參數(shù):分配有內(nèi)存空間的棧結(jié)構(gòu)/ 初始化棧int push(Sqstack &S,Elem &e)/ 插入元素/ 輸入?yún)?shù):S 棧結(jié)構(gòu), e 要入棧的節(jié)點(diǎn)/ 完成入棧操作int lengthstack(Sqstack S)/ 求棧的長度/ 返回棧的長度int pop(Sqstack &S,Elem &e)/ 輸入?yún)?shù)S 棧結(jié)構(gòu), e 要出棧的節(jié)點(diǎn)/ 完成出棧操作void initqueue(LinkQueue &Q)/ 構(gòu)造一個車道空隊(duì)列/ 傳入?yún)?shù)Q 要初始化的隊(duì)

5、列/ 傳出參數(shù): Q 帶有頭結(jié)點(diǎn)的隊(duì)列/ 初始化隊(duì)列void enqueue(LinkQueue &Q,int carnum,int time)/車道入隊(duì)操作/ 傳入?yún)?shù): Q 隊(duì)列, carnumber,time 要入隊(duì)的數(shù)據(jù)/ 完成入棧操作int lengthqueue(LinkQueue Q)/ 求車道隊(duì)列長度/ 返回隊(duì)的長度void dequeue(LinkQueue &Q,Elem &e)/ 從對頭離隊(duì)操作,并返回其值/ 傳入?yún)?shù):Q 隊(duì)列結(jié)構(gòu), e 的節(jié)點(diǎn)數(shù)據(jù)/ 刪除隊(duì)頭進(jìn)場函數(shù)void carin(Sqstack &S,LinkQueue &

6、;Q,Elem car)/ 傳入?yún)?shù):S 棧結(jié)構(gòu), Q 隊(duì)列結(jié)構(gòu) ,car 的節(jié)點(diǎn)數(shù)據(jù)int k=0;/ 檢測信號,當(dāng)值為 k=0 時表示棧和隊(duì)中都找不到該車牌號/ 賦值為棧底/ 在棧中尋找是否有同一編號的車/ 找到了有同一編號的車/ 如果在棧中未找到,在隊(duì)列中查找/ 隊(duì)頭/ 找不到繼續(xù)找/ 棧和隊(duì)列中都找不到相同車牌號,執(zhí)行入棧操作;/ 棧未滿void carleave(Sqstack &S,LinkQueue &Q,Elem car)/車輛退出函數(shù)/ 傳入?yún)?shù):S 棧結(jié)構(gòu), Q 隊(duì)列結(jié)構(gòu) ,car 的節(jié)點(diǎn)數(shù)據(jù)/ 在棧中沒有找到與要離開的車/ 先在棧中尋找;/ 在棧中找到/

7、備用棧/ 先在棧中尋找;/ 其他車退出停車場暫存在零時棧/ 棧中有車離開,將隊(duì)列中的車進(jìn)入棧中/ 離隊(duì),并返回?cái)?shù)據(jù)e/ 棧中沒找到要離開的車/ 在隊(duì)列中找到要離開的車四詳細(xì)設(shè)計(jì)1、程序整體流程打開數(shù)據(jù)文件結(jié)束2、程序函數(shù)調(diào)用關(guān)系3、汽車離開,到達(dá)流程圖車到達(dá)一是否有車位.開始車狀態(tài)車離開車在停車場、,否否是車達(dá)到和離時是刻停車場便道進(jìn)棧進(jìn)入隊(duì)列顯示車離開和到達(dá)的 時間計(jì)算停車時間計(jì) 算費(fèi)用過道上的車再離 開的車后面的車 向前以一個車位過道上有車否出隊(duì)列進(jìn)棧結(jié)束5.源代碼#include <fstream>#include <string>#include<iost

8、ream>#define OVERFLOW -2#define ERROR 0#define N 2 /停車場的容量設(shè)為2#define price 5/將單位時間的停車費(fèi)設(shè)為5using namespace std;typedef struct Elem定義車輛數(shù)據(jù)結(jié)構(gòu)類型int carnum;/ 車牌號int time;/ 停車時刻Elem;typedef structElem *base;Elem *top;int stacksize;Sqstack;void initStack(Sqstack &S)/ 建一個停車場空棧 S.base=(Elem*)malloc(N*si

9、zeof(Elem);if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=N;int push(Sqstack &S,Elem &e)/ 插入元素 Elem *temp;if(S.top-S.base=S.stacksize)/ 棧滿,退出 return 1; else temp=S.top;temp->carnum=e.carnum;temp->time=e.time;S.top+;return 0; int lengthstack(Sqstack S)/ 求棧的長度return S.top-S.base;int

10、 pop(Sqstack &S,Elem &e) / 若棧不空,則刪除S 的棧頂元素,用 E 返回其值,并返回 OK ;否則返回 ERRORif(S.top=S.base)return ERROR;e=*-S.top;return 1;typedef struct QNode/ 定義車道隊(duì)列struct QNode *next;Elem Qelem;QNode,*QueuePtr;typedef struct/ 隊(duì)頭指針,隊(duì)尾指針QueuePtr front;QueuePtr rear;LinkQueue;void initqueue(LinkQueue &Q)/ 構(gòu)造

11、一個車道空隊(duì)列Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode);if(!Q.front)exit(OVERFLOW);Q.front->next=Q.rear->next=NULL;車道入隊(duì)操作void enqueue(LinkQueue &Q,int carnum,int time)/QueuePtr p=(QueuePtr)malloc(sizeof(QNode);p->Qelem.carnum=carnum;p->Qelem.time=time;p->next=NULL;Q.rear->next=p;Q

12、.rear=p;int lengthqueue(LinkQueue Q)/ 求車道隊(duì)列長度int i=0;QueuePtr p;p=Q.front->next;while(p!=Q.rear)i+;p=p->next;i+;return i;void dequeue(LinkQueue &Q,Elem &e)/從對頭離隊(duì)操作,并返回其值QueuePtr p=(QueuePtr)malloc(sizeof(QNode);if(Q.front=Q.rear)cout<<" 車道中沒有車輛!"<<endl;if(Q.front!

13、=Q.rear)p=Q.front->next;e=p->Qelem;Q.front->next=p->next;if(Q.rear=p) Q.rear=Q.front;free(p);void carin(Sqstack &S,LinkQueue &Q,Elem car)/進(jìn)場函數(shù)int k=0;/ 檢測信號,當(dāng)值為 k=0 時表示棧和隊(duì)中都找不到該車牌號QueuePtr r;Elem *temp;temp=S.base;/ 賦值為棧底while(temp!=S.top)if(temp->carnum=car.carnum)/在棧中尋找是否有同一

14、編號的車cout<<" 該車號在停車場中已存在,請重新輸入 !"<<endl;k=1;/ 找到了有同一編號的車break;temp+;if(k=0&&Q.front!=Q.rear)/ 如果在棧中未找到,在隊(duì)列中查找r=Q.front->next; /隊(duì)頭while(r&&r->Qelem.carnum!=car.carnum)r=r->next;/ 找不到繼續(xù)找if(r&&r->Qelem.carnum=car.carnum)cout<<" 該車號在車道中

15、已存在 ,請重新輸入 !"<<endl;k=1;if(k=0)/ 棧和隊(duì)列中都找不到相同車牌號,執(zhí)行入棧操作;if(S.top-S.base!=S.stacksize)/ 棧未滿, S.top->carnum=car.carnum;S.top->time=car.time;S.top+;cout<<temp->carnum<<" 號車于 "<<car.time<<" 時刻進(jìn)入停車場"<<lengthstack(S)<<" 號車位! &

16、quot;<<endl;elseenqueue(Q,car.carnum,car.time);/棧滿已滿,把車安排在車道隊(duì)列中cout<<" 停 車 場 已 滿 , 請 "<<car.carnum<<" 號 車 在 便 車 道 "<<lengthqueue(Q)<<" 稍等! "<<endl;車輛退出函數(shù)void carleave(Sqstack &S,LinkQueue &Q,Elem car)/ int ture=0;/ 在棧中沒有

17、找到與要離開的車Elem e,em,*temp;QueuePtr p,r;temp=S.base;if(ture=0)while(temp!=S.top)/ 先在棧中尋找;if(temp->carnum=car.carnum) int temp_cost;temp_cost=(car.time-temp->time)*price; ture=1;/ 在棧中找到 cout<<car.carnum<<" 號車在 "<<car.time<<" 時刻離開, 停車時間為 "<<car.time

18、-temp->time<<" 刻鐘,應(yīng)交停車費(fèi)用為: "<<temp_cost<<endl;break; temp+;if(ture=1) / 備用棧 Sqstack spear; initStack(spear);while(S.top!=temp+1)/ 先在棧中尋找; pop(S,em); push(spear,em); pop(S,*temp);/ 其他車退出停車場暫存在零時棧 if(spear.top!=spear.base) while(spear.top!=spear.base) pop(spear,em); push

19、(S,em); if(ture=1&&Q.front!=Q.rear)/ 棧中有車離開,將隊(duì)列中的車進(jìn)入棧中 dequeue(Q,e); / 離隊(duì),并返回?cái)?shù)據(jù)eS.top->carnum=e.carnum; S.top->time=car.time; S.top+; cout<<" 請便道的第一輛車"<<" 牌號為 "<<e.carnum<<" 的車輛轉(zhuǎn)入停車場,停車位置為 "<<lengthstack(S)<<" 號 ,&q

20、uot;<<" 停車時刻為: "<<car.time<<endl; if(ture=0&&Q.front!=Q.rear)/ 棧中沒找到要離開的車 p=Q.front; r=Q.front->next; / 隊(duì)頭 while(r&&r->Qelem.carnum!=car.carnum) p=r; r=r->next; if(r&&r->Qelem.carnum=car.carnum)/在隊(duì)列中找到要離開的車ture=2;cout<<" 便道 &

21、quot;<<r->Qelem.carnum<<" 號車離開 , 不收取費(fèi)用!"<<endl;p->next=r->next;free(r);/ 直接從隊(duì)列離開if(ture=0)cout<<" 沒有該輛車!"<<endl;int main()char c;int j=0,temp_time,i=1;/i=0 ,判斷臨時記錄時間的 temp_time 應(yīng)該去該次的值,還是上次的值。 j=0 ,表示第一次輸入數(shù)據(jù),不需要檢測數(shù)據(jù)是否正確LinkQueue Q;Sqstack S;

22、Elem car;initqueue (Q);initStack(S);ifstream infile;cout<<" 歡迎使用停車場管理系統(tǒng)! "<<endl;cout<<"請稍等!信息正在載入, "<<endl;system("PAUSE");/ 暫停函數(shù),模擬仿真infile.open("aaa.txt"); / 讀入文件數(shù)據(jù)if(infile.fail()/ 文件讀入判斷 cout<<"input file failed.n"e

23、xit(1);while(infile>>c>>car.carnum>>car.time) if(j=1) if(S.top=S.base)cout<<" 停車場中沒有車!"<<endl;elseif(car.time<temp_time&&c!='E')/temp_time還是記錄上次的值cout<<" 您輸入的時間有誤,請重新輸入 !"<<endl; i=0;elsetemp_time=car.time;i=1;if(i=1) /

24、 正確的數(shù)據(jù)if(c='A')/ 到達(dá)carin(S,Q,car);else if(c='D') if(S.top=S.base)cout<<" 停車場中沒有車!"<<endl;elsecarleave(S,Q,car);j=1;if(j=0)第一次輸入數(shù)據(jù)不需要檢測if(c='A')/ 到達(dá)carin(S,Q,car);else if(c='D')cout<<"停車場中沒有車!"<<endl;j=1;temp_time=car.time;if

25、(c='E')cout<<"輸入結(jié)束!"<<endl;break;infile.close();return 0;五調(diào)試分析1.程序執(zhí)行調(diào)試時,讀取文件失敗,原因是“ aaa.txt ”文件放錯了位置2 .在數(shù)據(jù)輸入檢測時,經(jīng)常出現(xiàn)車號重復(fù)報(bào)錯信息,這時候得考慮這個檢測信號放置情況。簞M平時荷為10刻鐘,應(yīng)交停車費(fèi)由為150一_ a -Jt /Jl. I讀費(fèi)羞道皋正在載人 SBwEJ Cqowm 3 ,eze3 .車道內(nèi)停車不收費(fèi),時間卻被一直計(jì)入計(jì)費(fèi)時間,這時考慮調(diào)用值情況。出時刻離開,車時間為如二! 儒摘嚏斷端 !第一輛車牌號為E

26、的車輛理A制批續(xù).爰孥;W為車時刻為 遇鐮算停車時刻為,3AT.號4 .本程序循環(huán)用的很多,找車,排隊(duì),等等六測試結(jié)果1.模擬仿真,進(jìn)入登錄界面并載入信息,按任意鍵進(jìn)入下一個界面。2.清屏函數(shù)去除不必要的信息,顯示主要內(nèi)容:七用戶使用說明用戶將數(shù)據(jù)寫入aaa.txt的文件中,文件中的數(shù)據(jù)格式是A 1 5A 2 10D 1 15A 3 20A 4 25A 5 30D 2 35D 4 40其中 A 表示到達(dá), D 表示離去, E 表示輸入結(jié)束。這種格式,且其中的數(shù)據(jù)都必須是英文字符,然后執(zhí)行文件即可。八 . 課程設(shè)計(jì)總結(jié)通過此次實(shí)驗(yàn)我深刻了解到數(shù)據(jù)結(jié)構(gòu)的真正用處,這是一門純屬于設(shè)計(jì)的科目,它需用把理論變?yōu)樯蠙C(jī)調(diào)試。老師會給我們講了一些設(shè)計(jì)的思想,順著老師的思路,來完成自己的設(shè)計(jì),但是當(dāng)自己采用剛學(xué)的知識點(diǎn)編寫程序時卻感到十分棘手,有時表現(xiàn)在想不到適合題意的算法,有時表現(xiàn)在算法想出來后,只能將書本上原有的程序段謄寫到自己的程序中再加以必要的連接以完成程序的編寫。當(dāng)為停車場編寫棧,為車道編寫隊(duì)列遇到了很多自己都不了解的茫點(diǎn),想了很久,還是想不出改怎么完善,但是程序還是得繼續(xù)下去,我多次請教了

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論