停车场模拟实验报告.doc

上传人:jian****018 文档编号:7973086 上传时间:2020-03-26 格式:DOC 页数:16 大小:213.50KB
返回 下载 相关 举报
停车场模拟实验报告.doc_第1页
第1页 / 共16页
停车场模拟实验报告.doc_第2页
第2页 / 共16页
停车场模拟实验报告.doc_第3页
第3页 / 共16页
点击查看更多>>
资源描述
数学与计算机学院 数据结构 实验报告年级 大二 学号* 姓名 * 成绩 专业 电气信息类(计算机) 实验地点 主楼402 指导教师 实验项目 停车场模拟管理程序的设计与实现 实验日期 2010年10月21日 一、实验目的和要求通过实验进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。二、问题描述设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。三、数据结构设计、 为了便于区分每辆汽车并了解每辆汽车当前所处的位置,需要记录汽车的牌照号码和汽车的当前状态,所以为汽车定义一个新的类型car,具体定义如下:struct car/汽车信息类string license_plate;/汽车牌照号码char state;/汽车当前状态,字符s表示停放在停车位上,/字符p表示停放在便道上,每辆车的初始状态用字符i表示;、由于车位是一个狭长的通道,所以不允许两辆车同时出入停车场,当有车来到要进入停车位时也要顺序停放,当某辆车要离开时,比它后到的车要先暂时离开停车位,而且越后到的车就越先离开停车位,显然,这和栈的“后进先出”特点相吻合,所以可以用一个栈来描述停车位。由于停车塑钢只能停放有限的几辆车,而且为了便于停车场的管理,要为每个车位分配一个固定的编号,不妨设为、和(此程序利用数组下标实现),分别表示停车位的车位、车位、车位、车位和车位,针对这种情况使用一个顺序栈比较方便,具体定义如下:struct stopping /停车位栈car stopMAX_STOP;/各汽车信息存储空间int top;/用来指示栈顶位置的静态指针;、 当停车场的车位上都已经停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的先后顺序顺次存放在便道上,为便道上的每个车位也分配一个固定的编号,当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位,由于问题限制了汽车不能从便道上开走,即便道上的汽车只有在停车位上停放过之后才能离开停车场,这样越早进入便道的汽车就越早进入停车位,而且每次进入停车位的汽车都是处于便道“最前面”的汽车,显然,这和队列的“先进先出”的特点相吻合,所以,用一个顺序队来描述便道,用数组的下标表示便道的位置,具体定义如下:struct pavement /便道队car paveMAX_PAVE;/各汽车信息存储空间int front,rear;/用来指示队头和队尾的静态指针;、 当某汽车离开停车场时,比它后来的汽车要为它让路,而且当它开走之后让路的车还要按照原来的停放次序再次进入停车位,为了完成这项功能,再定义一个辅助栈,停车位中让路的车依次“压入”辅助栈,待提出开走请求的车开走后再从辅助栈中依次“弹出”到停车位中。对辅助栈也采用顺序栈,具体定义与停车位栈类似,如下:struct buffer/辅助栈car buffMAX_STOP;/各汽车信息存储空间int top;/用来指示栈顶位置的静态指针;由于程序的各函数要对这些数据结构中的数据进行操作,而且每次操作的结果都要动态地反应到以上数据结构中,所以在程序设计时以上新类型定义的变量都采用全局变量的形式。四、功能设计、本程序从总体上分为四个大的功能模块,分别为程序功能介绍和操作提示模块、汽车进入停车位的管理模块、汽车离开停车位的管理模块和查询停车场停车状态的查询模块。具体功能描述如下:()程序功能介绍和操作提示模块此模块给出程序欢迎信息,介绍本程序的功能,并给出具体功能所对应的键盘操作提示。函数原型为void welcome();() 汽车进入停车位的管理模块此模块用来登记停车场的汽车的车牌号和对该车的调度过程并修改该车的状态,其中调度过程以屏幕信息的形式反馈给用户来指导用户对车辆的调度。函数原型为void come();() 汽车离开停车位的管理模块此模块用来为提出离开停车场的车辆做调度处理,并修改相关车辆的状态,其中调度过程以屏幕信息的形式反馈给用户来指导用户对车辆进行调度,当有车离开停车场后应立即检查便道上是否有车,如果有车的话立即让便道上的第一辆车进入停车位。函数原型为void leave();() 查看停车场停车状态的查询模块此模块用来显示停车位和便道上的停车状态。函数原型为void disply();、由于程序应该能够随时处理用户提出的各种操作请求,所以在主函数中用一个循环结构随时监控键盘的按键操作,遇到相应的按键就转到对应函数继续运行,如此往复,直到接到退出的指令才能结束程序。五、测试数据(1)连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、JF005、JF006、JF007,前5辆车应该进入停车位15车位,第6、7辆车应停入便道的1、2位置上。(2) (1)中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF00的让路动作和JF006从便道到停车位上的动作。(3)随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。(3) 程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。输入的指令有误:进入停车场时,输入的车牌号码已经在停车场中:离开停车场时,输入的车牌号不在停车场中:经过反复运行和测试,程序的容错性能良好,界面简洁友好,运行稳定可靠,符合实际操作规范,基本上达到了模拟停车场管理的要求。六、实验完成后的思考、 通过本程序的设计训练掌握了栈和队列的定义和使用方法,对使用C+语言编码来验证数据结构的理论知识有了更深层次的理解,达到了实验目的。、 通过在设计过程在的思考,对使用现有知识来利用计算机来解决实际问题确立了信心,为今后的程序设计奠定了一定的心理上和技术上的准备。、 由于时间仓促和个人能力有限,程序中还有一些需要完善的地方,例如,对停放到停车场的汽车按时间进行收费管理,程序界面可以使用图形方式使之更美观等。今后,还要多练习,增强自己的能力。7、 程序代码#include stdafx.h#include #includeusing namespace std;const int MAX_STOP=5;const int MAX_PAVE=100;struct car/汽车信息类string license_plate;/汽车牌照号码char state;/汽车当前状态,字符s表示停放在停车位上,/字符p表示停放在便道上,每辆车的初始状态用字符i表示;struct stopping /停车位栈car stopMAX_STOP;/各汽车信息存储空间int top;/用来指示栈顶位置的静态指针;struct pavement /便道队car paveMAX_PAVE;/各汽车信息存储空间int front,rear;/用来指示队头和队尾的静态指针;struct buffer/辅助栈car buffMAX_STOP;int top;static stopping *stopping1;static pavement *pavement1;static buffer *buffer1; /初始化“停车位”栈stopping *init_stopping()stopping *s;s=new stopping;for(int i=0;istopi.state=i;s-top=-1;return s;/初始化“便道队”pavement *init_pavement()pavement *q;q=new pavement;q-front=0;q-rear=-1;for(int i=0;ipavei.state=i; return q;/初始化“辅助栈”buffer *init_buffer()buffer *s;s=new buffer;for(int i=0;ibuffi.state=i;s-top=-1;return s;/程序功能介绍和提示void welcome()cout欢迎使用本程序endl;cout本程序为停车场的模拟管理程序,有车来到时请按C键。endl;cout然后根据屏幕提示进行相关操作,有车要走时请按L键。endl;cout然后根据屏幕提示进行相关操作,查询停车场信息请按D键。endl;cout然后根据屏幕提示进行相关操作,退出程序请按Q键。endl;cout选择功能后请按Enter键继续程序的运行。endl;coutn请选择功能:endl;void reminder()/功能菜单cout请选择功能,选择功能后按Enter键继续:endl;coutC-汽车进入停车场endl;coutL-汽车离开停车场endl;coutD-显示停车场信息endl;coutQ-退出程序top;i=0;i-)if(s-stopi.license_plate=licen)return 0;/有相同车牌号的车return 1;/无相同车牌号的车void come()string license;cout请输入您的汽车牌照号码:license;for(int i=stopping1-top;i=0;i-)while(!check(stopping1,license)cout停车场中已停有车牌号为license的汽车,请检查您输入的号码是否正确。endl;cout请重新输入车牌号码:license;if(stopping1-toptop+;stopping1-stopstopping1-top.license_plate=license;stopping1-stopstopping1-top.state=s;cout车牌号为license的汽车进入停车位的第top+1号车位;nrear+;pavement1-pavepavement1-rear.license_plate=license;pavement1-pavepavement1-rear.state=p;cout车牌号为license的汽车暂时进入便道。nendl;/汽车离开停车场的管理模块void leave()string license;cout请输入您的车牌号码:license;if(check(stopping1,license)cout车牌号为license的汽车不在停车场内,请检查您输入的车牌号是否正确!ttop;i=0;i-)if(stopping1-stopi.license_plate=license)if(i=stopping1-top)/如果是停车位最外面的车离开,直接离开cout车牌号码为license的汽车离开停车场。ntop-;if(!(pavement1-front-pavement1-rear=1)/若便道上有车停放,则让最先进入便道的车进入停车场cout车牌号为pavepavement1-front.license_plate的汽车进入停车场;ntop+;stopping1-stopstopping1-top.license_plate=pavement1-pavepavement1-front.license_plate;stopping1-stopstopping1-top.state=s;pavement1-front+;break;else/若是停车位上里边的车离开,先让外面的车让路while(stopping1-topi)cout车牌号为stopstopping1-top.license_plate的汽车暂时退出停车位;top+;buffer1-buffbuffer1-top.license_plate=stopping1-stopstopping1-top.license_plate;stopping1-top-;coutendl;cout车牌号为stopstopping1-top.license_plate的汽车离开停车场;ntop-;while(buffer1-top-1)/让路的车重新回到停车位cout车牌号为buffbuffer1-top.license_plate的汽车重新回到停车位;top+;stopping1-stopstopping1-top.license_plate=buffer1-buffbuffer1-top.license_plate;buffer1-top-;coutfront-pavement1-rear=1)/若便道上有车停放,则让最先进入便道的车进入停车场cout车牌号为pavepavement1-front.license_plate的汽车进入停车场;top+;stopping1-stopstopping1-top.license_plate=pavement1-pavepavement1-front.license_plate;stopping1-stopstopping1-top.state=s;pavement1-front+;coutendl;break;/查看停车场停车状态的查询模块void display()coutn停车位的情况:top=-1)cout停车位无汽车停放!endl;elsefor(int i=0;itop;i+)couti+1车位stopi.license_plateendl;coutn便道上的情况:front-pavement1-rear=1)cout便道上无汽车停放!front;irear;i+)coutj位置pavei.license_plateendl;j+;coutkey;doswitch(key)case C:/进入停车场come();reminder();cinkey;break;case L:/离开停车场leave();reminder();cinkey;break;case D:/显示停车场信息display();reminder();cinkey;break;case Q:/退出停车场break;default:cout您输入的指令有误,请重新输入!key;break;while(key!=Q);display();return 0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!