您好,欢迎访问三七文档
数据结构实验报告班级:通信工程0805姓名:朱晨阳学号:U200812992电梯模拟摘要:此程序是一个简单的模拟电梯升降的系统。在现实中,电梯系统要由乘客和电梯相互作用而形成的一个灵活的系统,电梯升降需要人的指令,而人也可以在等待时间过长而离开。虽然他们的行为可能受对方的作用,但是他们的行为是基本独立的。所以在这个程序模拟中,我将其分成几个抽象数据类型,并且做好每一部份的相互联系。在程序运行中输入乘客所进入的楼层,将要去的楼层,等待最长时间等数据可以完成其模拟。而这个系统可以很好的模拟现实中的电梯运行的状态。Thisprogramisasimplesimulationofelevatorliftsystem.Inreality,theelevatorsystemisaflexiblesystemwhichisformedbypassengersandtheelevator.Theelevatorliftsrequirehuman’sinstructions,butwhocanalsoleavewhenit’swaitedfortoolong.Whiletheirbehaviormaybeaffectedbyeachother'srole,theirbehaviorislargelyindependent.Therefore,inthissimulation,Idivideditintoseveralabstractdatatypes.Andthissystemcanbeagoodsimulationoftherealstateoftheelevator.思路和原理:1.确定电梯的类型。其中包括:电梯所在层,电梯内人数,电梯当前状态,电梯运行时期,电梯计时器,每层的Up按钮,每层的Down按钮,电梯内的目标层按钮,同时,还需要造一个乘客栈,将要去不同楼层的人放在不同的栈中。2.确定乘客类型。其中包括:乘客编号,乘客将要去的楼层数,该乘客进入时间,所能容忍的等待时间以及该乘客进入的楼层。3.通过进行乘客的进出电梯活动来将两者联系起来。首先,每层都有两个等待队列:上楼队列和下楼队列。其次,此活动包括乘客时间与电梯事件,通过相同的参数将其相连接。乘客事件包括:新乘客进入事件,乘客放弃事件放弃,乘客进出事件。电梯事件包括:判断电梯的状态。4.按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。根据实验要求,定义时间:上升时间,下降时间,开门关门时间,进出电梯时间,最高层,最低层。算法设计:1.设定乘客栈的抽象数据类型定义ADTStack{数据对象:数据关系:基本操作:InitStack(S);操作结果:构造一个空栈DestroyStack(&S);初始条件:栈S已存在操作结果:销毁栈SClearStack(&S);初始条件:栈s已存在操作结果:把S置为空StackEmpty(S);初始条件:栈s已存在。操作结果:若栈S为空,则返回TRUE,否则返回FALSEStackLength(S);初始条件:栈s已存在。操作结果:返回栈S的长度GetTop(S,&e);初始条件:栈s已存在。操作结果:返回栈顶元素Push(&S,e);初始条件:栈s已存在。操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e);初始条件:栈s已存在。操作结果:删除S的栈顶元素,并以e返回其值。PrintStack(&S);初始条件:栈s已存在。操作结果:输出栈乘客类型ADTClient数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0}数据关系:R={ai-1,ai|ai-1,ai∈D,i=2,…,n}基本操作:PrintClientInfo(Clientconst&e,ClientStatuss)操作结果:输出乘客信息。CreatClient(Client*&p)操作结果:生成新的乘客。DestoryClient(Client*&p)操作结果:该乘客离开系统。GoAbove(Clientconst&e)操作结果:判断该乘客是否去往高层。CInfloor(Clientconst&e)操作结果:返回乘客进入的楼层。CInTime(Clientconst&e)操作结果:返回乘客进入时间。COutfloor(Clientconst&e)操作结果:返回乘客进入时间。}电梯类型表示电梯的各个属性和所有动作。ADTElevator数据对象:D={ai∈电梯信息,I=1,2,…,n,n≥0}基本操作:InitEle(Elevator&E)操作结果:初始化电梯类型。DestoryEle(Elevator&E)操作结果:销毁电梯类型。EleDecide(Elevator&E,WQueuew[Maxfloor+1][2])操作结果:电梯动作决策。ElevatorRun(Elevator&E,WQueuew[Maxfloor+1][2]){操作结果:电梯状态转换。CountOver(Elevator&E)操作结果:判断电梯计时是否完成。EleFloor(Elevatorconst&E)操作结果:返回电梯所在的层。EleStatus(Elevatorconst&E)操作结果:返回电梯状态。RequireAbove(Elevatorconst&E)操作结果:判断是否有高层请求。RequireBelow(Elevatorconst&E)操作结果:判断是否有低层请求。EleAchieved(Elevator&E)操作结果:判断电梯是否要停于当前层。EleOpenDoor(Elevator&E)操作结果:判断电梯是否要开门。}实现电梯和乘客之间的相互作用。包括:InOut(Elevator&E,WQueuew[Maxfloor+1][2])操作结果:进行乘客的进出电梯活动。NewClient(Elevator&E,WQueuew[5][2])操作结果:进入新乘客。PrintStatus(Elevator&E,WQueuew[5][2])操作结果:输出当前状态。Print(Elevator&E,Actiona)操作结果:输出电梯动作信息。具体实现:电梯类型基本操作:voidInitEle(Elevator&E){inti;E.floor=1;//电梯初始停在第一层E.status=Waiting;E.Count=OverTime;E.Stage=Down;E.ClientNumber=0;for(i=0;i=Maxfloor;i++){E.CallUp[i]=0;E.CallDown[i]=0;E.CallCar[i]=0;}for(i=0;i=Maxfloor;i++)InitStack(E.S[i]);}StatusCountOver(Elevator&E){//判断电梯计时是否完成if(E.Count){E.Count--;returnFALSE;}returnTRUE;}voidDestoryEle(Elevator&E){//销毁电梯类型inti;for(i=0;i=Maxfloor;i++)DestroyStack(E.S[i]);}intEleFloor(Elevatorconst&E){//返回电梯所在的层returnE.floor;}EleStatusEleStatus(Elevatorconst&E){returnE.status;}StatusRequireAbove(Elevatorconst&E){//判断是否有高层请求for(inti=E.floor+1;i=Maxfloor;i++)if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE;returnFALSE;}StatusRequireBelow(Elevatorconst&E){//判断是否有低层请求for(inti=E.floor-1;i=Minfloor;i--)if(E.CallCar[i]||E.CallDown[i]||E.CallUp[i])returnTRUE;returnFALSE;}StatusEleAchieved(Elevator&E){//判断电梯是否要停于当前层if(E.Stage==Up&&E.CallUp[E.floor]||E.Stage==Down&&E.CallDown[E.floor])returnTRUE;if(E.Stage==Up&&E.CallDown[E.floor]&&!RequireAbove(E)){E.Stage=Down;returnTRUE;}if(E.Stage==Down&&E.CallUp[E.floor]&&!RequireBelow(E)){E.Stage=Up;returnTRUE;}returnFALSE;}StatusEleOpenDoor(Elevator&E){//判断电梯是否要开门if(E.CallCar[E.floor]||E.CallDown[E.floor]&&E.Stage==Down||E.CallUp[E.floor]&&E.Stage==Up)returnTRUE;if(E.status==Waiting){if(E.CallDown[E.floor]){E.Stage=Down;returnTRUE;}if(E.CallUp[E.floor]){E.Stage=Up;returnTRUE;}}returnFALSE;}EleStageEleDecide(Elevator&E){//判断电梯动作intAbove,Below;Above=RequireAbove(E);Below=RequireBelow(E);if(Above==0&&Below==0)returnStop;//无请求则停止else{//有请求则按请求移动if(E.Stage==Up){if(Above!=0)returnUp;else{E.Stage=Down;returnDown;}}//ifelse{if(Below!=0)returnDown;else{E.Stage=Up;returnUp;}}//if}}ActionElevatorRun(Elevator&E){//电梯状态转换switch(E.status){caseOpening:E.status=Opened;E.Count=CloseTest;returnDoorOpened;caseOpened;//进行关门测试if(E.Stage==Down&&!E.CallCar[E.floor]&&!E.CallDown[E.floor]||E.Stage==Up&&!E.CallCar[E.floor]&&!E.CallUp[E.floor]){//无人进出,关门E.status=Closing;E.Count=DoorTime;}//ifbreak;caseClosing://完成关门则转入Closed状态E.status=Closed;returnDoorClosed;caseWaiting://不在第一层且超出所规定的停候时间,电梯向第一层移动if(E.Count==0){if(E.floor!=1)E.CallCar[1]=1;}elseE.Count--;//如果有人可以进入,则开门if(EleOpenDoor(E)){E.status=Opening;E.Count=DoorTime;break;}caseClosed://根据EleDecide的返回值设定电梯状态switch(EleDecide(E)){caseUp:E.status=Moving;E.Count=UpTime+Accelerate;returnGoingUp;caseDown:E.status=Moving;E.Count=DownTime+Accelerate;returnGoingDown;caseStop:if(E.status!=Waiting){E.status=Waiting;E.Cou
本文标题:电梯模拟
链接地址:https://www.777doc.com/doc-4218973 .html