數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)《停車場(chǎng)管理系統(tǒng)》_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)《停車場(chǎng)管理系統(tǒng)》_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)《停車場(chǎng)管理系統(tǒng)》_第3頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):停車場(chǎng)管理姓名:韋邦權(quán)專業(yè): 2013 級(jí)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)號(hào): 13224624班級(jí): 13052316完成日期:1.1 問(wèn)題描述設(shè)停車場(chǎng)是一個(gè)可停放 n 輛汽車的狹長(zhǎng)通道, 且只有一個(gè)門(mén)可供出入。 汽車在停車場(chǎng)內(nèi)按車輛到達(dá)時(shí)間的先后順序, 依次由北向南排列 (門(mén)在最南端, 最先到達(dá)的第一輛車停放在車場(chǎng)的最北端) ,若車場(chǎng)內(nèi)已停滿 n 輛汽車,則后來(lái)的汽車只能在門(mén)外的便道上等候, 一旦有車開(kāi)走, 則排在便道上的第一輛汽車即可開(kāi)入; 當(dāng)停車場(chǎng)內(nèi)某輛車要離開(kāi)時(shí),在它之后進(jìn)入的車輛必須先退出車場(chǎng)為它讓路, 待該輛車開(kāi)出大門(mén)外,其他車輛再按原順序進(jìn)入車場(chǎng), 每輛停放在車場(chǎng)的車在它離開(kāi)停

2、車場(chǎng)時(shí)必須按它停留的時(shí)間長(zhǎng)短交納費(fèi)用。2 需求分析( 1)根據(jù)車輛到達(dá)停車場(chǎng)到車輛離開(kāi)停車場(chǎng)時(shí)所停留的時(shí)間進(jìn)行計(jì)時(shí)收費(fèi)。( 2)當(dāng)有車輛從停車場(chǎng)離開(kāi)時(shí),等待的車輛按順序進(jìn)入停車場(chǎng)停放。實(shí)現(xiàn)停車場(chǎng)的調(diào)度功能。( 3)用順序棧來(lái)表示停車場(chǎng),鏈隊(duì)表示停車場(chǎng)外的便道。( 4)顯示停車場(chǎng)信息和便道信息。( 5)程序執(zhí)行的命令為: 1 車輛進(jìn)入停車場(chǎng) 2 車輛離開(kāi)停車場(chǎng) 3顯示停車場(chǎng)的信息。3 概要設(shè)計(jì)31 抽象數(shù)據(jù)類型定義( 1)棧的抽象數(shù)據(jù)類型定義AST Stack數(shù)據(jù)對(duì)象: D=ai|ai ElemSet,i=1,2,.,n, n0數(shù)據(jù)關(guān)系: R1=<ai-1,ai>|ai-1,ai D

3、,i=2,.,n約定 an 端為棧頂, a1 端為棧底 ?;静僮鳎篒nitStack(&S)操作結(jié)果:構(gòu)造一個(gè)空棧S。DestroyStack(&S);.初始條件:棧 S 已存在。操作結(jié)果:棧 S 被銷毀。ClearStack(&S)初始條件:棧 S 已存在。操作結(jié)果:將棧 S 清為空棧。StackEmpty(S)初始條件:棧 S 已存在。操作結(jié)果:若棧 S 為空棧,則返回 TRUE,否則 FALSE 。StackLength(s)初始條件 :棧 S 已存在。操作結(jié)果:返回 S 的元素個(gè)數(shù),既棧的長(zhǎng)度。GetTop(S,&e)初始條件:棧 S 已存在且非空。操

