數(shù)據結構實驗報告模擬停車場管理(含代碼)_第1頁
數(shù)據結構實驗報告模擬停車場管理(含代碼)_第2頁
數(shù)據結構實驗報告模擬停車場管理(含代碼)_第3頁
數(shù)據結構實驗報告模擬停車場管理(含代碼)_第4頁
數(shù)據結構實驗報告模擬停車場管理(含代碼)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、模擬停車場管理班級:物聯(lián)網 姓名:XXX 學號:XXXXXXX 日期:4月9日一、需求分析 1、程序的功能描述 按照從終端輸入的數(shù)據序列進行模擬管理。 1)狹道停車用棧來實現(xiàn),并且用的順序棧,等車位的便道用隊列來實現(xiàn),并用鏈 式存儲。 2)每一組輸入信息包含三個數(shù)據項,汽車的“到達”和“離去”的信息,汽車牌 照號碼,汽車“到達”或“離去”的時刻。 3)對每一組輸入數(shù)據進行操作后的輸出信息為:若是車輛到達,則輸出車輛在停車場內或便道上的停車位置;若是車子離去,則輸出車輛在停車場內停留的時間和繳納的費用。(假設在便道等車的時間不收費) 4)選作內容:(1)便道也是要收費的,僅僅比狹道收費便宜點。

2、(2)狹道上的車可以直接開走。 2、 輸入/輸出的要求 首先選擇操作的模塊,根據提示輸入車牌和到達時間,程序會告知是否停滿或者停車車位。車牌為10個字符以內的字符串,時間的輸入中間有冒號把時分隔開。3、 測試數(shù)據 1 蘇D543 1:10 1 蘇Q123 1:20 1 蘇D145 1:30二、概要設計 1、本程序所用的抽象數(shù)據類型的定義 typedef struct NODECarNode *stackMAX+1; int top;SeqStackCar;/狹道的堆棧順序存儲typedef struct carCarNode *data; struct car *next;QueueNode;

3、/隊列的鏈式存儲typedef struct NodeQueueNode *head; QueueNode *rear;LinkQueueCar;/便道上等候的隊列定義2、 主模塊的流程及各子模塊的主要功能 車輛到達:int Arrival(SeqStackCar *Enter,LinkQueueCar *W)首先定義一個棧和隊列的結構體指針為:*p , *t 。然后申請一個車輛信息的內存空間,并把它賦給棧指針。 車輛到達時就輸入車牌號,并通過if(Enter->top<MAX)來判斷該車是進車場內還是進便道上,如果是進車場內就把top 加1,顯示 在車場內的位置,還要輸入進車場的

4、時間,然后把該節(jié)點進棧。如果是else 就顯示該車要停在便道上,并進行進隊列的操作。 車輛離開: void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) 定義一個整型變量room 記錄要離開車輛的位置,定義兩個棧指針和一個隊列指針, 用個if(Enter->top>0) 確保棧不空,然后用個while(1) 確保輸入的車輛離開位置的合法 性。如果不和法,顯示輸入有誤,要重新輸入。通過while(Enter->top>room) 判斷離開車輛的位置,如果是中間位置,就要再用一個棧前面臨時開出來的車,

5、等要開出的車開出后,再把臨時棧的車看進 車場內,并要調用PRINT(p,room); 這個函數(shù)計算顯示費用。然后還要用 if(W->head!=W->rear)&&Enter->top<MAX) 語句判斷便道上有沒有車,如果有車就要顯示進車場的車的車牌號,并登記進入時間。開始初始化兩個棧Enter和Temp及一個隊列Wait。進入主菜單車到達車離開退出Room前車輛進臨時棧對room計費便道車信息車場內信息判便道是否有車車場是否為空列表顯示棧Enter元素出棧隊列中元素進棧隊列Wait中元素出隊元素進棧Enter便道車進車場元素進隊列Wait判斷棧是否為

6、滿結束退出列表顯示是否否是否是3、 模塊之間的層次關系 主函數(shù)中包含著各個函數(shù)模塊,各模塊也在互相調用。比如,離開函數(shù)中要計算停車費,故要調取價格函數(shù)。價格函數(shù)計算要用到離開和進入的時間,又要調用進入和離開函數(shù)。三、詳細設計 1、采用C語言定義相關的數(shù)據類型#define MAX 3 / 停車場最大容量為3輛,便于觀察#define price 0.05typedef struct time / 定義時間結構體int hour;int min;Time;typedef struct node / 定義車輛信息結構體char num10; Time reach; Time leave;CarNo

7、de;2、 寫出各模塊的偽碼算法void PRINT(CarNode *p,int room) / 車輛收費int A1,A2,B1,B2;printf("n車輛離開的時間:"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min); printf("n離開車輛的車牌號為:"); puts(p->num); printf("n其到達停車位時間); printf("n離開停車位時間為:); A1=p->reach.hour; A2=p-

