下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、停车场管理模拟一 . 需求分析1 .总体要求设停车场是一个可停放N 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停了 n 辆汽车,则后来的汽车只能在门外的通道上等候,一旦有车开走,则排在通道上的第一辆车即可开入;当停车场内每辆车要离开时,在它之后进入的车辆必须先退出停车场为其让路,待该辆车开出大门,其他车辆再按原次序进入停车场。请为停车场编写按上述要求进行管理的模拟程序。2 . 分析1 用栈来表示停车场,用队列来表示停车道。2 用户需输入车辆的必要信息,如车辆的到达或离
2、开,汽车牌号以及到达或离去的时刻。停车场的容量及单位时间的停车费由编程序者自行设置,结构需输出车辆停车所需缴纳的费用。3 本程序要求对车辆的动态能够输出具体的信息内容,包括停车或离开的时间,位置,及所需缴纳的停车费。4 测试数据为: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 表示输入结束。5 . 程序执
3、行的命令为:1. 创建栈和队列。 2. 对车辆的行为进行相应的处理。 3. 输出车辆的信 息。三 概要设计1 、 本程序基本模块( 1 ) 主程序部分:int main()/ 读入文件数据/ 文件读入判断/ 第一次输入数据不需要检测/ 处理车辆到达模块;/ 处理车辆离开模块; 2. 停车场模拟的抽象数据类型定义typedef struct Elem/ 定义车辆数据结构类型int carnum;/ 车牌号int time;/ 停车时刻Elem;typedef structElem *base;Elem *top;int stacksize;/ 栈大小Sqstack;void initStack(
4、Sqstack &S)/ 建一个停车场空栈/ 传入参数: stack 栈结构/ 传出参数:分配有内存空间的栈结构/ 初始化栈int push(Sqstack &S,Elem &e)/ 插入元素/ 输入参数:S 栈结构, e 要入栈的节点/ 完成入栈操作int lengthstack(Sqstack S)/ 求栈的长度/ 返回栈的长度int pop(Sqstack &S,Elem &e)/ 输入参数S 栈结构, e 要出栈的节点/ 完成出栈操作void initqueue(LinkQueue &Q)/ 构造一个车道空队列/ 传入参数Q 要初始化的队
5、列/ 传出参数: Q 带有头结点的队列/ 初始化队列void enqueue(LinkQueue &Q,int carnum,int time)/车道入队操作/ 传入参数: Q 队列, carnumber,time 要入队的数据/ 完成入栈操作int lengthqueue(LinkQueue Q)/ 求车道队列长度/ 返回队的长度void dequeue(LinkQueue &Q,Elem &e)/ 从对头离队操作,并返回其值/ 传入参数:Q 队列结构, e 的节点数据/ 删除队头进场函数void carin(Sqstack &S,LinkQueue &
6、;Q,Elem car)/ 传入参数:S 栈结构, Q 队列结构 ,car 的节点数据int k=0;/ 检测信号,当值为 k=0 时表示栈和队中都找不到该车牌号/ 赋值为栈底/ 在栈中寻找是否有同一编号的车/ 找到了有同一编号的车/ 如果在栈中未找到,在队列中查找/ 队头/ 找不到继续找/ 栈和队列中都找不到相同车牌号,执行入栈操作;/ 栈未满void carleave(Sqstack &S,LinkQueue &Q,Elem car)/车辆退出函数/ 传入参数:S 栈结构, Q 队列结构 ,car 的节点数据/ 在栈中没有找到与要离开的车/ 先在栈中寻找;/ 在栈中找到/
7、备用栈/ 先在栈中寻找;/ 其他车退出停车场暂存在零时栈/ 栈中有车离开,将队列中的车进入栈中/ 离队,并返回数据e/ 栈中没找到要离开的车/ 在队列中找到要离开的车四详细设计1、程序整体流程打开数据文件结束2、程序函数调用关系3、汽车离开,到达流程图车到达一是否有车位.开始车状态车离开车在停车场、,否否是车达到和离时是刻停车场便道进栈进入队列显示车离开和到达的 时间计算停车时间计 算费用过道上的车再离 开的车后面的车 向前以一个车位过道上有车否出队列进栈结束5.源代码#include <fstream>#include <string>#include<iost
8、ream>#define OVERFLOW -2#define ERROR 0#define N 2 /停车场的容量设为2#define price 5/将单位时间的停车费设为5using namespace std;typedef struct Elem定义车辆数据结构类型int carnum;/ 车牌号int time;/ 停车时刻Elem;typedef structElem *base;Elem *top;int stacksize;Sqstack;void initStack(Sqstack &S)/ 建一个停车场空栈 S.base=(Elem*)malloc(N*si
9、zeof(Elem);if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=N;int push(Sqstack &S,Elem &e)/ 插入元素 Elem *temp;if(S.top-S.base=S.stacksize)/ 栈满,退出 return 1; else temp=S.top;temp->carnum=e.carnum;temp->time=e.time;S.top+;return 0; int lengthstack(Sqstack S)/ 求栈的长度return S.top-S.base;int
10、 pop(Sqstack &S,Elem &e) / 若栈不空,则删除S 的栈顶元素,用 E 返回其值,并返回 OK ;否则返回 ERRORif(S.top=S.base)return ERROR;e=*-S.top;return 1;typedef struct QNode/ 定义车道队列struct QNode *next;Elem Qelem;QNode,*QueuePtr;typedef struct/ 队头指针,队尾指针QueuePtr front;QueuePtr rear;LinkQueue;void initqueue(LinkQueue &Q)/ 构造
11、一个车道空队列Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode);if(!Q.front)exit(OVERFLOW);Q.front->next=Q.rear->next=NULL;车道入队操作void enqueue(LinkQueue &Q,int carnum,int time)/QueuePtr p=(QueuePtr)malloc(sizeof(QNode);p->Qelem.carnum=carnum;p->Qelem.time=time;p->next=NULL;Q.rear->next=p;Q
12、.rear=p;int lengthqueue(LinkQueue Q)/ 求车道队列长度int i=0;QueuePtr p;p=Q.front->next;while(p!=Q.rear)i+;p=p->next;i+;return i;void dequeue(LinkQueue &Q,Elem &e)/从对头离队操作,并返回其值QueuePtr p=(QueuePtr)malloc(sizeof(QNode);if(Q.front=Q.rear)cout<<" 车道中没有车辆!"<<endl;if(Q.front!
13、=Q.rear)p=Q.front->next;e=p->Qelem;Q.front->next=p->next;if(Q.rear=p) Q.rear=Q.front;free(p);void carin(Sqstack &S,LinkQueue &Q,Elem car)/进场函数int k=0;/ 检测信号,当值为 k=0 时表示栈和队中都找不到该车牌号QueuePtr r;Elem *temp;temp=S.base;/ 赋值为栈底while(temp!=S.top)if(temp->carnum=car.carnum)/在栈中寻找是否有同一
14、编号的车cout<<" 该车号在停车场中已存在,请重新输入 !"<<endl;k=1;/ 找到了有同一编号的车break;temp+;if(k=0&&Q.front!=Q.rear)/ 如果在栈中未找到,在队列中查找r=Q.front->next; /队头while(r&&r->Qelem.carnum!=car.carnum)r=r->next;/ 找不到继续找if(r&&r->Qelem.carnum=car.carnum)cout<<" 该车号在车道中
15、已存在 ,请重新输入 !"<<endl;k=1;if(k=0)/ 栈和队列中都找不到相同车牌号,执行入栈操作;if(S.top-S.base!=S.stacksize)/ 栈未满, S.top->carnum=car.carnum;S.top->time=car.time;S.top+;cout<<temp->carnum<<" 号车于 "<<car.time<<" 时刻进入停车场"<<lengthstack(S)<<" 号车位! &
16、quot;<<endl;elseenqueue(Q,car.carnum,car.time);/栈满已满,把车安排在车道队列中cout<<" 停 车 场 已 满 , 请 "<<car.carnum<<" 号 车 在 便 车 道 "<<lengthqueue(Q)<<" 稍等! "<<endl;车辆退出函数void carleave(Sqstack &S,LinkQueue &Q,Elem car)/ int ture=0;/ 在栈中没有
17、找到与要离开的车Elem e,em,*temp;QueuePtr p,r;temp=S.base;if(ture=0)while(temp!=S.top)/ 先在栈中寻找;if(temp->carnum=car.carnum) int temp_cost;temp_cost=(car.time-temp->time)*price; ture=1;/ 在栈中找到 cout<<car.carnum<<" 号车在 "<<car.time<<" 时刻离开, 停车时间为 "<<car.time
18、-temp->time<<" 刻钟,应交停车费用为: "<<temp_cost<<endl;break; temp+;if(ture=1) / 备用栈 Sqstack spear; initStack(spear);while(S.top!=temp+1)/ 先在栈中寻找; pop(S,em); push(spear,em); pop(S,*temp);/ 其他车退出停车场暂存在零时栈 if(spear.top!=spear.base) while(spear.top!=spear.base) pop(spear,em); push
19、(S,em); if(ture=1&&Q.front!=Q.rear)/ 栈中有车离开,将队列中的车进入栈中 dequeue(Q,e); / 离队,并返回数据eS.top->carnum=e.carnum; S.top->time=car.time; S.top+; cout<<" 请便道的第一辆车"<<" 牌号为 "<<e.carnum<<" 的车辆转入停车场,停车位置为 "<<lengthstack(S)<<" 号 ,&q
20、uot;<<" 停车时刻为: "<<car.time<<endl; if(ture=0&&Q.front!=Q.rear)/ 栈中没找到要离开的车 p=Q.front; r=Q.front->next; / 队头 while(r&&r->Qelem.carnum!=car.carnum) p=r; r=r->next; if(r&&r->Qelem.carnum=car.carnum)/在队列中找到要离开的车ture=2;cout<<" 便道 &
21、quot;<<r->Qelem.carnum<<" 号车离开 , 不收取费用!"<<endl;p->next=r->next;free(r);/ 直接从队列离开if(ture=0)cout<<" 没有该辆车!"<<endl;int main()char c;int j=0,temp_time,i=1;/i=0 ,判断临时记录时间的 temp_time 应该去该次的值,还是上次的值。 j=0 ,表示第一次输入数据,不需要检测数据是否正确LinkQueue Q;Sqstack S;
22、Elem car;initqueue (Q);initStack(S);ifstream infile;cout<<" 欢迎使用停车场管理系统! "<<endl;cout<<"请稍等!信息正在载入, "<<endl;system("PAUSE");/ 暂停函数,模拟仿真infile.open("aaa.txt"); / 读入文件数据if(infile.fail()/ 文件读入判断 cout<<"input file failed.n"e
23、xit(1);while(infile>>c>>car.carnum>>car.time) if(j=1) if(S.top=S.base)cout<<" 停车场中没有车!"<<endl;elseif(car.time<temp_time&&c!='E')/temp_time还是记录上次的值cout<<" 您输入的时间有误,请重新输入 !"<<endl; i=0;elsetemp_time=car.time;i=1;if(i=1) /
24、 正确的数据if(c='A')/ 到达carin(S,Q,car);else if(c='D') if(S.top=S.base)cout<<" 停车场中没有车!"<<endl;elsecarleave(S,Q,car);j=1;if(j=0)第一次输入数据不需要检测if(c='A')/ 到达carin(S,Q,car);else if(c='D')cout<<"停车场中没有车!"<<endl;j=1;temp_time=car.time;if
25、(c='E')cout<<"输入结束!"<<endl;break;infile.close();return 0;五调试分析1.程序执行调试时,读取文件失败,原因是“ aaa.txt ”文件放错了位置2 .在数据输入检测时,经常出现车号重复报错信息,这时候得考虑这个检测信号放置情况。箪M平时荷为10刻钟,应交停车费由为150一_ a -Jt /Jl. I读费羞道皋正在载人 SBwEJ Cqowm 3 ,eze3 .车道内停车不收费,时间却被一直计入计费时间,这时考虑调用值情况。出时刻离开,车时间为如二! 儒摘嚏断端 !第一辆车牌号为E
26、的车辆理A制批续.爰孥;W为车时刻为 遇镰算停车时刻为,3AT.号4 .本程序循环用的很多,找车,排队,等等六测试结果1.模拟仿真,进入登录界面并载入信息,按任意键进入下一个界面。2.清屏函数去除不必要的信息,显示主要内容:七用户使用说明用户将数据写入aaa.txt的文件中,文件中的数据格式是A 1 5A 2 10D 1 15A 3 20A 4 25A 5 30D 2 35D 4 40其中 A 表示到达, D 表示离去, E 表示输入结束。这种格式,且其中的数据都必须是英文字符,然后执行文件即可。八 . 课程设计总结通过此次实验我深刻了解到数据结构的真正用处,这是一门纯属于设计的科目,它需用把理论变为上机调试。老师会给我们讲了一些设计的思想,顺着老师的思路,来完成自己的设计,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到自己的程序中再加以必要的连接以完成程序的编写。当为停车场编写栈,为车道编写队列遇到了很多自己都不了解的茫点,想了很久,还是想不出改怎么完善,但是程序还是得继续下去,我多次请教了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纸浆厂污水处理规范
- 2026年广西壮族自治区百色市公务员人员招聘考试模拟试题与答案详解
- 2026吉林省省直事业单位公开招聘工作人员48名笔试备考试题及答案解析
- 2026济宁市东方圣地人力资源开发有限公司招聘工作人员笔试模拟试题及答案解析
- 2026年阿里地区公务员人员招聘考试备考题库与答案详解
- 2026年曲靖市马龙区纳章镇人民政府招聘公益性岗位工作人员(2人)考试参考题库及答案解析
- 2026察哈尔高新技术开发区管理委员会公开招聘政府专职消防员18人考试备考题库及答案解析
- 2026年渝中区渝北区公务员人员招聘考试试题与答案详解
- 2026年杭州市下城区公务员人员招聘笔试模拟试题与答案详解
- 2026年10月广州市天河区奥体东小学编外聘用制专任教师招聘1人考试备考试题及答案解析
- 北京安全员C证考试题库及详细答案(完整版)
- 2026-2027学年广东六校高三上学期10月考试语文试卷
- 2026年中储粮质量检验岗位面试常见问题及解答
- 第2课 俄国的改革 课件
- 2026秋新教材苏教版五年级上册数学第七单元 用字母表示数量关系(一) 教案(共7课时)
- 建筑幕墙高空作业方案
- 2026年辅警笔试的题库及答案
- 初中化学九年级《碳单质的多样性》创新教学设计
- 2026年长期照护题测试卷附答案
- 填埋场环境风险管控方案
- 创伤性心搏骤停心肺复苏救治专家共识(2025版)完整版 + 损伤控制操作路径
评论
0/150
提交评论