停車場(chǎng)管理系統(tǒng)C語言實(shí)現(xiàn)_第1頁
停車場(chǎng)管理系統(tǒng)C語言實(shí)現(xiàn)_第2頁
停車場(chǎng)管理系統(tǒng)C語言實(shí)現(xiàn)_第3頁
停車場(chǎng)管理系統(tǒng)C語言實(shí)現(xiàn)_第4頁
停車場(chǎng)管理系統(tǒng)C語言實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1. 實(shí)驗(yàn)題目:設(shè)停車場(chǎng)是一個(gè)可停放 n 輛汽車的狹長(zhǎng)通道,且只有一個(gè)大門可供汽車進(jìn)出。 汽車在停車場(chǎng)內(nèi)按車輛到達(dá)時(shí)間的先后順序,依次由北向南排列(大門在最南端, 最先到達(dá)的第一輛車停放在車場(chǎng)的最北端)。若停車場(chǎng)內(nèi)已經(jīng)停滿 n 輛車,那么后 來的車只能在門外的便道上等候。一旦有車開走,則排在便道上的第一輛車即可開 入。當(dāng)停車場(chǎng)內(nèi)某輛車要離開時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路, 待該輛車開出大門外,其他車輛再按原次序進(jìn)入車場(chǎng)。每輛停放在車場(chǎng)的車在它離 開停車場(chǎng)時(shí)必須按它停留的時(shí)間長(zhǎng)短繳納費(fèi)用。試為停車場(chǎng)編制按上述要求進(jìn)行管 理的模擬程序。要求:根據(jù)各結(jié)點(diǎn)的信息,調(diào)用相應(yīng)的函數(shù)或者語句,

2、將結(jié)點(diǎn)入棧入隊(duì),出?;蛘?出隊(duì)。二需求分析1. 程序所能達(dá)到的基本可能:程序以棧模擬停車場(chǎng),以隊(duì)列模擬車場(chǎng)外的便道,按照從終端讀入數(shù)據(jù)的序列 進(jìn)行模擬管理。棧以順序結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列以鏈表結(jié)構(gòu)實(shí)現(xiàn)。同時(shí)另設(shè)一個(gè)棧,臨時(shí) 停放為給要離去的汽車讓路而從停車場(chǎng)退出來的汽車。輸入數(shù)據(jù)按到達(dá)或離去的時(shí) 刻有序。當(dāng)輸入數(shù)據(jù)包括數(shù)據(jù)項(xiàng)為汽車的“到達(dá)”(A表示)信息,汽車標(biāo)識(shí)(牌 照號(hào))以及到達(dá)時(shí)刻時(shí),應(yīng)輸出汽車在停車場(chǎng)內(nèi)或者便道上的停車位置;當(dāng)輸入數(shù) 據(jù)包括數(shù)據(jù)項(xiàng)為汽車的“離去” (D表示)信息,汽車標(biāo)識(shí)(牌照號(hào))以及離去時(shí)刻時(shí),應(yīng)輸出汽車在停車場(chǎng)停留的時(shí)間和應(yīng)繳納的費(fèi)用(便道上停留的時(shí)間不收 費(fèi));當(dāng)輸入數(shù)據(jù)

3、項(xiàng)為( P, 0, 0)時(shí),應(yīng)輸出停車場(chǎng)的車數(shù);當(dāng)輸入數(shù)據(jù)項(xiàng)為 ( W, 0, 0 )時(shí),應(yīng)輸出候車場(chǎng)車數(shù);當(dāng)輸入數(shù)據(jù)項(xiàng)為(E, 0, 0 ),退出程序;若輸入數(shù)據(jù)項(xiàng)不是以上所述,就輸出ERROR!。2. 輸入輸出形式及輸入值范圍:程序運(yùn)行后進(jìn)入循環(huán),顯示提示信息:“Please input the state,number andtime of the car: ”,提示用戶輸入車輛信息(“到達(dá)”或者“離開”,車牌編號(hào), 到達(dá)或者離開的時(shí)間)。若車輛信息為“到達(dá)”,車輛信息開始進(jìn)棧(模擬停車 場(chǎng)),當(dāng)棧滿,會(huì)顯示棧滿信息:“The parking place is full!”,同時(shí)車輛進(jìn)隊(duì)

