數據結構 停車場管理系統_第1頁
數據結構 停車場管理系統_第2頁
數據結構 停車場管理系統_第3頁
數據結構 停車場管理系統_第4頁
數據結構 停車場管理系統_第5頁
已閱讀5頁,還剩7頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、一、設計目的1了解并掌握數據結構與算法的設計方法,具備初步的獨立分析和設計能力;2.初步掌握軟件開發過程的問題分析、系統設計、程序編碼、測試等基本方法和技能;3.提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力;4.訓練用系統的觀點和軟件開發一般規范進行軟件開發,培養軟件工作者所應具備的科學的工作方法和作風。二、設計內容設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內已停滿n輛汽車,則后來的汽車只能在門外的便道上等待,一旦有車開走,則排在便道上的第

2、一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。三、設計要求按照從終端讀入的輸入數據進行模擬管理,每一組輸入數據包括三個數據項:汽車“進站”或“出站”信息、汽車牌照號碼以及進站或出站的時刻,對每一組輸入數據進行操作后的輸出信息為:若是車輛到達,則輸出汽車在停車場內或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內逗留的時間和應交納的費用(在便道上停留不收費),按以順序結構實現,隊列以鏈表結構實現。四

3、、設計過程1、算法思想分析由于停車場是一個狹窄通道,而且只有一個大門可供汽車進出,問題要求汽車停車場內按車輛到達時間的先后順序,依次由北向南排列。由此很容易聯想到數據結構中的堆棧模型,因此可首先設計一個堆棧,以堆棧來模擬停車場,又因為每個汽車的車牌號都不一樣,這樣一來可以根據車牌號準確找到汽車位置,所以堆棧里的數據元素我設計成汽車的車牌號。當停車場內某輛車要離開時,在他之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入停車場。這是個一退一進的過程,而且讓道的汽車必須保持原有的先后順序,因此可再設計一個堆棧,以之來暫時存放為出站汽車暫時讓道的汽車車牌號。當停車場滿后

4、,繼續進來的汽車需要停放在停車場旁邊的便道上等候,若停車場有汽車開走,則按排隊的先后順序依次進站,最先進入便道的汽車將會最先進入停車場,這完全是一個先進先出模型,因此可設計一個隊列來模擬便道,隊列中的數據元素仍然設計成汽車的車牌號。另外,停車場根據汽車在停車場內停放的總時長來收費的,在便道上的時間不計費,因此必須記錄車輛進入停車場時的時間,車輛離開停車場時的時間不需要記錄,當從終端輸入時可直接使用。由于時間不像汽車一樣需要讓道,我設計了一個順序表來存放時間。又用順序表用派生法設計了一個堆棧,恰好滿足上面模擬停車場的需要。2、算法描述與實現(1)時間結點類型typedef struct time

5、 int hour; int min; Time; /*時間結點*/ (2)車輛進出站信息類型typedef struct node char num10;Time reach; Time leave; CarNode; /*車輛信息結點*/ (3)停車場和便道信息類型typedef struct NODE CarNode *stackMax+1;int top; SeqStackCar; /*模擬車站*/typedef struct car CarNode *data;struct car *next; QueueNode; typedef struct Node QueueNode *he

6、ad; QueueNode *rear; LinkQueueCar; /*模擬通道*/ void InitStack(SeqStackCar *,int n); /*聲明棧*/初始化,創建一個新棧S用于停車場int InitQueue(LinkQueueCar *); /*聲明便道*/初始化,創建一個隊列Q用于便道int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*車輛進站*/ CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(&q

7、uot;n請輸入車牌號(例如:吉A1234):"); 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->stackEnter->top=p; return(1

8、); else /*車場已滿,車進便道等待*/ printf("n該車須在便道等待!"); t=(QueueNode *)malloc(sizeof(QueueNode); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; return(1); void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *,int n); /*車輛出站*/(4)主函數和其它函數的偽碼算法void main() SeqStackCar Enter,Temp; Li

