停车场模拟管理程序的设计与实现一、问题描述:设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆再按原次序进入车场。在这里假设汽车不能从便道上开走。二、数据结构设计1、为了便于区分每辆汽车,需要记录汽车的车牌号码,所以为汽车定义一个新的类型CAR,具体定义如下:typedefstruct{charlicense_plate[9];//汽车牌照号码,定义为一个字符串型}CAR;2、由于车位是一个狭长的通道,所以不允许两辆车同时出入停车位,当有车到来要进入停车位时也要顺次停放,当某辆车要离开时,比它后到的车要先暂时离开停车位,而且越后到的车越先离开停车位,显然这和栈的“后进先出”特点相吻合,所以可以使用一个栈来描述停车位。由于停车位只能停放有限的几辆车,而且为了便于停车场的管理,要为每个车位分配一个固定的编号,不妨设为0,1,2,3和4(可利用数组下标),分别表示停车位的0车位,1车位,2车位,3车位和4车位,针对这种情况使用一个顺序栈比较方便,具体定义如下:typedefstruct{CARSTOP[MAX_STOP];//各汽车信息的存储空间inttop;//用来指示栈顶位置的静态指针}STOPPING;3、当停车场的停车位上都已经停满了汽车,又有新的汽车到来时要把它调度到便道上,便到上的车辆要按照进入便道的先后顺序顺次存放在便道上,为便道上的每个位置也分配一个固定的编号,当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位,由于问题描述中限制了便道上的汽车不能从便道上开走,即便道上的汽车只有在停车位上停放过后才能离开停车场,这样越早进人便道的汽车就越早进人停车位,而且每次进入停车位的汽车都是处于便道“最前面”的汽车,显然,这和队列的“先进先出”特点相吻合,所以,这里使用一个顺序队来描述便道,可以利用数组的下标表示便道的位置,具体定义如下:#defineMAX_PAVE100//便道不限制停放车辆的数目,设为足够大typedefstruct{CARPAVE[MAX_PAVE];//各汽车信息的存储空间intfront,rear;//用来指示对头和队尾位置的静态指针intnum;}PAVEMENT;4、当某辆车要离开停车场的时候,比它后进停车位的车要为它让路,而且当它开走之后让路的车辆还要按照原来的停放次序再次进入停车位的某个位置上,为了完成这项功能,再定义一个辅助栈,停车位中让路的车依次“压入”辅助栈,待提出开走请求的车开走后,再从辅助栈的栈顶依次“弹出”到停车位中。对辅助栈也采用顺序栈,具体定义与停车栈类似,如下:typedefstruct{CARBUFFER[MAX_STOP];//各汽车信息的存储空间inttop;//用来指示栈顶位置的静态指针}BUFFER;三、功能函数设计本程序从总体上分为4个大的功能模块,分别为程序功能介绍和操作提示模块,汽车进入车位的管理模块,汽车离开停车位的管理模块和查看停车场停车状态的查询模块。具体功能描述如下:1、程序功能介绍和操作提示模块:此模块给出程序的功能,并给出程序功能所对应的键盘操作的提示,具体屏幕显示如下所示:☆☆☆☆☆☆☆☆☆欢迎使用本程序☆☆☆☆☆☆☆☆☆☆☆☆本程序为停车场的模拟管理程序,有车到来时请按【C】键。然后根据屏幕提示进行相关操作,有车要走时请按【L】键。然后根据屏幕提示进行相关操作,显示停车情况请按【D】键。然后根据屏幕提示进行相关操作,要退出程序请按【Q】键。请选择您要做的操作!函数原型为:voidwelcome(){cout☆☆☆☆☆☆☆☆☆欢迎使用本程序☆☆☆☆☆☆☆☆☆☆☆☆endl;coutendl;cout本程序为停车场的模拟管理程序,有车到来时请按【C】键。endl;cout然后根据屏幕提示进行相关操作,有车要走时请按【L】键。endl;cout然后根据屏幕提示进行相关操作,显示停车情况请按【D】键。endl;cout然后根据屏幕提示进行相关操作,要退出程序请按【Q】键。endl;cout请选择您要做的操作!endl;}2、汽车进入停车位的管理模块:此模块用来登记停车场的汽车车牌号和对该车的调度。其中,调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆进行调度。例如,调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度。例如,当期车位上0、1、2、3车位分别停放着牌照为JF001、JF002、JF003、JF004的汽车,便道上无汽车,当牌照为JF005的汽车到来后屏幕应给出如下提示信息:牌照为JF005的汽车停入停车位的5号车位!按A键继续程序的运行。函数原型为:voidcome(STOPPING*s,BUFFER*l,PAVEMENT*q){CARx;charb[9];cout欢迎停车,请输入车牌号(最多位):;cinb;for(inti=0;i9;i++)x.license_plate[i]=b[i];//将车辆车牌号存入类型CAR的x.license_plate中if(s-top==MAX_STOP-1){cout车位已满,请进入便道上等候!endl;q-rear=(q-rear+1)%MAX_PAVE;//若停车场内车位已满,将车辆信息存入队列中q-PAVE[q-rear]=x;q-num++;}else{s-top++;s-STOP[s-top]=x;//若停车场内车位未满,将车辆信息存入栈中cout牌照为s-STOP[s-top].license_plate的汽车停入停车位的s-top号车位!endl;}cout按A键继续进行程序endl;}3、汽车离开停车场车位的车辆做调度处理。其中调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度,当有车辆离开停车场后应该立刻检查便道上是否有车,如果有,则立即让便道上的第一辆汽车进入停车位。例如,当前停车位上0、1、2、3、4车位分别停放着牌照为JF001、JF002、JF003、JF004、JF005的汽车,便道上的1和2位置上分别停放着牌照为JF006和JF007的汽车,当接收到JF003要离开的信息时,屏幕应给出如下提示信息:函数原型为:voidleave(STOPPING*s,BUFFER*l,PAVEMENT*q){cout欢迎取车,请输入您的车所停在的车位号:;intn;cinn;while(n0||n4){cout输入错误,请重新输入!;cinn;}if(ns-top){cout无此车!endl;cout按A键继续进行程序endl;return;}if(ns-top){while(n!=s-top){cout牌照为s-STOP[s-top].license_plate的汽车暂时退出停车位!endl;l-top++;l-BUFFER[l-top]=s-STOP[s-top];//将停在要开走的汽车前面的汽车暂时退出停车场,存入临时栈中s-top--;}}if(n==s-top){cout牌照为s-STOP[s-top].license_plate的汽车从停车场开走;endl;//汽车开走s-top--;}while(l-top!=-1){s-top++;s-STOP[s-top]=l-BUFFER[l-top];l-top--;cout牌照为s-STOP[s-top].license_plate的汽车停入停车位的s-top号车位!endl;//将临时栈中的汽车再次存入停车场}while(s-topMAX_STOP-1&&q-num!=0){if(q-num==0)break;else{q-front=(q-front+1)%MAX_PAVE;s-top++;s-STOP[s-top]=q-PAVE[q-front];//停车场未满,便道有车,此时存入停车场q-num--;cout牌照为s-STOP[s-top].license_plate的汽车停入停车位的s-top号车位!endl;}}cout按A键继续程序的运行。endl;}4、查看停车场停车状态的查询模块:此模块用来在屏幕上显示停车位和便道上各位置的状态,例如,当前车位上1、2、3、4和5车位分别停放着牌照为JF001、JF002、JF003、JF004和JF005的汽车,便道上的1和2位置上分别停放着牌照为JF006和JF007的汽车,当接收查看指令后,屏幕上应显示:函数原型为:voiddisplay(STOPPING*s,PAVEMENT*q){inttopp;topp=-1;if(s-top==-1)cout停车场内无车!endl;else{cout停车场内的情况:endl;while(topp!=s-top){topp++;couttopp车位-----s-STOP[topp].license_plateendl;//将停车场栈内的车辆信息输出}if(q-num!=0){cout便道上的情况:endl;intfrontt=q-front;intm=q-num;inti=0;while(m!=0){i++;m--;couti车位-----q-PAVE[frontt+1].license_plateendl;//输出便道上的车辆信息情况frontt++;}}}cout按A键继续程序的运行。endl;}由于程序应该能够随时处理用户所提出的各种操作请求,所以在主函数中用一个while循环结构随时监控键盘的按键操作,遇到相应的按键就转到对应函数继续运行,运行完该函数继续监控键盘按键,如此往复,直到接到“退出”指令程序才能结束。部分代码如下:charm='A';while(m=='A'){welcome();chard;cind;switch(d){case'C':come(s,l,q);break;case'L':leave(s,l,q);break;case'D':display(s,q);break;case'Q':return0;}cinm;四、界面设计本程序的界面力求简洁、友好,每一步需要用户操作的提示以及每一次用户操作产生的调度结果都以中文的形式显示在屏幕上,使用户对要做什么和已经做了什么一目了然。五、编码实现#includestdafx.h#includeiostream#includestring.husingnamespacestd;#defineMAX_STOP5#defineMAX_PAVE100//便道不限制停放车辆的数目,设为足够大typedefstruct{charlicense_plate[9];//汽车牌照号码,定义为一个字符数组类型}CAR;typedefstruct{CARSTOP[MAX_STOP];//各汽车信息的存储空间inttop;//用来指示栈顶位置的静态指针}STOPPING;typedefstruct{CARPAVE[MAX_PAVE];//各汽车信息的存储空间intfront,rear;//用来指示对头和队尾位置的静态指针intnum;}PAVEMENT;typedefstruct{CARBUFFER[MAX_STOP];//各汽车信息的存储空间inttop;//用来指示栈顶位置的静态指针}BUFFER;voidwe