实验报告
题目:模拟停车场管理的问题
一.需求分析
1. 以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入数据序列
进行模拟管理。
2. 每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车
牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息
为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车辆
离去,则输出车辆在停车场内停留的时间和应缴纳的费用(在便道上停留的
时间不收费)。
3. 栈以顺序结构出现,队列以链表结构实现。
二.模块设计
class car
class carstack
{public:
//车的信息类
//栈(停车场的类)
carstack();//构造函数,栈的初始化
int empty();//判断栈是否为空
int full();//判断栈是否为满
car *s;//存放 car 类型栈元素的数组初始地址
int top;//栈顶指针
class carqueue
//队列(便道的类)
{public:
carqueue();//构造函数,队列的初始化
int full();//判断队列是否为满
car *front,*rear;//存放 car 类型队列元素的数组初始地址
}
}
class pakingmanagement
//管理停车场的类
{public:
int pushstack(carstack &cs,int cnum,double ctime);//入栈,cs 栈内进行
调整,返回栈内位置
void popstack(carstack &cs,int cnum);//出栈,cs 栈内进行调整,
//根据车牌号把车弹出栈,将出栈 car 的 number 赋值给 int popstacknumber()
//将出栈 car 的 time 赋值给 double popstacktime(),无返回值!
int pushqueue(carqueue &cq,int cnum,double ctime);//入队,队内进行
调整,返回队内位置
int popqueue(carqueue &cq);//出队,队内进行调整,返回汽车车牌号
void arrival(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆
到达,
//根据输入的车牌号、到达时间,变更函数参数;并 cout 车位信息
void leave(carstack &cs,carqueue &cq,int cnum,double ctime);//车辆离
开,
//根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作;
//并 cout 停留时间和收费情况
void deletequeue(carqueue &cq,int i);//删除 cq 过道中第 i 辆车
int popstacknumber;//专门存放出栈的时候返回的车牌号
double popstacktime;//专门存放出栈的时候返回的时刻
三.详细设计
1. carstack::carstack()//构造函数,栈的初始化
{
top=-1;
s=new car[Max];//创建 car 类型栈元素的数组
if(s==NULL)
{
cout<<"栈空间分配不成功!"<
是 car 类型栈元素的数组
return (cs.top+1);//返回栈内位置加 1,即停车场内车位从 1 号开始
}
}
void parkingmanagement::popstack(carstack &cs,int cnum)//出栈,cs 栈内进行
调整,
//根据车牌号把车弹出栈,将出栈 car 的 number 赋值给 int popstacknumber
//将出栈 car 的 time 赋值给 double popstacktime,无返回值!
{
int i;
car p;
carstack stemp;//定义一个 carstack 类型的临时存放出栈元素的栈
for(i=0; i<=cs.top; i++)
if((cs.s[i]).number==cnum) break;//当要出栈的车的车牌号=栈内的车
牌号元素时,跳出循环
p=cs.s[i];//将要出栈的元素赋给 car 类型的 p 存放
while(cs.top>i)
stemp.s[++(stemp.top)]=cs.s[(cs.top)--];//出栈的元素数组逐个赋
给临时栈
popstacknumber=p.number;// 将 这 个 车 牌 号 信 息 传 给 int
popstacknumber()
popstacktime=p.time;//将该车的时间信息传给 double popstacktime()
cs.top--;//栈顶指针回到原来位置
while(stemp.top>=0)
cs.s[++(cs.top)]=stemp.s[(stemp.top)--];//临时栈出栈的元素逐个
赋给原栈,完成先退再进的工作
}
int parkingmanagement::pushqueue(carqueue &cq,int cnum,double ctime)//入队,
队内进行调整,返回队内位置
{
car *p,*countp;
int count(1);//count 用于记录车在过道上的位置信息,因队列为链式的,
所以进行循环累加
p=new car;//创建一个 car 类型的指针
p->number=cnum;
p->time=ctime;
p->next=NULL;//首先将指向存放 car 类型元素的数组初始地址置空
if (cq.front==NULL)//第一次入队要判断头结点是否为空
{
cq.front=cq.rear=p;
}
else
{//尾插法插入元素
p->next=(cq.rear)->next;
(cq.rear)->next=p;
cq.rear=(cq.rear)->next;
}
countp=(cq.front)->next;
while(countp!=NULL)
{
count++;
countp=countp->next;
}//count 即车在过道上的位置,【从 1 开始计!!!】
return count;
}
{
}
ctime)
息
{
的车牌号
{
int parkingmanagement::popqueue(carqueue &cq)//出队,队内进行调整,返回汽
车车牌号
car p;
p.number=((cq.front)->next)->number;//cq 队里,从 cq.front 开始指向下一
个元素的车牌号赋给 car 类型的车信息
p.time=((cq.front)->next)->time;//cq 队里,从 cq.front 开始指向下一个元素
的时刻
//赋给 car 类型的车信息
p.next=((cq.front)->next)->next;//cq 队里,从 cq.front 开始指向下一个元素
的指针
//赋给 car 类型的车信息的下一个元素的指针
return p.number;
cq.front=(cq.front)->next;
void parkingmanagement::arrival(carstack &cs,carqueue &cq,int cnum,double
//车辆到达,根据输入的车牌号、到达时间,变更函数参数;并 cout 车位信
int pos;
if(!(cs.full()))//如果栈未满,车辆停入停车场
{
int fl(0),i;//定义一个从 0 开始的标记 fl
for(i=0;i<=cs.top;i++)
{
if(cs.s[i].number==cnum)//如果到达的车的车牌号=栈内已有车辆
fl=1;//fl 记 1
break;
}
}
if(fl==1)//如果到达的车的车牌号!=栈内已有车辆的车牌号
cout<<"输入错误!请重新输入!"<
额"<next;
if(p->number==cnum)//在过道中找到要出去的车,则在队列
中删除该 car。
//后面的车辆依然顺序排列,补足空位
位,请自行驶离,无需付费!"<Max)
{
{
}
break;
}
}
if(p==NULL)
cout<<"您的车不在本停车场内,或输入有误,请重新输入!
"<next;
j++;
}//找到第 i 个节点(i 从 1 开始)
if(!p || !p->next)
cout<<"i 不合法";
else
{
q=p->next;
p->next=q->next;
delete q;
}
}
四:函数的调用关系图
main
arrival
pushstack
pushqueue
leave
popstack
pushstack
popqueue
deletequeue
五:设计和调试分析
1.
2.
3.
本实验内容为停车场的管理系统,其中定义了类 carstack 来模拟停车
场,类 carqueue 来模拟便道,同时又定义了另外一个栈 stemp 来暂时存放
要给离去的汽车让路而从停车场退出来的汽车。
程序中运用了友元函数,使得 parkingmanagement 函数能访问 carstack
和 carqueue 类中的所有成员,但是在调试过程中,这一问题没能很好地解
决,比如如果便道中的第一辆车离开时,则仍会输出需要付费的信息,所
以程序还有点毛病,其它的执行还可以
本实验的模块划分比较合理,定义了车类,栈类,队列类,管理类,
以及入栈,出栈,入队,出对,删除对等函数,通过对各个函数的调用使
程序能按照要求执行相应的操作。
六:测试结果
进入停车场系统,按照提示输入车辆的相关信息,车库容量为 2。
停车场已满,再开进的车需要停在便道上,根据提示输入相关信息。
车辆离开时,在停车场内停车则需要付费,收费标准为每小时 20 元,根据提示
输入车辆停留的时间等信息,显示停留时间和付费金额。