1、int now;/乘客当前所在的位置int dis;/乘客的目地地int wait;/最长的等待的时间int waitnow;/已经等待的时间struct passage *next;Passage;虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:typedef struct liftint count_C;/计数电梯已到达的层数int count_A;/系统的总时间计数器 记得必须初始化为0int flag_inHigh;/九个楼层有无请求的标志 哪个楼层如果有请求 该标志置1int num;/等待队列中的人数 记得要进
2、行初始化为0int people;/电梯中人数int flag_outHigh;Lift;(2)算法设计顾名思义本程序在运行的过程中用到的算法便是“电梯算法”,电梯算法借鉴了磁盘寻道C-LOOK算法,即电梯向一个方向运行,直到这个方向上没有服务为止。2.2设计表示(1)、函数调用关系图及其说明如下:(2)函数接口说明:函数中的参数均是使用的全局变量的传递,因而在函数间进行传递的过程中比较简单,下面就将主要函数及他们之间的参数的关系列出如下:int OutOrIn(Lift &L,Passage *Queue,Passage *LiftQ);/进和出电梯的总函数int Update(Lift &
3、/刷新的函数int Run(Lift &/整个电梯各种状态转换的函数int OpenTheDoor(Lift &L);/开门主要是用于解决其中的时间问题int CloseTheDoor(Lift &/关门int In(Lift &/进入 主要是解决每个人进入电梯的时间问题int Out(Lift &/出去int Test(Lift &/电梯测试关门还是开门的函数int Request(Lift &L,Passage *Queue);2.3详细设计3、调试分析该程序的调试过程较为轻松,基本在算法实现的基础上没有出现什么错误,因而在调试的过程中并无什么深刻印象。4、用户手册点击运行程序,在弹出的窗
4、口中,会提示要输入的信息:1、 提示信息为:“请输入图中的顶点数和弧数以及图的标志和弧的标志:”按要求输入即可,本题即输入9 11 v a2、 提示信息为“请完成该邻接表的输入”:由于邻接表的输入信息一般较多,而且均是采用的链表来存储,因而该部分的输入要特别的小心3、 在完成上面两步的输入后按enter键便能得到程序的运行结果,即输出完成整项工程至少需要多少时间和影响工程进度的关键活动 思路和原理:1. 确定电梯的类型。其中包括:电梯所在层,电梯内人数,电梯当前状态,电梯运行时期,电梯计时器,每层的Up按钮,每层的Down按钮,电梯内的目标层按钮,同时,还需要造一个乘客栈,将要去不同楼层的人放
5、在不同的栈中。2. 确定乘客类型。乘客编号,乘客将要去的楼层数,该乘客进入时间,所能容忍的等待时间以及该乘客进入的楼层。3. 通过进行乘客的进出电梯活动来将两者联系起来。首先,每层都有两个等待队列:上楼队列和下楼队列。其次,此活动包括乘客时间与电梯事件,通过相同的参数将其相连接。乘客事件包括:新乘客进入事件,乘客放弃事件放弃,乘客进出事件。电梯事件包括:判断电梯的状态。4. 按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。根据实验要求,定义时间:上升时间,下降时间,开门关门时间,进出电梯时间,最高层,最低层。算法设计:1. 设定乘客栈的抽象数据类型定义ADT Stack 数据对象:
6、数据关系:基本操作:InitStack(S);操作结果:构造一个空栈DestroyStack(&S);初始条件:栈S已存在操作结果:销毁栈SClearStack(&栈s已存在把S置为空StackEmpty(S);栈s已存在。若栈S为空,则返回TRUE,否则返回FALSEStackLength(S); 初始条件:返回栈S的长度GetTop(S, &e);初始条件:返回栈顶元素Push(&S, e); 操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S, &删除S的栈顶元素,并以e返回其值。PrintStack(&输出栈乘客类型ADT ClientD=ai乘客信息,I=1,2,n,n0R=|a
7、i-1,aiD,i=2,nPrintClientInfo(Client const &e,ClientStatus s)输出乘客信息。CreatClient(Client *&p)生成新的乘客。DestoryClient(Client *&该乘客离开系统。GoAbove(Client const &e)判断该乘客是否去往高层。CInfloor(Client const &返回乘客进入的楼层。CInTime(Client const &返回乘客进入时间。COutfloor(Client const &电梯类型表示电梯的各个属性和所有动作。ADT ElevatorD=ai电梯信息,I=1,2,n,
8、n0InitEle(Elevator &E)初始化电梯类型。DestoryEle(Elevator &销毁电梯类型。EleDecide(Elevator &E,WQueue wMaxfloor+12)电梯动作决策。ElevatorRun(Elevator &E,WQueue wMaxfloor+12)电梯状态转换。CountOver(Elevator &判断电梯计时是否完成。EleFloor(Elevator const &返回电梯所在的层。EleStatus(Elevator const &返回电梯状态。RequireAbove(Elevator const &判断是否有高层请求。Requi
9、reBelow(Elevator const &判断是否有低层请求。EleAchieved(Elevator &判断电梯是否要停于当前层。EleOpenDoor(Elevator &判断电梯是否要开门。实现电梯和乘客之间的相互作用。包括:InOut(Elevator &进行乘客的进出电梯活动。NewClient(Elevator &E,WQueue w52)进入新乘客。PrintStatus(Elevator &输出当前状态。Print(Elevator &E,Action a)输出电梯动作信息。具体实现:电梯类型基本操作:void InitEle(Elevator &E) int i;E.f
10、loor=1; /电梯初始停在第一层E.status=Waiting;E.Count=OverTime;E.Stage=Down;E.ClientNumber=0;for(i=0;i=Maxfloor;i+) E.CallUpi=0;E.CallDowni=0;E.CallCari=0;i+) InitStack(E.Si);Status CountOver(Elevator &E) /判断电梯计时是否完成if(E.Count) E.Count-;return FALSE;return TRUE;void DestoryEle(Elevator &E) /销毁电梯类型i+) DestroyStack(E.Si);int EleFloor(Elevator const &E) /返回电梯所在的层return E.floor;EleStatus EleStatus(Elevator const &E) return E.status;Status RequireAbove(Elevator const &E) /判断是否有高层请求for(int i=E.floor+1;i+)if(E.CallCari|E.CallDowni|E.CallUpi) return TRUE;return FALSE;Status RequireBelow(Elevator const &E) /判断是否
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1