4、列(模擬停車場(chǎng)旁便道),并顯示該進(jìn)入便道車輛的車牌編號(hào),讓用戶知道該車 的具體位置;若車輛信息為“離開”,會(huì)顯示該車進(jìn)入停車場(chǎng)的時(shí)間以及相應(yīng)的停 車費(fèi)用,若該車較部分車早進(jìn)停車場(chǎng),這部分車需先退出停車場(chǎng),暫時(shí)進(jìn)入一個(gè)新 棧為其讓道,會(huì)顯示進(jìn)入新棧的車輛的車牌編號(hào)及其入停車場(chǎng)的時(shí)間,當(dāng)待離開車 離開停車場(chǎng)后,這部分車會(huì)重新進(jìn)入停車場(chǎng),同時(shí)便道上的第一輛車進(jìn)入停車場(chǎng); 若輸入( P, 0, 0),會(huì)顯示停車場(chǎng)的車數(shù);若輸入( W, 0, 0),會(huì)顯示 便道上的車數(shù);若輸入 ( E, 0, 0),程序會(huì)跳出循環(huán),同時(shí)程序結(jié)束;若輸入 為其他字母,程序會(huì)顯示“ ERRO!R ”報(bào)錯(cuò)。若便道上沒有車輛停

5、靠,會(huì)顯示便道 為空的信息:用戶每輸入一組數(shù)據(jù),程序就會(huì)根據(jù)相應(yīng)輸入給出輸出。輸入值第一 個(gè)必須為字母,后兩個(gè)為數(shù)字。3. 測(cè)試數(shù)據(jù)要求:用戶輸入字母時(shí),輸入大寫或小寫,都可以被該程序識(shí)別,正常運(yùn)行。但要求用戶輸入數(shù)據(jù)時(shí),三個(gè)數(shù)據(jù)項(xiàng)之間必須用逗號(hào)相分隔開。三概要設(shè)計(jì)為了實(shí)現(xiàn)上述功能,該程序以棧模擬停車場(chǎng)以及臨時(shí)停放為給要離去的汽車讓 路而從停車場(chǎng)退出來的汽車的場(chǎng)地,以隊(duì)列模擬車場(chǎng)外的便道,因此需要棧和隊(duì)列 這兩個(gè)抽象數(shù)據(jù)類型。1. 棧抽象數(shù)據(jù)類型定義:ADT SqStack數(shù)據(jù)對(duì)象:D=ai,bi,ci,di |ai int, bi int, ci int, di char ,i=1,2,3,

6、n,n0數(shù)據(jù)關(guān)系:R=( ai,bi,di)| ai,bi,di D,ai,bi,di struct car;基本操作:Judge_Output(s,q,r)是; / 根據(jù) r 中車輛信息控制車輛是入棧 s 還入隊(duì) q 以及相關(guān)操作A_cars(s,q, a); / 將到達(dá)車輛 a 的信息入棧 s 或者入隊(duì) qD_cars(s,q, d);/ 將待離開車輛 d 出棧 s ,并將 q 中相應(yīng)車輛入棧并進(jìn)行相關(guān)的操作ADT SqStack2. 隊(duì)列抽象數(shù)據(jù)類型定義:ADT LinkQueue數(shù)據(jù)對(duì)象: D=ai ,bi,ci |ai Qnode *, bi Qnode*,ci int ,i=1,2

7、,3 ,n,n0;數(shù)據(jù)關(guān)系: R= ;基本操作:Judge_Output(s,q,r)A_cars(s,q, a)D_cars(s,q, d);/ 根據(jù) r 中車輛信息控制車輛是入棧 s 還是入隊(duì) q 以及相關(guān)操作; / 將到達(dá)車輛 a 的信息入棧 s 或者入隊(duì) q;將待離幵車輛d出棧s,并將q中相應(yīng)車輛入棧并進(jìn)行相關(guān)的操作ADT LinkQueue3. 主要算法流程圖:I Judge_Output 算法流程圖:II A_cars 算法流程圖:III D_cars 算法流程圖:4. 本程序保護(hù)模塊:主函數(shù)模塊棧單元模塊:實(shí)現(xiàn)棧的抽象數(shù)據(jù)類型 隊(duì)列單元模塊:實(shí)現(xiàn)隊(duì)列的抽象數(shù)據(jù)類型 調(diào)用關(guān)系:四詳

