版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构-电梯模拟的报告数据结构-电梯模拟的报告数据结构-电梯模拟的报告
1.课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题.2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4。训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2.课程设计任务与要求:任务根据教材《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。设计题目从《数据结构题集》“第二篇实习篇”中选取,每班每题不得超过2人。另选题:学生自选课题学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识.学生自选课题需在17周前报课程设计指导教师批准方可生效。要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率.在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。2、.设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书一需求分析(1)、模拟某校五层教学楼的电梯系统.该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第一层、第二层、第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层",电梯“空闲”时,将来该层候命。五个楼层从下到上的编号为:0、1、2、3、4.除了地下层外,每一层都有一个要求向下的按钮除了第四层外,每一层都有一个要求向上的按钮。对应的变量为:CallUp[0。。3]和CallDown[1。.4]。电梯内的五个目标层按钮对应的变量为:CallCar[0。.4]。(2)、电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。(3)、
乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃.对于在楼层内等待电梯的乘客,将插入在等候队列里,每一层有两个等候队列,一队要求向上,一队要求向下,用链队列来实现。对于在电梯内的乘客,用五个乘客栈来实现,该乘客要去哪一层,就把他放在相应编号的栈中,对应变量为EleStack[0…4]。(4)、模拟时钟从0开始,时间单位为0。1秒.人和电梯的各种动作均要耗费一定的时间单位(简记为t):有人进出时,电梯每隔40t测试一次,若无人进出,则关门关门和开门各需要20t每个人进出电梯均需要25t电梯加速需要15t上升时,每一层需要51t,减速需要14t下降时,每一层需要61t,减速需要23t如果电梯在某层静止时间超过300t,则驶回1层候命。(5)、按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。二概要设计乘客类型反映乘客的所有属性。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) 操作结果:返回乘客进入时间。}乘客栈类型电梯内的乘客用乘客栈表示,去不同楼层的乘客放在不同的栈中。ADTEstack数据对象:D={ai∈乘客信息,I=1,2,…,n,n≥0}数据关系:R={<ai—1,ai〉|ai-1,ai∈D,i=2,…,n}基本操作:略。}等候队列类型在电梯外等待的乘客用等待队列表示。每层各有两个等待队列,分别为上楼队列和下楼队列。与一般队列不同的是在基本操作中加入了放弃操作CGiveUp(WQueue&Q,intfloor)。电梯类型表示电梯的各个属性和所有动作.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) 操作结果:输出电梯动作信息。主程序主程序主要处理两类事件:乘客事件和电梯事件。除此之外,主程序还处理各个模块的初始化和销毁工作,以及电梯状态的输出.乘客事件包括新乘客到达事件,乘客放弃等待事件,乘客进出电梯事件.电梯事件包括电梯运行事件。本程序包含6个模块:主程序模块乘客模块乘客栈模块电梯模块等待队列模块高楼模块:实现电梯和乘客之间的互交.各模块之间的调用关系如下:主程序主程序电梯模块乘客栈模块等待队列模块乘客模块高楼模块三详细设计//所有常量,全局变量和类型定义#defineNULL 0 //空指针#defineTRUE 1#define FALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1#defineOVERFLOW —2#defineINT_MAX 32767//Status是函数类型,其值是函数结果状态代码typedefintStatus;#defineEmpty 0//-—-—-—-——--—-—-----———-——--—--—--—-—---———-——-——-——--—//电梯状态enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting};enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None};enum EleStage{Up,Down,OpenDoor,Stop};enum ClientStatus{New,GiveUp,In,Out,Finish};#define CloseTest40 //电梯关门测试时间#defineOverTime300 //电梯停候超时时间#defineAccelerate15 //加速时间#defineUpTime 51 //上升时间#defineDownTime61 //下降时间#defineUpDecelerate14 //上升减速#defineDownDecelerate23 //下降减速#defineDoorTime 20 //开门关门时间#defineInOutTime 25 //进出电梯时间#defineMaxfloor 4 //最高层#defineMinfloor 0 //最低层longTime=0; //时钟longMaxTime;//系统运行最长时间intInOutCount=0;//用于进出计时intInterTime=0;//下一乘客进入系统的时间intID=0; //乘客编号intGiveUpNumber=0;//乘客放弃的数目intTotalTime=0;//总共等待时间部分重要操作的算法:1、判断运动方向函数EleDecide的算法:2、统计高层和低层的请求(不包括当前层)。3、高层和低层均无请求:发出Stop命令。4、否则,1)若电梯在上升期:1。若有高层请求:上升;2.若无高层请求:转下降期,下降。2)若电梯在下降期:1.若有低层请求:下降;2。若无有低层请求:转上升期,上升。判断电梯是否要停于当前层函数EleAchieved的算法:该层的CallCar为1;该层在上升(下降)期有上升(下降)请求(判断CallUp或CallDown);上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。判断电梯动作函数ElevatorRun的算法:若电梯在Opening状态,则转至Opened状态.若电梯在Opened状态,若无人进出,则转至Closing状态。若电梯在Closed状态,则根据电梯请求情况转至相应状态。若电梯在Closing状态,则转至Closed状态。若电梯在Moving状态,若达到目标层,则转至Decelerate状态。否则,继续移动。若电梯在Decelerate状态,则设定电梯时期,并转至Opening状态。若电梯在Waiting状态,在判断是否等待超时,若超时则向第一层移动。否则,判断电梯请求情况并转至相应状态。四设计与调试分析在本程序中如何判断电梯的动作最为关键。此外,合理划分各个模块和处理各个模块之间的联系也非常重要.本设计中涉及时间函数的使用,由于刚开始接触,这方面的使用相当有难度。使用不当就容易造成编译不通过或者运行时发送错误报告。还有在电梯调度方面不能按照预定的想法实现,所以和现实中的电梯有出入.没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入到哪层楼来告知电梯运行到几楼。开门,关门时需要精心思考,此处记时及判断是否要开门也是难点,所以这些看似很平常的动作却是最难也是最容易错的地方。此外在指针的使用方面也是难点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不过编译。为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。由于开始为了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了,于是就将这些变量删除,比如开始按照提示设置了D1-表示人们正在进出电梯等等。由于将程序分块,将不同部分写入不同源文件中,这样出错后便于查找及修改,这是分模块的优点之一也是编写和调试的一个小技巧。五用户手册程序运行后输入程序的运行时间,电梯开始运行。在本设计中,用0—4分别表示地下一楼至四楼,用户只要按照提示依次输入正确的数值,每次按下回车键即认为已经输入信息。此后只需等待系统自行进行处理,若未显示乘客放弃乘坐电梯即认为该乘客已达目的楼层.此间程序会一直运行到开始时输入的运行时间,此时整个程序运行结束,按任意键退出。此操作可参考测试成果中的效果图。六测试成果从测试结果看,乘客放弃数的大小和平均等待时间的长短还与乘客出现的密度和乘客的平均容忍时间有关系。七附录(源程序清单)#include<stdlib。h〉#include〈iostream.h〉#include〈iomanip.h>#include〈stdio.h>#include〈windows.h>#include〈conio。h〉#include〈time.h>//所有常量,全局变量和类型定义#defineNULL 0 //空指针#defineTRUE 1#define FALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1#defineOVERFLOW —2#defineINT_MAX 32767//Status是函数类型,其值是函数结果状态代码typedefintStatus;#defineEmpty 0//—-————-——-——-———-—----——-—-—--—-——-——-———-——-———-—-—-—//电梯状态enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting};enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None};enum EleStage{Up,Down,OpenDoor,Stop};enum ClientStatus{New,GiveUp,In,Out,Finish};#define CloseTest40 //电梯关门测试时间#defineOverTime300 //电梯停候超时时间#defineAccelerate15 //加速时间#defineUpTime 51 //上升时间#defineDownTime61 //下降时间#defineUpDecelerate14 //上升减速#defineDownDecelerate23 //下降减速#defineDoorTime 20 //开门关门时间#defineInOutTime 25 //进出电梯时间#defineMaxfloor 4 //最高层#defineMinfloor 0 //最低层longTime=0; //时钟longMaxTime;//系统运行最长时间intInOutCount=0;//用于进出计时intInterTime=0;//下一乘客进入系统的时间intID=0; //乘客编号intGiveUpNumber=0;//乘客放弃的数目intTotalTime=0;//总共等待时间//乘客类型typedefstruct{ intClinetID; //乘客编号 intOutfloor; //去哪层 intInTime; //该乘客进入时间 intGivepuTime; //所能容忍的等待时间 intInfloor;//乘客进入的楼层}Client;//乘客类型基本操作voidPrintClientInfo(Clientconst&e,ClientStatuss){ //输出乘客信息#if!test switch(s){ caseNew:cout〈<Time〈<'\t'〈〈e。ClinetID〈〈”号乘客进入第"〈<e。Infloor<〈”层"<<endl;break; caseGiveUp:cout<<Time<〈"\t"<〈e.ClinetID〈<”号乘客放弃等待,等待了"<〈Time-e.InTime<〈”/0.1s”〈〈endl;break; caseOut:cout<〈Time<〈'\t'<〈e。ClinetID<〈”号乘客走出电梯"〈〈endl;break; caseIn:cout〈<Time〈<’\t’〈<e。ClinetID<<”号乘客走进电梯,要去第”〈<e。Outfloor<〈"层"<〈endl;break; default:break; };//switch#endif}StatusCreatClient(Client*&p){ //生成新的乘客 intd; p=newClient; if(!p)returnOVERFLOW; p—>ClinetID=++ID; //ut<<ID; cout〈〈"所在楼层:"; //ut<〈e.Infloor<<'\n’; cout〈〈ID;cout〈<"所能容忍的等待时间:”;cin>〉d; p->GivepuTime=d;//产生所能容忍的等待时间 p—〉InTime=Time; cout〈〈”下一乘客要到达的时间:";cin〉〉d; InterTime=d;//产生下一乘客要到达的时间cout〈〈"所要到达的楼层:”;cin〉>d; p-〉Outfloor=d; //产生所要到达的楼层 //该乘客出现的楼层 while((p—〉Infloor=rand()%(Maxfloor+1))==p—〉Outfloor);// cin>〉p-〉Infloor〉>p->Outfloor〉〉InterTime; PrintClientInfo(*p,New); returnOK;}StatusDestoryClient(Client*&p){ //该乘客离开系统 deletep; p=NULL; returnOK;}StatusGoAbove(Clientconst&e){ //判断该乘客是否去往高层 if(e.Outfloor〉e。Infloor)returnTRUE; elsereturnFALSE;}intCInfloor(Clientconst&e){ //返回乘客进入的楼层 returne。Infloor;}intCInTime(Clientconst&e){ //返回乘客进入时间 returne。InTime;}intCOutfloor(Clientconst&e){ //返回乘客进入时间 returne.Outfloor;}#define STACK_INIT_SIZE 10 //存储空间初始分配量#define STACKINCREMENT 5 //存储空间分配增量//乘客栈typedef Client *SElemType; typedefstruct{ SElemType *base; //栈底指针,栈不存在时base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配存储空间,以元素为单位}ClientStack;//乘客栈的基本操作StatusInitStack(ClientStack&S); //构造一个空栈StatusDestroyStack(ClientStack&S); //销毁栈SStatusClearStack(ClientStack&S); //把S置为空StatusStackEmpty(ClientStackS); //若栈S为空,则返回TRUE,否则返回FALSEintStackLength(ClientStackS); //返回栈S的长度StatusGetTop(ClientStackS,SElemType&e); //返回栈顶元素StatusPush(ClientStack&S,SElemTypee); //入栈StatusPop(ClientStack&S,SElemType&e); //出栈voidPrintStack(ClientStack&S); //输出栈StatusInitStack(ClientStack&S){ //构造一个空栈 S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S。base)returnOVERFLOW; S.top=S。base; S.stacksize=STACK_INIT_SIZE; returnOK;}//InitStackStatusDestroyStack(ClientStack&S){ //销毁栈S SElemType *p; if(S.base){ for(p=S.base;p<S.top;p++) DestoryClient(*p); free(S.base); } returnOK;}StatusClearStack(ClientStack&S){ //把S置为空 if(!S。base)returnERROR; S.top=S.base; returnOK;}StatusStackEmpty(ClientStackS){ //若栈S为空,则返回TRUE,否则返回FALSE if(S.top==S。base)returnTRUE; else returnFALSE;}intStackLength(ClientStackS){ //返回栈S的长度 returnS.top-S。base;}StatusGetTop(ClientStackS,SElemType&e){ //返回栈顶元素 if(!S.base)returnERROR; e=*(S。top—1); returnOK;}//GetTopStatusPush(ClientStack&S,SElemTypee){ //入栈 if(!S。base)returnERROR; if(S。top-S.base>=S.stacksize){ S.base=(SElemType*)realloc(S.base,(S。stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base)returnOVERFLOW; S。top=S。base+S。stacksize; S。stacksize+=STACKINCREMENT; } *S。top++=e; returnOK;}//PushStatusPop(ClientStack&S,SElemType&e){ //出栈 if(S.top==S.base)returnERROR; e=*(—-S。top); returnOK;}//PopvoidPrintStack(ClientStack&S){ //输出栈 SElemType*i; i=S.base; while(i〈S.top) cout〈〈(*i++)-〉ClinetID<〈’’;}//电梯类型#include”ClientStack.h"typedefstruct{ intfloor; //电梯所在层 intClientNumber;//电梯内人数 EleStatusstatus; //电梯当前状态 EleStageStage; //电梯运行时期 intCount;//用于电梯计时 intCallUp[Maxfloor+1];//每层的Up按钮 intCallDown[Maxfloor+1];//每层的Down按钮 intCallCar[Maxfloor+1];//电梯内的目标层按钮 ClientStack S[Maxfloor+1];//乘客栈,要去不同楼层的人放在不同的栈中}Elevator;//电梯类型基本操作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。CallCar[E.floor])returnTRUE; 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; } }//if else{ if(Below!=0)returnDown; else{ E。Stage=Up;returnUp; } }//if }}ActionElevatorRun(Elevator&E){ //电梯状态转换 switch(E。status){ caseOpening: //完成开门则转入Opened状态 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; }//if break; 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.Count=OverTime;} };//switch break; caseMoving: //完成移动 if(E。Stage==Up)E.floor++; else E.floor-—; if(EleAchieved(E)){//到达目标层,转入减速状态 E.status=Decelerate; E.Count=DownDecelerate; } elseE。Count+=DownTime;//未到达目标层,继续下降 returnAchieved; caseDecelerate: //完成减速 //确定正确的电梯时期 if(E.Stage==Up&&!E。CallUp[E。floor]&&!RequireAbove(E))E.Stage=Down; elseif(E.Stage==Down&&!E。CallDown[E.floor]&&!RequireBelow(E))E.Stage=Up; //转到开门状态 E。status=Opening;E.Count=DoorTime; break; };//switch returnNone;}//ElevatorRun//单链队列-—队列的链式存储结构typedefClient*QElemType;//等候队列typedefstructQNode{ QElemType data; structQNode *next;}QNode,*QueuePtr;typedefstruct{ QueuePtr front; //队头指针 QueuePtr rear; //队尾指针}WQueue;//等待队列的基本操作StatusInitQueue(WQueue&Q){ //构造一个空队列Q Q。front=Q.rear=newQNode; if(!Q.front)returnOVERFLOW;//分配存储失败 Q.front—〉next=NULL; Q.front—>data=NULL; returnOK;}StatusDestroyQueue(WQueue&Q){ //销毁队列Q while(Q.front){ Q.rear=Q。front—>next; if(Q。front->data)DestoryClient(Q。front->data); deleteQ。front; Q.front=Q。rear; } returnOK;}StatusEnQueue(WQueue&Q,QElemTypee){ //插入元素e为Q的新的队尾元素 QueuePtrp; p=newQNode; if(!p)returnOVERFLOW; p-〉data=e;p->next=NULL; Q.rear—〉next=p; Q。rear=p; returnOK;}StatusDeQueue(WQueue&Q,QElemType&e){ //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK; //否则返回ERROR QueuePtrp; if(Q。front==Q。rear)returnERROR; p=Q.front—>next; e=p->data; Q.front—>next=p->next; if(Q。rear==p)Q。rear=Q.front; deletep; returnOK;}StatusQueueEmpty(WQueueQ){ //判断队列是否为空 if(Q。front==Q.rear)returnTRUE; else returnFALSE;}StatusQDelNode(WQueue&Q,QueuePtrp){ //删除队列中p指向的结点的下一个结点 QueuePtrq; if(p==NULL||p—>next==NULL)returnERROR; q=p-〉next; p-〉next=q—〉next; if(p-〉next==NULL)Q.rear=p; DestoryClient(q-〉data); deleteq; returnOK;}StatusCGiveUp(WQueue&Q,intfloor){ //删除放弃等待的乘客 QueuePtrp; p=Q。front; if(p—〉next!=NULL) if(p->next-〉data->GivepuTime==0&&floor!=p-〉next—〉data—〉Infloor){ PrintClientInfo(*(p->next—〉data),GiveUp); TotalTime+=Time—CInTime(*(p—>next->data)); QDelNode(Q,p);//将放弃等待的人删除 GiveUpNumber++; } else p—〉next->data-〉GivepuTime——; returnOK;}voidPrintQueue(WQueueQ){ //输出队列 QueuePtrq; intcount=0; if(Q.front-〉next==NULL)gotoend; q=Q.front—〉next; while(q!=NULL){ cout<<setw(3)〈〈q->data-〉ClinetID〈〈'’; q=q-〉next; count++; }end: while(count++<=4)cout〈<””;}#include"main。h"#include"Client.h"#include”wqueue.h”#include”Elevator.h”voidInOut(Elevator&E,WQueuew[Maxfloor+1][2]){ //进行乘客的进出电梯活动 //注意:电梯时期要正确,否则乘客无法进入. Client*p; if(E。CallCar[E.floor])//人要从电梯中走出 if(StackEmpty(E.S[E.floor]))E。CallCar[E.floor]=0; else{//当前层的乘客栈非空,出电梯 Pop(E.S[E.floor],p);E。ClientNumber—-; InOutCount=InOutTime; PrintClientInfo(*p,Out); TotalTime+=Time-CInTime(*p); DestoryClient(p); }//else if(E.CallCar[E.floor]==0)//有人要走入电梯 if(!QueueEmpty(w[E。floor][E.Stage])){//若队列不空,继续进电梯 DeQueue(w[E.floor][E。Stage],p); Push(E。S[COutfloor(*p)],p); if(E。CallCar[COutfloor(*p)]!=1){ //按下要去楼层的按钮 E.CallCar[COutfloor(*p)]=1; } E.ClientNumber++; InOutCount=InOutTime; PrintClientInfo(*p,In); }//if else{//乘客的进出活动已完成 if(E.Stage==Down)E。CallDown[E。floor]=0;//将相应的下降按钮取消 elseE.CallUp[E。floor]=0;//将相应的上升按钮取消 }}voidNewClient(Elevator&E,WQueuew[5][2]){ //进入新乘客 Client*p; CreatClient(p);//新的乘客 //将该乘客插入相应队列并按下相应按钮(Up/Down) if(GoAbove(*p)){ EnQueue(w[CInfloor(*p)][Up],p);E.CallUp[CInfloor(*p)]=1; } else{ EnQueue(w[CInfloor(*p)][Down],p);E.CallDown[CInfloor(*p)]=1; }//else}/**********************************************************/voidPrint(Elevator&E,Actiona){ //输出电梯动作信息 switch(a){ caseDoorOpened: cout<〈Time〈〈"\t电梯门已打开"<<endl;break; caseDoorClosed: cout<<Time<〈”\t电梯门已关闭"〈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业安全培训及管理制度
- 幼儿园安全知识宣传方案
- 室内设计专业求职信
- 教师数字赋能心得体会
- 分析实验基础知识与基本操作
- 装修行业个人年终工作总结
- 不属于幼儿所使用的说的语用技能项目
- 小学语文教师求职信
- 国际学校学生作业评估制度
- 数学教育科研工作总结与反思
- 供应室教学课件
- 第三单元 测量(单元测试)-2024-2025学年三年级上册数学人教版
- 1输变电工程施工质量验收统一表式(线路工程)-2024年版
- 华为年财务报表分析(共16张课件)
- 让我们一起去追“星”!两弹一星之核弹老人魏世杰课件高二下学期爱国主义教育主题班会
- 不锈钢管市场洞察报告
- 2024-2025学年七年级生物上册 第二单元第一、二章 单元测试卷( 人教版)
- 人教部编版三年级上册《道德与法治》教案全套
- Unit 4 Weekend Activities Part B(教学设计)-2024-2025学年闽教版英语五年级上册
- 2024-2025学年高中生物下学期《细胞增殖》教学设计
- 2024年全国检验类之临床医学检验技术(师)考试历年考试题附答案
评论
0/150
提交评论