停车场管理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY
课程实验报告
题目:停车场管理
学生姓名:
学生学号:
专业班级:
指导老师:
完成日期:
一.需求分析
1.输入形式
第一次输入一个正整数,代表停车场容量大小。然后输入三个值,分别为字符、正整数、正整数,中间用空格隔开,分别代表车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。其中字符必须为“A,D,E”三者之一。输入格式为:“A 1 5”、“D 1 15”和“E 0 0“。
当用户输入的字符不是ADE或者输入的不是正整数时,提示用户输入错误并重新输入
2.输出形式
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
(注:本程序中默认停车一小时收费10元)
3.程序功能
本程序可通过用户输入的车辆信息,输出该车的停车位置或者停车时间及应缴费用
4.测试数据
请输入停车场容量:5
A 1 1 车停在停车场第 1 个位置
A 2 2 车停在停车场第 2 个位置
A 6 6 车停在停车场第 3 个位置
D 1 4 停车时间:3 缴纳费用:¥30
D 2 6 停车时间:3 缴纳费用:¥30
F C 19.5 输入有误,请重新输入
E 0 0
二.概要设计
1.抽象数据类型
将每辆车模拟成一个对象,每个对象具有车牌号时间等属性,所以定义一个Car类存储这些信息
class Car
{
public:
int CarNumber;//车牌号码
int ArriveTime;//到达时间
int LeaveTime;//离开时间
}
使用栈模拟停车场,其ADT设计:
ADT stack
数据对象:Car类
数据关系:线性关系
基本操作:
void clear();//栈的初始化
bool push(const Car& item);//栈的插入操作
bool pop(Car& it);//栈的删除操作
bool topValue(Car& it)//栈的顶层元素
int length() const
{return size};//栈的实际长度
使用队列模拟场外通道,其ADT设计如下:
ADT Queue
数据对象:Car类
数据关系:线性关系
基本操作:
void clear();//队列的初始化
bool enqueue(const Car& it);//入队
bool dequeue(Car& it);//出队
int length() const
{return size;};//队列的长度
2.算法基本思想
①在该程序中,对停车场和场外通中每辆车停车的编号而言,他们有
唯一的第一个元素和最后一个元素,而且除第一个元素以外的每个元素都有唯一的后继,除最后一个元素以外的每个元素都有唯一的前驱。因此这些元素具有线性关系。而且,对于停车场里面的汽车,他们逻辑次序是“先进后出,后进先出“的,且只在表头作插入和删除,所以可以使用栈来模拟停车场。而在场外通道中的汽车,他们是”先进先出”的,在一端插入另一端删除操作,所以可以用队列来模拟场外通道。当汽车离开时,在它之后进入的车辆必须先退出再按原次序进入停车场,所以需要定义另外一个临时栈存储这些元素。(本算法按用户输入的顺序进行车辆的停放,不是按车牌号码依次停放)
②(1)当有汽车需要进停车场停车时,进行入栈操作,若停车场已
满,即栈已满,则将车停在场外通道里,进行入队操作,并记下此时的时间ArriveTime;
(2)当有汽车需要离开停车场时,对该车对应的元素进行出栈操作,并将后面进来的车辆所对应的元素进行出栈操作,将这些元素(除了需要离开的车对应的元素)存入另外一个栈,即为需要离开停车场的车让道,并记下此时的时间LeaveTime;
(3)在需要离开停车场的车成功离开停车场时,将存储在临时栈的那些元素按照原来的顺序依次插入原来的栈;
(4)如果队列不为空(即停车场场外通道上有车,这些车需要进入停车场停车),进行入栈操作,即进行(1)操作;
(5)通过LeaveTime 与ArriveTime的差计算停车时间和停车费用(本程序默认停车每小时10元);
3.程序基本流程
程序由个基本模块组成:
输入模块:输入停车场的容量和车辆的相关信息;
停车模块:根据车的信息,将该车对应的元素进行入栈操作;
离开模块:根据车的信息,将该车对应的元素进行出栈操作,并将后面的元素存入一个临时栈中;
输出模块:输出该车停车位置或停车费用;
三.详细设计
1.物理数据类型
①停车场容量为正整数,使用整型数据存储n;
②对于剩下的输入使用字符型、整型、整型存储,并将相应数据存入
Car类
class Car
{
public:
int CarNumber;//车牌号码
int ArriveTime;//到达时间
int LeaveTime;//离开时间
}
③定义一个Link类用来存储元素值element及下一个存储表中下一个节
点指针的next域,其ADT设计如下:
template
{
public:
Car element;
Link *next;
Link(const Car & elemval, Link* nextval = NULL)
{
element = elemval;
next = nextval;
}
Link(Link *nextval = NULL)
{
next = nextval;
}
};
④由于停车场容量一定,即栈空间大小不变,所以可以选用顺序表实现栈
class AStck:public Stack
{
private:
int size;//栈的长度
int top;//栈顶元素
Car *listArray;//顺序表保存栈元素
public:
AStack(int sz)
{size=sz;top=0;listArray=new Car[sz];} //构造函数