停車場管理系統(tǒng)__C語言實現(xiàn)_第1頁
停車場管理系統(tǒng)__C語言實現(xiàn)_第2頁
停車場管理系統(tǒng)__C語言實現(xiàn)_第3頁
停車場管理系統(tǒng)__C語言實現(xiàn)_第4頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.一問題描述1. 實驗題目:設(shè)停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內(nèi)按車輛到達時間的先后順序, 依次由北向南排列 (大門在最南端,最先到達的第一輛車停放在車場的最北端) 。若停車場內(nèi)已經(jīng)停滿 n 輛車,那么后來的車只能在門外的便道上等候。 一旦有車開走, 則排在便道上的第一輛車即可開入。當(dāng)停車場內(nèi)某輛車要離開時, 在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外, 其他車輛再按原次序進入車場。 每輛停放在車場的車在它離開停車場時必須按它停留的時間長短繳納費用。 試為停車場編制按上述要求進行管理的模擬程序。2. 基本要求:以棧模擬停車場, 以

2、隊列模擬車場外的便道, 按照從終端讀入數(shù)據(jù)的序列進行模擬管理。每一組輸入數(shù)據(jù)包括三個數(shù)據(jù)項:汽車的“到達” (A表示)或“離去”(D表示)信息、汽車標(biāo)識(牌照號)以及到達或離去的時刻。對每一組輸入數(shù)據(jù)進行操作后的輸出信息為: 若是車輛到達, 則輸出汽車在停車場內(nèi)或者便道上的停車位置; 若是車輛離去, 則輸出汽車在停車場停留的時間和應(yīng)繳納的費用(便道上停留的時間不收費) 。棧以順序結(jié)構(gòu)實現(xiàn),隊列以鏈表結(jié)構(gòu)實現(xiàn)。3. 測試數(shù)據(jù):設(shè) 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),(

3、E,0,0)。每一組輸入數(shù)據(jù)包括三個數(shù)據(jù)項:汽車“到達”或“離去”信息、汽車牌照號碼及到達或離去的時刻,其中, A表示到達; D表示離去, E表示輸入結(jié)束。其中:(A,1,5)表示 1 號牌照車在 5 這個時刻到達,而( D,1,15)表示 1 號牌照車在 15 這個時刻離去。4. 簡述每一部分的對象、目的和要求:I. 主函數(shù)部分:對象:棧,隊列;目的:創(chuàng)建棧和隊列對停車場管理系統(tǒng)進行模擬;要求:對棧和隊列進行初始化。word 教育資料.II 被調(diào)函數(shù)部分:對象:棧和隊列中的結(jié)點(亦即車輛的信息) ;目的:將結(jié)點存放到棧和隊列中,并作出正確的處理;要求:根據(jù)各結(jié)點的信息,調(diào)用相應(yīng)的函數(shù)或者語句

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

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

6、s full! ”,同時車輛進隊列(模擬停車場旁便道),并顯示該進入便道車輛的車牌編號,讓用戶知道該車的具體位置;若車輛信息為“離開” ,會顯示該車進入停車場的時間以及相應(yīng)的停車費用,若該車較部分車早進停車場, 這部分車需先退出停車場, 暫時進入一個新棧為其讓道,會顯示進入新棧的車輛的車牌編號及其入停車場的時間, 當(dāng)待離開車離開停車場后,這部分車會重新進入停車場, 同時便道上的第一輛車進入停車場;若輸入(P,0,0),會顯示停車場的車數(shù);若輸入( W,0, 0),會顯示便道上的車數(shù);若輸入( E,0,0),程序會跳出循環(huán),同時程序結(jié)束;若輸入為其word 教育資料.他字母,程序會顯示“ ERR

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

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

