停車場實驗報告_第1頁
停車場實驗報告_第2頁
停車場實驗報告_第3頁
停車場實驗報告_第4頁
停車場實驗報告_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)大作業(yè)算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計題目:停車場的收費管理系統(tǒng)組長:張賽組員:王佳琪,袁潔瑩,張瑜 完成日期:2013年12月25日3一、 設(shè)計目的與內(nèi)容1. 問題描述任務(wù):停車場可以同時停放M輛車,停車場的入口和出口可分別有N輛車排隊。停車每小時收費5元,每天不超過50元,停車不滿半小時不收費,超過半小時按一小時收費。功能要求:完成停車場進出車的收費管理以及查詢每輛車的停車記錄(按照車牌號查詢);停車場目前的狀況(滿或空的車位數(shù))。規(guī)定:輸入數(shù)據(jù)形式和范圍:車牌號、停車開始時間輸出形式:有中文提示,停車的時間長短、離開停車場的時間、費用界面要求:有合理的提示。存儲結(jié)構(gòu):學(xué)生自己根據(jù)系統(tǒng)功能要

2、求自己設(shè)計,但是要求停車記錄要存儲在數(shù)據(jù)文件中。測試數(shù)據(jù):要求使用1、全部合法數(shù)據(jù);2、整體非法數(shù)據(jù);3、局部非法數(shù)據(jù)。進行程序測試,以保證程序的穩(wěn)定。測試數(shù)據(jù)及測試結(jié)果請在上交的資料中寫明;2. 基本要求(1)停車場管理主要實現(xiàn)以下幾個功能: 、停車場車位的劃分。 、車輛進出管理及收費功能。 、停車場車輛信息查詢功能。 、退出系統(tǒng)。(2)以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數(shù)據(jù)序列進行模擬管理。(3)棧以順序結(jié)構(gòu)實現(xiàn),隊列以鏈表結(jié)構(gòu)實現(xiàn)。3. 目的:程序所能達(dá)到的功能:程序主要服務(wù)于停車場使用者和停車場管理者。對于使用停車場的停車者,在其等待期間,系統(tǒng)為使用者提供查詢

3、,修改,刪除車輛信息的操作。當(dāng)使用者想要離開停車場,停車場自動計算出停車費用,并自動讓正在等待的使用者有序進入停車位。而管理者可以通過本系統(tǒng)查詢過場,在場,等待的車輛信息,也可以統(tǒng)計24小時內(nèi)的停車收入。停車場的管理系統(tǒng)利用棧和隊列的這些特點來實現(xiàn)模擬停車場和便道。二、 算法的基本思想1. 數(shù)據(jù)結(jié)構(gòu)定義(1) 隊列數(shù)據(jù)類型定義:ADT Queue數(shù)據(jù)對象:D=ai|aiElemSet, i=1,2,n,n0數(shù)據(jù)關(guān)系:R1=|ai-1,aiD,i=2,n基本操作:InitQueue(&Q)操作結(jié)果:構(gòu)造一個空隊列Q。DestroyQueue(&Q)初始條件:隊列Q已存在。操作結(jié)果

4、:隊列Q被銷毀,不再存在。ClearQueue(&Q)初始條件:隊列Q已存在。操作結(jié)果:將Q清為空隊列。QueueEmpty(&Q)初始條件:隊列Q已存在。操作結(jié)果:若Q為空隊列,則返回TRUE,否則返回FALSE。QueueLength(Q)初始條件:隊列Q已存在。操作結(jié)果:返回Q的元素個數(shù),即隊列的長度。GetHead(Q, &e)初始條件:Q為非空隊列。操作結(jié)果:用e返回Q的隊頭元素。EnQueue(&Q, e)初始條件:隊列Q已存在。操作結(jié)果:插入元素e為Q的新的隊尾元素。DeQueue(&Q, &e)初始條件:Q為非空隊列。操作結(jié)果:刪