4、作結(jié)果:用 e 返回 S 的棧頂元素。Push(&S,e)初始條件:棧 S 已存在。操作結(jié)果:插入元素e 為新的棧頂元素。Pop(&S,&e)初始條件:棧S 已存在且非空。操作結(jié)果:刪除S 的棧頂元素,并用e 返回其值。StackTraverse(S,visit()初始條件:棧 S 已存在且非空。操作結(jié)果:從棧底到棧頂依次對(duì)S 的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit() 。一旦 visit()失敗,則操作失效。ADT Stack( 2)隊(duì)列的抽象數(shù)據(jù)類型定義ADT Queue數(shù)據(jù)對(duì)象: D=ai|ai ElemSet,i=1,2,.,n,n0數(shù)據(jù)關(guān)系: R1=<ai-1

5、,ai>|ai-1,ai D,i=2,.,n約定其中 a1 端為隊(duì)列頭, an 為隊(duì)列尾。基本操作:;.InitQueue(&Q)操作結(jié)果:構(gòu)造一個(gè)空隊(duì)列Q。DestroyQueue(&Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:隊(duì)列 Q 被銷毀,不再存在。ClearQueue(&Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:將 Q 清為空隊(duì)列。QueueEmpty(Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:若 Q 為空隊(duì)列,則返回TRUE,否則 FALSE 。QueueLength(Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:返回 Q 的元素個(gè)數(shù),即隊(duì)列的長(zhǎng)度。GetH

6、ead(Q,&e)初始條件: Q 為非空隊(duì)列。操作結(jié)果:用 e 返回的隊(duì)頭元素。EnQueue(&Q,e)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:插入元素e 為 Q 的新的隊(duì)尾元素。DeQueue(&Q,&e)初始條件: Q 為非空隊(duì)列。操作結(jié)果:刪除Q 的隊(duì)頭元素,并用e 返回其值。QueueTraverse(Q,visit()初始條件: Q 已存在且非空。操作結(jié)果:從隊(duì)頭到隊(duì)尾,依次對(duì)Q 的每個(gè)數(shù)據(jù)元素調(diào)用函數(shù)visit() 。一旦visit() 失敗,則操作失敗。ADT Queue32 模塊劃分本程序包括六個(gè)模塊:( 1)主程序模塊;.void main()

7、初始化停車站;初始化讓路的臨時(shí)棧;初始化通道;輸出主菜單:車輛到達(dá)、車輛離開(kāi)與計(jì)費(fèi)、查看停車場(chǎng)信息;( 2)入場(chǎng)模塊int arrive(SqStack *In,LinkQueue *W)車輛進(jìn)入停車場(chǎng);計(jì)算停車費(fèi)用( 3)出場(chǎng)模塊void leave(SqStack *In,SqStack *Out,LinkQueue *W)車輛離開(kāi)停車場(chǎng);( 4)輸出模塊void info(SqStack S,LinkQueue W)輸出停車場(chǎng)信息;( 5)棧模塊 實(shí)現(xiàn)棧的抽象數(shù)據(jù)類型( 6)隊(duì)列模塊 實(shí)現(xiàn)隊(duì)列的抽象數(shù)據(jù)類型;.4 詳細(xì)設(shè)計(jì)41 數(shù)據(jù)類型的定義int MAX; /* 定義一個(gè)全局變量用來(lái)存

8、儲(chǔ)車庫(kù)最大容量*/float price;/* 定義一個(gè)全局變量用來(lái)存儲(chǔ)每車每小時(shí)的費(fèi)用*/typedef struct timeint hour;int min;Time; /* 時(shí)間結(jié)點(diǎn) */typedef struct nodechar num10;Time reach;Time leave;Car; /* 車輛信息結(jié)點(diǎn) */typedef struct NODECar *stack100;int top;SqStack; /* 停車站 */typedef struct carCar *data;struct car *next;QNode;typedef struct Node;.QN

9、ode *head;QNode *rear;LinkQueue; /* 通道 */42 主要模塊的算法描述本程序主要分為四部分: ( 1)主函數(shù)及程序框架、 (2)車輛到達(dá)模塊、(3)車輛離開(kāi)模塊、(4)顯示車輛信息模塊,( 1)主函數(shù)void main()SqStack In,Out; LinkQueue Wait;int ch;InitStack(&In); /* 初始化停車站 */InitStack(&Out); /* 初始化讓路的臨時(shí)棧 */InitQueue(&Wait); /* 初始化通道 */while(1)printf("- 歡迎使用停車場(chǎng)管理

10、系統(tǒng)-n");printf("t 本系統(tǒng)由 5011工作室開(kāi)發(fā),作者 :鄧春國(guó)、段慶龍、梁偉明、丁磊。 nn");printf(" 請(qǐng)輸入停車場(chǎng)的容量 :");scanf("%d",&MAX);printf(" 請(qǐng)輸入停車場(chǎng)的收費(fèi)標(biāo)準(zhǔn) (元/小時(shí) ):");scanf("%f",&price);printf(" 您輸入的停車場(chǎng)容量為 %d位,費(fèi)用為 %2.1f元/小時(shí)。n",MAX,price);printf("n (1)車輛到達(dá) n(2)

11、車輛離開(kāi) n(3)停車場(chǎng)信息 n(4)退出系統(tǒng) n請(qǐng)選擇 n");.車輛離開(kāi) */車輛到達(dá) */.while(1)ch=getch();switch(ch)case 49:arrive(&In,&Wait);break; /*case 50:leave(&In,&Out,&Wait);break; /*case 51:info(In,Wait);break; /*輸出車站信息 */case 52:printf(" 謝謝使用! ");exit(0); /* 退出主程序 */ default:printf("n 按鍵無(wú)

12、效,請(qǐng)重新按鍵選擇! ");/*49 -52分別表示 “1”-“4”這四個(gè)按鍵的鍵值 */system("CLS");printf("-歡迎使用停車場(chǎng)管理系統(tǒng)-n");printf("t 本系統(tǒng)由 CG工作室開(kāi)發(fā),作者 :鄧春國(guó)、段慶龍、梁偉明、丁磊。 nnn");printf(" 您輸入的停車場(chǎng)容量為 %d位,費(fèi)用為 %2.1f元/小時(shí)。n",MAX,price);printf("n (1)車輛到達(dá) n(2)車輛離開(kāi) n(3)停車場(chǎng)信息 n(4)退出系統(tǒng)n請(qǐng)選擇 n");( 2)車輛

13、離開(kāi)模塊1 算法分析void leave(SqStack *In,SqStack *Out,LinkQueue *W) /* 車輛離開(kāi) */int room;Car *p,*t;QNode *q;./* 開(kāi)始定義一個(gè)整型變量 room,用來(lái)記錄要離開(kāi)的車輛在停車場(chǎng)的位置, 定義車輛結(jié)點(diǎn)指針 p 和 t 和隊(duì)列結(jié)點(diǎn)指針 q。*/if(In->top>0) /* 有車 */while(1)printf("n 請(qǐng)輸入車在停車場(chǎng)的位置 (1-%d):",In->top);scanf("%d",&room);if(room>=1&a

14、mp;&room<=In->top) break;/* 判斷停車場(chǎng)內(nèi)是否有車,如果有車,就輸入要離開(kāi)的車輛在停車場(chǎng)的位置,否則就提示停車場(chǎng)沒(méi)車。這里用了while 循環(huán)語(yǔ)句,如果輸入的車輛位置超出范圍,就要重新輸入。 */while(In->top>room) /* 車輛離開(kāi) */Out->top+;Out->stackOut->top=In->stackIn->top;In->stackIn->top=NULL;In->top-;/* 如果棧頂位置 In->top 大于要離開(kāi)的車位置room(即要離開(kāi)的車不

15、在停車場(chǎng)的門(mén)口)的話,在要離開(kāi)的車輛前面的車就要先離開(kāi),開(kāi)到臨時(shí)停車場(chǎng), 即臨時(shí)棧中,因此Out所表示的臨時(shí)棧的棧頂top加11輛車;接著,用來(lái)表示臨時(shí)停車場(chǎng)增加把該車的信息拷貝到棧Out 中,然后刪除棧 In 的棧頂(即這輛車開(kāi)走) 。*/p=In->stackIn->top;In->stackIn->top=NULL;In->top-;while(Out->top>=1)In->top+;In->stackIn->top=Out->stackOut->top;Out->stackOut->top=NULL;

16、 Out->top-;./* 直到要離開(kāi)的車輛前面的車都開(kāi)到臨時(shí)停車場(chǎng)之后,該車才離開(kāi),離開(kāi)之后,該車的信息結(jié)點(diǎn) In->stackIn->top 置空,然后棧頂 In->top 減 1。之后就判斷臨時(shí)停車場(chǎng)是否有車,有車就一輛一輛的開(kāi)回停車場(chǎng)里面, 因此停車場(chǎng)的棧頂In->top 加1,然后就把臨時(shí)停車場(chǎng)的車結(jié)點(diǎn)的信息拷貝到停車場(chǎng)的車結(jié)點(diǎn)上,接著刪除臨時(shí)停車場(chǎng)車的結(jié)點(diǎn)(即 Out->stackOut->top=NULL;Out->top-; )。*/PRINT(p,room);if(W->head!=W->rear)&&am

17、p;In->top<MAX)q=W->head->next;t=q->data;In->top+; printf("n 便道的 %s 號(hào)車進(jìn)入車場(chǎng)第 %d 號(hào)停車位 。",t->num,In->top);printf("n 請(qǐng)輸入現(xiàn)在的時(shí)間 (格式 “*:* ”):"); scanf("%d:%d",&(t->reach.hour),&(t->reach.min); W->head->next=q->next; if(q=W->rear

18、) W->rear=W->head;In->stackIn->top=t;free(q);/* 判斷 (W->head!=W->rear)&&In->top<MAX (即通道上是否有車及停車場(chǎng)是否已滿),如果便道有車且停車場(chǎng)未滿,通道的車便可進(jìn)入停車場(chǎng),此時(shí)指針q 指向便道的頭,即隊(duì)頭,然后停車場(chǎng)的棧頂In->top 加 1 以便增加新的車輛,接著輸入隊(duì)頭的車輛信息,即要進(jìn)去停車場(chǎng)的車的信息,然后便道隊(duì)列的頭結(jié)點(diǎn)指向q(即剛進(jìn)入停車場(chǎng)的車的結(jié)點(diǎn)) 的后繼結(jié)點(diǎn), 即原隊(duì)列中第二輛車的結(jié)點(diǎn),接著判斷剛離開(kāi)的車是否是最后一輛車,如

19、果是,就把隊(duì)列置空,即隊(duì)頭等于隊(duì)尾;之后就把結(jié)點(diǎn)t(即要進(jìn)入停車場(chǎng)的車)的信息拷貝到停車場(chǎng)棧頂?shù)能囍?,最后釋放p 的空間,即原隊(duì)頭結(jié)點(diǎn)。 */else printf("n 停車場(chǎng)里沒(méi)有車 n"); /* 沒(méi)車 */;.printf(" 請(qǐng)按任意鍵返回 ");getch();2 leave 函數(shù)流程圖如圖4.1 所示:開(kāi)始定義必要的變量判斷停車場(chǎng)是否有車是輸入離開(kāi)車輛的信息判斷前面是否有其他車且停車場(chǎng)未滿是前面的車先進(jìn)入臨時(shí)停車場(chǎng)車輛離開(kāi)車臨時(shí)停車場(chǎng)的車回到停車場(chǎng)判斷便道否有車是便道的車先進(jìn)入停車場(chǎng)結(jié)束圖 4.1leave否輸出停車場(chǎng)里沒(méi)有車否否函數(shù)流程圖

20、;.5 測(cè)試分析測(cè)試數(shù)據(jù)及結(jié)果如下:輸入 2 輛車的信息,如圖5.2 所示:再輸入 2 輛車的信息,如圖;.最后選擇車輛離開(kāi),輸入第2 輛車離開(kāi),如圖6 課程設(shè)計(jì)總結(jié)通過(guò)這次課程設(shè)計(jì)使我充分的理解了用棧和隊(duì)列實(shí)現(xiàn)模擬停車場(chǎng)的基本原理,知道了棧的順序存儲(chǔ)結(jié)構(gòu)和隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的定義和算法描述,同時(shí)也學(xué)會(huì)了編寫(xiě)停車場(chǎng)問(wèn)題的程序。 雖然此次的程序不是很完備,沒(méi)有加入一些更完善的功能,但是總體還是一個(gè)比較能體現(xiàn)數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)能力的程序了,當(dāng)然只是相對(duì)于我這個(gè)初學(xué)者來(lái)說(shuō)。在剛開(kāi)始編程的時(shí)候, 我感到有點(diǎn)無(wú)從下手, 但經(jīng)過(guò)對(duì)題目的詳細(xì)分析和思考之后,我就知道具體應(yīng)該做什么,怎么做了。經(jīng)過(guò)幾天和同學(xué)的一起

21、研究,我完成這個(gè)程序,我學(xué)到了很多東西,這是在課堂上無(wú)法做到的。源程序#include<stdio.h>#include <stdlib.h>#include<iostream.h>#include<string.h>.#include<math.h>#define size 1/ 停車場(chǎng)位置數(shù)/模擬停車場(chǎng)的堆棧的性質(zhì);typedef struct zanlindint number;/汽車車號(hào)int ar_time;/ 汽車到達(dá)時(shí)間zanInode;typedef structzanInode*base;/ 停車場(chǎng)的堆棧底zanIn

22、ode*top;/ 停車場(chǎng)的堆棧頂int stacksize_curren;stackhead;/堆棧的基本操作;void initstack(stackhead &L)/構(gòu)造一個(gè)空棧L.base=(zanInode*)malloc(size*sizeof(zanlind);if(!L.base) exit(0);L.top=L.base;L.stacksize_curren=0;void push(stackhead &L,zanInode e) / 把元素 e 壓入 s 棧*L.top+=e;L.stacksize_curren+;void pop(stackhead &a

23、mp;L,zanInode &e)/把元素 e 彈出 s 棧if(L.top=L.base)cout<<" 停車場(chǎng)為空!"return;e=*-L.top;L.stacksize_curren-;/模擬便道的隊(duì)列的性質(zhì);typedef struct duilieint number;/汽車車號(hào)int ar_time;/汽車到達(dá)時(shí)間struct duilie *next;*queueptr;typedef structqueueptr front;/便道的隊(duì)列的對(duì)頭queueptr rear;/便道的隊(duì)列的隊(duì)尾;.int length;linkqueue;

24、/隊(duì)列的基本操作;void initqueue(linkqueue &q) /構(gòu)造一個(gè)空隊(duì)列q.front=q.rear=(queueptr)malloc(sizeof(duilie);if(!q.front|!q.rear)exit(0);q.front->next=NULL;q.length=0;void enqueue(linkqueue &q,int number,int ar_time) /把元素的插入隊(duì)列(屬性為number ,ar_time )queueptr p;p=(queueptr)malloc(sizeof(duilie);if(!p) exit(0

25、);p->number=number;p->ar_time=ar_time;p->next=NULL;q.rear->next=p;q.rear=p;q.length+;void popqueue(linkqueue &q,queueptr &w) /把元素的插入隊(duì)列(屬性為number,ar_time )queueptr p;if(q.front=q.rear)cout<<" 停車場(chǎng)的通道為空! !"<<endl;return;p=q.front->next;w=p;q.front->next=p

26、->next;q.length-;if(q.rear=p) q.front=q.rear;void jinru(stackhead &st,linkqueue &q)/對(duì)進(jìn)入停車場(chǎng)的汽車的處理;int number,time_a;cout<<" 車牌為: "cin>>number;cout<<" 進(jìn)場(chǎng)的時(shí)刻 :".cin>>time_a;if(st.stacksize_curren<2)zanInode e;e.number=number;e.ar_time=time_a;pus

27、h(st,e);cout<< "該車已進(jìn)入停車場(chǎng)在: "<<st.stacksize_curren<<"號(hào)車道 "<<endl<<endl;elseenqueue(q,number,time_a);cout<<" 停車場(chǎng)已滿,該車先停在便道的第"<<q.length<<" 個(gè)位置上 "<<endl;void likai(stackhead &st,stackhead &sl,linkqueue

28、 &q) /對(duì)離開(kāi)的汽車的處理;/st 堆棧為停車場(chǎng),sl 堆棧為倒車場(chǎng)int number,time_d,flag=1,money,arrivaltime;/q 為便道隊(duì)列cout<<" 車牌為: "cin>>number;cout<<" 出場(chǎng)的時(shí)刻:"cin>>time_d;zanInode e,q_to_s;queueptr w;while(flag)/ 找到要開(kāi)出的車,并彈出停車場(chǎng)棧pop(st,e);push(sl,e);if(e.number=number)flag=0;money=(t

29、ime_d-e.ar_time)*2;arrivaltime=e.ar_time;pop(sl,e);/把臨時(shí)堆棧的第一輛車(要離開(kāi)的)去掉;while(sl.stacksize_curren) / 把倒車場(chǎng)的車倒回停車場(chǎng)pop(sl,e);push(st,e);if(st.stacksize_curren<2&&q.length!=0) /停車場(chǎng)有空位,便道上的車開(kāi)進(jìn)入停車場(chǎng);.popqueue(q,w);q_to_s.ar_time=time_d;q_to_s.number=w->number;push(st,q_to_s);cout<<"

30、 車 牌 為 "<<q_to_s.number<<" 的 車 已 從 通 道 進(jìn) 入 停 車 場(chǎng) , 所 在 的 停 車 位為 :"<<st.stacksize_curren<<endl<<endl;cout<<"n收據(jù) "<<endl;cout<<"=車牌號(hào) : "<<number<<endl;cout<<"="<<endl;cout<<"| 進(jìn)車場(chǎng)時(shí)刻| 出車場(chǎng)時(shí)刻| 停留時(shí)間| 應(yīng)付(元) |"<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論