模拟停车厂管理报告.docx
《模拟停车厂管理报告.docx》由会员分享,可在线阅读,更多相关《模拟停车厂管理报告.docx(13页珍藏版)》请在冰豆网上搜索。
模拟停车厂管理报告
模拟停车厂管理
班级:
数学1班姓名:
田娟学号:
2013433033日期:
12月25号
一、需求分析
1.程序的功能;
设停车厂是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后顺序依次排列,若停车场内已停满汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。
每辆停放在停车场的车,在离开时按其在停车场停留时间的长短交费。
在这里假设汽车不能从便道上开走。
试设计一个实现停车场管理的程序。
2.输入输出的要求;
按照从终端输入数据序列进行模拟管理。
1.栈用顺序结构实现,队列用链式结构实现;
2.每一组输入数据包括三个数据项:
汽车“到达”或“离去”的信息、汽车牌照号码、汽车到达或离去的时刻;
3.对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用(假设在便道上等候的时间不收费)。
3.测试数据。
1.当停车场容量为2时,(‘A’、“F001”、5),(‘A’、“A002”、10),(‘D’、“F001”、15),(‘A’、“F003”、20),(‘A’、“C004”、25),(‘A’、“B005”、30),(‘D’、“A002”、35),(‘D’、“C004”、40),(‘E’、0、0)。
二、概要设计
1.本程序所用的抽象数据类型的定义;
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟便道*/
2.主模块的流程及各子模块的主要功能;
2.1*初始化栈*/
voidInitStack(SeqStackCar*s)/
2,2初始化便道*/
intInitQueue(LinkQueueCar*Q)/*
2.3车辆到达*
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*/
2.4车辆离开
4voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)/*
2.5输出离开车辆的信息清单*/
voidPRINT(CarNode*p,introom)/*
2.6列表显示车场信息
voidList1(SeqStackCar*S)/**/
2.7列表显示便道信息
voidList2(LinkQueueCar*W)/**/
2.8/*列表界面
voidList(SeqStackCarS,LinkQueueCarW)*/
3.模块之间的层次关系。
停车管理系统
车辆到达
车辆离开
退出系统
车辆基本信息显示
三、详细设计
1.采用c语言定义相关的数据类型;
typedefstructtime
{
inthour;
intmin;
}Time;/*时间结点*/
typedefstructnode
{
charnum[5];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
typedefstructNODE
{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;/*模拟停车场*/
typedefstructcar
{
CarNode*data;
structcar*next;
}QueueNode;
2.写出各模块的伪码算法;
voidmain()
{
SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
InitStack(&Enter);/*初始化车站*/
InitStack(&Temp);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1)
{
cout<<"停车管理系统"<cout<<"1.车辆到达"<cout<<"2.车辆离开"<cout<<"3.车辆基本信息显示"<cout<<"4.退出系统"<cout<<"请选择所需要的服务!
输入1-4"<while
(1)
{
cin>>ch;
if(ch>=1&&ch<=4)break;
elsecout<<"输入错误!
请选择:
(1-4)."<}
switch(ch)
{
case1:
Arrival(&Enter,&Wait);break;/*车辆到达*/
case2:
Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/
case3:
List(Enter,Wait);break;/*列表显示信息*/
case4:
exit(0);/*退出主程序*/
default:
break;
}
}
}
voidInitStack(SeqStackCar*s)/*初始化栈*/
{
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueueCar*Q)/*初始化便道*/
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
elsereturn(-1);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
cout<<"请输入车牌号(如:
A123):
"<cin>>p->num;
if(Enter->top{
Enter->top++;
cout<<"车辆在车场第"<top<<"位置!
"<cout<<"请输入到达时间:
(小时:
分钟)"<cin>>p->reach.hour;
while(p->reach.hour<0||p->reach.hour>23)//控制时间格式正确
{
cout<<"输入错误!
"<cout<<"请重输入到达时间的时(0-23)!
"<cin>>p->reach.hour;
}
cin>>p->reach.min;
while(p->reach.min<0||p->reach.min>59)//控制分钟输入正确
{
cout<<"输入错误!
"<cout<<"请重输入到达时间的分(0-59)!
"<cin>>p->reach.min;
}
Enter->stack[Enter->top]=p;
return
(1);
}
else/*车场已满,车进便道*/
{
cout<<"车场已满,请在便道等待!
"<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)/*车辆离开*/
{
introom;
CarNode*p;
QueueNode*q;/*判断车场内是否有车*/
if(Enter->top>0)/*有车*/
{
while
(1)/*输入离开车辆的信息*/
{
cout<<"请输入车在车场的位置--"<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{
/*便道的车辆进入车场*/
q=W->head->next;
p=q->data;/*p指向链队头*/
Enter->top++;
cout<<"便道的"<num<<"号车进入车场第"<top<<"位置!
"<cout<<"进便道时间"<cin>>p->leave.hour;
cin>>p->leave.min;
Enter->stack[Enter->top]=p;
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
free(q);/*释放q地址*/
}
else
cout<<"便道里没有车!
"<}
elsecout<<"车场里没有车!
"<}
voidPRINT(CarNode*p,introom)/*输出离开车辆的信息清单*/
{
intA1,A2,B1,B2;
cout<<"请输入离开的时间:
(小时:
分钟)"<cin>>p->leave.hour;
while(p->leave.hour<0||p->leave.hour>23)
{
cout<<"输入错误!
"<cout<<"请重输入离开的时间的时(0-23)"<cin>>p->leave.hour;
B1=p->leave.hour;
}
cin>>p->leave.min;
if(p->leave.min<0||p->leave.min>59)
{
cout<<"输入错误!
"<cout<<"请重输入到达时间的分(0-59)!
"<cin>>p->leave.min;
}
cout<<"离开车辆的车牌号为:
"<cout<num;
cout<<"其到达时间为:
"<reach.hour<<":
"<reach.min<cout<<"离开时间为:
"<leave.hour<<":
"<leave.min<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<<"元!
"<free(p);
}
voidList1(SeqStackCar*S)/*列表显示车场信息*/
{
cout<<"显示车场停车情况!
"<inti;
if(S->top>0)/*判断车站内是否有车*/
{
cout<<"位置到达时间车牌号"<for(i=1;i<=S->top;i++)
{
cout<<""<stack[i]->reach.hour<<":
"<stack[i]->reach.min<<""<stack[i]->num<}
}
elsecout<<"车场里没有车!
"<}
voidList2(LinkQueueCar*W)/*列表显示便道信息*/
{
cout<<"您选择的是便道停车情况!
"<intj=1;
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)/*判断通道上是否有车*/
{
cout<<"等待车辆的车牌号码为:
"<while(p!
=NULL)
{
cout<data->num<p=p->next;
j++;
}//开始时显示不正确,没有按照正常输出
}
elsecout<<"便道里没有车!
";
}
voidList(SeqStackCarS,LinkQueueCarW)/*列表界面*/
{
intflag,tag;
while(flag)/*列表显示循环控制*/
{
cout<<"请选择您要显示信息!
(1-3):
"<cout<<"****--1.车场--****"<cout<<"****--2.便道--****"<cout<<"****--3.返回--****"<while(flag)
{
cin>>tag;
if(tag>=1||tag<=3)break;
elsecout<<"输入错误!
请选择(1-3):
"<}
switch(tag)
{
case1:
List1(&S);break;/*列表显示车场信息*/
case2:
List2(&W);break;/*列表显示便道信息*/
case3:
flag=0;break;
default:
break;
}
}
}
四、调试分析
1.调试中遇到的问题及对问题的解决方法;
停车场内已停满汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场
五、使用说明及测试结果
1.停车场管理系统
2.车辆进站
3.车辆出站
4.显示车辆所在信息
6、源代码
略