zoukankan      html  css  js  c++  java
  • 基于Java的电梯系统

    一、思路

    写一个简单的电梯系统,首先根据老师提供的需求,写一下基础思路:

    1. 电梯有最高层和最低层,输入数字选择正确楼层数
    2. 输入数字大于当前楼层,则为上行;小于当前楼层,则为下行
    3. 每次输入数字的时候,需要对同为上行的数字或者同为下行的数字,进行排序
    4. 所输入的目标楼层用集合存放,循环最低层到最高层,如果当前层在集合中存在,显示开门,若还有目标楼层,则关门,继续到下一目标楼层。
    5. 当选择一个目标楼层,会生成随机重量记录在目标楼层,上行用原来重量加上目标楼层重量,下行则用原来重量减去目标楼层重量

    二、实现

       2.1 电梯类

      1 package Ele;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Collections;
      5 import java.util.Iterator;
      6 import java.util.List;
      7 import java.util.Random;
      8 
      9 public class Elevator {
     10     private List<Integer> upFloorList = new ArrayList<Integer>();       // 上升楼层
     11     private List<Integer> downFloorList = new ArrayList<Integer>();     // 下降楼层
     12     private int[] storeyWeight; // 目标层重量
     13     private int capacity;       // 电梯最大重量
     14     private int topFloor;       // 电梯最高层
     15     private int bottomFloor;    // 电梯最底层
     16     private int nowFloor = 1;   // 当前层
     17 
     18     public Elevator(int bottomFloor, int topFloor, int capacity) { //有参构造方法
     19         this.topFloor = topFloor;
     20         this.bottomFloor = bottomFloor;
     21         this.capacity = capacity;
     22 
     23         // 当前楼层减最低层,就是当前层重量的下标 假如当前楼层为5楼,5楼下标就是 5-1 = 4
     24         // 初始化目标楼层重量,数组大小 = 最高层 - 最低层 + 1
     25         storeyWeight = new int[(topFloor - bottomFloor + 1)];
     26     }
     27 
     28     // 设置楼层
     29     public void SetFloor(int floorNum) {
     30         //如果 所选楼层 与 所在楼层 相同,则提示
     31         if (floorNum == nowFloor) {
     32             System.out.println("请选择其它楼层");
     33             return;
     34         }
     35 
     36         // 生成90-500之间的随机重量
     37         Random random = new Random();
     38         int thisFloorWeight = random.nextInt(500 - 90 + 1) + 90;
     39 
     40         int sum = 0;
     41         //目标楼层增加的重量
     42         for (int i = 0; i < storeyWeight.length; i++) {
     43             sum += storeyWeight[i];
     44         }
     45         //原重量+增加重量=当前重量
     46         System.out.println("选择" + floorNum + "楼乘客重量:" + thisFloorWeight + ",此时总重:" + (sum + thisFloorWeight));
     47 
     48         // 如果 目标楼层总重量 > 最大重量,提示
     49         if (sum + thisFloorWeight > this.capacity) {
     50             System.out.println("超重了哟");
     51             return;
     52         }
     53 
     54         // 当前输入楼层重量加上该楼层新增加重量 后的重量
     55         storeyWeight[floorNum - bottomFloor] += thisFloorWeight;
     56 
     57         //如果输入楼层数 已经在上升或下降楼层的集合中,则只新增重量,不添加楼层
     58         if (!upFloorList.contains(floorNum) && !downFloorList.contains(floorNum)) {
     59             if (floorNum > nowFloor) {
     60                 upFloorList.add(floorNum);
     61 
     62                 // 上升楼层升序排序
     63                 Collections.sort(upFloorList);
     64 
     65             } else {
     66                 downFloorList.add(floorNum);
     67 
     68                 // 下降楼层降序排序
     69                 downFloorList.sort(Collections.reverseOrder());
     70             }
     71         }
     72     }
     73 
     74     // 上升:从所在层到所选楼层中的最高层
     75     // 下降:从所在层到所选楼层中的最低层
     76     // 获得集合中最后一个元素:list.get(list.size()-1);
     77 
     78     // 启动电梯
     79     public void StartElevator() throws InterruptedException {
     80         System.out.println("当前为 < " + nowFloor + " > 楼");
     81         // 上行
     82         if (upFloorList.size() > 0) {
     83             System.out.println("---电梯上行---");
     84             for (int i = nowFloor + 1; i <= upFloorList.get(upFloorList.size() - 1); i++) {
     85                 Thread.sleep(500);
     86                 System.out.println("----" + i + "楼---");
     87                 if (upFloorList.contains(i)) {
     88                     System.out.println("---☆开门☆---");
     89                     nowFloor = i;
     90                     upFloorList.remove(upFloorList.indexOf(i));
     91                     storeyWeight[i - bottomFloor] = 0;
     92 
     93                     if (upFloorList.size() > 0) {
     94                         System.out.print("剩余所选楼层为:");
     95                         Iterator it = upFloorList.iterator();
     96                         while (it.hasNext()) {
     97                             int floor = (int) it.next();
     98                             System.out.print(floor + "楼  重量为 " + storeyWeight[floor - bottomFloor] + ";  ");
     99                         }
    100                         System.out.println();
    101                     }
    102                     return;
    103                 }
    104             }
    105         }
    106 
    107         // 下行
    108         if (downFloorList.size() > 0) {
    109             System.out.println("---电梯下行---");
    110             for (int i = nowFloor - 1; i >= bottomFloor; i--) {
    111                 Thread.sleep(500);
    112                 System.out.println("----" + i + "楼---");
    113                 if (downFloorList.contains(i)) {
    114                     System.out.println("---☆开门☆---");
    115                     nowFloor = i;
    116                     downFloorList.remove(downFloorList.indexOf(i));
    117                     storeyWeight[i - bottomFloor] = 0;
    118                     if (downFloorList.size() > 0) {
    119                         System.out.print("剩余所选楼层为:");
    120                         Iterator it = downFloorList.iterator();
    121                         while (it.hasNext()) {
    122                             int floor = (int) it.next();
    123                             System.out.print(floor + "楼  重量为 " + storeyWeight[floor - bottomFloor] + ";  ");
    124                         }
    125                         System.out.println();
    126                     }
    127                     return;
    128                 }
    129             }
    130         }
    131         System.out.println("无客");
    132 
    133     }
    134 }

       2.2 程序入口

     1 package com.company;
     2 
     3 
     4 import Ele.Elevator;
     5 
     6 import java.util.Scanner;
     7 
     8 public class Main {
     9 
    10     public static void main(String[] args) throws InterruptedException {
    11         // 创建一个电梯
    12         int bottomFloor = 1;    // 最低层1楼
    13         int topFloor = 12;      // 最高层12楼
    14         int capacity = 1000;    // 最大承重1000
    15         Elevator elvator = new Elevator(bottomFloor, topFloor, capacity);
    16 
    17         System.out.println("当前电梯可选择" + bottomFloor + "-" + topFloor + "层,请选择楼层数(输入-1表示关闭电梯门):");
    18 
    19         //输入内容
    20         Scanner scanner = new Scanner(System.in);
    21         while (scanner.hasNextLine()) {
    22             //如果输入不是数字,提示后,再次输入
    23             if (!scanner.hasNextInt()) {
    24                 System.out.println("请输入数字!");
    25                 scanner.next();
    26             }
    27 
    28             //输入是数字则进行以下操作
    29             else {
    30                 int num = scanner.nextInt();
    31                 //若输入数字为-1,意为结束输入,启动电梯
    32                 if (num == -1) {
    33                     System.out.println("------------------------");
    34                     System.out.println("电梯门关闭,开始启动");
    35                     elvator.StartElevator();
    36                 } else if (num > topFloor || num < bottomFloor || num == 0) {
    37                     //若输入数字不符合楼层数,则提示并再次输入
    38                     System.out.println("请选择" + bottomFloor + "-" + topFloor + "层");
    39                 } else {
    40                     elvator.SetFloor(num);
    41                 }
    42             }
    43         }
    44     }
    45 }

    三、展示

     1. 乘客选择楼层,输入-1表示结束选择。(乘客重量为随机产生)

       

     2. 电梯从高到低或从低到高顺序 依次到达,每到达一目标层,都需输入-1关门,电梯继续运行 至下一目标楼层

        

        

          

     3. 当无选择楼层 ,直接输入-1 关门时,显示当前楼层,提示无客

        

     4. 当选择楼层与当前所在楼层一样时,提示

       

     5. 当选择楼层不符合电梯最高最低楼层设置时,提示

       

    四、总结

      这个简易电梯程序,基本实现了电梯的上行和下行判断,当选择多个楼层时,可以对同为上行或下行的目标楼层自动排序依次到达,每个目标楼层会随机生成乘客重量并记录。

    在写这个程序时,遇见了一些问题:

    1.  使用while语句接收用户输入时,判断输入是否为数字,输入不是数字会陷入死循环提示。在此增加了scanner.next()语句,提示后可以继续输入。

      if (!scanner.hasNextInt()) {
                    System.out.println("请输入数字!");
                    scanner.next();
                }

    2.  若重复选择某楼层,到达该楼层后,仍会显示该楼层为剩余楼层。在此增加了判断语句,如果选择的楼层数已经存在于上升或下降目标楼层的集合中,则只增加重量,不会重复添加目标楼层。

     if (!upFloorList.contains(floorNum) && !downFloorList.contains(floorNum)) {
                if (floorNum > nowFloor) {
                    upFloorList.add(floorNum);
    
                    // 上升楼层升序排序
                    Collections.sort(upFloorList);
    
                } else {
                    downFloorList.add(floorNum);
    
                    // 下降楼层降序排序
                    downFloorList.sort(Collections.reverseOrder());
                }
            }
        }

    3.  将目标楼层随机产生的重量存放于一个数组中,当前楼层减最低层,就是当前层重量的下标,假如当前楼层为5楼,5楼下标就是 5-1 = 4,storeyWeight[4]即为5楼重量。

      代码还有不完善的地方,例如若从1到8楼上升时,6楼有人也要乘坐电梯,如何满足在6楼停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正

           *转载需标明出处

  • 相关阅读:
    Linux下Apache服务器并发优化
    centos 7 mount win共享文件夹 开机自动挂载
    自学 phpredis 的心路历程
    VM虚拟机下centos7 无法上网的问题解决办法
    php headers_sent 函数的作用
    is_file 与 file_exists 的区别
    php 面向对象 中的self
    php 去除所有空格 包括中文空格圆角空格
    滑动窗口滚动条触发事件
    PHP中file_exists与is_file、is_dir的区别,以及执行效率的比较 转自#冰雪傲骨#
  • 原文地址:https://www.cnblogs.com/lzh7513/p/11728866.html
Copyright © 2011-2022 走看看