首先,说一说我对这个题目的理解:刚刚看到这个题目时,我就觉得这不应该是最好用硬件来实现的吗。。比如说,当电梯控制超载,图形显示,传感器神马的。所以令我很茫然。由于没学过图形化编程,那就只好在输出上做文章了,想了想思路,约束条件较多,需要控制的也较复杂,先实现它基本的功能好了。
需求分析:
1.4部电梯,每个电梯的信息不同,需要根据它的信息,做出与之对应的停靠、响应
2.如何能让电梯符合日常需求,做出合理控制
3.图形显示就先让它尽量用输出表述清晰
首先需要考虑的一点是,如果要模拟电梯,过程就很重要,比如说,上楼还是下楼,哪个电梯接收指示,选择目的楼层,到达目的地等等。电梯遵循节约能源的原则,需要在相邻或比较接近的楼层停靠,这个应该是不难,看了下要求,4个电梯,停的楼层数、人数、重量都不一样,电梯如果在运行中需要显示上下箭头,如果在某个楼层停靠,那就输出个下划线好了。那运行的过程要怎样显示出来呢,有一点硬件的基础,最开始就认为是运行时间得有延迟啊,怎么办呢,如果不针对硬件,那就应该需要什么东西控制,才能明确地地看出它的运行过程,通过萌萌的队友提示,就通过输入一个数表示,如果输入的是这个数,那就输出运行一层,两层到多层。有了大概要实施的框架,就开始我们的变成之旅啦。
1.电梯楼层,上升、下降、停靠显示
把每个电梯的楼层用一个数组表示,通过上升下降实现对楼层控制,用该数组输出,上升用ascii码中码值为24的表示,下降用ascii码中码值为25的表示。
2.接人实现
首先输入上楼or下楼,等待附近空闲电梯来接,空闲电梯的标准为:如果呼叫楼层为奇数楼层,偶数楼层不参与比较差值,反之同理。比较差值的过程,在调试过程中出现了一个bug,楼层差值如Nowfloor - elevator[i],如果下楼的话,差值就变成负的了,果断取绝对值。如果电梯与呼叫楼层不相等,就一直循环执行上楼下楼操作。可以看每个楼梯停靠的过程,可由如上叙述,通过输入一个值,然后判等。如果相等,电梯层数自增或自减。
cin >> m; if (m = 'a') { elevator[a] = elevator[a] + 1; status[0] = int(24); display(a); }
区分奇、偶层,来进行电梯控制,如果判断最小值为不合适的电梯,最小值跳过,如下:
if (a % 2 != 0) { if (d % 2 == 0) { if (min >= d) min = d; } } if (d % 2 != 0) { if (a % 2 == 0) { if (min >= a) min = a; } }
3.电梯运行
空闲电梯到达后,选择目的楼层,如果在奇数电梯上,目的楼层输入偶数时,提示:该电梯不在偶数楼层停靠,反之同理。当如果有另一个人需要进入电梯时,把楼层传入数组,可以让另一个人进入电梯,电梯到达后,因为无法判断人数和体重,均采用人工输入,输入成功后,若无超载现象,即可输入目的楼层,如果不到目的楼层,一直执行upstairs(),downstairs()程序。判断如下:
for (; elevator[1] != floor;) { if (direction == 1) upstairs(1); else downstairs(1); }
因为输入时出现了格式较乱的情况,经过队友提点,学会了光标定位的方式,可以是界面变的有序。这一点在以后的编程中也可以多用到
HANDLE hOut; COORD pos = { 0,7 }; /* 光标的起始位(第1列,第3行) 0是第1列 2是第3行*/ hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos);
只能说,这次编程思路很重要,调试过程找bug比较麻烦,一步一步跟踪,总会达到目的结果
一~四号电梯分别为为奇数层、偶数层,全部层最多十人,全部层最多二十人电梯 运行截图如下:
总结:此次结对编程从分析到思路,让我体验到有助攻的好处,两个人编程确实和一个人编程不一样,因为我们需要讨论,磨合。最初因为我们平时接触不多,可能会有点小尴尬。但我的队友是一个开朗的大男生,因此在合作的过程中,就渐渐熟悉了起来。每段代码需要模块化,以前自己写的时候,基本上是一条龙的思维模式,想到哪儿,写到哪儿。知道哪里有调用,哪里要传参,不会太顾及模块化编程。而这次编程,最初可能会没思路,多一个人思考,在没思路的时候能够获得帮助。在讨论过后,以及程序编写的过程中,我也会得到一些以前没有或不懂的知识。这次编程让我初次感受到了结对编程的乐趣,希望下次能够继续体验。
最后附上一张我们的认真工作照: