电梯控制程序可能的实现思路
今天和大家聊一下,电梯控制程序可能的实现思路,聊的基本思路是,根据现象猜代码:
首先,先确定电梯程序大体采用的什么计算流程,是怎么接送乘客的?
显然是乘客先在电梯外按电梯,电梯来了开门进去按楼层,电梯到了提醒,下电梯关门,这么一个流程……
然后开始分析细节
- 除了最高和最低层外,中间的每一层都有上下两个按键,乘客按键后会发出的指令,指令不会瞬间执行完,所以指令需要存起来,所以创建一个指令集合,
- 然后分析出指令集合是什么数据结构,因为观察的现象发现,不是谁先按的先送谁也不是谁后按的先送谁,排除栈和队列,暂且先用list,
- 然后分析怎么存,两种思路,对应两种实现方式,
一是:来一个指令存一个,到一层消除一个,
另一种思路是:存所有楼层数个0,如果有到这个楼层的需求,就把楼层对应的位置元素设置为1,这里选第二种来继续 - 要有指示灯,按了楼层后,楼层指示灯常亮,正好可以用刚才的指令集合,指示灯亮不亮取决于有没有这楼层的需求
- 再然后电梯上下要记录当前状态,所以,肯定有当前楼层数这个变量
- 额外再分析出的一个不明显的逻辑,那就是当前运动方向是大前提,在这个前提下的指令会执行,其他指令等电梯到了两端返回时才执行,所以需要有【运动方向】这个变量
然后开始运行,考虑可能的场景
- 乘客按键,程序需要输入,所以电梯需要指令监听的逻辑,随时随地扫描有没有电梯内外的指令,至少是个循环去监听的,先假设是循环先用着
- 当一个方向有指令时,先改变运动方向变量,往这个方向运动着,电梯每到一层,就做以下几件事:
-
- 当前楼层数变量+1或-1,
-
- 判断要不要停,依据是到指令集合里找到当前楼层索引对应的指令,是1就停,如果停了:
播放提醒音
熄灭指示灯
开关门
- 判断要不要停,依据是到指令集合里找到当前楼层索引对应的指令,是1就停,如果停了:
-
- 再判断要上还是要下,依据是:有没有到达方向端点,所以还需要有方向端点变量,值的来源是每次按键后,遍历楼层指令找对最大或最小的层数记录下来,没达到端点就继续走
- 有种情况是:当乘客同时在电梯的上方和下方按上下键时,电梯需要判断是先上还是先下,所以命令集合的添加方法得加锁,不然不好确定运动方向变量值
- 有种紧急情况是:当乘客在某一层电梯外边按了紧急按钮时,程序需要忽略运动方向这个变量,直接朝这个紧急楼层去,所以需要有紧急楼层这个变量,而且比运动方向的判断逻辑优先级高
- 还有一些情况比如,满载电梯不停,超载电梯不走,所以需要有载重状态这个变量来控制,比如:电梯下降至10楼,但载重状态是满载,此时若在里面和外面分别按了7层和8层,程序应该有控制在7层停而8层不停的逻辑
最后聊一下改进:
- 常见的电梯不会选最优的调度方式,想了下应该是,因为电梯按键时只按了上或下键,没说要上几层或下几层,如果在外面就能确定都要去的层数的话,理论上可以算出最优的调度方法,也就是先接谁后接谁,让时间更短