8、細(xì)設(shè)計(jì)1. 相關(guān)頭文件庫的調(diào)用說明:#include#include#define MAXSIZE 14#define n 2#define fee 102. 元素類型、結(jié)點(diǎn)類型和結(jié)點(diǎn)指針類型:struct car char bb;int num;int time;struct rangweicarint num;int time;typedef struct stackkstruct rangweicar HMAXSIZE;int topp;SqStackk;#define QNODE struct QnodeQNODE int data;QNODE *next;3. 棧類型和隊(duì)列類型:ty

9、pedef struct stackstruct car Gn;int top;SqStack;typedef struct linkqueueQNODE *front,*rear;int geshu;LinkQueue;/ 部分基本操作的偽碼實(shí)現(xiàn)void Judge_Output(SqStack *s,LinkQueue *q,struct car *r) if(*r).bb=E|(*r).bb=e)printf(STOP!n);else if(*r).bb=P|(*r).bb=p)printf(The number of parking cars is %dn,(s-top)+1);els

10、e if(*r).bb=W|(*r).bb=w) printf(The number of waiting cars is %dn,q-geshu);else if(*r).bb=A|(*r).bb=a)A_cars(s,q,*r);else if(*r).bb=D|(*r).bb=d)D_cars(s,q,*r);elseprintf(ERROR!n);A_cars(SqStack *s,LinkQueue *q,struct car a)QNODE *t;if(s-top!=n-1)(s-top)+;(s-Gs-top).bb=a.bb;(s-Gs-top).time=a.time;els

11、eprintf(The parking place is full!n);t=(QNODE *)malloc(sizeof(QNODE);t-data=a.num;t-next=NULL;q-rear-next=t;q-rear=t;printf(the number of the car in the access roadis:%dn,q-rear-data);q-geshu+;int D_cars(SqStack *s,LinkQueue *q,struct car d)int i,j,l;float x,y;QNODE *p;SqStackk *k;if(d.num=(s-Gs-top

12、).num)x=d.time-(s-Gs-top).time;y=fee*x;printf(The time is %.2f hours,the fee is %.2f yuann,x,y);if(q-geshu=0)printf(The queue is empty!n);return 0;elsep=q-front-next;q-front-next=p-next;(s-Gs-top).num=p-data;free(p);q-geshu-;if(q-front-next=NULL)q-rear=q-front;return 1;elsefor(i=0;itop);i+)if(s-Gi).