9、nkQueueCar Wait;int ch;int n; n=getn();InitStack(&Enter,n); /*初始化車場*/InitStack(&Temp,n); /*初始化讓路的臨時棧*/InitQueue(&Wait); /*初始化便道*/while(1) printf("n1. 車輛進站");printf(" 2. 車輛出站");printf(" 3. 存車信息");printf(" 4. 退出系統n"); while(1) printf("請選擇: 1|2|3

10、|4.n");scanf("%d",&ch);fflush(stdin);doif(ch>4 | ch<1)printf("輸入有誤,請重新輸入!");scanf("%d",&ch);fflush(stdin);elsebreak;while(ch>4 | ch<1);break;switch(ch) case 1:Arrival(&Enter,&Wait,n);break; /*車輛進站*/case 2:Leave(&Enter,&Temp,&

11、Wait,n);break; /*車輛出站*/case 3:List(Enter,Wait);break; /*存車信息*/case 4:exit(0); /*退出系統*/default:break; 系統測試程序初始界面:車輛進站:停車場存車信息:車輛進入便道:車輛出站:便道上的車出站:五、設計總結參考文獻:數據結構程序設計題典李春葆等編 清華大學出版社數據結構(C語言版) 黃國瑜 葉乃菁編 清華大學出版社數據結構課程設計蘇仕華 等編 機械工業出版社附錄:#include<stdio.h>#include<stdlib.h> #include<string.h&

12、gt;#include<malloc.h>/*-*/ #define Max 10int getn()int n;printf("歡迎您光臨吉吉停車場,");printf("本停車場管理實行24小時制,停車每分鐘0.1元.n");printf("請輸入停車場可容納的車(最多10輛):");scanf("%d",&n);fflush(stdin);doif(n<1 | n>10)printf("輸入的車輛數不在要求范圍內,請重新輸入!");scanf("%

13、d",&n);fflush(stdin);else break;while(n<1 | n>10);return n;typedef struct time int hour; int min; Time; /*時間結點*/ typedef struct node char num10;Time reach; Time leave; CarNode; /*車輛信息結點*/ typedef struct NODE CarNode *stackMax+1;int top; SeqStackCar; /*模擬車站*/typedef struct car CarNode

