实验报告 停车场管理.docx
《实验报告 停车场管理.docx》由会员分享,可在线阅读,更多相关《实验报告 停车场管理.docx(13页珍藏版)》请在冰豆网上搜索。
![实验报告 停车场管理.docx](https://file1.bdocx.com/fileroot1/2023-1/21/63e3372a-c2c8-4cb7-b569-1bf265f6913a/63e3372a-c2c8-4cb7-b569-1bf265f6913a1.gif)
实验报告停车场管理
实验停车场管理
姓名:
曹国君梁辰唐琪皓黄悦班级:
信息1班
学号:
********************************实验时间:
第5周
1.问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按照它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
2.数据结构设计
由于停车场的停车位有限,只有一个入口,且通道狭长,当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,顺序栈的结构符合停车场的需求。
若车场内已停满,车辆再外排队等候,队伍不限长度,可以使用链式队列进行模拟。
输入:
停车位数,停车费单价,进入或离去,车牌号,进入或离去时间
输出:
进入:
输出停在停车场或者便道上的位置
离去:
输出停留在停车场上的时间(离开时间-进入停车场的时间)及费用
为了满足以上的要求,至少需要记录进入时间以及车牌号
template
classSqStack
{protected:
//顺序栈的数据成员:
inttop;//栈顶指针
intmaxSize;
structSet//定义一个结构体,可以存放两个数据
{ElemTypenum;
ElemTypetime;
};//栈最大容量
Set*elems;
}
template
structNode
{
//数据成员:
ElemTypedata1,data2;//两个数据域
Node*next;//指针域
//构造函数:
Node();//无参数的构造函数
Node(ElemTypeitem1,ElemTypeitem2,Node*link=NULL);//已知数数据元素值和指针建立结构
};
3.程序设计
(1)头文件
由于数据域的改变,创建,插入,删除等函数都需要增加一个数据域的处理。
顺序栈:
public:
//抽象数据类型方法声明及重载编译系统默认方法声明:
SqStack(intsize=DEFAULT_SIZE);//构造函数
virtual~SqStack();//析构函数
intLength()const;//求栈长度
boolEmpty()const;//判断栈是否为空
voidClear();//将栈清空
voidTraverse(void(*Visit)(constElemType&))const;//遍历栈
StatusPush(constElemType&e,constElemType&t);//入栈
StatusTop(ElemType&e,ElemType&t)const;//取顶元素
StatusPop(ElemType&e,ElemType&e);//出栈
SqStack(constSqStack©);//复制构造函数
SqStack&operator=(constSqStack©);//赋值语句重载
链式队列:
public:
LinkQueue();//无参数的构造函数
virtual~LinkQueue();//析构函数
intLength()const;//求队列长度
boolEmpty()const;//判断队列是否为空
voidClear();//将队列清空
voidTraverse(void(*Visit)(constElemType&))const;//遍历队列
StatusDelQueue(ElemType&e,ElemType&t);//出队操作
StatusGetHead(ElemType&e,ElemType&t)const;//取队头操作
StatusEnQueue(constElemType&e,constElemType&t);//入队操作
LinkQueue(constLinkQueue©);//复制构造函数
LinkQueue&operator=(constLinkQueue©);//赋值语句重载
(2)辅助函数
当车辆离开时,输入车牌号与离开时间,如果该车辆在停车场中,则在其之后的车辆需要暂时离开停车场为其让路,返回其进入停车场的时间,并判别为真;如果该车辆不存在停车场中,则判别为假。
intdepart(constint&a,constint&n,SqStack&p,bool&dans)//返回进入时间
{SqStackpark1(n);//建立一个临时栈
inttmpn,tmpt,count=0,atime,i;
do{p.Pop(tmpn,tmpt);
park1.Push(tmpn,tmpt);
count++;}//计数器用来记录让开的车数
while(tmpn!
=a&&!
p.Empty());//如果栈顶车牌不符合条件,而且栈不为空,把栈顶元素弹出后放入临时栈中
if(tmpn==a)//如果找到了该车
{dans=1;//判别为真
park1.Pop(tmpn,tmpt);//该车辆离开
count--;}
else
{dans=0;}//如果遍历仍找不到车,则判别为假
atime=tmpt;
for(inti=0;i{park1.Pop(tmpn,tmpt);
p.Push(tmpn,tmpt);
}
returnatime;//返回进入时间
}
为了避免输入重复的车牌号,输入的离开时间小于进入时间,设计了遍历功能供使用者参考
template
voidSqStack:
:
Traverse(void(*Visit)(constElemType&))const
//操作结果:
从栈顶到栈底依次对栈的每个元素调用函数(*visit)
{
for(intPos=top-1;Pos>=0;Pos--)//从栈底到栈顶对栈的每个元素调用函数(*visit)
{cout<<"车牌:
";(*Visit)(elems[Pos].num);
cout<<"到达时间:
";(*Visit)(elems[Pos].time);
cout<}
}
(3)主程序
#include"assistance.h"
#include"sq_stack.h"
#include"lk_queue.h"
intdepart(constint&a,constint&n,SqStack&p,bool&dans)
{SqStackpark1(n);
inttmpn,tmpt,count=0,atime,i;
do{p.Pop(tmpn,tmpt);
park1.Push(tmpn,tmpt);
count++;}
while(tmpn!
=a&&!
p.Empty());
if(tmpn==a)
{dans=1;
park1.Pop(tmpn,tmpt);
count--;}
else
{dans=0;}
atime=tmpt;
for(inti=0;i{park1.Pop(tmpn,tmpt);
p.Push(tmpn,tmpt);
}
returnatime;
}
intmain(){
intn=0,time,num,tmp,oldtime;
doubleprix;//停车单价
boolsi;//判别车辆是否存在
charjug='P';
cout<<"欢迎使用停车场管理系统"<while(n<1)
{
cout<<"请输入停车场的车位数:
"<cin>>n;
}
LinkQueuehallway;
SqStackpark(n);
cout<<"请输入每分钟停车费:
"<cin>>prix;
while(jug!
='E')//选择界面
{
cout<<"A.车辆到达"<cout<<"D.车辆离开"<cout<<"L.查看停车场情况"<cout<<"E.退出程序"<cin>>jug;
switch(jug){
case'A':
//进入
{cout<<"请输入车牌号与达到时间:
"<cin>>num>>time;
if(park.Length()!
=n)//停车场没满
{park.Push(num,time);
cout<<"车牌号为"<"<