9、node *, biQnode*,ci int ,i=1,2,3.,n,n0;word 教育資料.數(shù)據(jù)關(guān)系: R= ;基本操作:Judge_Output(s,q,r);/ 根據(jù) r 中車輛信息控制車輛是入棧 s還是入隊 q 以及相關(guān)操作A_cars(s,q, a);/ 將到達車輛 a 的信息入棧 s 或者入隊qD_cars(s,q, d);/ 將待離開車輛 d 出棧 s,并將 q 中相應(yīng)車輛入棧并進行相關(guān)的操作ADT LinkQueue3. 主要算法流程圖:I Judge_Output 算法流程圖:word 教育資料.開始F輸入為 E(e)TF輸入為 P(p)輸出“ STOP!”TF輸入為 W

10、(w)輸出停車場車輛的數(shù)目TF輸入為 A(a)輸出便道上車輛數(shù)目T輸入為 D(d)調(diào)用 A_cars函數(shù)調(diào)用 D_cars函數(shù)結(jié)束II A_cars 算法流程圖:word 教育資料.開始停車場未滿TF車進停車場車進便道結(jié)束III D_cars 算法流程圖:開始該車是最后進FT停車場的車在該車后進的車退結(jié)賬離開出停車場后讓其結(jié)賬離開便道上有車TF便道上第一輛車進停車場結(jié)束word 教育資料.4. 本程序保護模塊:主函數(shù)模塊棧單元模塊:實現(xiàn)棧的抽象數(shù)據(jù)類型隊列單元模塊:實現(xiàn)隊列的抽象數(shù)據(jù)類型調(diào)用關(guān)系:棧單元模塊主函數(shù)模塊隊列單元模塊四詳細設(shè)計1. 相關(guān)頭文件庫的調(diào)用說明:#include<s

11、tdio.h>#include<stdlib.h>#define MAXSIZE 14#define n 2#define fee 102. 元素類型、結(jié)點類型和結(jié)點指針類型:struct car char bb; int num;int time;struct rangweicarint num;int time;typedef struct stackkstruct rangweicar HMAXSIZE;word 教育資料.int topp;SqStackk;#define QNODE struct QnodeQNODE int data;QNODE *next;3.

12、棧類型和隊列類型:typedef struct stackstruct car Gn;int top;SqStack;typedef struct linkqueueQNODE *front,*rear;int geshu;LinkQueue;/ 部分基本操作的偽碼實現(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='

13、p')printf("The number of parking cars is %dn",(s->top)+1); else 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')