8、>reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n應交費用為: %2.1f元",(B1-A1)*60+(B2-A2)*price+PRINTE(p,room);free(p);int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/進入便道或者狹道 CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf("n請輸入車牌號(例:豫B1234)

9、:"); gets(p->num);if(Enter->top<MAX)Enter->top+; printf("n車輛在車場第%d位置.",Enter->top); printf("n車輛到達時間:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); Enter->stacktop=p; return(1);else printf("n該車須在便道等待!有車位時進入車場"); t=(Queu

10、eNode *)malloc(sizeof(QueueNode); 進入隊列,調整指針;printf("請輸入進入便道的時間"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); return(1);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /車輛的離開int room; CarNode *p,*t; QueueNode *q;if(Enter->top>0) / 判斷車場是否為空

11、 while(1) printf("n請輸入車在車場的位置/1-%d/:",Enter->top); scanf("%d",&room); if(room>=1&&room<=Enter->top) break; else printf("n 輸入有誤,請重輸: ");while(Enter->top>room) / 把要刪除的車輛的前面的車開出來,進臨時棧。Temp->top+; Temp->stackTemp->top=Enter->stackEn

12、ter->top; Enter->stackEnter->top=NULL; Enter->top-; p=Enter->stackEnter->top; /把要刪除的車輛節(jié)點賦給p。 Enter->stackEnter->top=NULL; Enter->top-;while(Temp->top>=1) / 再把臨時棧里德車輛進停車場Enter->top+; Enter->stackEnter->top=Temp->stackTemp->top; Temp->stackTemp->to

13、p=NULL; Temp->top-;PRINT(p,room); / 調用計費函數(shù)計費。if(W->head!=W->rear)&&Enter->top<MAX) /如果便道上有車,則再開進停車場。 q=W->head->next; t=q->data; Enter->top+; scanf("%d:%d",&(t->reach.hour),&(t->reach.min); / t->leave .hour =t->reach.hour; /t->leave

14、 .min =t->reach.min; W->head->next=q->next;if(q=W->rear) W->rear=W->head;Enter->stackEnter->top=t;PRINTE(t,room); free(q);else printf("n便道里沒有車.n");else printf("n車場里沒有車."); 3、畫出函數(shù)的調用關系圖 |->到達函數(shù)-| |->離開函數(shù)->停車費用主函數(shù)->顯示車場里的情況 |->顯示便道里的情況四、調試分

15、析 1、調試中遇到的問題及對問題的解決方法 因為時間結構體里的小時,分鐘都是用的是整型,所以如果出現(xiàn)1:01這個時間的話,會導致顯示列表是1:1;這樣的話會造成人的誤解,同時會導致程序對停車繳納的費用計算錯誤。解決方法1:可以用數(shù)組和或者字符串來表示時間,但是問題來了,要是用字符串的話,算停車費有點問題,要廢上一段時間的,會提高復雜度。解決方案2:將輸出用右對齊方式,缺位的用0補齊,這樣最快捷啦!2、 算法的時間復雜度和空間復雜度 由于沒有進行循環(huán)嵌套之類的運算,只有簡單的循環(huán)語句,所以時間復雜度T(O)=O(n),在數(shù)據的存儲方面,除了車牌號用的是數(shù)組以外,便道用的是順序棧,這些是提前要申請

16、一定的存儲空間的,這樣非動態(tài)分配的存儲空間,在某些時候是會導致空間的浪費,增加其空間復雜度。其余的都是結構體和鏈式存儲的隊列屬于動態(tài)存儲。當停車場的規(guī)模較小時,空間復雜度較小,隨著規(guī)模的增加,動態(tài)存儲的擴充,空間復雜度也隨之增加。5、 使用說明及測試結果(給出程序的使用說明、注意事項及不同情況的測試結果) 時間以24進制計算,停車時間不能跨越24進制。車牌號是10個字符串以內,不可溢出。第一個應繳費用是在便道中的費用,第二個費用是總費用。六、源程序(要求程序簡潔、清晰、主要語句帶注釋)代碼非本人寫,對其進行改進而已#include<stdio.h>#include<stdli

17、b.h>#include<string.h>#define MAX 3 / 停車場最大容量為3輛,便于觀察#define price 0.05#define pricee 0.02typedef struct time / 定義時間結構體int hour;int min;Time;typedef struct node / 定義車輛信息結構體char num10; Time reach; Time leave;CarNode;typedef struct NODECarNode *stackMAX+1; int top;SeqStackCar;typedef struct c

18、arCarNode *data; struct car *next;QueueNode;typedef struct NodeQueueNode *head; QueueNode *rear;LinkQueueCar;void InitStack(SeqStackCar *); int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,LinkQueueCar *); void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);void List(SeqStackCar,LinkQueueC

19、ar); void main()SeqStackCar Enter,Temp; LinkQueueCar Wait; int ch;system("color 4A"); InitStack(&Enter); InitStack(&Temp); InitQueue(&Wait); while(1) printf("n §§§§§§ 歡迎使用停車場系統(tǒng).§§§§§§tnn"); printf("nt# 1

20、. 車輛到達登記.#tn"); printf("nt# 2. 車輛離開登記.#tn"); printf("nt# 3. 車輛列表顯示.#tn"); printf("nt# 4. 退出系統(tǒng). #tnn");while(1)printf(" 請選擇: "); scanf("%d",&ch); if(ch>=1&&ch<=4)break; else printf("n 輸入有誤,請重新選擇: 14: ");switch(ch) case

21、 1:Arrival(&Enter,&Wait);break; case 2:Leave(&Enter,&Temp,&Wait);break; case 3:List(Enter,Wait);break; case 4:exit(0); default: break;/ 自定義函數(shù)void InitStack(SeqStackCar *s) / 棧的初始化 int i; s->top=0; for(i=0;i<=MAX;i+) s->stacks->top=NULL;int InitQueue(LinkQueueCar *Q) /

22、 隊列的初始化Q->head=(QueueNode *)malloc(sizeof(QueueNode);if(Q->head!=NULL)Q->head->next=NULL; Q->rear=Q->head; return(1); else return(-1);float PRINTE(CarNode *p,int room) / 車輛收費int A1,A2,B1,B2;printf("n車輛離開便道的時間:"); scanf("%d:%d",&(p->leave.hour),&(p->

23、;leave.min); printf("n離開車輛的車牌號為:"); puts(p->num); printf("n其到達便道時間為: %d:%d",p->reach.hour,p->reach.min); printf("n離開便道時間為: %d:%d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n

24、應交費用為: %2.1f元",(B1-A1)*60+(B2-A2)*pricee);return(B1-A1)*60+(B2-A2)*pricee); free(p);void PRINT(CarNode *p,int room) / 車輛收費int A1,A2,B1,B2;printf("n車輛離開的時間:"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min); printf("n離開車輛的車牌號為:"); puts(p->num); prin

25、tf("n其到達停車位時間為: %d:%d",p->reach.hour,p->reach.min); printf("n離開停車位時間為: %d:%d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n應交費用為: %2.1f元",(B1-A1)*60+(B2-A2)*price+PRINTE(p,room); free

26、(p); / 車輛的到達登記int Arrival(SeqStackCar *Enter,LinkQueueCar *W) CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf("n請輸入車牌號(例:豫B1234):"); gets(p->num);if(Enter->top<MAX)Enter->top+; printf("n車輛在車場第%d位置.",Enter->top); printf("n車輛到達時

27、間:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); Enter->stackEnter->top=p; return(1);else printf("n該車須在便道等待!有車位時進入車場"); t=(QueueNode *)malloc(sizeof(QueueNode); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t;printf("請輸入進入便道的時

28、間"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); return(1);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /車輛的離開int room; CarNode *p,*t; QueueNode *q;if(Enter->top>0) / 判斷車場是否為空 while(1) printf("n請輸入車在車場的位置/1-%d/:",Enter->top); sc

29、anf("%d",&room); if(room>=1&&room<=Enter->top) break; else printf("n 輸入有誤,請重輸: ");while(Enter->top>room) / 把要刪除的車輛的前面的車開出來,進臨時棧。Temp->top+; Temp->stackTemp->top=Enter->stackEnter->top; Enter->stackEnter->top=NULL; Enter->top-; p=

30、Enter->stackEnter->top; /把要刪除的車輛節(jié)點賦給p。 Enter->stackEnter->top=NULL; Enter->top-;while(Temp->top>=1) / 再把臨時棧里德車輛進停車場Enter->top+; Enter->stackEnter->top=Temp->stackTemp->top; Temp->stackTemp->top=NULL; Temp->top-;PRINT(p,room); / 調用計費函數(shù)計費。if(W->head!=W-&

31、gt;rear)&&Enter->top<MAX) /如果便道上有車,則再開進停車場。 q=W->head->next; t=q->data; Enter->top+; printf("n便道的%s號車進入車場第%d位置.",t->num,Enter->top); printf("n請輸入%s號車進入車場的時間:",t->num); scanf("%d:%d",&(t->reach.hour),&(t->reach.min); / t->leave .hour =t->reach.hour; /t->leave .min =t->reach.min; W->head->next=q->next;if(q=W->rear) W->rear=W->head;Enter->stackEnter->top=t;PRINTE(t,room); free(q);else printf("n便道里沒有車.n");else printf("n車場里沒有車.")

溫馨提示

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

評論

0/150

提交評論