【问题描述】设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体”构成的集合。虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。【基本要求】(1)模拟某校5层教学楼电梯系统。该楼有个自动电梯,能在每一层停留。5个楼曾由下至上依次称为地下层,第一层,第二层,第三层和第四层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层待命。
(2)乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
(3)模拟时钟从0开始,时间单位为0.1秒。人和电梯各种动作均要耗费一定时间单位(记为t),如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层待命。(4)按时序显示系统状态的变化过程:发生的全部人和电梯的动作序列。【测试数据】模拟时钟Time的初始值为0,终值可在500~10000范围内逐步增加。【实现提示】(1)楼层由上自下依次编号为0,1,2,3,4。每层有要求Up(上)和Down(下)的两个按钮,对应10个变量CallUp[0,4]和CallDown[0..4]。电梯内5个目标层按钮对应变量CallCar[0..4]。有人按下某个按钮时,相应的变量就置为1,一旦要求满足后,电梯就把该变量清为0。(2)电梯处于三种状态之一:GoingUp(上行)、GoingDown(下行)和Idle(停候)。如果电梯处于Idle状态且不在1层,则关门并驶回1层。在1层停留时,电梯是闭门候命。一旦收到往另一层的命令,就转入GoingUp或GoingDown状态,执行相应的操作。 (3)用变量Time表示模拟时钟,初值为0,时间单位(t)为0.1秒。其他重要的变量有:Floor---电梯的当前位置(楼层);D1---值为0,除非人们正在进入和离开电梯;D2---值为0,如果电梯已经在某层停候300t以上;D3---值为0,除非电梯门正开着又无人进出电梯;State---电梯的当前状态(GoingUp,GoingDown,Idle)。系统初始时,Floor=1,D1=D2=D3=0,State=Idle。(4)每个人从进入系统到离开称为该人在系统中的存在周期。在此周期内,他有6种可能发生的动作:(5)电梯的活动有9种:(6)当电梯须对下一个方向作出判定时,便在若干临界时刻调用Controler函数。该函数有以下要点:C1.[需要判断?]若State≠Idle,则返回。C2.[应该开门?]如果电梯处于E1且CallUp[1],CallDown[1]或CallCar[1]非0,则预置20个t后启动E3,并返回。C3.[有按钮按下?]找最小的j≠Floor,使得CallUp[j],CallDown[j]或CallCar[j]非0,并转到C4。但如果不存在这样的j,那么,如果Controler正为E6所调用,则置j为,否则返回。C4.[置State]如果Floor>j,则置State为GoingDown;如果Floor<j,则置State为GoingUp。C5.[电梯静止?]如果电梯处于E1而且j≠1,则预置20个t后启动E6,返回。(7)由上可见,关键是按时序管理系统中所有乘客和电梯的动作设计合适的数据结构。