【c++】电梯调度程序 源码 - 载客电梯10部(用EO-E9 标识)

原题

问题域概述

某国际展览中心共40层,设有载客电梯10部(用EO-E9 标识)

限定条件

(1)电梯的运行规则是:
E0、E1:可到达每层。
E2、E3:可到达1、25-40 层。
E4、E5:可到达1-25层。
E6、E7:可到达1、2-40 层中的偶数层
E8、E9:可到达1-39 层中的奇数层。
(2)每部电梯的最大桑员量均为 人(K 值可以根据仿真情况在 10-18 人之间确定)。
(3)仿真开始时,各电梯随机地处于其符合运行规则的任意一层,为空梯
(4)仿真开始后有N人(0<N<1000)在M分钟(0M<10)内随机地到达该国际展览中心的1层,开始乘梯活动。
(5)每位乘客初次所要到达的楼层是随机的,令其在合适的电梯处等待电梯到来
(6)每位乘客乘坐合适的电梯到达指定楼层后,随机地停留 10-120 秒后,再随机地去往另一楼层,依此类推,当每人乘坐过L次(每人的值不同在产生乘客时随机地在1-10次之间确定)电梯后,第L+1 次为下至底层并结束乘梯行为。到所有乘客结束梯行为时本次仿真结束。
(7)电梯运行速度为S秒/层(S 值可以根据仿真情况在1-5之间定)每人上下时间为T秒(T值可以根据仿真情况在2-10之间确定)
(8)电梯运行的方向由先发出请求者决定,不允许后发出请求者改变电梯的当前运行方向除非是未被请求的空梯。
(9) 当某层有乘客按下乘梯电钮时,优先考虑离该层最近的、满足条件(8)、能够最快到达目标层的电梯。
(10)不许电梯超员

开发结果的行为特征

(1)产生事件的周期为1秒,每次可产生0个或多个事件
(2)各随机事件由互不相关的伪随机数发生器决定
(3)设计一个易于理解的界面,动态显示各梯的载客与运行情况,动态显示各楼层的人员停留情况与要求桑梯情况;动态显示从仿真开始到目前的时间。
(4)显示时用应表示出不同的乘客及其当前所要求去往的楼层。例如,12-32表示标识为12的乘客要求去往32 层。
(5)统计各梯的运行与空闲时间;统计各人发出乘梯要求后的等待时间;仿真结束后显示这些时间。
(6) 参数K、N、M、ST应从命行输入
(7)(选做)考虑有些乘客(随机决定)携带的物品体积较大,需占用1-2人的电梯空间(随机决定),且上下梯的时间比其他乘客长一倍的情况,再进行相应的仿真(注意,不是所有的乘客都携带较大体积)

注意:界面能说明问题即可,切忌把主要精力放在界面上而忽视了实质问题

可能有些同学面临的问题是如何既要计时、又要改变相关对象的状态、还要展示出当前所有对象的相关状态。实际上,完全可以用串行方式来模拟并发的活动。建议大家想象一下动画片的原理:将多个固定和静止的画面定时、按顺序地放映出来,就变成了活动的画面。所以,可以在程序中定义一个主循环,在该循环外进行必要的初始化,进入后每秒钟执行次,以遍历方式一一激励当前已经产生的对象,由它们根据自己的当前状态和相关的状态变化规则,决定是否需要改变、改变成什么样的下状态,以及按照上述行为特征的设计展示必要的对象状态。

源码

界面展示

界面实现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++源代码 注重类的交互 片段 #include using namespace std; #include "elevator.h" //Elevator class definition #include "person.h" //Person class definition #include "floor.h" //Floor class definition //constants that represent time required to travel //between floors and direction of the elevator const int Elevator::ELEVATOR_TRAVEL_TIME = 5; const int Elevator::UP = 0; const int Elevator::DOWN = 1; //constructor Elevator::Elevator( Floor &firstFloor, Floor &secondFloor) : elevatorButton( * this ), currentBuildingClockTime( 0 ), moving( false ), direction( UP ), currentFloor( Floor::FLOOR1 ), arrivalTime( 0 ), floor1NeedsService( false ), floor2NeedsService( false ), floor1Ref( firstFloor ), floor2Ref( secondFloor ), passengerPtr( 0 ) { cout << "elevator constrcuted" <<endl; }// end Elevator constructor //destructor Elevator::~Elevator() { delete passengerPtr; cout << "elevator destructed" << endl; }//end Elevator destructor //give time to elevator void Elevator::processTime( int time ) { currentBuildingClockTime = time; if ( moving ) //elevator is moving processPossibleArrival(); else processPossibleDeparture(); if ( !moving ) cout << "elevator at rest on floor " << currentFloor << endl; }// end function processTime // when elevator is moving, determine if it should stop void Elevator::processPossibleArrival() { //if elevator arrives at destination floor if ( currentBuildingClockTime == arrivalTime ) { currentFloor = ( currentFloor == Floor::FLOOR1 ? Floor::FLOOR2 : Floor::FLOOR1); //update current floor direction = ( currentFloor == Floor::FLOOR1 ? UP : DOWN ); //update direction cout << "elevator arrives on floor " << currentFloor <<endl; // process arrival at currentFloor arriveAtFloor( currentFloor == Floor::FLOOR1 ? floor1Ref : floor2Ref); return; }//end if //elevator still moving cout << "elevator moving " << ( direction == UP ? "UP" : "DOWN"

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值