数据结构课程设计 电梯模拟

电梯模拟

问题描述

  设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是乘客和电梯等“活动体“构成的集合,虽然他们彼此交互作用,但他们的行为是基本独立的。在离散的模拟中,以模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一时刻。
【基本要求】

  1. 模拟某校五层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留。五个楼层由下至上依次称为地下层、第→层、第二层、第三层和第四层,其中第一层是大楼的迸出层,即是电梯的“本垒层“,电梯“空闲“时,将来到该层候命。
  2. 乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
  3. 模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要耗费一定的时间单位(简记为t),比如:
    有人进出时,电梯每隔40t测试一次,若无人进出,则关门;
    关门和开门各需要20g
    每个人进出电梯均需要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 ——电梯的当前位置(楼层);
    DI ——值为0,除非人们正在进入和离开电梯;
    D2 ——值为0,如果电梯已经在某层停候30Ot以上;
    D3 ——值为0,除非电梯门正开着又无人迸出电梯;
    State ——电梯的当前状态(GoingUp,GoingDOWEl,Idle)。
    系统初始时,Floor=1,Dl=D2=D3=0,State=Idle。

  4. 每个人从进入系统到离开称为该人在系统中的存在周期。在此周期内,他有6种可能发生的动作:
    M1. [进入系统,为下一人的出现作准备]产生以下数值:
    InFloor ——该人进入哪层楼;
    OutFloor ——他要去哪层楼;
    GiveupTime ——他能容忍的等候时间;
    InterTime ——下一人出现的时间间隔,据此系统预置下一人进入系统的时刻。
    M2. [按电钮并等候]此时应对以下不同情况作不同的处理:
    ①Floor=InFloor且电梯的下一个活动是E6(电梯在本层,但正在关门〉;
    ②Floor=InFloor且D3不等于0(电梯在本层,正有人迸出);
    ③其他情况,可能D2=0或电梯处于活动El(在1层停候)。

    M3. [进入排队]在等候队列Queue[InFloor]末尾插入该人,并预置在GiveupTime个t之后,他若仍在队列中将实施动作M4。
    M4. [放弃]如果Floor不等于InFloor或D1=0,则从Queue[InFloor]和系统删除该人。如果Floor=InFloor且D1不等于0,他就继续等候(他知道马上就可进入电梯〉。
    M5. [进入电梯]从Queue[InFloor〕删除该人,并把他插入到lElevator(电梯)校中。置CallCar[011tFloor]为1。
    M6. [离去]从Elevator和系统删除该人。

  5. 电梯的活动有9种:

    E1. [在1层停候]若有人按下一个按钮,则调用Controler将电梯转入活动E3或E60。
    E2. [要改变状态?]如果电梯处于GoingUp(或GoingDown〉状态,但该方向的楼层却无人等待,则要看反方向楼层是否有人等候,而决定置State为GoingDown(或GoingUp〉还是Idle。
    E3. [开门]置DI和D2为非0值,预置300个t后启动活动E9和76个t后启动E5,然后预置20个t后转到目。
    E4. [让人出入]如果Elevator不空且有人的011tFloor=Floor,则按进入的倒序每隔25个t让这类人立即转到他们的动作M6。Elevator中不再有要离开的人时,如果Queue[Floor]不空,则以25个t的速度让他们依次转到MLQueue[Floor]空时,置Dl为0,D3手0,而且等候某个其他活动的到来。
    E5. [关门]每隔40个t检查D1,直到是D1=O(若D1不等于0,则仍有人出入〉。置D3为0并预置电梯再20个t后启动活动E6(再关门期间,若有人到来,则如M2所述,门再次打开)。
    E6. [准备移动]置Caucar[Floor]为0,而且若State手GoingDown,则置CallUP
    CFloor]为05若State手GoingUp,则置CallDownCFloor]为0。调用Controler函数。
    如果State=Idle,则即使已经执行了Controler,也转到E1。否则,如果D2不等于0,则取消电梯活动E9。最后,如果State=GoingUp,则预置15个t后(电梯加速〉转到E7;如果State=GoingDown,则预置15个t后(电梯加速)转到E8。
    E7. [上升一层]置Floor加1并等候51个人如果现在CallCar[Floor〕=1或CallUp[Floor]=1,或者如果((Floor=1或CallDOWEl[Floor]=1)且CallUp[j]=CallDOWEl[j]=CallCar[j]=0对于所有j>Floor),则预置14个t后(减速)转到E2;否则重复E7。
    E8. [下降一层]除了方向相反之外,与E7类似,但那里的51和14个t,此时分别改为61和23个t(电梯下降比上升慢)。
    E9. [置不活动指示器]置D2为0并调用Controler函数(E9是由E3预置的,但几乎总是被E6取消了训。

  6. 当电梯须对下一个方向作出判定时,便在若干临界时刻调用Controler函数。该 函数有以下要点:

    C1. [需要判断?]若State不等于Idle,则返回。
    C2. [应该开门?]如果电梯处于E1且CallUp[1],CallDown[1]或CallCar[1]非0,则
    预置20个t后启动E3,并返回。
    C3. [有按钮按下?]找最小的j不等于Floor,使得CallUp[j],Calldown〔j]或Caucar[j]非0,并转到C4。但如果不存在这样的j,那么,如果Controler正为E6所调用,则置j为1,否则返回。
    C4. [置State]如果Floor>j,则置State为GoingDOWEl;如果Floor<j,则置State为
    GoingUp。
    C5. [电梯静止?]如果电梯处于E1而且j不等于1,则预置20个t后启动E6。返回。

  7. 由上可见,关键是按时序管理系统中所有乘客和电梯的动作设计合适的数据结构。

功能模块结构

  电梯模拟由三大功能模块组成:乘客模块,电梯模块,时序模块。其中,乘客模块包括:加入乘客,乘客进入电梯,乘客离开电梯,乘客放弃等候,乘客加入上升队列,乘客加入下降队列;电梯模块包括:电梯上升,电梯下降,电梯开门,电梯关门,电梯加减速,电梯停下;时序模块包括:加入时序操作。
具体如下图:
在这里插入图片描述

程序结构(流程图)

电梯模拟(moni函数)流程图:

在这里插入图片描述

电梯控制(Controler函数)流程图:

在这里插入图片描述

加入新乘客(input函数)流程图
在这里插入图片描述

乘客进入电梯(peoplein函数)流程图

在这里插入图片描述

乘客走出电梯(peopleout函数)流程图

在这里插入图片描述
电梯获取下步指令(getWhere函数)流程图
在这里插入图片描述

试验结果(包括输入数据和输出结果)

初始界面:
在这里插入图片描述
添加新乘客界面:
在这里插入图片描述
电梯模拟运行界面:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

电梯模拟

  • 31
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值