软工第四次作业——结对编程二

一、结对编程作业要求

本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。

  • (1)我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:

    • 能够自动生成四则运算练习题
    • 可以定制题目数量
    • 用户可以选择运算符
    • 用户设置最大数(如十以内、百以内等)
    • 用户选择是否有括号、是否有小数
    • 用户选择输出方式(如输出到文件、打印机等)
    • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
  • (2)现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下:

    • 楼层号为0~20,其中0号为地下一层
    • 有楼层限制的电梯不在相应楼层停靠,如单双层
    • 所有电梯采用统一按钮控制
    • 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了。
    电梯编号 可服务楼层 最大乘客数量 最大载重量
    1 全部楼层 10 800 kg
    2 单层 10 800 kg
    3 双层 10 800 kg
    4 全部楼层 20 200 kg

经过队内讨论,最终我们选择的了第二个题目——电梯控制系统来完成。

领航员:祁萁 驾驶员:易成辉

二、代码分析

  • 根据题目的要求,我们首先需要设置一些变量:上下楼(choose)、乘客所在楼层(Layer)、电梯编号(elevatorNum)、乘坐人数(passengers)、乘客总重量(totalWeight)、要去的楼层(floor)。详细代码如下所示:

		    Scanner scan0 = new Scanner(System.in);
             	    System.out.println("请选择上下楼(上楼:up 下楼:down):");
		    String choose = scan0.nextLine();
		    Scanner scan1 = new Scanner(System.in);
		    System.out.println("请输入所在楼层:");
		    int Layer = scan1.nextInt();
		    Elevator = Choose(Layer,ElevatorLayer);
		    System.out.println("请选择你要乘坐的电梯:");
		    int elevatorNum = scan1.nextInt();
		    System.out.println("请输入乘坐人数:");
		    int passengers = scan1.nextInt();
		    System.out.println("请输入乘坐者的总重量(单位:kg):");
		    int totalWeight = scan1.nextInt();
	            System.out.println("请输入要去的楼层:");
		    int floor = scan1.nextInt();

  • 另外,我们还需要对当前电梯所在层进行判断,以便于进行一个最短路径的求解。详细代码如下所示:

	//找到离乘客所在楼层最近的电梯以供乘客选择
	public static int Choose(int layer,int[] E) 
	{
		//定义一个数组来保存电梯所在层和乘客之间的距离
		int[] min = new int[5];
		min[0] = E[1] - layer;
		if(min[0] < 0)
			min[0] = -min[0];
		min[1] = min[0];
		
		for(int i = 2;i < 5;i ++) 
		{
			min[i] = E[i] - layer;
			if(min[i] <= 0) 
				min[i] = -min[i];
			if(min[0] > min[i])
				min[0] = min[i];
		}
		//可能有多部电梯都里乘客最近,可以有多重选择
		for(int i = 1;i < 5;i ++) 
		{
			if(min[i] == min[0])
				System.out.println("你可以选择乘坐"+ i + "号电梯!");
		}
		return 0;
	}
  • 最近电梯算法流程图

  • 因为每一部电梯都有一些参数和其他电梯不同,所以在乘客选择电梯后,还要针对乘客的相关设置是否在所选电梯的规格之内,而且,不同的电梯也有不同的规格,也就是说,我们需要分别对不同电梯进行判断。(这段代码有点长,就不单独拿出来了,详见程序清单)

  • 电梯算法流程图

注:流程图中n为电梯的最大载客量,m为电梯的最大载重量

  • 代码coding地址

电梯控制系统

三、运行效果



程序清单

/**
*@项目名称: ${Elevator Control System}
*@文件名称: ${ElevatorControlSystem2}
*@author 易成辉
*@Date: ${2018.04.14}
*/
package elevatorcontrolsystem;

import java.util.Scanner;