13、num!=d.num) continue;else break;if(i=(s-top)printf(ERROR!n);return -1;x=d.time-(s-Gi).time;y=fee*x;printf(The time is %.2f hours,the fee is %.2f yuann,x,y);k=(SqStackk *)malloc(sizeof(SqStackk);k-topp=-1;for(j=(s-top);ji;j-)k-topp+; (k-Hk-topp).num=(s-Gj).num;(k-Hk-topp).time=(s-Gj).time;s-top-;for(

14、l=0;ltopp);l+)printf(the information(number and time) in the new stack is:n); printf(%d,%dn,(k-Hl).num,(k-Hl).time);s-top-;while(k-topp=0)s-top+;(s-Gs-top).num=(k-Hk-topp).num;(s-Gs-top).time=(k-Hk-topp).time;k-topp-;if(q-geshu=0)printf(The access road is empty!n);return 2;elses-top+;p=q-front-next;

15、q-front-next=p-next;(s-Gs-top).num=p-data;(s-Gs-top).time=d.time;free(p);q-geshu-;if(q-front-next=NULL)q-rear=q-front;return 3;4. 主函數(shù)的偽碼:main()SqStack *s;LinkQueue *q;QNODE *p;struct car aaMAXSIZE;int i;s=(SqStack *)malloc(sizeof(SqStack);s-top=-1;q=(LinkQueue *)malloc(sizeof(LinkQueue);p=(QNODE *)m

16、alloc(sizeof(QNODE);p-next=NULL;q-front=q-rear=p;q-geshu=0;printf(*n);H*printf(n);H*printf(H*停車場(chǎng)管理系統(tǒng)*n);printf(H*n);printf(H*n);for(i=0;iMAXSIZE;i+)printf(Please input the state,number and time of the car:n);scanf(%c,%d,%d,&(aai.bb),&(aai.num),&(aai.time);getchar();Judge_Output(s,q,&aai);if(aai.bb=E

17、|aai.bb=e) break;5. 函數(shù)調(diào)用關(guān)系:五測(cè)試分析:1. 出現(xiàn)問題及解決辦法:該程序是四個(gè)程序調(diào)試中最順利的一個(gè),只在一個(gè)地方上出了問題,就是輸入字符時(shí)由于回車鍵也是字符,回車鍵總會(huì)被讀入,導(dǎo)致經(jīng)常輸出“ERRO!R ”。后來找到原因后在 scanf 函數(shù)后緊接著加了一個(gè) getchar ();語句后就恢復(fù)了正常。2. 方法優(yōu)缺點(diǎn)分析 :優(yōu)點(diǎn):用棧和隊(duì)列來模擬停車場(chǎng)讓整個(gè)問題顯得簡(jiǎn)單,易于實(shí)現(xiàn);缺點(diǎn):棧和隊(duì)列這兩個(gè)數(shù)學(xué)模型用在停車場(chǎng)管理上還是有失妥當(dāng)?shù)模F(xiàn)實(shí)中停車場(chǎng) 出口入口不可能為同一處,不可能當(dāng)一輛車要離開,在它后面進(jìn)來的車必須為它讓 路,因此無法用棧的“后進(jìn)先出”原則來模擬

18、;而且沒有考慮便道上的車在等待過 程中可以中途開走等情況,而這些都無法用隊(duì)列的“先進(jìn)先出”原則來模擬3. 主要算法的時(shí)間和空間復(fù)雜度分析: ( 1)由于算法 Judge_Output 函數(shù)根據(jù)判斷條件,每次只選擇一個(gè)程序段執(zhí)行,所 以其時(shí)間復(fù)雜度是 O(1) ;( 2)由于算法 A_cars 函數(shù)根據(jù)判斷條件,將數(shù)據(jù)入?;蛉腙?duì)列,所以其時(shí)間復(fù)雜 度也是 O(1) ;(3)由于算法D_cars函數(shù)在出棧數(shù)據(jù)不在最頂端時(shí)需將 n個(gè)數(shù)據(jù)先出該棧,再入新棧,再回舊棧的操作,故其時(shí)間復(fù)雜度是 O(n) ;( 4)所有算法的空間復(fù)雜度都是 O(1) 。六使用說明程序運(yùn)行后用戶根據(jù)提示一次輸入車輛的狀態(tài)信息

19、,車牌編號(hào),時(shí)間,程序會(huì) 根據(jù)車輛的狀態(tài)信息調(diào)用相應(yīng)的函數(shù),并輸出用戶想得到的信息。七調(diào)試結(jié)果輸入數(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),( P, 0, 0),(W, 0, 0),(F, 0, 0),( E, 0, 0)。輸出數(shù)據(jù): 1號(hào)車停放時(shí)間為 10小時(shí),收費(fèi) 100元; 2 號(hào)車停放時(shí)間為 25小時(shí),收 費(fèi) 250元; 4號(hào)車停放 5小時(shí),收費(fèi) 50 元;此時(shí)停車場(chǎng)有兩輛車,便道上無車。若 停車場(chǎng)已滿,則會(huì)顯示停車場(chǎng)已滿的信息;若便道上無

20、車等待停車,會(huì)顯示便道上 無車的信息;若中途有車離開,需其后的車讓道,會(huì)顯示進(jìn)入臨時(shí)停車場(chǎng)的車輛的 信息;若輸入(F, 0, 0),輸出“ ERROR”;若輸入(E, 0, 0),程序 結(jié)束。運(yùn)行結(jié)果截屏:八附錄源程序文件清單:#include /* 調(diào)用的頭文件庫聲明 */#include#define MAXSIZE 14#define n 2#define fee 10struct car/*用該結(jié)構(gòu)體來存放車的狀態(tài),編號(hào)和時(shí)間信息 */ char bb;int num;int time;typedef struct stack /*用該棧來模擬停車場(chǎng) */struct car Gn;i

21、nt top;SqStack;struct rangweicar/*用該結(jié)構(gòu)體來存放臨時(shí)讓出的車輛的編號(hào)以及時(shí)間信息 */int num;int time;1;typedef struct stack /*用該棧來模擬臨時(shí)讓出的車輛的??繄?chǎng)地 */struct rangweicar HMAXSIZE;int topp;SqStackk;#define QNODE struct QnodeQNODE int data;/* 鏈隊(duì)結(jié)點(diǎn)的類型 */QNODE *next;typedef struct linkqueue /* 用該鏈隊(duì)來模擬便道 */QNODE *front,*rear;int ge

22、shu;LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r) /* 該算法通過傳遞 來的車輛信息調(diào) 用相關(guān)函數(shù)實(shí)現(xiàn)操作 */if(*r).bb=E|(*r).bb=e)/*若車輛狀態(tài)為E,終止程序*/printf(STOP!n);else if(*r).bb=P|(*r).bb=p)/*若車輛狀態(tài)為P,輸出停車場(chǎng)車輛數(shù) */printf(The number of parking cars is %dn,(s-top)+1);else if(*r).bb=W|(*r).bb=w)/*若車輛狀態(tài)為W,輸出便道車輛數(shù)

23、*/printf(The number of waiting cars is %dn,q-geshu);A_cars 函數(shù) */A_cars(s,q,*r);若車輛狀態(tài)為D,調(diào)用else if(*r).bb=D|(*r).bb=d) /*D_cars 函數(shù) */D_cars(s,q,*r);elseprintf(ERROR!n); /*若車輛狀態(tài)為其他字母,報(bào)錯(cuò) */A_cars(SqStack *s,LinkQueue *q,struct car a) /*該算法實(shí)現(xiàn)對(duì)車輛狀態(tài)為到達(dá)的車輛的操Q(mào)NODE *t;作*/if(s-top!=n-1) /*狀態(tài),車牌編(s-top)+;若停車場(chǎng)還沒

24、有滿,則車進(jìn)停車場(chǎng),并存入車輛的號(hào)和到達(dá)時(shí)間信息 */(s-Gs-top).bb=a.bb;(s-Gs-top).num=a.num;(s-Gs-top).time=a.time;elseprintf(The parking place is full!n); /* 若停車場(chǎng)已滿,車進(jìn)便道,并 顯示該車的車牌編t=(QNODE *)malloc(sizeof(QNODE);號(hào),同時(shí)記錄便道車輛數(shù)目 */t-data=a.num;t-next=NULL;q-rear-next=t;q-rear=t;printf(thenumber of the car in the access road is

25、:%dn,q-rear-data);q-geshu+;int D_cars(SqStack *s,LinkQueue *q,struct car d)/* 該算法實(shí)現(xiàn)車輛狀態(tài)為離開的車int i,j,l;輛的操作 */float x,y;QNODE *p;SqStackk *k;if(d.num=(s-Gs-top).num) /* 若待離開車為最后進(jìn)停車場(chǎng)的車的情況 */ x=d.time-(s-Gs-top).time;y=fee*x; /* 直接計(jì)算停車時(shí)間,費(fèi)用并離去 */ printf(The time is %.2f hours,the fee is %.2f yuann,x,y)

