关于停车计费系统的几个问题
2017-09-12 17:04
417 查看
停车厂管理问题
[问题描述]设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
[测试数据]
设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
[基本要求]
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。
[实现提示]
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
实现中遇到的问题:
建立一个基本类Elem存放车的信息(时间和车牌),在栈和数组中设置Elem的元素,存放基本信息。
class类型重定义问题,在排头加入#pragma once即可。
在实现enqueue函数时遇到rear无法正确更改问题,源代码如下:
void enqueue(Elem car) { Qnode p(car.carnum, car.time); rear->next=&p; rear = rear->next; size++; }
后来发现是因为p没有建新结点,在car中输入会改变Q里面rear的值。
将其改为:
void enqueue(Elem E) { rear->next=new Qnode(E.carnum, E.time); rear = rear->next; size++; }
已经实现了车辆的进入。
车辆进出函数如下:
void carin(Queue &Q, Cstack &S, Elem car) { int flag = 0; for (int i = 0; i < S.top; i++)//在停车场中查找是否存在 { if (car.carnum == S.Carnum[i].carnum) { cout << "该车号在停车场中已存在,请重新输入!" << endl; flag = 1; break; } } if (flag == 0 && Q.front != Q.rear) //在停车场中不存在,在便道里查找 { Qnode *temp=Q.front->next; while (temp&&temp->Qelem.carnum!=car.carnum) { temp = temp->next; } while (temp&&temp->Qelem.carnum == car.carnum) { flag = 1; cout << "该车在车道里已存在,请重新输入!" << endl; break; } } if (flag==0) //均不存在,让车进入 { if (S.top == S.maxSize)//车库已满,在便道等待 { Q.enqueue(car); cout << "请在通道"<<Q.lenth()<<"等待" << endl; } else{ //停入车库 S.push(car); cout << "请进入停车场" << S.lenth() << "号车位!" << endl; } } } void leavecar(Queue &Q, Cstack &S, Elem car) { int flag = 0,i=0; Elem t; while (car.carnum != S.Carnum[i].carnum) //在停车场中寻找车辆 { if (i >= S.top) { cout << "在车库里未找到该车" << endl; flag = 1; break; } i++; } if (flag == 1) //未找到该车在便道里寻找 { if (Q.size == 0)flag = 2; Queue *temp = new Queue; while (Q.size != 0 && Q.front->next->Qelem.carnum != car.carnum) { t = Q.dequeue(); temp->enqueue(t); if (Q.size == 0) { cout << "未在车道里找到车辆" << endl; flag = 2; break; } } if (flag == 1) { t = Q.dequeue(); cout << "车在车道里第" << temp->size + 1 << "位,已开出。"<<endl; while (temp->size != 0) { t = temp->dequeue(); Q.enqueue(t); } } } if (flag == 2) { cout << "车辆输入有误。" << endl; } if (flag == 0) { Cstack *temp = new Cstack; int m = S.top -1 ; while (S.Carnum[m].carnum != car.carnum) { t = S.pop(); temp->push(t); m--; } t = S.pop(); if (car.time > t.time) { cout << "尾号为" << car.carnum << "的车已经开出。" << endl; cout << "停车用时:" << car.time - t.time << endl; } else { cout << "输入错误" <<endl; S.push(t); } while (temp->top!=0) { t = temp->pop(); S.push(t); } if (S.top != S.maxSize && Q.size != 0) { t = Q.dequeue(); t.time = car.time;//进入车库后更新时间 S.push(t); cout << "等待车辆" << t.carnum << "开入车库" << endl; } } }
相关文章推荐
- 【软件测试】关于停车系统的若干问题和反思
- 关于软件系统可靠性的几个9问题
- 关于内容管理系统IWMS的几个问题
- 关于用移动硬盘装系统的几个问题
- 一道关于停车计费的问题
- 关于系统时间的几个问题
- 关于CRT连接到虚拟机Linux系统的几个问题。
- 关于系统时间的几个问题
- 关于几个计算机系统的小问题
- 关于实现和完善志愿者管理系统的几个功能的问题
- 关于著作权侵权诉讼中确定损害赔偿数额的几个问题
- [项目总结]关于调用系统照相机Activity被销毁问题解决
- 关于索引使用的几个小问题
- 关于Segmentation fault (core dumped)几个简单问题
- 消息系统NATS常见的几个问题
- 关于Segmentation fault (core dumped)几个简单问题的整理
- linxu 系统下关于多串口平台 串口号不匹配问题
- Android 关于调用系统内已安装的相机问题
- 关于《梦回水浒》的几个问题释疑
- 关于68013的几个问题