资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
HUNAN UNIVERSITY实验二最终报告题 目: 停车场管理 学生姓名 学生学号 专业班级 指导老师 完 成 日 期 2014年4月24日 一、 需求分析1 输入形式:用户通过键盘输入一组数据:字符、整数、整数后,输出汽车到达或者汽车离去的相应信息到DOS界面。当用户输入数据不符合规范时,提示重新输入。输入规则:第一个字符中A表示车辆到达;D表示车辆离去;E表示输入结束;第二个整数代表车牌号码;第三个整数代表到达或离去的时刻。2 输出形式:1) 停入停车场:车牌号为x的汽车到达,位于停车场位置y2) 停入便道:停车场已满,车牌号为x的汽车位于便道位置y3) 移动停车位置:车牌号为x的汽车停在停车场位置y4) 离开车辆信息:车牌号为x的汽车离开,停车时间y小时,缴费z元3 功能:根据用户输入数据,若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。4 测试数据停车场系统容量为2收费标准:每小时5元输入:A 1 5输出:车牌号为1的汽车到达,位于停车场位置1 输入:A 2 10输出格式:车牌号为2的汽车到达,位于停车场位置2输入:A 3 20输出格式:停车场已满,车牌号为3的汽车位于便道位置1 输入:D 1 15输出格式:车牌号为1的汽车离开,停车时间10小时,缴费50元。输出格式:车牌号为3的汽车到达停车场,位于位置2输入:E 0 0二、概要设计抽象数据类型根据题目设计要求,车辆只能从一个大门出入,汽车只能从停车场唯一一条狭长通道驶入驶出,而暂时停放车辆的便道同理。每一辆停入停车场或便道的汽车有唯一的前驱和后继,所以问题适合建立一个线性数据关系求解。因为停车场具有只有一个出入口、容量限定的特点,所以实现停车场的线性结构需要具备可限定空间大小,“先进后出”,只有一端出入口的特性,所以用堆栈实现它。而临时车道停放车辆后要按原序停放回停车场,具有“先进后出”的特点,且需要的临时车道的容量小于等于停车场容量,所以用实现停车场的同一堆栈实现它。停车便道具有“先进先出”的特点,且需要停车便道的长度不可预测,所以使用链式队列实现。由于每辆汽车都包含车牌号、停放时间的信息,所以定义一个汽车类为每辆汽车打包这些信息。class car /car类 public:int num; /车牌号码int time; /汽车停放时间;堆栈ADT定义:数据对象:car类数据关系:R=|ai-1,aicar,i=1,2,3.n约定an 为栈顶,a1为栈底。Stack(); /结构初始化操作bool push(const car& it); /压入一个数据bool pop(car& it); /依次弹出m个数据bool topValue(car& it); /获取栈顶元素Stack(); /结构销毁操作int length() const; /获取栈的长度队列ADT定义:数据对象:car类数据关系:R=|ai-1,aicar,i=1,2,3.n约定a1 为队列头,an为队列尾。Queue(); /队列结构初始化Queue(); /结构销毁操作bool push(const car& it); /数据入列bool pop(car& it); /数据出列virtual int length() const; /获取队列长度算法的基本思想1) 如果有一辆车要停入,先判断停车场是否已满。若未满,把汽车停入停车场(入栈),记录下汽车的车牌号和停放时间。若已满,把汽车停入便道(入队列)中,记录汽车车牌号,并提示输出停放位置。2) 如果一辆车要离开,用该车车牌号查找停车场中的车,如果不是所查找的车,把此车驶出停车场(出栈),停入临时车道中(入临时栈),直到查找到该车为止。若查找到,把此车驶出停车场,记录汽车驶离时间,计算停车费用。汽车离开后把临时车道中的汽车依次驶出(出临时找),并停入停车场中(入栈)。最后判断便道内是否停有汽车,如果有,把便道中的第一辆车驶出(出队列)停放到停车场(入栈)内,记录停放时间为汽车驶离时间。程序的流程(1) 输入模块:输入一组包含汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻的数据。(2) 判断模块:判断汽车是“到达”或“离开”,若为“到达”执行第(3) 1)步,若为“离开”执行第(3) 2)步。 (若为结束则停止程序。)(3) 处理模块:1) 汽车“到达”:把汽车包含的信息存入栈中,如果入栈失败,则存入队列中。返回第(1)步。2) 汽车“离开”:根据要离开汽车的车牌号对栈中数据判断,不是寻找的数据则出栈存入临时栈中。找到数据则返回其时间信息并弹出该数据,再判断队列中是否有数据,有则把队列头的数据弹出,压入栈中。(4) 输出模块:根据时间信息计算停车费用输出到屏幕,并返回第(1)步。三、详细设计根据题目需求,用堆栈实现停车场和临时车道,为了有更高的空间效率和节省结构性开销,用顺序表实现堆栈,链式队列实现便道物理数据类型用字符变量存储用户输入“来去”信息,用car类存储汽车车牌号、来去时间。class carpublic: int num; int time;停车场和临时车道的堆栈基本操作如下:class Stackprivate:int size;int top;car *data;public:Stack() /结构初始化操作 size=n; top=0; data=new carn;Stack() /结构销毁操作delete data;/压入数据,成功返回true,失败返回falsebool push(const car& it)if(top=size) return false;elsedatatop+=it; return true;/弹出数据,成功返回true,失败返回falsebool pop(car& it)if(top=0) return false;elseit=data-top; return true;/获取栈顶元素,获取成功返回true,失败返回falsebool topValue(car& it) constif(top=0) return false;else it = datatop-1;return true;int length() constreturn top; /获取栈的长度;用于便道的链式队列实现如下:class qnode /定义单链表的结点public:car elem;qnode *next;qnode(const car& elemval,qnode* nextval=NULL)elem=elemval;next=nextval;qnode(qnode* nextval=NULL)next=nextval;class Queueprivate:int size;qnode *front;qnode *next;qnode *rear;car *data;public:Queue() /队列结构初始化size=0;front=NULL; rear=NULL;Queue() /结构销毁操作while(front!=NULL)rear=front;front=front-next;delete rear;rear=NULL;size=0; /数据入列,成功返回true,失败返回bool push(const car& it)if(rear=NULL)front=rear=new qnode(it,NULL); else /appendrear-next=new qnode(it,NULL);rear=rear-next;size+;return true;/数据出列,成功返回true,失败返回bool pop(car& it) if(length()=0) return false; it=front-elem; qnode* ltemp=front; front=front-next; delete ltemp; if(front=NULL) rear=NULL; size-; return true; /获取队列长度int length() const return size; ;算法的具体步骤车辆“离开”处理模块停车场问题中各部分调用的流程图如下:程序结束车辆“到达”处理模块/定义使用到的变量char comego;car Car;Stack park;Stack temp;Queue path;cout停车场系统容量为2endl; /停车场容量、收费标准提示信息cout收费标准:每小时5元endl;/提示输入car c;while(comego!=E|comego!=e) /如果输入不为E或e时,进入循环switch(comego) case a: /如果输入字符为a或A,进行车辆到达相关操作case A:/在基本操作中定义push()为bool型函数,当栈不满时压栈成功返回true,否则返回false,所以用压栈操作park.push()作为入栈成功与否的判断条件if(park.push(Car) /如果入栈成功/输出停车车牌号和位于停车场的位置else /入栈失败
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号