当前位置:文档之家› 数据结构课程设计停车场管理系统

数据结构课程设计停车场管理系统

实验二停车场管理班级:A0712 学号:12 姓名:冷清淼成绩:__________指导教师签名:__________ 一、问题描述设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。

在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。

若停车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。

当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。

每辆车离开停车场时,应按其停留时间的长短交费(在便道上停留的时间不收费)。

设计要求:1.模拟上述管理过程。

要求以顺序栈模拟停车场,以链队列模拟便道。

2.从终端读入汽车到达或离去的数据,每组数据包括三项:(1)是“到达”还是“离开”;(2)汽车牌照号码;(3)“到达”或“离开”的时刻。

3.与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。

二、算法说明1.数据结构说明(1)用到两个堆栈:一个为车场栈;另一个为临时栈temptypedef struct NODE{CarNode *stack[MAX+1];int top;}SeqStackCar; /*模拟车场*/(2)一个队列结构,存储便道车辆信息:typedef struct Node{QueueNode *head; QueueNode *rear;}LinkQueueCar; /*模拟便道*/2.算法说明(1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示停车场系统车辆到达车辆离开列表显示321图1 (2)以模块为单位分析算法1、“到达”模块:到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。

如图2。

车辆到达停车场是否满结束进入停车场进入便道是否图22.“离开”模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。

如图3。

车辆离开停车场是否空结束车辆离开提示没有车是否否便道是否有车是车进入车场图33. “显示”模块:显示模块有两个显示选项,即:车场与便道。

如图4。

列表显示判断输入值结束显示车场列表显示便道列表2.便道1.车场图4三、测试结果(一)测试用例(说明:测试用例要合理并且足够,既要有正确用例,也要有错误用例,同时检验程序的正确性和强壮性)1.第一组测试用例(1)测试输入:停车场的车辆离开,如下表:服务选择车牌号/车位到达/离开时间1 QH058 15:251 AB123 18:451 EA642 23:152 2 0:302 1 0:65(错误)(2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。

(3)正确输出:第一次离开的是AB123,应交费3.45元。

第二次时,当在输入65时,应该提示输入错误,重输。

(4)实际输出:(5)错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式控制。

(6)当前状态:已改正2.第二组测试用例(1)测试输入:连续6辆车到达,如下表:服务选择车牌号到达时间1 A8828 7:561 S2296 8:251 WW666 8:451 HK456 15:501 GH999 12:301 DD555 13:40(2)测试目的:测试到达方法与列表显示方法能否正确完成。

(3)正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。

(4)实际输出:(5)错误原因:没有作出时间先后的判断,而是先输入先进入。

(6)当前状态:待修改3.第三组测试用例(1)测试输入:接上一步输入离开信息,下表:服务选择离开车位离开时间便道车进入时间2 3 13:30 13:40(2)测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。

(3)正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。

(4)实际输出:(5)错误原因:没有错误。

(6)当前状态:通过(二)测试结果分析此停车管理系统基本可能实现一个小的停车场的管理,其“到达”与“离开”方法都相对比较完整,以及结算清单明了。

尽管在时间先后上有出现混乱,但当其用到实际应用时,那个时间先后就可以避免了。

但在输入数据时,要按照严格的格式输入,否则有可能出现死去或崩溃。

若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。

会慢慢完善。

附录:源代码///系统说明:本系统适应于小型停车场,且停车时间在一天之内的短期停放停车场。

//在此系统中,车库容量设置为5,便于测试。

在实际使用中可以对容量大小按实际情况设置。

#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 5 /*车库容量,可以根据实际情况改变*/#define price 0.01 /*一辆车每分钟费用,可变*/typedef struct time{int hour;int min;}Time; /*时间结点*/typedef struct node{char num[10];Time reach;Time leave;}CarNode; /*车辆信息结点*/typedef struct NODE{CarNode *stack[MAX+1];int top;}SeqStackCar; /*模拟停车场*/typedef struct car{CarNode *data;struct car *next;}QueueNode;typedef struct Node{QueueNode *head;QueueNode *rear;}LinkQueueCar; /*模拟便道*//*方法声明*/void InitStack(SeqStackCar *); /*初始化栈*/int InitQueue(LinkQueueCar *); /*初始化便道*/int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/void List(SeqStackCar,LinkQueueCar); /*显示信息*/void PRINT(CarNode *p,int room); /*输出离开车辆的信息清单*/void main(){system("color F2"); /*设置系统颜色,本系统为白底绿字f2*/SeqStackCar Enter,Temp;LinkQueueCar Wait;int ch;InitStack(&Enter); /*初始化车站*/InitStack(&Temp); /*初始化让路的临时栈*/InitQueue(&Wait); /*初始化通道*/while(1){cout<<" ※※※※@欢迎使用本停车管理系统@ ※※※※"<<endl;cout<<"********************************************************"<<endl;cout<<" ※--※ 1. 车辆到达※-- ※"<<endl;cout<<" ※--※ 2. 车辆离开※-- ※"<<endl;cout<<" ※--※ 3. 列表显示※-- ※"<<endl;cout<<" ※--※ 4. 退出系统※-- ※"<<endl;cout<<"********************************************************"<<endl;cout<<"!说明:请注意正确输入时间,在输入“时”后,按“ENTER”或者“空格”,再输入“分”。

不要为非数字!"<<endl;cout<<"请选择所需要的服务! (1-4)."<<endl;while(1){cin>>ch;if(ch>=1&&ch<=4)break;else cout<<"输入错误!请选择:(1-4)."<<endl;}switch(ch){case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/case 2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/case 3:List(Enter,Wait);break; /*列表显示信息*/case 4:exit(0); /*退出主程序*/default: break;}}}void InitStack(SeqStackCar *s) /*初始化栈*/{int i;s->top=0;for(i=0;i<=MAX;i++)s->stack[s->top]=NULL;}int InitQueue(LinkQueueCar *Q) /*初始化便道*/{Q->head=(QueueNode *)malloc(sizeof(QueueNode));if(Q->head!=NULL){Q->head->next=NULL;Q->rear=Q->head;return(1);}else return(-1);}int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/{CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode));flushall();cout<<"请输入车牌号(例:A1234):"<<endl;gets(p->num);if(Enter->top<MAX) /*车场未满,车进车场*/{Enter->top++;cout<<"车辆在车场第"<<Enter->top <<"位置!"<<endl;cout<<"请输入到达时间:(小时:分钟)"<<endl;cin>>p->reach.hour;while(p->reach.hour<0||p->reach.hour>23) //控制时间格式正确{cout<<"输入错误!"<<endl;cout<<"请重输入到达时间的时(0-23)!"<<endl;cin>>p->reach.hour;}cin>>p->reach.min;while(p->reach.min<0||p->reach.min>59) //控制分钟输入正确{cout<<"输入错误!"<<endl;cout<<"请重输入到达时间的分(0-59)!"<<endl;cin>>p->reach.min;}Enter->stack[Enter->top]=p;return(1);}else /*车场已满,车进便道*/{cout<<"车场已满,请在便道等待!"<<endl;t=(QueueNode *)malloc(sizeof(QueueNode));t->data=p;t->next=NULL;W->rear->next=t;W->rear=t;return(1);}}void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /*车辆离开*/ {int room;CarNode *p;QueueNode *q;/*判断车场内是否有车*/if(Enter->top>0) /*有车*/{while(1) /*输入离开车辆的信息*/{cout<<"请输入车在车场的位置1--"<<Enter->top<<":";cin>>room;if(room>=1&&room<=Enter->top) break;}while(Enter->top>room) /*车辆离开*/{Temp->top++; /*临时通道栈顶指针*/Temp->stack[Temp->top]=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;}p=Enter->stack[Enter->top];Enter->stack[Enter->top]=NULL;Enter->top--;while(Temp->top>=1) /*判断临时通道上是否有车*/{Enter->top++;Enter->stack[Enter->top]=Temp->stack[Temp->top];Temp->stack[Temp->top]=NULL;Temp->top--;}PRINT(p,room);if((W->head!=W->rear)&&Enter->top<MAX) /*车站是未满*/{ /*便道的车辆进入车场*/q=W->head->next;p=q->data; /*p指向链队头*/Enter->top++;cout<<"便道的"<<p->num<<"号车进入车场第"<<Enter->top<<"位置!"<<endl;cout<<"请输入现在的时间如(小时:分钟):"<<endl;cin>>p->reach.hour;if(p->reach.hour<0||p->reach.hour>23){cout<<"输入错误!"<<endl;cout<<"请重输入到达时间的时(0-23)!"<<endl;cin>>p->reach.hour;}cin>>p->reach.min;if(p->reach.min<0||p->reach.min>59){cout<<"输入错误!"<<endl;cout<<"请重输入到达时间的分(0-59)!"<<endl;cin>>p->reach.min;}Enter->stack[Enter->top]=p;W->head->next=q->next;if(q==W->rear) W->rear=W->head;free(q); /*释放q地址*/}else cout<<"便道里没有车!"<<endl; /*便道没车*/}else cout<<"车场里没有车!"<<endl; /*车场没车*/}void PRINT(CarNode *p,int room) /*输出离开车辆的信息清单*/{int A1,A2,B1,B2;cout<<"请输入离开的时间:(小时:分钟)"<<endl;cin>>p->leave.hour;while(p->leave.hour<0||p->leave.hour>23){cout<<"输入错误!"<<endl;cout<<"请重输入离开的时间的时(0-23)"<<endl;cin>>p->leave.hour;B1=p->leave.hour;}cin>>p->leave.min;if(p->leave.min<0||p->leave.min>59){cout<<"输入错误!"<<endl;cout<<"请重输入到达时间的分(0-59)!"<<endl;cin>>p->leave.min;}cout<<endl<<"离开车辆的车牌号为:"<<endl;puts(p->num);cout<<"其到达时间为: "<<p->reach.hour<<":"<<p->reach.min<<endl;cout<<"离开时间为: "<<p->leave.hour<<":"<<p->leave.min<<endl;A1=p->reach.hour;A2=p->reach.min;B1=p->leave.hour;B2=p->leave.min;cout<<"应交费用为: "<<(((B1-A1)*60+(B2-A2))+1440)%1440*price<<"元!"<<endl;free(p);}void List1(SeqStackCar *S) /*列表显示车场信息*/{cout<<"您选择的是车场停车情况!"<<endl;int i;if(S->top>0) /*判断车站内是否有车*/{cout<<" 位置到达时间车牌号"<<endl;for(i=1;i<=S->top;i++){cout<<" "<<i<<" "<<S->stack[i]->reach.hour<<":"<<S->stack[i]->reach.min<<" "<<S->stack[i]->num<<endl;}}else cout<<"车场里没有车!"<<endl;}void List2(LinkQueueCar *W) /*列表显示便道信息*/{cout<<"您选择的是便道停车情况!"<<endl;int j=1;QueueNode *p;p=W->head->next;if(W->head!=W->rear) /*判断通道上是否有车*/{cout<<"等待车辆的车牌号码为:"<<endl;while(p!=NULL){//cout<<j;//puts(p->data->num);cout<<j<<" "<<p->data->num<<endl;p=p->next;j++;} //开始时显示不正确,没有按照正常输出}else cout<<"便道里没有车!";}void List(SeqStackCar S,LinkQueueCar W) /*列表界面*/ {int flag,tag;flag=1;while(flag) /*列表显示循环控制*/{cout<<"请选择您要显示信息! (1-3):"<<endl;cout<<"※--1.车场--※"<<endl;cout<<"※--2.便道--※"<<endl;cout<<"※--3.返回--※"<<endl;while(1){cin>>tag;if(tag>=1||tag<=3) break;else cout<<"输入错误!请选择(1-3):"<<endl;}switch(tag){case 1:List1(&S);break; /*列表显示车场信息*/case 2:List2(&W);break; /*列表显示便道信息*/case 3:flag=0;break;default: break;}}}。

相关主题