public class ElevatorControlSystem2 
{
	//找到离乘客所在楼层最近的电梯以供乘客选择
	public static int Choose(int layer,int[] E) 
	{
		//定义一个数组来保存电梯所在层和乘客之间的距离
		int[] min = new int[5];
		min[0] = E[1] - layer;
		if(min[0] < 0)
			min[0] = -min[0];
		min[1] = min[0];
		
		for(int i = 2;i < 5;i ++) 
		{
			min[i] = E[i] - layer;
			if(min[i] <= 0) 
				min[i] = -min[i];
			if(min[0] > min[i])
				min[0] = min[i];
		}
		//可能有多部电梯都里乘客最近,可以有多重选择
		for(int i = 1;i < 5;i ++) 
		{
			if(min[i] == min[0])
				System.out.println("你可以选择乘坐"+ i + "号电梯!");
		}
		return 0;
	}
	
	public static int GetElevator(int ElevatorNum, int Passengers, int TotolWeight, int Floor ) 
	{
		int Finish = 0;
		//乘坐1号电梯
	    if(ElevatorNum == 1)
	    {
	    	//人数超载
	    	if(Passengers > 10)
		    {
	    		Passengers = Passengers - 10;
			    System.out.println("人数超载,请下去"+ Passengers +"人!");
		    }
	    	//重量超载
	    	else if(TotolWeight > 800)
	    		System.out.println("重量超载,本电梯载重800kg,请根据情况下去适当人数!");
	    	//楼层超出范围
		    else if(Floor > 20 || Floor < 0)
		    	System.out.println("抱歉,电梯只能通往0-20层!");
		    else
		    {
		    	System.out.println("欢迎乘坐本次电梯,你已到达"+ Floor +"层!");
		    	Finish = 1;
		    }
    	}
	    
	    //乘坐2号电梯
	    else if(ElevatorNum == 2)
	    {
	    	//人数超载
	    	if(Passengers > 10)
		    {
	    		Passengers = Passengers - 10;
			    System.out.println("人数超载,请下去"+ Passengers +"人!");
		    }
	    	//重量超载
	    	else if(TotolWeight > 800)
	    		System.out.println("重量超载,本电梯载重800kg,请根据情况下去适当人数!");
	    	//楼层超出范围
		    else if(Floor > 20 || Floor < 0)
		    	System.out.println("抱歉,电梯只能通往0-20层!");
	    	//选择了去双数楼层
		    else if(Floor%2 == 0)
		    	System.out.println("抱歉,"+ ElevatorNum +"号电梯只能通往单数楼层,请换乘其他号电梯!");
		    else
		    {
		    	System.out.println("欢迎乘坐本次电梯,你已到达"+ Floor +"层!");
		    	Finish = 1;
		    }
	    }
	    
	    //乘坐3号电梯
	    else if(ElevatorNum == 3)
	    {
	    	//人数超载
	    	if(Passengers > 10)
		    {
	    		Passengers = Passengers - 10;
			    System.out.println("人数超载,请下去"+ Passengers +"人!");
		    }
	    	//重量超载
	    	else if(TotolWeight > 800)
	    		System.out.println("重量超载,本电梯载重800kg,请根据情况下去适当人数!");
	    	//楼层超出范围
		    else if(Floor > 20 || Floor < 0)
		    	System.out.println("抱歉,电梯只能通往0-20层!");
	    	//选择了去单数楼层
		    else if(Floor%2 == 1)
		    	System.out.println("抱歉,"+ ElevatorNum +"号电梯只能通往双数楼层,请换乘其他号电梯!");
		    else
		    {
		    	System.out.println("欢迎乘坐本次电梯,你已到达"+ Floor +"层!");
		    	Finish = 1;
		    }		
	    }
	    
	    //乘坐4号电梯
	    else if(ElevatorNum == 4)
	    {
	    	//人数超载
	    	if(Passengers > 20)
		    {
	    		Passengers = Passengers - 20;
			    System.out.println("人数超载,请下去"+ Passengers +"人!");
		    }
	    	//重量超载
	    	else if(TotolWeight > 200)
	    		System.out.println("重量超载,本电梯载重800kg,请根据情况下去适当人数!");
	    	//楼层超出范围
		    else if(Floor > 20 || Floor < 0)
		    	System.out.println("抱歉,电梯只能通往0-20层!");
		    else
		    {
		    	System.out.println("欢迎乘坐本次电梯,你已到达"+ Floor +"层!");
		    	Finish = 1;
		    }
	    }
	    
	    //选择其他电梯(电梯编号写错)
	    else
	    	System.out.println("抱歉,没有"+ ElevatorNum +"号电梯,请重新选择!");
	    return Finish;
	}
	
