模拟停车场管理程序的设计与实现.docx
《模拟停车场管理程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《模拟停车场管理程序的设计与实现.docx(30页珍藏版)》请在冰豆网上搜索。
![模拟停车场管理程序的设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-2/25/1b2b8315-7377-4c1e-926e-98c39b43db18/1b2b8315-7377-4c1e-926e-98c39b43db181.gif)
模拟停车场管理程序的设计与实现
实验题目:
模拟停车场管理程序的设计与实现
一、需求分析
1.程序的功能;
这是一个模拟停车场管理程序,设停车厂是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后顺序依次排列,若停车场内已停满汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。
汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
停放在便道上的汽车也收费,收费标准比停放在停车场的车低。
每辆停放在停车场的车,在离开时按其在停车场停留时间的长短交费。
2.输入输出的要求;
每一组输入数据包括三个数据项:
汽车“到达”或“离去”的信息、汽车牌照号码、汽车到达或离去的时刻;
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆离去,则输出车辆在停车场内停留的时间和应缴纳的费用
3.测试数据。
当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。
(到达和离开时间请自行设定)。
二、概要设计
1.本程序所用的抽象数据类型的定义;
/*时间的类型定义*/
typedefstruct
{
inthour;
intmin;
}TIME;
/*汽车的类型定义*/
typedefstruct
{
charlicense_plate[10];/*汽车牌照号码*/
TIMEtime,time1;/*time,time1分别表示汽车进入停车场和便道的时刻*/
charstate;/*汽车当前状态,p表示一直停放在停车位上,*/
/*q表示一直在便道上等候,*/
/*i表示由便道进入停车位*/
}Car;
/*表示停车位的顺序栈*/
typedefstruct
{
CarPark[MAX_PARK];/*各汽车信息的存储空间*/
inttop;/*用来指示栈顶位置的静态指针*/
}ParkStack;
/*链队列来模拟便道*/
typedefstructqnode
{
Cardata;/*各汽车信息的存储空间*/
structqnode*next;
}Qnode;
typedefstruct
{
Qnode*front,*rear;/*用来指示队头和队尾位置的指针*/
}RoadQueue;
2.主模块的流程及各子模块的主要功能;
本程序从总体上分为四个功能模块,分别为:
(1)程序功能介绍和操作提示模块
提示用户进行正确的操作。
(2)汽车进入停车位的管理模块
记录进入停车场的汽车信息并插入栈或队中。
(3)汽车离开停车位的管理模块
释放离开汽车所占空间,计算汽车停车费用并输出。
(4)查看停车场状态的查询模块
列出停车场状态。
3.模块之间的层次关系。
三、详细设计
1.采用c语言定义相关的数据类型;
/*时间的类型定义*/
typedefstruct
{
inthour;
intmin;
}TIME;
/*汽车的类型定义*/
typedefstruct
{
charlicense_plate[10];/*汽车牌照号码*/
TIMEtime,time1;/*time,time1分别表示汽车进入停车场和便道的时刻*/
charstate;/*汽车当前状态,p表示一直停放在停车位上,*/
/*q表示一直在便道上等候,*/
/*i表示由便道进入停车位*/
}Car;
/*表示停车位的顺序栈*/
typedefstruct
{
CarPark[MAX_PARK];/*各汽车信息的存储空间*/
inttop;/*用来指示栈顶位置的静态指针*/
}ParkStack;
/*链队列来模拟便道*/
typedefstructqnode
{
Cardata;/*各汽车信息的存储空间*/
structqnode*next;
}Qnode;
typedefstruct
{
Qnode*front,*rear;/*用来指示队头和队尾位置的指针*/
}RoadQueue;
2.写出各模块的伪码算法;
//程序功能介绍和操作提示模块
voidwelcome()
{
cout<cout<<"本程序为停车场的模拟管理程序"<cout<<"----------------------------------------"<cout<<"有车到来请按【C】键"<cout<<"有车要走请按【L】键"<cout<<"查询停车场状态请按【S】键"<cout<<"退出程序请按【Q】键"<cout<cin>>ch;
}
//汽车进入停车场的管理模块
voidcar_come()
{
CarnewCar;
cout<cout<<"请输入到来车辆的车牌号:
";
cin>>newCar.license_plate;
if(Park_Car->top{
cout<:
";
cin>>newCar.time.hour>>newCar.time.min;
newCar.state='p';
Park_Car->top++;
Park_Car->Park[Park_Car->top]=newCar;
}
else//停车位满,车辆进去便道或开走
{
inti;
cout<";
cin>>i;
if(i==1)
{
cout<:
";
cin>>newCar.time1.hour>>newCar.time1.min;
newCar.state='q';
Qnode*p;
p=newQnode;
if(!
p)
{
cout<<"申请动态存储空间失败!
"<return;
}
else
{
p->data=newCar;
p->next=NULL;
Road_Car->rear->next=p;
Road_Car->rear=p;
}
}
else
cout<"<}
cout<cin>>ch;
welcome();
}
//汽车离开停车场的管理模块
voidcar_leave()
{
chars[10];
inti;
TIMEt;
cout<cout<<"请输入要走的车辆号码:
";
cin>>s;
for(i=0;i<=Park_Car->top;i++)//在停车位寻找要开走的汽车
if(strcmp(s,Park_Car->Park[i].license_plate)==0)
break;
if(i<=Park_Car->top)//在停车位找到要开走的汽车
{
cout<cout<<"请输入当前时间<时分>:
";
cin>>t.hour>>t.min;
print(Park_Car->Park[i],t);
while((Park_Car->top)>i)//该车前面的汽车暂时退出
{
Buffer_Car->top++;
Buffer_Car->Park[Buffer_Car->top]=Park_Car->Park[Park_Car->top];
Park_Car->top--;
cout<<"车牌号为"<Park[Buffer_Car->top].license_plate<<"的汽车暂时退出停车场;"<}
cout<<"车牌号为"<Park[i].license_plate<<"的汽车从停车场开走;"<Park_Car->top--;
while(Buffer_Car->top>-1)//暂时退出的汽车开回停车位
{
Park_Car->top++;
Park_Car->Park[Park_Car->top]=Buffer_Car->Park[Buffer_Car->top];
Buffer_Car->top--;
cout<<"车牌号为"<Park[Park_Car->top].license_plate<<"的汽车停回停车场的"<top+1<<"车位;"<}
if(Road_Car->front!
=Road_Car->rear)//便道有车,则进入停车位
{
Qnode*p;
p=Road_Car->front->next;
Road_Car->front->next=p->next;
p->data.state='i';
p->data.time=t;
Park_Car->top++;
Park_Car->Park[Park_Car->top]=p->data;
deletep;
if(Road_Car->front->next==NULL)
Road_Car->rear=Road_Car->front;
cout<<"车牌号为"<Park[Park_Car->top].license_plate<<"的汽车从便道进入停车位的"<top+1<<"车位;"<}
}
else//在停车位未找到要开走的汽车,则在便道寻找
{
intk=0;
Qnode*p,*r;
p=Road_Car->front->next;
r=Road_Car->front->next;
while(p)
{
k++;
if(strcmp(p->data.license_plate,s)==0)
break;
p=p->next;
}
if(p)//在便道找到该车
{
cout<cout<<"请输入当前时间<时分>:
";
cin>>t.hour>>t.min;
print(p->data,t);
while(p!
=r)//该车前面有车,前面的车要让路
{
cout<<"车牌号为"<data.license_plate<<"的汽车开出便道让路;"<Road_Car->front->next=r->next;
r->next=NULL;
BufferCar->rear->next=r;
BufferCar->rear=r;
r=Road_Car->front->next;
}
cout<<"车牌号为"<data.license_plate<<"的汽车从便道开走。
"<Road_Car->front->next=p->next;//删除结点
deletep;
if(Road_Car->front->next==NULL)//若便道只有一辆车,出队后便道为空
Road_Car->rear=Road_Car->front;
if(BufferCar->front!
=BufferCar->rear)//辅助队列不为空,即有车让路
{
BufferCar->rear->next=Road_Car->front->next;
Road_Car->rear=Road_Car->front;
Road_Car->rear->next=BufferCar->front->next;
Road_Car->rear=BufferCar->rear;
BufferCar->rear=BufferCar->front;
cout<<"让路的车辆开回便道。
"<}
}
else
cout<<"没有在停车场找到该车!
"<}
cout<cin>>ch;
welcome();
}
//显示停车场停车状态的查询模块
voidcar_display()
{
inti=0;
//停车位情况
cout<"<while(i<=Park_Car->top)
{
cout<Park[i].license_plate;
if(Park_Car->Park[i].state=='p')
cout<<""<Park[i].time.hour<<"时"<Park[i].time.min<<"分停入停车位。
"<else
{
cout<<""<Park[i].time1.hour<<"时"<Park[i].time1.min<<"分进入便道等候;";
cout<Park[i].time.hour<<"时"<Park[i].time.min<<"分由便道进入停车位。
"<}
i++;
}
while(i{
cout<
i++;
}
//便道上的情况
cout<"<if(Road_Car->front==Road_Car->rear)
cout<else
{
Qnode*p;
p=Road_Car->front->next;
i=1;
while(p)
{
cout<data.license_plate;
cout<<""<data.time1.hour<<"时"<data.time1.min<<"分进入便道等候。
"<p=p->next;
i++;
}
}
cout<cin>>ch;
welcome();
}
3.画出函数的调用关系图。
四、调试分析
1.调试中遇到的问题及对问题的解决方法;
经过两周的设计和开发,停车场管理系统基本开发完毕。
其功能基本符合用户需求,能够完成对车辆的管理和查询以及各类相关报表的打印。
对于车辆进去和离开停车场的时间,也进行了完善,具体到了小时和分钟。
该程序给用户提供了选择机会,采用比较友好的界面显示。
但由于设计时间较短,该系统仍有不尽人意的地方,如不同类型车辆收费情况不够完善等。
五、使用说明及测试结果
(1)使用说明
程序操作简单,在车辆到来时,选择【C】,然后根据提示输入车牌号及当前时刻;有车要走时,选择【L】,然后根据提示输入此时时刻;要查询停车场信息时,只需选择【S】;
若退出程序,则选择【Q】。
(2)测试结果
程序运行时的欢迎界面。
当停车场容量为5时,连续有7辆车到来,牌照号分别为F001、F002、F003、F004、、F005、F006、F007,前5辆车应该进入停车位1-5车位,第6、7辆车应停入便道的1、2位置上。
显示停车场信息。
牌照号为F003的汽车从停车厂开走,应显示F005、F004的让路动作和F006从便道到停车位上的动作。
(到达和离开时间请自行设定)。
牌照号为F003的汽车从停车厂开走后,显示停车场信息。
六、源程序
#include
#include
#include
#include
#defineMAX_PARK3/*停车场容量*/
#definePrice0.5/*停车位收费标准:
每分钟每车.5元*/
#defineprice0.3/*便道收费标准:
每分钟每车.3元*/
typedefstruct
{
inthour;
intmin;
}TIME;
typedefstruct/*汽车的类型定义*/
{
charlicense_plate[10];/*汽车牌照号码,定义为一个字符数组*/
TIMEtime,time1;/*time,time1分别表示汽车进入停车场和便道的时刻*/
charstate;/*汽车当前状态,p表示一直停放在停车位上,q表示一直在便道上等候,i表示由便道进入停车位*/
}Car;
typedefstruct/*表示停车位的顺序栈*/
{
CarPark[MAX_PARK];/*各汽车信息的存储空间*/
inttop;/*用来指示栈顶位置的静态指针*/
}ParkStack;
ParkStack*Park_Car,*Buffer_Car;//Park_Car和Buffer_Car分别指向表示停车场和辅助栈的指针变量
typedefstructqnode/*链队列来模拟便道*/
{
Cardata;/*各汽车信息的存储空间*/
structqnode*next;
}Qnode;
typedefstruct
{
Qnode*front,*rear;/*用来指示队头和队尾位置的指针*/
}RoadQueue;
RoadQueue*Road_Car,*BufferCar;//Road_Car和BufferCar分别指向表示便道和辅助队列的指针变量
charch;
voidcar_display();
//顺序栈的初始化
ParkStack*Init_ParkStack()
{
ParkStack*s;
s=newParkStack;
if(s==NULL)
returnNULL;//未申请到足够大的存储空间,返回空指针
else
{
s->top=-1;
returns;//申请到新空间,返回栈空间地址
}
}
//链队列的初始化
RoadQueue*Init_RoadQueue()
{
RoadQueue*q;
Qnode*p;
q=newRoadQueue;
p=newQnode;
if(!
q||!
p)
returnNULL;
{
p->next=NULL;
q->front=q->rear=p;
returnq;
}
}
//打印要离开汽车的信息及收费清单
voidprint(Carcar,TIMEt)
{
cout<";
if(car.state=='p')//车辆一直停放在停车位
{
cout<<"汽车车牌号"<cout<<""<cout<<""<<"共"<<(t.hour-car.time.hour)*60+(t.min-car.time.min)<<"分钟,";
cout<<"应付费"<<((t.hour-car.time.hour)*60+(t.min-car.time.min))*Price<<"元(停车位每小时每车"<"<}
elseif(car.state=='q')//车辆一直在便道等候
{
cout<<"汽车车牌号"<cout<<""<cout<<""<<"共"<<(t.hour-car.time1.hour)*60+(t.min-car.time1.min)<<"分钟,";
cout<<"应付费"<<((t.hour-car.time1.hour)*60+(t.min-car.time1.min))*price<<"元(便道每小时每车"<"<}
elseif(car.state=='i')//车辆由便道进入停车位
{
intm,n;
m=(car.time.hour-car.time1.hour)*60+(car.time.min-car.time1.min);
n=(t.hour-car.time.hour)*60+(t.min-car.time.min);
cout<<"汽车车牌号"<cout<<""<