26、;if(q-geshu=0) /* 若便道上無車,函數(shù)返回 */printf(The queue is empty!n);return 0;Else /* 若便道上有車,第一輛車進(jìn)停車場(chǎng) */ p=q-front-next;q-front-next=p-next;*/(s-Gs-top).num=p-data;/*并存入其車牌編號(hào)及進(jìn)停車場(chǎng)的時(shí)間(s-Gs-top).time=d.time;free(p);q-geshu-;if(q-front-next=NULL)q-rear=q-front;/*若此時(shí)便道上無車,返回 1*/return 1;Else/*待離開的車不是最后進(jìn)停車場(chǎng)的那輛車的

27、情況 */for(i=0;itop);i+)/*先找到待離開車在停車場(chǎng)中的位置 */continue;if(s-Gi).num!=d.num)else break;if(i=(s-top)printf(ERROR!n);return -1;x=d.time-(s-Gi).time; /* 計(jì)算待離開車的停車時(shí)間并計(jì)算費(fèi)用 */ y=fee*x;printf(The time is %.2f hours,the fee is %.2f yuann,x,y);k=(SqStackk *)malloc(sizeof(SqStackk); /* 設(shè)立一個(gè)新棧臨時(shí)停放為該車離開而讓k-topp=-1; 路的車輛 */ for(j=(s-top);ji;j-)k-topp+; (k-Hk-topp).num=(s-Gj).num;(k-Hk-topp).time=(s-Gj).time;s-top-;for(l=0;ltopp);l+) printf(the information(number and time) in the new stack is:n);printf(%d,%dn,(k-Hl).num,(k-Hl).time);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論