14、D_cars(s,q,*r);elseword 教育資料.printf("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).num=a.num;(s->Gs->top).time=a.time;elseprintf("The parking place is full!n");t=(QNODE *)malloc(si

15、zeof(QNODE);t->data=a.num;t->next=NULL;q->rear->next=t;q->rear=t;printf("thenumberofthecarintheaccessroadis:%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).num)x=d.tim

16、e-(s->Gs->top).time;word 教育資料.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;(s->Gs->top).time=d.

17、time;free(p);q->geshu-;if(q->front->next=NULL)q->rear=q->front;return 1;elsefor(i=0;i<(s->top);i+)if(s->Gi).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 i

18、s %.2f yuann",x,y);word 教育資料.k=(SqStackk *)malloc(sizeof(SqStackk);k->topp=-1;for(j=(s->top);j>i;j-)k->topp+; (k->Hk->topp).num=(s->Gj).num;(k->Hk->topp).time=(s->Gj).time;s->top-;for(l=0;l<=(k->topp);l+)printf("the information(number and time) in the

19、 new stack is:n"); printf("%d,%dn",(k->Hl).num,(k->Hl).time); s->top-;while(k->topp>=0)s->top+;(s->Gs->top).bb='A'(s->Gs->top).num=(k->Hk->topp).num;(s->Gs->top).time=(k->Hk->topp).time;k->topp-;if(q->geshu=0)printf("T

20、he access road is empty!n");return 2;elses->top+;p=q->front->next;q->front->next=p->next;(s->Gs->top).num=p->data;(s->Gs->top).time=d.time;free(p);word 教育資料.q->geshu-;if(q->front->next=NULL)q->rear=q->front;return 3;4. 主函數(shù)的偽碼:main()SqStack *s;Link

21、Queue *q;QNODE *p;struct car aaMAXSIZE;int i;s=(SqStack *)malloc(sizeof(SqStack);s->top=-1;q=(LinkQueue *)malloc(sizeof(LinkQueue);p=(QNODE *)malloc(sizeof(QNODE);p->next=NULL;q->front=q->rear=p;q->geshu=0;printf("*n");printf("*n");printf("*停車場管理系統(tǒng)*n");pr

22、intf("*n");printf("* *n");word 教育資料.for(i=0;i<MAXSIZE;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'|aai.bb='e&#

23、39;) break;5. 函數(shù)調(diào)用關(guān)系:main函數(shù)調(diào)用 A_cars函數(shù)調(diào)用Judge_Output 函數(shù)調(diào)用 D_cars函數(shù)五測試分析:1. 出現(xiàn)問題及解決辦法:該程序是四個程序調(diào)試中最順利的一個,只在一個地方上出了問題, 就是輸入字符時由于回車鍵也是字符,回車鍵總會被讀入,導(dǎo)致經(jīng)常輸出“ERROR!”。后來找到原因后在scanf 函數(shù)后緊接著加了一個getchar ();語句后就恢復(fù)了正常。2. 方法優(yōu)缺點分析 :優(yōu)點:用棧和隊列來模擬停車場讓整個問題顯得簡單,易于實現(xiàn);缺點:棧和隊列這兩個數(shù)學(xué)模型用在停車場管理上還是有失妥當(dāng)?shù)模?現(xiàn)實中停車場出口入口不可能為同一處, 不可能當(dāng)一輛車

24、要離開, 在它后面進來的車必須為word 教育資料.它讓路,因此無法用棧的“后進先出”原則來模擬;而且沒有考慮便道上的車在等待過程中可以中途開走等情況,而這些都無法用隊列的 “先進先出” 原則來模擬。3. 主要算法的時間和空間復(fù)雜度分析:( 1)由于算法 Judge_Output 函數(shù)根據(jù)判斷條件,每次只選擇一個程序段執(zhí)行,所以其時間復(fù)雜度是O(1) ;( 2)由于算法 A_cars 函數(shù)根據(jù)判斷條件, 將數(shù)據(jù)入?;蛉腙犃?, 所以其時間復(fù)雜度也是 O(1) ;( 3)由于算法 D_cars 函數(shù)在出棧數(shù)據(jù)不在最頂端時需將n 個數(shù)據(jù)先出該棧, 再入新棧,再回舊棧的操作,故其時間復(fù)雜度是O(n)

25、;( 4)所有算法的空間復(fù)雜度都是 O(1) 。六使用說明程序運行后用戶根據(jù)提示一次輸入車輛的狀態(tài)信息, 車牌編號,時間,程序會根據(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 號車停放時間為 10 小時,收費 100 元;2 號車停放時間為 25 小時,收費 250 元; 4 號車停放 5 小時,收費 50 元;此時停車場有兩輛車,便道上無

26、車。若停車場已滿,則會顯示停車場已滿的信息;若便道上無車等待停車,會顯示便道上無車的信息; 若中途有車離開, 需其后的車讓道, 會顯示進入臨時停車場的車輛的信息;若輸入( F,0,0),輸出“ ERROR!”;若輸入(E,0,0),程序結(jié)束。運行結(jié)果截屏:word 教育資料.八附錄源程序文件清單:#include<stdio.h>/*調(diào)用的頭文件庫聲明*/#include<stdlib.h>#define MAXSIZE 14#define n 2#define fee 10struct car/*用該結(jié)構(gòu)體來存放車的狀態(tài),編號和時間信息*/ char bb;int n

27、um;int time;typedef struct stack/*用該棧來模擬停車場*/struct car Gn;int top;SqStack;struct rangweicar/*用該結(jié)構(gòu)體來存放臨時讓出的車輛的編號以及時間信息*/int num;int time;typedef struct stack/*用該棧來模擬臨時讓出的車輛的??繄龅?/struct rangweicar HMAXSIZE;int topp;SqStackk;#define QNODE struct QnodeQNODE int data;/*鏈隊結(jié)點的類型*/QNODE *next;word 教育資料.;t

28、ypedef struct linkqueue/*用該鏈隊來模擬便道*/QNODE *front,*rear;int geshu;LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r) /*該算法通過傳遞來的車輛信息調(diào)用相關(guān)函數(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)為

29、P,輸出停車場車輛數(shù)*/printf("The number of parking cars is %dn",(s->top)+1);else if(*r).bb='W'|(*r).bb='w')/*若車輛狀態(tài)為W,輸出便道車輛數(shù)*/printf("The number of waiting cars is %dn",q->geshu);else if(*r).bb='A'|(*r).bb='a')/*若車輛狀態(tài)為A,調(diào)用 A_cars 函數(shù)*/A_cars(s,q,*r);el

30、se if(*r).bb='D'|(*r).bb='d')/*若車輛狀態(tài)為D,調(diào)用 D_cars 函數(shù)*/D_cars(s,q,*r);elseprintf("ERROR!n");/*若車輛狀態(tài)為其他字母,報錯*/A_cars(SqStack *s,LinkQueue *q,struct car a)/*該算法實現(xiàn)對車輛狀態(tài)為到達的車輛的操Q(mào)NODE *t;作 */if(s->top!=n-1)/*若停車場還沒有滿,則車進停車場,并存入車輛的狀態(tài),車牌編(s->top)+;號和到達時間信息*/(s->Gs->top).

31、bb=a.bb;(s->Gs->top).num=a.num;(s->Gs->top).time=a.time;elseprintf("The parking place is full!n");/*若停車場已滿,車進便道,并顯示該車的車牌編t=(QNODE *)malloc(sizeof(QNODE);號,同時記錄便道車輛數(shù)目*/t->data=a.num;t->next=NULL;q->rear->next=t;q->rear=t;printf("the number of the car in the a

32、ccess road is:%dn",q->rear->data);word 教育資料.q->geshu+;int D_cars(SqStack *s,LinkQueue *q,struct car d)/*該算法實現(xiàn)車輛狀態(tài)為離開的車int i,j,l;輛的操作 */float x,y;QNODE *p;SqStackk *k;if(d.num=(s->Gs->top).num)/*若待離開車為最后進停車場的車的情況*/x=d.time-(s->Gs->top).time;y=fee*x;/*直接計算停車時間,費用并離去*/printf(&

33、quot;The time is %.2f hours,the fee is %.2f yuann",x,y);if(q->geshu=0)/*若便道上無車,函數(shù)返回*/printf("The queue is empty!n");return 0;Else/*若便道上有車,第一輛車進停車場*/p=q->front->next;q->front->next=p->next;(s->Gs->top).num=p->data;/*并存入其車牌編號及進停車場的時間*/(s->Gs->top).time=d

34、.time;free(p);q->geshu-;if(q->front->next=NULL)q->rear=q->front;/*若此時便道上無車,返回1*/return 1;Else/*待離開的車不是最后進停車場的那輛車的情況*/for(i=0;i<(s->top);i+)/*先找到待離開車在停車場中的位置*/if(s->Gi).num!=d.num) continue;else break;if(i>=(s->top)printf("ERROR!n");return -1;x=d.time-(s->Gi

35、).time;/*計算待離開車的停車時間并計算費用*/y=fee*x;printf("The time is %.2f hours,the fee is %.2f yuann",x,y);k=(SqStackk *)malloc(sizeof(SqStackk);/*設(shè)立一個新棧臨時停放為該車離開而讓k->topp=-1;路的車輛 */for(j=(s->top);j>i;j-)word 教育資料.k->topp+; (k->Hk->topp).num=(s->Gj).num;(k->Hk->topp).time=(s->Gj).time;s->top-;for(l=0;l<=(k->topp);l+)printf("the information(number and time) in the new stack is:n");printf("%d,%dn",(k->Hl).num,(k->Hl).time);/*顯示在新棧中的車輛信息 */s->t

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論