5、除Q的隊頭元素,并用e返回其值。QueueTraverse(Q, visit()初始條件:Q已存在且非空。操作結(jié)果:從隊頭到隊尾,依次對Q的每個數(shù)據(jù)元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。ADT Queue(2) 棧數(shù)據(jù)類型定義ADT stack數(shù)據(jù)對象:D=ai|aicharset, i=1,2,n,n0數(shù)據(jù)關(guān)系:R1=|ai-1,aiD,i=2,n基本操作:initstack(&S, n)操作結(jié)果:構(gòu)造一個空棧S,該棧可存放n個元素。push(&S, e)初始條件:棧S已存在。操作結(jié)果:在棧S的棧頂插入新的棧頂元素e。pop(&S, &

6、;e)初始條件:棧S已存在。操作結(jié)果:刪除S的棧頂元素,并以e返回其值。DestroyStack(&S)初始條件:棧S已存在。操作結(jié)果:銷毀棧S。ClearStack(&S)初始條件:棧S已存在。操作結(jié)果:將S清為空棧。StackLength(&S)初始條件:棧S已存在。操作結(jié)果:返回棧S的長度。StackEmpty(&S)初始條件:棧S已存在。操作結(jié)果:若S為空棧,則返回TRUE,否則返回FALSE。GetTop(S, &e)初始條件:棧S已存在。操作結(jié)果:若棧S不空,則以e返回棧頂元素。StackTraverse(S, visit()初始條件:棧S已

7、存在。操作結(jié)果:從棧底到棧頂依次對S中的每個元素調(diào)用函數(shù)visit()。ADT stack2. 主程序流程基本框架:駛?cè)腭偝霾僮鹘y(tǒng)計入棧入隊列出棧出隊列已收取的總停車費用查詢修改刪除過場、在場與等待車輛信息查找(棧 數(shù)組)在場車輛信息修改(棧)等待車輛隊列刪除(隊列)(1) 車輛信息類型typedef struct int Htime; int Mtime;Time; /簡單模擬時間信息,記錄小時和分鐘typedef struct char num20;Time reachtime; Time leavetime;carinfo;(2) 棧類型typedef struct stack cari

8、nfo car5;int top;Stack;int inistack(Stack *S) /初始化棧 S->top=-1;return 1;void Push(Stack *S,carinfo x) /進棧操作S->top+;S->carS->top=x; printf("進站成功!n"); void Pop(Stack *S,carinfo x) /出棧操作 if(S->top=-1) printf("空棧,無法出棧!"); x=S->carS->top; S->top-; printf("出

9、棧成功!n"); int IsEmpty(Stack *S) /判斷棧空 if(S->top=-1)return 1;else return 0;(3)隊列類型(便道)typedef struct Nodecarinfo data; struct Node *next;QueueNode;typedef struct QueueNode *front; QueueNode *rear;Queue,*linkQueue;int EnterQ(Queue *Q,carinfo x);int iniQueue(Queue *Q) /初始化便道 Q->front=(QueueNo

10、de *)malloc(sizeof(QueueNode); /申請節(jié)點 if(Q->front!=NULL) Q->rear=Q->front; Q->front->next=NULL; return 1; else return 0;int EnterQ(Queue *Q,carinfo x) /進便道 QueueNode *newNode; newNode=(QueueNode *)malloc(sizeof(QueueNode); if(newNode!=NULL) newNode->data=x; newNode->next=NULL; Q-

11、>rear->next=newNode; Q->rear=newNode; return 1; else return 0;int DeleteQ(Queue *Q,carinfo x) /出便道 QueueNode *p; p=Q->front->next; if(Q->front=Q->rear) /判斷便道是否有車 return 0; x=p->data; if(p->next=Q->rear) Q->rear=Q->front; Q->front->next=NULL; Q->front->

12、next=p->next; free(p); return 1;(4)主函數(shù)及其他函數(shù)的算法void main()Queue *Q; Stack *S=NULL; S=(Stack *)malloc(sizeof(Stack); /申請棧節(jié)點 Q=(linkQueue)malloc(sizeof(Queue); /申請便道節(jié)點 int i; iniQueue(Q); /初始化調(diào)用 inistack(S); /初始化調(diào)用printf("n*歡迎使用停車場管理界面*n"); printf("*本停車場每小時收費2元,停車不滿半小時不收費,超過半小時按一小時收費*

13、"); printGraph(); while(1) printf("n請輸入操作"); scanf("%d",&i); switch(i) case 1:Arrive(S,Q);printGraph(); break; case 2:Departure(S,Q);printGraph();break; case 3:Print(S);printGraph();break; case 0:exit(1);break; case 4:PrintQ(Q);break; case 5:Search(S);break; default :pri

14、ntf("重新輸入");printGraph(); void Lpush(Stack *S,carinfo x)Push(S,x); /進臨時棧void LPop(Stack *S,carinfo x)Pop(S,x); int Arrive(Stack *S,Queue *Q) /車輛到達(dá) carinfo x; int a; printf("輸入車牌號:"); scanf("%s",x.num); printf("請輸入進車場的時間(*:*):"); scanf("%d:%d",&x.

15、reachtime.Htime,&x.reachtime.Mtime); if(S->top=Size-1) printf("車場已滿,不能進入,進便道n"); a=EnterQ(Q, x); /遞歸調(diào)用進便道操作if(a=1)printf("OKn");elseprintf("No!n"); else Push(S,x); return 1; int Departure(Stack *S,Queue *Q) /車輛離開操作 carinfo a;int parktime,paytime;char x20;Time lea

16、vetime;Stack *p=NULL;int point1=S->top;int point2=S->top; printf("請輸入要離去的車牌號:"); scanf("%s",x); while(point1!=-1&&point2!=-1) if(strcmp(S->carpoint1.num,x)=0) /匹配函數(shù),是否輸入的信息與車場信息匹配 printf("請輸入要離開的時間(*:*):"); scanf("%d:%d",&leavetime.Htime,&

17、amp;leavetime.Mtime); for(;point1!=S->top;point1+,point2+) /掃描直到結(jié)束 S->carpoint1=S->carpoint2; /如果找到了 ,出車 S->top-; printf("成功出車場n"); parktime=(leavetime.Htime-S->carpoint1.reachtime.Htime)*60+(leavetime.Mtime-S->carpoint1.reachtime.Mtime); if(leavetime.Htime-S->carpoint

18、1.reachtime.Htime>=10) paytime=10; else if(leavetime.Mtime-S->carpoint1.reachtime.Mtime<=30) paytime=leavetime.Htime-S->carpoint1.reachtime.Htime; else paytime=leavetime.Htime-S->carpoint1.reachtime.Htime+1; printf("其在停車場內(nèi)停留時間為%d分鐘,實際按照%d小時計費,所需付費為:%d元。n",parktime,paytime,pa

19、ytime*2); point2=-1; else point2=point1; point1-; if(Q->front!=Q->rear) a=Q->front->next->data; printf("從便道進入停車場的車牌號:%s",a.num); printf("請輸入進車場的時間:%d:%d",leavetime.Htime,leavetime.Mtime); scanf("%d:%d",&a.reachtime.Htime,&a.reachtime.Mtime);Push(S

20、,a);DeleteQ(Q,Q->front->next->data); if(point1=-1) /如果到結(jié)束了,還沒有找到,則輸出信息 printf("此車沒有在停車場!n"); return 1; void Print1(carinfo x) /簡單的輸出操作 printf("車牌號:%sn",x.num); printf("進車場的時間:%d:%dn",x.reachtime.Htime,x.reachtime.Mtime); printf("n-n");void Print(Stack

21、 *S)/打印車場信息 carinfo x; int point=S->top; /從棧頭開始if(S->top=-1)printf("車場沒有車輛登記進入!n");else while(point!=-1) printf("n-n"); printf("車的位置號:%dn",point);x=S->carpoint; / 把依次掃描到的信息賦值給x Print1(x); /調(diào)用輸出函數(shù) point-; /輸出所有的車場信息 printf("顯示車場信息成功!n"); void PrintQ(Qu

22、eue *Q) /打印便道車輛信息 QueueNode *p;/p=(QueueNode *)malloc(sizeof(Queue); /申請結(jié)點 p=Q->front->next; if(Q->front!=Q->rear) /*判斷通道上是否有車*/ printf("n等待車輛的車牌號為: "); while(p!=NULL) /判斷是否到結(jié)尾 printf("%s ",p->data.num); p=p->next; /如果沒找到,繼續(xù)向下找 printf("n"); else printf

23、("nttt便道里沒有車。n"); int Search(Stack *S) /按車牌號查找車輛信息char x20;Time leavetime;Stack *p=NULL;carinfo a;int point1=S->top;int point2=S->top; printf("請輸入要查找的車牌號:"); scanf("%s",x); while(point1!=-1&&point2!=-1) if(strcmp(S->carpoint1.num,x)=0) /匹配函數(shù),是否輸入的信息與車場信

24、息匹配 for(;point1!=S->top;point1+,point2+) /掃描直到結(jié)束 S->carpoint1=S->carpoint2; /如果找到了 ,輸出信息 printf("該車目前在停車場中。n"); point2=-1; else point2=point1; point1-; if(point1=-1) /如果到結(jié)束了,還沒有找到,則輸出信息 printf("此車沒有在停車場!"); return 1; void printGraph()int i;printf("n"); for(i=0;

25、i<80;i+) printf("-"); printf("nttt*請選擇操作序號*"); printf("nnttt -車輛到達(dá)請選1-"); printf("nnttt -車輛離開請選2-"); printf("nnttt -查詢停車場信息請選3-"); printf("nnttt -查詢便道信息請選4-"); printf("nnttt -按車牌號查找請選5-"); printf("nnttt -退出系統(tǒng)請選0-"); p

26、rintf("nn"); for(i=0;i<80;i+) printf("-");3. 各模塊之間的調(diào)用關(guān)系主函數(shù)void main()初始化調(diào)用iniQueue(Q); inistack(S); 調(diào)用到達(dá)函數(shù)Arrive(S,Q); 調(diào)用離開函數(shù)Departure(S);調(diào)用打印信息函數(shù)printGraph()三、 測試數(shù)據(jù)全部合法數(shù)據(jù):1.主界面2.到達(dá):3.離開:(若便道有車等待) 輸出從便道中進入停車場的車牌號、進車場時間(即為從便道中出車的時間)、進站成功!4.輸出車場信息5輸出便車道信息6、按車牌號查找信息非法數(shù)據(jù)1.主界面:2.車輛

27、到達(dá):3.車輛離開四、 源程序及系統(tǒng)文件使用說明#include<stdio.h>#include<stdlib.h>#include<string.h>#define Size 2#define price 5typedef struct int Htime; int Mtime;Time; /簡單模擬時間信息,記錄小時和分鐘typedef struct char num20;Time reachtime; Time leavetime;carinfo; /通過結(jié)構(gòu)來保存來車的車牌號,到達(dá)時間,離開時間typedef struct stackcarinfo

28、 car5;int top; Stack;typedef struct Nodecarinfo data; struct Node *next;QueueNode; /結(jié)點的定義typedef struct QueueNode *front; QueueNode *rear;Queue,*linkQueue; /定義隊列結(jié)點int EnterQ(Queue *Q,carinfo x);int inistack(Stack *S) /初始化棧 S->top=-1;return 1;void Push(Stack *S,carinfo x) /進棧操作S->top+;S->car

29、S->top=x; printf("進站成功!n"); void Pop(Stack *S,carinfo x) /出棧操作 if(S->top=-1) printf("空棧,無法出棧!"); x=S->carS->top; S->top-; printf("出棧成功!n"); int IsEmpty(Stack *S) /判斷???if(S->top=-1)return 1;else return 0;int iniQueue(Queue *Q) /初始化便道 Q->front=(Queue

30、Node *)malloc(sizeof(QueueNode); /申請節(jié)點 if(Q->front!=NULL) Q->rear=Q->front; Q->front->next=NULL; return 1; else return 0;int EnterQ(Queue *Q,carinfo x) /進便道 QueueNode *newNode; newNode=(QueueNode *)malloc(sizeof(QueueNode); if(newNode!=NULL) newNode->data=x; newNode->next=NULL;

31、Q->rear->next=newNode; Q->rear=newNode; return 1; else return 0;int DeleteQ(Queue *Q,carinfo x) /出便道 QueueNode *p; p=Q->front->next; if(Q->front=Q->rear) /判斷便道是否有車 return 0; x=p->data; if(p->next=Q->rear) Q->rear=Q->front; Q->front->next=NULL; Q->front-&g

32、t;next=p->next; free(p); return 1;void Lpush(Stack *S,carinfo x)Push(S,x); /進臨時棧void LPop(Stack *S,carinfo x)Pop(S,x); int Arrive(Stack *S,Queue *Q) /車輛到達(dá) carinfo x; int a; printf("輸入車牌號:"); scanf("%s",x.num); printf("請輸入進車場的時間(*:*):"); scanf("%d:%d",&x

33、.reachtime.Htime,&x.reachtime.Mtime); if(S->top=Size-1) printf("車場已滿,不能進入,進便道n"); a=EnterQ(Q, x); /遞歸調(diào)用進便道操作if(a=1)printf("OKn");elseprintf("No!n"); else Push(S,x); return 1; int Departure(Stack *S,Queue *Q) /車輛離開操作 carinfo a;int parktime,paytime;char x20;Time le

34、avetime;Stack *p=NULL;int point1=S->top;int point2=S->top; printf("請輸入要離去的車牌號:"); scanf("%s",x); while(point1!=-1&&point2!=-1) if(strcmp(S->carpoint1.num,x)=0) /匹配函數(shù),是否輸入的信息與車場信息匹配 printf("請輸入要離開的時間(*:*):"); scanf("%d:%d",&leavetime.Htime,

35、&leavetime.Mtime); for(;point1!=S->top;point1+,point2+) /掃描直到結(jié)束 S->carpoint1=S->carpoint2; /如果找到了 ,出車 S->top-; printf("成功出車場n"); parktime=(leavetime.Htime-S->carpoint1.reachtime.Htime)*60+(leavetime.Mtime-S->carpoint1.reachtime.Mtime); if(leavetime.Htime-S->carpoin

36、t1.reachtime.Htime>=10) paytime=10; else if(leavetime.Mtime-S->carpoint1.reachtime.Mtime<=30) paytime=leavetime.Htime-S->carpoint1.reachtime.Htime; else paytime=leavetime.Htime-S->carpoint1.reachtime.Htime+1; printf("其在停車場內(nèi)停留時間為%d分鐘,實際按照%d小時計費,所需付費為:%d元。n",parktime,paytime,p

37、aytime*2); point2=-1; else point2=point1; point1-; if(Q->front!=Q->rear) a=Q->front->next->data; printf("從便道進入停車場的車牌號:%s",a.num); printf("請輸入進車場的時間:%d:%d",leavetime.Htime,leavetime.Mtime); scanf("%d:%d",&a.reachtime.Htime,&a.reachtime.Mtime);Push(

38、S,a);DeleteQ(Q,Q->front->next->data); if(point1=-1) /如果到結(jié)束了,還沒有找到,則輸出信息 printf("此車沒有在停車場!n"); return 1; void Print1(carinfo x) /簡單的輸出操作 printf("車牌號:%sn",x.num); printf("進車場的時間:%d:%dn",x.reachtime.Htime,x.reachtime.Mtime); printf("n-n");void Print(Stac

39、k *S)/打印車場信息 carinfo x; int point=S->top; /從棧頭開始if(S->top=-1)printf("車場沒有車輛登記進入!n");else while(point!=-1) printf("n-n"); printf("車的位置號:%dn",point);x=S->carpoint; / 把依次掃描到的信息賦值給x Print1(x); /調(diào)用輸出函數(shù) point-; /輸出所有的車場信息 printf("顯示車場信息成功!n"); void PrintQ(Q

40、ueue *Q) /打印便道車輛信息 QueueNode *p;/p=(QueueNode *)malloc(sizeof(Queue); /申請結(jié)點 p=Q->front->next; if(Q->front!=Q->rear) /*判斷通道上是否有車*/ printf("n等待車輛的車牌號為: "); while(p!=NULL) /判斷是否到結(jié)尾 printf("%s ",p->data.num); p=p->next; /如果沒找到,繼續(xù)向下找 printf("n"); else print

41、f("nttt便道里沒有車。n"); int Search(Stack *S) /按車牌號查找車輛信息 char x20;Time leavetime;Stack *p=NULL;carinfo a;int point1=S->top;int point2=S->top; printf("請輸入要查找的車牌號:"); scanf("%s",x); while(point1!=-1&&point2!=-1) if(strcmp(S->carpoint1.num,x)=0) /匹配函數(shù),是否輸入的信息與車場信息匹配 for(;point1!=S->top;point1+,point2+) /掃描直到結(jié)束 S->carpoint1=S->carpoint2; /如果找到了 ,輸出信息 printf("該車目前在停車場中。n"); point2=-1; else point2=point1; point1-; if(point1=-1) /如果到結(jié)束了,還沒有找到,則輸出信息 pri

溫馨提示

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

評論

0/150

提交評論