实验二:停车场管理问题
一、 问题描述
1) 问题描述
设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。 2) 基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。每一组输入数据包括三个数据项:汽车的“到达”(‘A’表示)或“离去”(‘D’表示)信息、汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 3) 测试数据
设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:汽车 “到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。其中:(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,1,15)表示1号牌照车在15这个时刻离去。 二、需求分析
1.程序所能达到的基本可能
可实现特定停车场车辆出入的管理功能,可以查询等车场、候车场使用情况。
2.输入的形式及输入值的范围
功能指令分为5种,分别是:
A— 到达; D—离开;
P—查询停车场使用情况; W—查询候车场使用情况; E—退出程序。
车牌号、到达时间、费用及停车场容量可为任意正整数;
3.输出的形式
依据所选功能指令不同,输出形式略有不同。 对于 A指令,输出车牌号,车位号;
D指令,输出车牌号,计费时间段,应付费用; P指令,输出停车场内车辆数目;
W指令,输出后车场内车辆数目; E指令,输出退出提示。
4.测试数据要求
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入数
据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。:
输入数据:程序接受5个命令,分别是:到达(‘A’,车牌号,时间);离去(‘D’,车牌号,时间);停车场(‘P’, 0, 0)显示停车场的车数;候车场(‘W’, 0, 0)显示候车场的车数;退出(‘E’, 0, 0)退出程序。
输出数据:对于车辆到达,要输出汽车在停车场内或者便道上的停车位置;对于车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。
三、 概要设计
1. 主程序流程
首先设定停车场容量及停车场收费标准;选择功能指令,输入车牌号,到达时间;根据指令调用不同的函数,完成指令功能。 2. 核心模块的算法伪码
//主程序 void main() {
cout<<\请设定停车场的最大容量(大于零的整数):\ cin>>Parkingroom;
cout<<\请设置停车场收费标准(大于零的数字,单位:y/h):\ cin>>fee;
cout<<\ cout<<\功能指令如下(注:区分大小写):\
<<\到达;\<<\离开;\<<\停车场使用情况\<<\候车便道情况\<<\退出程序\
cout<<\
char order; parking *s1,*s2; pave *p; car x; int k=1; s1=new parking; s2=new parking; p=new pave; Init_parking(s1); Init_parking(s2); Init_pave(p); while(k) { }
cout<<\请输入功能指令:\cin>>order; cin>>x.num; cin>>x.intime;
switch(order) {
case'A':parkingin(s1,p,x);
break;
case'D':parkingout(s1,s2,p,x);
break;
case'P':roomsituation();
break;
case'W':roompave();
break;
case'E':k=0;cout<<\程序即将退出!\
break;
default:cout<<\您输入的指令有错误,请重新输入。\}
cout<<\程序结束!\}
预编译代码:#include
#include
四、 详细设计
1.实现每个操作的伪码,重点语句加注释 { };
//停车场信息 struct parking {
//便道上车辆信息 struct pavecar {
//便车道信息 struct pave {
//初始化栈——停车场 void Init_parking(parking* s) {
s->top=-1; pavecar *front; pavecar *rear; pavecar *next; int pavenum; int posnum; car N[10000]; int top; int size; int num; int intime;
//车辆信息
struct car
};
};
};
}
//初始化队列——便道 void Init_pave(pave *s) {
s->front=new (pavecar); s->rear=s->front; s->front->next=NULL; s->front->posnum=0; }
//便道上车辆进入
void pavein(pave *s,int num) {
pavecar *p; p=new (pavecar); p->pavenum=num;
//便道上车辆离开 int paveout(pave *s) {
pavecar *p; int num; p=s->front->next;
s->front->next=p->next; if(p->next==NULL) {
p->posnum=s->rear->posnum+1; p->next=NULL; if(s->rear==s->front) {
s->front->next=p;
}
s->rear->next=p; s->rear=p;
::carwait=::carwait+1;
}