1、HUNAN UNIVERSITY课程实习报告题 目: 停车场管理问题学生姓名 学生学号专业班级指导老师李晓鸿完 成 日 期2 0 1 5年 11 月 25日一、 需求分析1. 输入的形式的输入的范围:选择功能:1停车 2离开停车场 3离开过道若输入1(停车),输入当前车牌号和当前的时间;若输入2(离开停车场),输入车票号和当前时间;若输入3(离开过道),输入车牌号.2. 输出的形式:提示选择功能“1。停车 2离开停车场 3离开过道”。若输入1(停车),并且输入当前车牌号和当前的时间后,若停车场未满,输出“成功 停入停车场,停车场内有n辆车,过道上有m辆车等候;若停车场满,输出 “停 车场已满,
2、请在过道等候。 若输入2(离开停车场),输入车票号和当前时间,输出“存车总计时间,收费q元, 停车场内有n辆车,过道上有m辆车等候”;如果进停车场和出停车场时间错误,输 出“时间输入有误,请重新输入”;如果停车场没有此车,输出“车牌号有误,请重新 输入。若输入3(离开过道),输入车牌号,输出“此车已成功离开过道;若无此车,输出 “停车过道为空。若输入其他,则提示选择功能“1。停车 2离开停车场 3离开过道”。3. 程序所能达到的功能:有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出.车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面
3、)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。4. 测试数据:正常的进入停车场,出停车场,离开过道的模拟输入11(车牌)1(当前时间)输入 12(车牌)2(当前时间)输入22(车牌)3(当前时间)输入13(车牌)4(当前时间)输入
4、14(车牌)5(当前时间)输入34(车牌)停车场里没有车出停车场的模拟输入21(车牌)过道没车出过道的模拟输入31(车牌)进入停车场时间与出停车场时间的模拟输入11(车牌)1(进停车场的时间)输入21(车牌)0(出停车场的时间)停车场模拟系统功能输入错误输入4二。概要设计抽象数据类型:由于该停车场只有一个门供出入,并且最先进的停在停车场的最末,最先进的车辆要出停车场需要之后进入的车先出,满足先进后出的结构,其限制是仅允许在表的一端进行插入和删除运算,所以用栈来模拟停车场.由于这是一个模拟的车库,车辆出停车场,后面车辆不得不被动跟着出停车场,我们需要对这些车辆进行管理,将第一辆被动出停车场的放置
5、到一个队伍的前端,接下来被动出停车场的车辆依次放到第一辆车之后,当需要离开的车出栈后,对被动出停车场的车辆进行管理,又队伍的前端依次进入停车场,由于满足只允许在表的前端进行删除操作,而在表的后端进行插入操作,所以用队列来模拟被动出停车场车辆的管理。基本思想1。给定一个size为停车场的容量.2.每一辆车进栈前,储存车辆编号和进栈的时间。3。对于栈满的情况,再来的车辆不进栈,只记录编号。4.对于出栈的车辆,先将出栈车辆之前的停车场内车辆由后往前依次进入队列中,将进栈和出栈时间相比较算出需要付的金额,之后再将队列中的元素由前往后依次进栈.程序的流程程序由三个模块组成:输入模块:按照提示输入计算模块
6、:计算(出栈时间进栈时间)每小时金额。输出模块:首先提示 请选择:1、停车;2、离开停车场;3、离开过道;” 选择1.2提示 ”请输入车牌号和现在的时间:” 选择3提示“请输入车牌号”基本ADT栈空判别算法int Empty_SeqStack(queue *s) if (stop = -1)return 0;elsereturn 1;入栈算法void Push_SeqStack(queue s, Datatype x) s-top+;sdata1stop = x;return;出栈算法void Pop_SeqStack(queue *s, Datatype *x) *x = sdata1sto
7、p;s-top-;return;列队初始化C_SeQueue *Init_SeQueue() C_SeQueue *q;q = new C_SeQueue;qfront = qrear = MAXSIZE - 1;qnum = 0;return q;入队算法void In_SeQueue(C_SeQueue q, Datatype x) q-rear = (qrear + 1) MAXSIZE;qdata2qrear = x;qnum+;return;出队算法void Out_SeQueue(C_SeQueue q, Datatype x)qfront = (qfront + 1) MAXSI
8、ZE;x = qdata2q-front;qnum-;return;算法流程图(进入车库和出车库)三 详细设计1. 数据类型用Int型整数储存车辆的信息。车辆进出时间。收取的费用2.算法的具体步骤车进入停车场的基本操作void Arrive(queue s, C_SeQueue q, int x, double t) int y;int a = stop;while (a != 1) /判断将要存的车是否已存在于停车场,防止出现有相同车牌号的车出现在停车场内;if (sdata1a = x)cout 此车已存在停车场内!” endl;return;elsea-;if (Push_SeqStac
9、k1(s, x, t))cout 此车已成功存入停车场。 endl;elsecout top = x) while (i)if (t = 1 & t s-timestop)d = t stimestop;Pop_SeqStack(s, y);cout 存车时间总计:” d ”小时 endl 收费为: d 元 endl;i = 0;elsecout 时间输入有误,请重新输入。” t;elsecout num != 0 & stop != MINSIZE - 1)Out_SeQueue(q, &y);Push_SeqStack1(s, y, t);show(s, q);return;离开过道的基本
10、操作void Leave1(queue s, C_SeQueue *q, int x) if (qnum = 0)cout ”停车过道为空。 front)a-;if (qdata2(a + MAXSIZE) MAXSIZE = x)while ((a + MAXSIZE) % MAXSIZE != q-rear 1)qdata2a = qdata2a + 1;a+;qnum;cout 此车已成功离开过道。” endl;elsecout ”此车不在过道中。” usingnamespace std;#defineMAXSIZE 10#defineMINSIZE 2typedefintDatatyp
11、e;typedefstructDatatype data1MINSIZE;int top;double timeMINSIZE;queue;queue Init_SeqStack() /栈的初始化;queue s;s = newqueue;if (!s)cout 空间不足” top+;sdata1s-top = x;return;int Push_SeqStack1(queue s, Datatypex, doublet) /入栈算法1;if (stop = MINSIZE 1)return 0;elsestop+;s-data1stop = x;s-timestop = t;return 1
12、;void Pop_SeqStack(queue s, Datatype x) /出栈算法;x = sdata1stop;stop;return;typedefstructDatatype data2MAXSIZE;int rear, front;int num;C_SeQueue;C_SeQueue *Init_SeQueue() /列队初始化;C_SeQueue *q;q = newC_SeQueue;q-front = qrear = MAXSIZE 1;qnum = 0;return q;void In_SeQueue(C_SeQueue *q, Datatypex) /入队算法;qr
13、ear = (q-rear + 1) MAXSIZE;qdata2q-rear = x;q-num+;return;void Out_SeQueue(C_SeQueue q, Datatype x)/出队算法;qfront = (qfront + 1) MAXSIZE;x = qdata2q-front;qnum-;return;void show(queue s, C_SeQueue q) /显示停车情况;cout ”停车场内有” s-top + 1 ”辆车。” endl;cout ”通道上有” q-num ”辆车在等候。” top;while (a != 1) /判断将要存的车是否已存在于
14、停车场,防止出现有相同车牌号的车出现在停车场内;if (sdata1a = x)cout 成功停入车场 endl;return;elsea-;if (Push_SeqStack1(s, x, t)cout ”成功停入车场。 data1s-top = x) while (i)if (t = 1 & t top)d = t - stimestop;Pop_SeqStack(s, y);cout 存车时间总计: d ”小时” endl ”收费为:” d ”元” endl;i = 0;elsecout ”时间输入有误,请重新输入。” t;elsecout num != 0 stop != MINSIZ
15、E - 1)Out_SeQueue(q, &y);Push_SeqStack1(s, y, t);show(s, q);return;void Leave1(queue *s, C_SeQueue *q, intx) /离开过道;if (qnum = 0)cout 停车过道为空. rear;while (qdata2a != x & (a + MAXSIZE) % MAXSIZE != qfront) a;if (qdata2(a + MAXSIZE) MAXSIZE = x)while (a + MAXSIZE) MAXSIZE != qrear 1)qdata2a = qdata2a +
16、1;a+;q-num-;cout ”此车已成功离开过道.” endl;elsecout ”此车不在过道中。” endl;show(s, q);void main()double time;int x, a;queue *s;C_SeQueue *q;s = Init_SeqStack();q = Init_SeQueue();while (1)cout a;switch (a)case 1: cout ”请输入车牌号和现在的时间:” x time; Arrive(s, q, x, time);break;case 2: cout 请输入车牌号和现在的时间:” x time; Leave(s, q, x, time);break;case 3: cout 请输入车牌号:” x; Leave1(s, q, x); cout endl;break;case 0:return;