电梯-校园导航-文件管理.doc_第1页
电梯-校园导航-文件管理.doc_第2页
电梯-校园导航-文件管理.doc_第3页
电梯-校园导航-文件管理.doc_第4页
电梯-校园导航-文件管理.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

数据结构课程设计-电梯,文件目录,校园导航 院系: * 班级: * 姓名: * 学号: * 题号:第二题题目:电梯模拟1、问题描述:模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;电梯加速需要15t;上升时,每一层需要51t,减速需要14t;下降时,每一层需要61t,减速需要23t;如果电梯在某层静止时间超过300t,则驶回1层候命。要求:按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。2、需求分析: 2.1需解决的问题:输出电梯运行过程中的所有动作和进出电梯乘客的信息。 2.2程序功能: 模拟楼层中电梯载客的过程,并将过程描述出来。 2.3 输入输出的形式:每当电梯到达一层楼,输出电梯在这层楼所做的动作,和乘客惊出电梯的信息,并输出当时的系统时间。 2.4乘客已等待时间的计算是计算从乘客呼叫电梯,到乘客能进电梯的时间间隔。3、概要设计: 3.1数据结构设计:(1)、电梯的状态: typedef enumUp,Down,Free StateofElevator; (2)、乘客的结构体: 采用数组存储 typedef struct int FloorofPerson; /乘客所在楼层int GoFloor; /乘客要去楼层int WaitingTime; /乘客的最大容忍等待时间int Direction; /方向int InorOut; /乘客是否已出电梯int Leave; /乘客是否离去int WaitedTime; /乘客已经等待的时间 Person; /乘客的结构体(3) 电梯的结构体: 采用数组存储 typedef struct /*电梯结构体 int Floor; /所在楼层StateofElevator State; /运行方向状态int NumberofPerson; /装载乘客人数 Elevator; /定义电梯的结构体 (4)整栋楼的乘客信息:用Person类型的二维数组存储Person Passenger9N; /全局结构体二维数组保存整栋楼的乘客的相关信息(5) 电梯内乘客信息: 用Person类型的一维数组存储 Person PassengerInElevatorMaxSize; /在电梯中的乘客的相关信息 通过电梯内乘客的信息,和当前楼层电梯外乘客的信息来判断是否有乘客进出电梯和电梯接下来的运行方向,再通过在顶楼和底层电梯方向的唯一改变,使电梯能够正常工作。3.2算法设计:(1) 本设计分成9个模块:模块一:乘客进入电梯的函数:若乘客的方向与电梯方向一致,若电梯内有空位则进电梯,然后改变电梯内的乘客信息和当前楼层乘客信息。输出当前时刻及有几个乘客进入电梯。模块二:乘客出电梯函数:若乘客到达目的地,则出电梯。并将全局数组中的乘客信息重新修改,输出当前时刻及有几个乘客出电梯。模块三:电梯开门函数:输出什么时刻电梯门已经打开。模块四:电梯关门函数:输出什么时刻电梯门已经关闭。模块五:电梯往既定方向运行一层的函数:根据电梯内的方向确定电梯是向上运行还是向下运行,输出电梯的运行状态。电梯结构体内的所在楼层变量相应的加1或减1。模块六:系统最开始的初始化函数:对整栋楼的乘客信息初始化,对电梯内的乘客信息初始化。模块七:查询函数,查询整栋楼有无请求模块八:电梯空闲状态函数:输出电梯当前处于空闲状态。模块九:电梯运行函数:若整栋楼无请求,则输出电梯在一楼,处于空闲状态。否则输出当前时间及电梯所在楼层。根据电梯内的乘客信息和当前楼层乘客信息,判断电梯做出那些动作,判断电梯是否开门,若不开门则继续上升或下降。若开门,则电梯开门,然后乘客出电梯,乘客进电梯,最后关门,并重新计算每层楼的正在等待的乘客的已等待的时间。然后根据电梯运行方向向上运行一层或向下运行一层。(2) 流程图: 电梯当前在第一层 整栋楼有无请求?电梯空闲 yes NO一楼有没有人? Yes No 电梯向上运行第一个乘客方向响应同方向的请求 1 0电梯向下运行电梯走一层响应同方向的请求电梯所在层小于8?电梯走一层 yes no 电梯所在层大于0?改变方向,向下 no改变方向,向上(3)模块对应函数接口: 模块一对应接口:int In(int y,int x,StateofElevator State1) 它的参数y表示电梯内当前人数,x表示当前楼层,State1 表示电梯运行方向。此程序用来处理当前楼层的每个乘客该不该进电梯,以及当乘客进电梯后电梯内乘客信息的处理,和当前楼层乘客信息的处理。 模块二对应接口:int Out(int floor,int number) 它的参数floor表示当前楼层,number表示电梯内人数,此程序用来处理当前电梯内乘客该不该出电梯,以及当乘客出电梯后电梯内乘客信息的处理。 模块三对应接口:void Open()无返回值函数,此函数用来处理电梯开门过程的时间变化,输出电梯正在开门以及一定时间后电梯门已打开。 模块四对应接口:void Close() 无返回值函数,此函数用来处理电梯关门过程的时间变化,输出电梯正在关门以及一段时间后电梯门已关闭。 模块五对应接口:int Go(Elevator *ele) 它的参数 ele表示指向电梯结构体的指针,此函数通过ele所指向的电梯方向,来输出电梯是向上运行还是向下运行,以及处理电梯运行一层的时间变化。 模块六对应接口:int Initialize()无形式参数,但是有返回值,此函数用来初始化最初的整栋楼的乘客信息和电梯内的乘客信息。并遍历整栋楼是否有人请求使用电梯,若有返回1,若无返回0。 模块七对应接口:int Test() 无形式参数,但是有返回值,此函数用来遍历整栋楼是否有人请求使用电梯,若有返回1,若无返回0。 模块八对应接口:void OnFree() 此函数用来输出电梯处于空闲状态。 模块九对应接口:void Run(Elevator *left)它的参数left表示指向电梯结构体得指针,首先调用Test()函数,若整栋楼无请求,则输出电梯在一楼,处于空闲状态。否则输出当前时间及电梯所在楼层。根据电梯内的乘客信息和当前楼层乘客信息,判断电梯做出那些动作,判断电梯是否开门,若不开门则继续上升或下降。若开门,则电梯开门open(),然后乘客出电梯out(),乘客进电梯in(),最后关门close(),并重新计算每层楼的正在等待的乘客的已等待的时间。然后根据电梯运行方向向上运行一层或向下运行一层。4、 详细设计: 4.1关键算法描述: 关键算法:是指当电梯到达某一层时,电梯所要执行的动作和对接下来电梯运行方向的计算,然后往此方向移动一层。循环调用此函数就能实现电梯的运行。 4.2关键算法Run()伪码表示: while(运行次数) If(无请求) 输出电梯空闲 ; Else if(电梯外没人,没人下) If(电梯里有人) If(运行方向向上) 电梯向上移动一层; If(到达第八层) 就改变运行方向; 开门;出门;进门;关门; 计算整栋楼乘客已经等待的时间; If(运行方向向下) 电梯向下移动一层; If(到达第零层) 就改变运行方向; 开门;出门;进门;关门; 计算整栋楼乘客已经等待的时间; else (电梯里没人) 按原方向运行; If(到顶点) 改变方向; Else 往前运行一层 ; 计算整栋楼乘客已经等待的时间; Else Open();out();in();close(); 计算整栋楼乘客已经等待的时间; If(电梯内第一个乘客的运行方向向上) 电梯向上移动一层; If(到达第八层) 就改变运行方向; 开门;出门;进门;关门; 计算整栋楼乘客已经等待的时间; else(电梯内第一个乘客的运行方向向上) 电梯向下移动一层; If(到达第零层) 就改变运行方向; 开门;出门;进门;关门; 计算整栋楼乘客已经等待的时间; 4.3函数调用关系图:Test()Initialize()Main()OnFree()Open()Run()Out()In()Close()Go() 5、 测试结果: 本程序的数据由电脑随机产生,所以具有很强的随机性,这里我只随机取一组数据分析。 (1)产生的整栋楼的乘客的信息: (2)电梯运行过程截图: 6、分析与探讨:(1)调试过程中遇到的问题与解决方案: 调试过程中难点有三点:1、电梯运行到第0层或则第8层时,必须转变电梯运行方向,而且当电梯上升到当前高度的时候,如果接下来的楼层没有请求且电梯中人的目的地也不再上面,则电梯就可以不再往上运行了。2、由于程序是自动运行的,而且初始化的信息也是随机产生的,所以不好调试。3、电梯运行过程中,时间是不停的在走的,电梯的每一个动作都会增加系统时间。所以可能会产生遗漏,造成输出错误。 解决方案: 最开始时在电梯结构体和乘客结构体的构造上不能使程序编写简单,存在数据结构不合理的问题,而且当时对于按时间顺序输出电梯运行过程不知道怎么处理,后来的解决方案是设置一个系统时间,是一个全局变量,能被任何函数赋值,这样就能实现按时序显示电梯的运行过程。 对于电梯方向的问题,对于第八层和第零层的乘客,他们的方向必然是向下和向上的,当电梯上到顶楼后要向下运行,下到底楼后要向上运行,而且当电梯运行到一定楼层后他可能就不需要再往上运行了,可以往下运行了,这时我们就要判断,所以要根据电梯内的乘客和电梯当前楼层的乘客以及整栋楼的乘客信息来决定电梯的运行方向。后来考虑编程时是应该以电梯为主还是以乘客为主,这两种不同时思考方向,他们的代码实现是很不同的,用乘客为主来编写程序,系统更加人性化,但是它的实现相比较以电梯为主而言就要难很多,比如电梯第乘客请求的响应顺序的算法就比较难。(2) 算法的时间空间复杂度分析: 对于本程序中的一些算法,用到的多是对数组的操作,而且主要是对数组内容的比较和修改,所以本程序所用到的算法的时空复杂度还是比较低的。最高的时间复杂度就是对电梯内乘客信息的修改和楼层中乘客信息的修改,其时间复杂度是O(n2)。其他的判断电梯的方向的时间复杂度是O(1),对于电梯初始运行方向的确定的函数的时间复杂度是O(n)。(3) 思维扩展: 由于电梯和乘客是两个独立的运行单位,所以我们可以考虑用线程的方式来编写上述程序。或则选择用以人为主来编写程序,是程序更加人性化。7、 用户手册:由于本系统经过编译连接,输入回车后,它的运行时自动的。因此并不需要用户来操作。而电梯运行次数在本程序中便于调试是做了规定的,我们可以增加它的运行次数,或者让它总是处于运行状态;而且我们知道,系统初始化是的信息是通过随机函数产生的,所以具有很强的随机性。因此第二次运行结果与第一次肯定是不一样的。8、源程序清单: Working.h /电梯运行头文件 Elevator.cpp /主函数 / Working.h /电梯运行头文件#define MaxSize 5 /电梯所能承载的最大人数#define N 5typedef enumUp,Down,Free StateofElevator; /电梯的状态typedef struct /* 乘客结构体int FloorofPerson; /乘客所在楼层int GoFloor; /乘客要去楼层int WaitingTime; /乘客的最大容忍等待时间int Direction; /方向int InorOut; /乘客是否已出电梯int Leave; /乘客是否离去int WaitedTime; /乘客已经等待的时间Person;typedef struct /*电梯结构体int Floor; /所在楼层StateofElevator State; /运行方向状态int NumberofPerson; /装载乘客人数Elevator;Person Passenger9N; /全局结构体二维数组保存整栋楼的乘客的相关信息Person PassengerInElevatorMaxSize; /在电梯中的乘客的相关信息存储在结构体一维数组中int b9; /每层楼的人数int InCount9; /每层楼进入电梯的实际人数int OutCount9; /每层楼走出电梯的实际人数int tclock=0; /电梯运行时的全局软时钟int InTime9; /每层楼乘客进入电梯的时间int OutTime9; /每层楼乘客出电梯的时间void print(int b) /输出整栋楼的乘客信息int i=0,j=0;cout所在楼层 目的楼层 最大容忍时间 方向 已等待时间 endl; for(i=0;i0) for(j=0;jbi;j+) coutPassengerij.FloorofPerson Passengerij.GoFloor Passengerij.WaitingTime Passengerij.Direction Passengerij.WaitedTimeendl; int In(int y,int x,StateofElevator State1) /乘客进入电梯,每次乘客进入电梯后将该层的乘客重新排序( y表示电梯当前人数;x表示楼层)int m=y; /保存电梯当前人数int p,q,l,v=0,et;int d=1;if(State1=Up) / 电梯当前运行方向d=1;if(State1=Down)d=0;for(p=0;pbx;p+) if(Passengerxp.Direction=d&Passengerxp.Leave=0)/该x层乘客p的方向与电梯方向一致且未离开,若电梯未满,则进电梯if(m=MaxSize) printf(电梯现在已经超载,请您等待片刻!n);break; /该楼层的其他乘客等待一段时间m+; /电梯内人数增加for(q=0;qMaxSize;q+) if(PassengerInElevatorq.InorOut=0) /如果电梯内乘客q已出电梯,则乘客p入电梯PassengerInElevatorq=Passengerxp; /乘客正式进入电梯PassengerInElevatorq.InorOut=1; /乘客已经进入电梯PassengerInElevatorq.Leave=1;PassengerInElevatorq.WaitedTime=0;PassengerInElevatorq.WaitingTime=0;Passengerxp.Direction=-2;Passengerxp.FloorofPerson=-2;Passengerxp.InorOut=-2;Passengerxp.Leave=-2;Passengerxp.GoFloor=-2;Passengerxp.WaitedTime=0;Passengerxp.WaitingTime=0; /进了电梯表明乘客即可到达目的地从而离开系统break;InCountx=m-y; /每层楼进入电梯的实际人数 /*将本楼层的乘客信息重新排列,将该层剩余乘客信息放入全局结构体二维数组*/Person *temp=(Person *)malloc(bx-InCountx)*sizeof(Person); /临时数组for(l=0;lbx;l+)if(Passengerxl.InorOut=0&Passengerxl.Leave=0&v(bx-InCountx) /如果该层乘客已出电梯,且未离开,且有人等待tempv=Passengerxl;Passengerxl.Direction=-2;Passengerxl.FloorofPerson=-2;Passengerxl.GoFloor=-2;Passengerxl.WaitedTime=0;Passengerxl.WaitingTime=0;Passengerxl.InorOut=-2;Passengerxl.Leave=-2;v+;for(et=0;et(bx-InCountx);et+)Passengerxet=tempet;bx=bx-InCountx;InTimex=InCountx*25;tclock+=InTimex;printf(在%dt时刻第%d楼层有%d个人进入电梯!n,tclock,x,(m-y);return m;int Out(int floor,int number) /乘客出电梯,每次乘客出电梯将全局数组中的乘客信息重新修改,floor表示楼层,number表示电梯内人数int i;int k=number;for(i=0;iState=Up)printf(电梯正在向上运行!n);printf(n);e-Floor+;if(e-State=Down)e-Floor-;printf(电梯正在向下运行!n);printf(n);tclock+=10;return (e-Floor);int Initialize() /系统最开始的初始化int i,j,k,m,n,s,c,u,v=0;srand(time(0); /获取时间种子for(i=0;i=8;i+) /每层楼的人数随机初始化bi=rand()%N;for(m=0;mb0;m+) /最底层楼的乘客信息初始化Passenger0m.Direction=1;for(c=0;cb8;c+) /最高层的乘客信息初始化Passenger8c.Direction=0;for(n=1;n=7;n+) /每层楼每个乘客方向初始化for(s=0;sbn;s+)Passengerns.Direction=rand()%2;for(j=0;j=8;j+) /每层楼的乘客的相关信息随机初始化for(k=0;kbj;k+)Passengerjk.FloorofPerson=j;Passengerjk.WaitingTime=100+rand()%100;Passengerjk.InorOut=0; /电梯外Passengerjk.Leave=0; /未离开Passengerjk.WaitedTime=0;if(Passengerjk.Direction=1)Passengerjk.GoFloor=(j+1)+rand()%(8-j);if(Passengerjk.Direction=0&j!=1)Passengerjk.GoFloor=rand()%(j-1);if(Passengerjk.Direction=0&j=1)Passengerjk.GoFloor=0; for(u=0;u=8;u+) / 遍历整栋楼,有人则返回1,没人返回0; if(bu=0) v+; if(v=9) return 0; else return 1;int Test() / 考查整栋楼有无请求 ,无返回0,有返回1;int cs,cf=0;for(cs=0;csFloor; /保存电梯当前的所在楼层数int number=ts-NumberofPerson; /保存电梯当前的人数int ps,ms,ns,bs=0,ls=0,pt,yt;int loop=0; /循环次数while(loop!=15) if(Test()=0) /考查整栋楼有无请求 ,无返回0,有返回1;OnFree(); /输出电梯现在在第一楼!电梯正处于空闲状态! elsebs=0;printf(在%dt时刻电梯正在第%d层!n,tclock,floor);for(ns=0;nsnumber;ns+) if(PassengerInElevatorns.GoFloor!=floor) bs+;if(bfloor=0&bs=number) /电梯外没人,没人下 /电梯不开门,继续上升或下降 if(number!=0) /电梯里有人 if(PassengerInElevator0.Direction=1&floorState=Up;floor=Go(ts); /电梯移动if(floor=8) printf(在%dt时刻电梯正在%d楼层!n,tclock,floor); Open(); number=Out(floor,number); /乘客出电梯OutTimefloor=OutCountfloor*25; /乘客出电梯的耗时ts-State=Down;number=In(number,floor,ts-State);InTimefloor=InCountfloor*25; /乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps=8;ps+)for(ms=0;ms0) /往下 ts-State=Down;floor=Go(ts);if(floor=0) printf(在%dt时刻电梯正在%d楼层!n,tclock,floor); Open(); number=Out(floor,number); /乘客出电梯OutTimefloor=OutCountfloor*25; /乘客出电梯的耗时ts-State=Up;number=In(number,floor,ts-State); InTimefloor=InCountfloor*25; /乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps=8;ps+)for(ms=0;msState=Up) if(floor=8)ts-State=Down; elsefloor=Go(ts); if(ts-State=Down) if(floor=0) ts-State=Up; else floor=Go(ts); for(pt=0;pt=8;pt+)for(yt=0;ytState);InTimefloor=InCountfloor*25; /乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps=8;ps+)for(ms=0;msbps;ms+) if(Passengerpsms.InorOut=0&Passengerpsms.Leave=0)Passengerpsms.WaitedTime+=(50+OutTimefloor+InTimefloor); /*服务完本层,电梯正式运行*/if(PassengerInElevator0.Direction=1&floorState=Up;floor=Go(ts);if(floor=8) printf(在%dt时刻电梯正在%d楼层!n,tclock,floor); Open(); number=Out(floor,number); /乘客出电梯 OutTimefloor=OutCountfloor*25; /乘客出电梯的耗时 ts-State=Down; number=In(number,floor,ts-State); InTimefloor=InCountfloor*25; /乘客进入电梯的耗时 Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps=8;ps+)for(ms=0;ms0)ts-State=Down;floor=Go(ts); if(floor=0) printf(在%dt时刻电梯正在%d楼层!n,tclock,floor);Open();number=Out(floor,number); /乘客出电梯OutTimefloor=OutCountfloor*25; /乘客出电梯的耗时 ts-State=Up; number=In(number,floor,ts-State); InTimefloor=InCountfloor*25; /乘客进入电梯的耗时 Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps=8;ps+)for(ms=0;msbps;ms+) if(Passengerpsms.InorOut=0&Passengerpsms.Leave=0) Passengerpsms.WaitedTime+=(50+OutTimefloor+InTimefloor); floor=Go(ts); Request(); /乘客向电梯请求loop+; /Elevator.cpp /主函数#include#include#include#include#include#include#includeWorking.hvoid main()int number,floor,state;Elevator left; left.State=Free; /电梯初始化left.Floor=1;left.NumberofPerson=0;for(number=0;numberMaxSize;number+) /电梯内乘客信息初始化PassengerInElevatornumber.InorOut=0;PassengerInElevatornumber.Direction=-1;PassengerInElevatornumber.FloorofPerson=-1;PassengerInElevatornumber.Leave=0;PassengerInElevatornumber.GoFloor=-1;PassengerInElevatornumber.WaitedTime=0;PassengerInElevatornumber.WaitingTime=0;for(floor=0;floor=8;floor+)InCountfloor=0;OutCountfloor=0;InTimefloor=0;OutTimefloor=0; state=Initialize(); print(b);if(s

温馨提示

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

评论

0/150

提交评论