	public static void main(String[] args)
	{
		int Elevator = 0;
		//为了能够多次完整输入测试用例而设的一个输入量,相当于电梯启动,并没什么用,输入一个空格然后敲回车就行
		Scanner scan = new Scanner(System.in);
		//电梯初态
		int[] ElevatorLayer = {0,0,0,0,0};
		//输入要进行的操作    
		while(scan.hasNextLine())
		{
			for(int i = 1;i < 5;i ++) 
			{
				System.out.println(i+ "号电梯现在在:" +ElevatorLayer[i]+"层");
			}
			Scanner scan0 = new Scanner(System.in);
			System.out.println("请选择上下楼(上楼:up 下楼:down):");
		    String choose = scan0.nextLine();
		    Scanner scan1 = new Scanner(System.in);
		    System.out.println("请输入所在楼层:");
		    int Layer = scan1.nextInt();
		    Elevator = Choose(Layer,ElevatorLayer);
		    System.out.println("请选择你要乘坐的电梯:");
			int elevatorNum = scan1.nextInt();
		    System.out.println("请输入乘坐人数:");
			int passengers = scan1.nextInt();
			System.out.println("请输入乘坐者的总重量(单位:kg):");
			int totalWeight = scan1.nextInt();
			System.out.println("请输入要去的楼层:");
			int floor = scan1.nextInt();
			ElevatorControlSystem2 Ele = new ElevatorControlSystem2();
			Elevator = Ele.GetElevator(elevatorNum, passengers, totalWeight, floor);
			if(Elevator == 1)
				ElevatorLayer[elevatorNum] = floor;
			System.out.println();
		}
	}
}

四、总结

  • 嗯,首先,肯定是对我的partner的工作的肯定了。相对于我来说,她的工作是相当认真的了,不但对我的代码进行了很透彻的分析,还指出了我在算法构思上的很多漏洞,在我写代码的时候给了我很大的支持,并且在与之讨论的时候,经常恰到好处的提出自己的想法,让我在构思上更加完善,虽然最后还是有很多地方没能够改正过来,但是还是很感谢我的领航员祁大姐的。

  • 其次是感谢其在我代码风格上的帮助。相信不止我一个吧,很多同学目前在写代码的时候都是不喜欢写注释的,然后命名也是随自己的意愿,想怎么写就怎么写,但是这种写法是非常不符合代码规范的,会对别人理解你的代码造成很多困难。在我的partner的提醒和帮助下(个人英语很渣),很顺利的完成了和代码相关的命名,比如乘客所在楼层(Layer)、电梯编号(elevatorNum)、乘客总重量(totalWeight)。另外,还帮助我纠正了一些代码排版上的问题以及对相关代码进行注释的工作。

  • 最后,还是要指出一些自己的不足之处,首先是没能够将代码进行可视化处理,个人目前对eclipse的windowbuilder插件还不是很了解;其次是自己在算法上还有很大的不足,对于partner提出的一些算法上的bug没能够给完善,真的是有愧于partner的辛苦工作啊;再有就是不得不吐槽一下自己的代码风格了,真的可以说是很烂了。在最后的最后,还是要再次感谢祁大姐的认真负责,给与了我很大的帮助。

原文地址:https://www.cnblogs.com/ych123123/p/8856176.html