停车场实验报告_第1页
停车场实验报告_第2页
停车场实验报告_第3页
停车场实验报告_第4页
停车场实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构实验报告实验二 停车厂模拟管理程序的设计与实现本实验的目的是进一步理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。一、【问题描述】设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该车辆开出大门,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走,试设计这样一个停车厂模拟管理程序。为了以下描述的方便,停车厂的停车场用“停车位”进行叙述,停车厂的便道用“便道”进行叙述。二、【数据结构设计】1、为了便于区分每辆汽车并了解每辆车当前所处的位置,需要记录汽车的牌照号码和汽车的当前状态,所以为汽车定义一个新的类型CAR,具体定义如下:typedef structchar *license_plate; /汽车牌照号码,定义为一个字符指针类型char state; /汽车当前状态,字符s表示停放在停车位上,/字符p表示停放在便道上,每辆车的初始状态用字符i来进行表示2、由于车位是一个狭长的通道,所以不允许两辆车同时出入停车位,当有车到来要进入停车位的时候也要顺次停放,当某辆车要离开时,比它后到的车要先暂时离开停车位,而且越后到的车就越先离开停车位,显然这和栈的“后进先出”特点相吻合,所以可以使用一个栈来描述停车位。由于停车位只能停放有限的几辆车,而且为了便于停车厂的管理,为每个车位要分配一个固定的编号,不妨设为1、2、3、4、5(可利用数组的下标),分别表示停车位的1车位、2车位、3车位、4车位。5车位,针对这种情况使用一个顺序栈比较方便,具体定义如下:#define MAX_STOP 5typedef structCAR STOPMAX_STOP; /各汽车信息的存储空间int top; /用来指示栈顶位置的静态指针STOPPING;3、当停车场的停车位上都已经停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的先后顺序顺次存放在便道上,为便道上的每个位置也分配一个固定的编号,当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位,由于问题描述中限制了便道上的汽车不能从便道上开走,即便道上的汽车只有在停车位上停放过之后才能离开停车厂,这样越早进入便道的汽车就越早进入停车位,而且每次进入停车位的汽车都是处于便道“最前面”的汽车,显然,这和队列的先进先出特点相吻合,所以,这里使用一个顺序队来描述便道,可以利用数组的下标表示便道的位置,具体定义如下:#define MAX_PAVE 100 /*便道不限制停放车辆的数目,设为足够大*/typedef structCAR PAVEMAX_PAVE; /各汽车信息的存储空间int front,rear; /用来指示队头和队尾位置的静态指针PAVEMENT;4、当某辆车要离开停车厂的时候,比它后进停车位的车要为它让路,而且当它开走之后让路的车还要按照原来的停放次序再次进入停车位的某个车位上,为了完成这项功能,再定义一个辅助栈,停车位中让路的车依次“压入”辅助栈,待提出开走请求的车开走后再从辅助栈的栈顶依次“弹出”到停车位中。对辅助栈也采用顺序栈,具体定义与停车位栈类似,如下:typedef structCAR BUFFERMAX_STOP; /各汽车信息的存储空间int top; /用来指示栈顶位置的静态指针BUFFER;当然,辅助栈直接利用在2中定义的类型STOPPING也是可以的。由于程序的各函数要对这些数据结构中的数据进行操作,而且每次操作的结果都要动态反应到以上数据结构中,所以在程序设计的时候使用以上新类型定义的变量都采用全局变量的形式。三、【功能(函数)设计】1、本程序从总体上分为四个大的功能模块:分别为:程序功能介绍和操作提示模块、汽车进入停车厂车位的管理模块、汽车离开停车厂车位的管理模块、查看停车厂停车状态的查询模块,具体功能描述如下:1)程序功能介绍和操作提示模块:此模块给出程序欢迎信息,介绍本程序的功能,并给出程序功能所对应的键盘操作的提示,具体屏幕显示如下所示:函数原型为void welcome( );2)汽车进入停车厂车位的管理模块:此模块用来登记停车厂的汽车的车牌号和对该车的调度过程并修改该车的状态,其中调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度。例如,当前停车位上1、2、3车位分别停放着牌照为JF001、JF002、JF003的汽车,便道上无汽车,当牌照为JF004的汽车到来后屏幕应给出如下提示信息:函数原型为void come( );此函数还要调用其他对于栈和队列的基本操作。3)汽车离开停车厂停车位的管理模块:此模块用来为提出离开停车厂的车辆做调度处理,并修改相关车辆的状态,其中调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度,当有车离开停车厂后应该立刻检查便道上是否有车,如果有车的话立即让便道上的第一辆汽车停入停车位。例如,当前停车位上1,2,3,4,5车位分别停放着牌照为JF001、JF002、JF003、JF004、JF005的汽车,便道上的1,2位置分别停放着牌照为JF006、JF007、JF008的汽车,当接收到JF003要离开的信息时,屏幕应给出如下提示信息:函数原型为void leave( );此函数还要调用其他对于栈和队列的基本操作。4)查看停车厂停车状态的查询模块:此模块用来在屏幕上显示停车位和便道上各位置的状态,例如,当前停车位上1,2,3,4,5车位分别停放着牌照为JF001、JF002、JF003、JF004、JF005的汽车,便道上的1,2位置分别停放着牌照为JF006、JF007的汽车,当接受到查看指令后,屏幕上应显示:函数原型为void display( );此函数还要调用其他对于栈和队列的基本操作。2、以上四个总体功能模块要用到的栈和队列的基本操作所对应的主要函数如下表所示:函数原型函数功能STOPPING *init_stopping( )初始化“停车位栈”BUFFER *init_buff( )初始化“辅助栈”PAVEMENT *init_pavement( )初始化“便道队列”Int car_come(int pos)将pos指定的汽车信息插入“停车位栈”,并修改该车状态。Int car_leave(int pos)将pos指定的汽车信息从“停车位栈”删除,并修改该车状态。Int stop_to_buff(int pos)将pos指定的汽车信息从“停车位栈”移动到“辅助栈”。Int buff_to_stop(int pos)将pos指定的汽车信息从“辅助栈”移动到“停车位栈”。Int pave_to_stop(int pos)将pos指定的汽车信息从“便道队列”移动到“停车位栈”Int car_disp(int pos)将pos指定的汽车信息显示在屏幕上。其他函数的定义和说明请参照源代码。3、由于程序应该能够随时处理用户所提出的各种操作请求,所以在主函数中用一个DO_WHILE循环结构随时监控键盘的按键操作,遇到相应的按键就转到对应函数继续运行,运行完该函数继续监控键盘按键,如此往复,直到接到“退出”指令程序才能结束。部分编码如下:dowelcome();cinkey;if(key=C|key=c)come();else if(key=L|key=l)leave();check();else if(key=S|key=s)display();else welcome();while(key!=Q)&(key!=q);四、【界面设计】本程序的界面力求简洁、友好,每一步需要用户操作的提示以及每一次用户操作产生的调度结果都以中文的形式显示在屏幕上,使用户对要做什么和已经做了什么一目了然。文字表述精练,准确。具体设计可参阅功能设计中的相关部分,这里就不再赘述。五、【编码实现】略。详见具体源代码。六、【运行与测试】对于测试用例的设计注重所定义的数据结构的边界以及各种数据结构共存的可能性。例如:1、连续有7辆车到来,牌照号分别为JF001、JF002、JF003、JF004、JF005、JF006、JF007,前5辆车应该进入停车位15车位,第6、7辆车应停入便道的1、2位置上。2、1中的情况发生后,让牌照号为JF003的汽车从停车厂开走,应显示JF005、JF004的让路动作和JF006从便道到停车位上的动作。3、随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。4、其他正常操作的一般情况。5、程序容错性的测试,当按键输入错误的时候是否有错误提示给用户指导用户正确操作,并作出相应处理保证程序健康的运行。经过反复的运行和测试,程序的容错性能良好,界面简洁友好,运行稳定可靠,符合实际操作规范,基本达到了模拟停车厂管理的要求。七、【实验完成后的思考】1、通过本程序熟练掌握了栈和队列的定义和使用方法,对使用C语言编码来验证数据结构的理论知识有了更深层次的理解,达到了实验目的。2、通过在设计过程中的讨论和思考,对使用现有知识利用计算机来解决现实生活中的实际问题确立了信心,对软件工程思想和模块化程序思想有了比较清晰的理解,为今后的程序设计奠定了一定的心理和技术上的准备。3、由于时间仓促和个人能力有限,程序中还有一些需要完善的地方,例如:对停放到停车厂的汽车按时间的收费管理,程序界面可以使用图形方式使之更美观,使用鼠标或菜单方式使之能够适应更多人的使用习惯。在今后的实验中要多多练习这方面的能力。 实验人:实验完成日期:2011年10月20日 实验报告提交日期:2011年10月26日附 程序代码:/ test.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#define MAX_STOP 5#define MAX_PAVE 100using namespace std;typedef structstring license_plate; /汽车牌照号码,定义为一个字符指针类型char state; /汽车当前状态,字符s表示停放在停车位上,/字符p表示停放在便道上,每辆车的初始状态用字符i来进行表示CAR;typedef structCAR STOPMAX_STOP; /各汽车信息的存储空间int top; /用来指示栈顶位置的静态指针STOPPING;typedef structCAR PAVEMAX_PAVE; /各汽车信息的存储空间int front,rear; /用来指示队头和队尾位置的静态指针PAVEMENT;typedef structCAR BUFFERMAX_STOP; /各汽车信息的存储空间int top; /用来指示栈顶位置的静态指针BUFFER;STOPPING *s;BUFFER *b;PAVEMENT *p;void welcome( )cout 欢迎使用停车场管理系统endl 有车到来时请按c 键endl 有车要走时请按l 键endl 显示停车场状态请按s 键endl 要退出程序请按q 键endl 请选择您要做的操作top=-1;return s;int push_stopping(CAR car)if(s-top=MAX_STOP-1)return 0;elses-top+;s-STOPs-top=car;return 1;int pop_stopping(CAR *car)if(s-top=-1)return 0;else*car=s-STOPs-top;s-top-;return 1;BUFFER *init_buff( ) /初始化“辅助栈”b=new BUFFER;b-top=-1;return b;int push_buff(CAR car)if(b-top=MAX_STOP-1)return 0;elseb-top+;b-BUFFERb-top=car;return 1;int pop_buff(CAR *car)if(b-top=-1)return 0;else*car=b-BUFFERb-top;b-top-;return 1;PAVEMENT *init_pavement( ) /初始化“便道队列”p=new PAVEMENT;p-front=p-rear=MAX_PAVE-1;return p;int In_pavement(CAR car)if(p-rear+1)%MAX_PAVE=p-front)return 0;elsep-rear=(p-rear+1)%MAX_PAVE;p-PAVEp-rear=car;return 1;int Out_pavement(CAR *car)if(p-rear%MAX_PAVE=p-front)return 0;elsep-front=(p-front+1)%MAX_PAVE;*car=p-PAVEp-front;return 1;int car_come(CAR car) /将pos指定的汽车信息插入“停车位栈”,并修改该车状态car.state=s;return push_stopping(car);int car_leave() /将pos指定的汽车信息从“停车位栈”删除,并修改该车状态CAR *car=new CAR();int a=pop_stopping(car);coutlicense_plate离开了了停车场state=i;return a;int stop_to_buff() /将pos指定的汽车信息从“停车位栈”移动到“辅助栈”CAR *car=new CAR();if(pop_stopping(car)if(push_buff(*car)coutlicense_plate由停车场进入了辅助endl;return 1;elsereturn 0;elsereturn 0;int buff_to_stop() /将pos指定的汽车信息从“辅助栈”移动到“停车位栈”CAR *car=new CAR();if(pop_buff(car)if(push_stopping(*car)coutlicense_plate由辅助进入了停车场endl;return 1;elsereturn 0;elsereturn 0;int pave_to_stop() /将pos指定的汽车信息从“便道队列”移动到“停车位栈”CAR *car=new CAR();if(Out_pavement(car)if(push_stopping(*car)coutlicense_plate由便道进入了停车场endl;return 1;elsereturn 0;elsereturn 0;int come()CA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论