14、*data;struct car *next; QueueNode; typedef struct Node QueueNode *head; QueueNode *rear; LinkQueueCar; /*模擬通道*/ void InitStack(SeqStackCar *,int n); /*聲明棧*/int InitQueue(LinkQueueCar *); /*聲明便道*/int Arrival(SeqStackCar *,LinkQueueCar *,int n); /*車輛進站*/void Leave(SeqStackCar *,SeqStackCar *,LinkQueue

15、Car *,int n); /*車輛出站*/void List(SeqStackCar,LinkQueueCar); /*顯示存車信息*/ void InitStack(SeqStackCar *s,int n) /*初始化棧*/ int i; s->top=0; for(i=0;i<=n;i+)s->stacks->top=NULL; intInitQueue(LinkQueueCar *Q) /*初始化便道*/ Q->head=(QueueNode *)malloc(sizeof(QueueNode); if(Q->head!=NULL) Q->h

16、ead->next=NULL; Q->rear=Q->head; return(1); else return(-1); voidPRINT(CarNode *p) /*打印出站車的信息*/ int A1,A2,B1,B2;int a,b,c; printf("n請輸入離開的時間:/*:*/"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min);fflush(stdin);doif(p->leave.hour<p->reach.hour | (p

17、->leave.hour=p->reach.hour && p->leave.min<p->reach.min)printf("輸入離開時間比進站時間早,請重新輸入!n");scanf("%d:%d",&(p->leave.hour),&(p->leave.min);fflush(stdin);if(p->leave.hour<0 | p->leave.hour>=24 | p->leave.min<0 | p->leave.min>

18、=60)printf("輸入的時間格式有錯,請重新輸入!");scanf("%d:%d",&(p->leave.hour),&(p->leave.min);fflush(stdin);else break;while(p->leave.hour<p->reach.hour | (p->leave.hour=p->reach.hour && p->leave.min<p->reach.min) | p->leave.hour<0 | p->leav

19、e.hour>=24 | p->leave.min<0 | p->leave.min>=60);printf("車場現在有一輛車離開,請便道里的第一輛車進入車場!n");printf("出站的車的車牌號為:");puts(p->num);printf("n");A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min;a=(B1-A1)*60+B2-A2;if(a>=60)b=a/60;c=

20、a-60*b;elseb=0;c=a;printf(" 祝您一路順風,歡迎您下次光臨.");printf("n 收 據n");printf("= 車牌號: ");puts(p->num);printf("n");printf("=n");printf("|進車場時刻 | 出車場時刻 | 停留時間 | 應付(元)|n");printf("=n");printf("| %d:%d",p->reach.hour,p->rea

21、ch.min);printf(" | %d:%d",p->leave.hour,p->leave.min);printf(" | %d:%d",b,c);printf(" | %2.1f",0.1*a);printf(" |n");printf("-n");free(p); intArrival(SeqStackCar *Enter,LinkQueueCar *W,int n) /*車輛到達*/ CarNode *p; QueueNode *t; int a,b;p=(CarNode

22、 *)malloc(sizeof(CarNode); flushall(); printf("n請輸入車牌號(七位,例:吉A1234):n");printf("請嚴格按照要求輸入車牌號,否則系統會出錯!n");doa=strlen("陜A1234");b=strlen(gets(p->num);fflush(stdin);if(a!=b)printf("輸入車牌號格式錯誤,請重新輸入(七位)!n");gets(p->num);fflush(stdin);else break;if(a!=b)printf

23、("輸入車牌號格式錯誤,請重新輸入(七位)!n");while(a!=b);if(Enter->top<n) /*車場未滿,車進車場*/ Enter->top+; printf("n車輛在車場第%d位置.",Enter->top); fflush(stdin);printf("n請輸入到達時間:/*:*/"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min);fflush(stdin);doif(p->reach

24、.hour<0 | p->reach.hour>=24 | p->reach.min<0 | p->reach.min>=60)printf("輸入的時間格式有錯,請重新輸入!");scanf("%d:%d",&(p->reach.hour),&(p->reach.min);fflush(stdin);elsebreak;while(p->reach.hour<0 | p->reach.hour>=24 | p->reach.min<0 | p-&g

25、t;reach.min>=60);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; return(1); voidLeave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W,in

26、t n) /*車輛離開*/ int i, room; CarNode *p,*t; QueueNode *q; /*判斷車場內是否有車*/ if(Enter->top>0) /*有車*/ while(1) /*輸入離開車輛的信息*/ printf("n請輸入要離開的車在車場的位置/1-%d/:",Enter->top);scanf("%d",&room);fflush(stdin); if(room>=1&&room<=Enter->top) break; while(Enter->top

27、>room) /*車輛離開*/ Temp->top+; Temp->stackTemp->top=Enter->stackEnter->top; Enter->stackEnter->top=NULL; Enter->top-; p=Enter->stackEnter->top; Enter->stackEnter->top=NULL; Enter->top-; while(Temp->top>=1) Enter->top+; Enter->stackEnter->top=Temp

28、->stackTemp->top; Temp->stackTemp->top=NULL; Temp->top-; PRINT(p);/*判斷通道上是否有車及車站是否已滿*/ if(W->head!=W->rear)&&Enter->top<n) /*便道的車輛進入車場*/q=W->head->next; t=q->data; Enter->top+; printf("n現在請便道上的車進入車場.該車的車牌號為:");puts(t->num);printf("n該車進

29、入車場第%d位置.",Enter->top);printf("n請輸入現在的時間(即該車進站的時間)/*:*/:");scanf("%d:%d",&(t->reach.hour),&(t->reach.min);fflush(stdin); doif(t->reach.hour<0 | t->reach.hour>=24 | t->reach.min<0 | t->reach.min>=60)printf("輸入的時間格式有錯,請重新輸入!")

30、;scanf("%d:%d",&(t->reach.hour),&(t->reach.min);fflush(stdin);elsebreak;while(t->reach.hour<0 | t->reach.hour>=24 | t->reach.min<0 | t->reach.min>=60);W->head->next=q->next; if(q=W->rear) W->rear=W->head; Enter->stackEnter->top=

31、t; free(q); else printf("n目前便道里沒有車.n"); else printf("n目前車場里沒有車,來車請直接進入車場!"); /*沒車*/ voidList1(SeqStackCar *S) /*列表顯示車場存車信息*/ int i; if(S->top>0) /*判斷車站內是否有車*/ printf("n車場:"); printf("n 位置 到達時間 車牌號n"); for(i=1;i<=S->top;i+) printf(" %d ",i

32、); printf("%d:%d ",S->stacki->reach.hour,S->stacki->reach.min); puts(S->stacki->num); else printf("n目前車場里沒有車"); voidList2(LinkQueueCar *W) /*列表顯示便道信息*/ QueueNode *p; p=W->head->next; if(W->head!=W->rear) /*判斷通道上是否有車*/ printf("n目前正在等待車輛的號碼為:"

33、;);while(p!=NULL) puts(p->data->num); p=p->next; printf("n"); else printf("n目前便道里沒有車."); voidList(SeqStackCar S,LinkQueueCar W) int flag,tag; flag=1; while(flag) printf("n1.車場n2.便道n3.返回n"); while(1) printf("n請選擇 1|2|3:"); scanf("%d",&tag);fflush(stdin);doif

溫馨提示

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

最新文檔

評論

0/150

提交評論