结对编程第二次作业
四部电梯的统一控制
题目要求:
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
驾驶员:熊星(本人)
领航员:敖贵
题目2:
- 楼层号为0~20,其中0号为地下一层
- 有楼层限制的电梯不在相应楼层停靠,如单双层
- 所有电梯采用统一按钮控制
- 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了。
-
软件设计流程
一、使用工具以及选择语言
Eclipse开发工具 JAVA语言二、需求阶段
要求乘客乘坐电梯时选择最优解 (1)统一按钮控制,每层楼的总布局由21个楼层按钮控制(0~20),有上下两个按钮。 (2)单层电梯不在双数楼层停靠,不响应前往双数楼层。 (3)双层电梯不在单数楼层停靠,不响应前往单数楼层。 (4)在所有电梯都处于停靠的状态下,选择距离乘客最近的电梯进行响应。 (5)在先考虑同方向或者停止运行的且正往乘客所处楼层停靠的电梯中,选择距离最短的电梯响应。 (6)如若所有电梯都与乘客要前往的楼层反向(电梯状态都不为STOP),选择在较高楼层的电梯进行响应(为了尽量让所有电梯都能由底层到高层再由高层向底层循环,让电梯的效率更高)。 (7)电梯先选择最优解在乘客楼层停靠,当乘客人数或乘客总重量超过该电梯的总承重的情况下,进行电梯响应报警,提示等待下一趟电梯。三、设计阶段
(1)采用JAVA的awt 和Swing进行界面开发,一开始很难入手,循序渐进就好。由于自身能力不足,无法全部实现全部界面的设计,只制作了几个简单的UI界面。四、开发阶段
(1)由于四个电梯的属性有共同点和特殊点,一开始想写出Elevator父类,以及四个继承父类的子类elevator1~4;后来觉得没有多大必要,这些特性完全可以经由父类里的方法进行筛选以及判断就能实现。 其中主要的属性为状态condition(DOWN,STOP,UP三种),当前楼层currentpose。 ``` public class Elevator { private int condition;//电梯状态 private int currentpose;//电梯当前位置 private int weight_limit;//电梯限重 private int number_limit;//电梯限数 } ``` (2)接着就是乘客类(people类),乘客类主要有四个属性,状态condition,所在楼层location,目的楼层Goto,重量quality,数量amount其中condition可以由后两个属性计算得到,其他的都需要进行提前设置。 ``` public class People { private int location;//所在位置 private int Goto; //前往第几层 private boolean condition;//上下楼标记 private int people_count;//总人数 private int quality;//总重量 } ``` (3)进行电梯选择最优解的判断,这里先对能到达的电梯进行筛选具体方法由下列部分代码给出,再对筛选后的电梯进行距离测量以及需求分析判断,主要思路在需求阶段已经阐述明白,在进行超重判断。 ``` if(people.get_condition()){ if(elevator1.get_currentpose() <= people.get_location()&&(elevator1.get_conditionvalue()==1||elevator1.get_conditionvalue()==0)) { a[1]=people.get_location()-elevator1.get_currentpose(); }else{ b[1]=elevator1.get_currentpose()-people.get_location(); } ///// if(elevator2.get_currentpose()<=people.get_location()&&(elevator2.get_conditionvalue()==1||elevator2.get_conditionvalue()==0)) { a[2]=people.get_location()-elevator2.get_currentpose(); }else{ b[2]=elevator2.get_currentpose()-people.get_location(); } //// if(elevator4.get_currentpose()<=people.get_location()&&(elevator4.get_conditionvalue()==1||elevator4.get_conditionvalue()==0)) { a[4]=people.get_location()-elevator4.get_currentpose(); }else{ b[4]=elevator4.get_currentpose()-people.get_location(); } //// Mapmap = new HashMap (); int k1 = Math.min(Math.min(a[1],a[2]),Math.min(a[3], a[4])); int k2 = Math.min(Math.min(b[1],b[2]),Math.min(b[3], b[4])); if(k1<50) { map.put("elevator1",a[1]); map.put("elevator2",a[2]); map.put("elevator4",a[4]); int value=k1; String key=""; for (Map.Entry<String, Integer> entry : map.entrySet()) { if(value==entry.getValue()){ key=entry.getKey(); } } System.out.println(key+"即将到达");(4)对电梯对象和乘客对象的设置进行异常捕捉处理(Exception),以下为部分代码展示。public void peopleset(People people){
Scanner scanner = new Scanner(System.in);
String loc = scanner.nextLine();
try{
people.location = Integer.parseInt(loc);
}catch (Exception e) {
System.out.println("乘客楼层设置报错");
}finally {
}}###五、测试阶段 主要部分由我的领航员完成。 <img src="https://images2018.cnblogs.com/blog/1349158/201804/1349158-20180415212149795-1700528230.jpg" width = "700" height = "500" alt="图片名称" align=center /> ###六、总结 </td> 其实写出主要程序代码并不难,难的是做出界面效果,这对于java图形化界面小白的我来说,难受的很啊,真是后很当初选Eclipse用java来写,一点都不高效。所以就拖延了很久,也是不停的通过网上找资料和java UI视频学习才get到了新技能,过程真是一言难尽。当然,其中领航员的作用也功不可没,我们俩在开始选题前就做了各种想法探讨,以及功能的实现难易。最终选择了题目2。我觉得对于任何一件新上手的事情,都是很难一蹴而就的,你需要有耐心有毅力去坚持它,才能逐步的取得一定的进步以及成果,就比如这次的结对编程,让我充实对java语言的掌握度,各种类的继承,类方法的调用以及异常处理的用法,其次便是对 java UI 图形界面的一定了解,虽然很复杂,但是还是坚持了下来。java awt以及 Swing 图形界面绘制方面是个比较难上手的技能,也正是这一点让我得到了很多启发,以后尽量选择更容易上手的开发工具比如Android studio或者xcode工具进行开发。 总的来说,这次软件工程结对编程作业我受益良多。在寝室捣鼓了好几天后才顺利完成程序的基本功能,唯一的遗憾就是界面显示没有完善。 最后附上合照一张 <img src="https://images2018.cnblogs.com/blog/1349158/201804/1349158-20180415220534652-1803686350.jpg" width = "700" height = "500" alt="图片名称" align=center /> ####代码地址:[Github] (https://github.com/supremexiongxing/project/tree/master/ElevatorControl)
| 电梯编号 | 可服务楼层 | 最大乘客数量 | 最大载重量 |
|---|---|---|---|
| 1 | 全部楼层 | 10 | 800 kg |
| 2 | 单层 | 10 | 800 kg |
| 3 | 双层 | 10 | 800 kg |
| 4 | 全部楼层 | 20 | 200 kg |
浙公网安备 33010602011771号