模拟停车场管理程序的设计与实现.docx
- 文档编号:30629496
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:31
- 大小:319.37KB
模拟停车场管理程序的设计与实现.docx
《模拟停车场管理程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《模拟停车场管理程序的设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
模拟停车场管理程序的设计与实现
实验题目:
模拟停车场管理程序的设计与实现
一、需求分析
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<<"车牌号为"< } cout<<"车牌号为"< 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<<"车牌号为"< } 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<<"车牌号为"< } } 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<<"车牌号为"< Road_Car->front->next=r->next; r->next=NULL; BufferCar->rear->next=r; BufferCar->rear=r; r=Road_Car->front->next; } cout<<"车牌号为"< "< 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<<""< "< else { cout<<""< cout< "< } 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<<""< "< 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<<""<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 停车场 管理程序 设计 实现