基于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.println("剩余所选层数为:");
 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.println("剩余所选层数为:");
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("请选择1-12楼层。");
39                 } else {
40                     elvator.SetFloor(num);
41                 }
42             }
43         }
44     }
45 }

三、总结

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

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

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层停止并上人后,继续上行。这些还有待我继续完善,也望请大家批评指正

原文地址:https://www.cnblogs.com/lzh7513/p/11728866.html

时间: 2024-11-11 06:47:16

基于Java的捎带电梯系统的相关文章

基于Java的开源CMS系统选择(转)

CMS概述 对于网站CMS系统而言,基于PHP的是主流,如Drupal/Joomla在各个主流虚拟机提供商上都是标准配置,也被广泛使用. 但如果你拥有Java团队,或者项目目标是想建立一个企业网使用的内容管理系统,那么选择一个基于Java的CMS系统就是合适的. 基于PHP的CMS系统和Java CMS,有一个显著的区别, 基于Java的CMS通常会把内容架构在JCR规范上,例如Jackrabbit,ModeShape, 而PHP的CMS直接架构在RDBMS规范上,主要是MySQL上.总体上Ja

基于java的学生成绩系统 关于普通生、留级生、特长生的研究与实现【原创】

文章结尾有彩蛋 研究的题目为: JAVA 学生成绩系统 求符合下列要求的代码某学校有三类学生:1)普通生,总评成绩由平时成绩30%和考试成绩70%组成2)留级生:总评成绩完全由考试成绩组成3)特长生:总评成绩由平时成绩30%+考试成绩70%+10分附加分组成每个学生都有姓名和学号.要求:一.正确定义类表示上述三类学生及其关系.二.正确定义各个类的方法,求每个学生的总评成绩三.定义方法,求N个学生的总评成绩平均分四.定义方法,求N个学生中的总评成绩最高者五.定义方法,输入N个学生的信息和成绩,并存

基于java web+mysql的登录注册系统

 结对编程二人项目 组员:王刚029   齐凤霞007 项目名称:基于java web+mysql的登录注册系统 软件需求: 1,任何基于B/S或者C/S的软件都离不开基本的登录注册,我们决定采用B/S结构+MySQL数据库来完成基本的登录注册功能2,采用简单的JSP+Servlet+MySQL完成登录,注册功能3,登录,注册界面信息的回显,数据格式的校验功能 说明: 1,采用MVC模式,降低了代码的耦合性整体架构:>jsp显示页面和回显数据>Servlet负责处理jsp提交的数据>Se

基于java最短路径算法公交查询系统的设计与实现

基于J2EE的公交查询系统的设计与实现 1引言 1.1 选题背景 20多年来,我国经济得到了持续.快速.稳定.健康地发展.经济的快速增长,带动了汽车工业的蓬勃发展,并使交通状况显著改善.据统计,中国公路通车总里程已达130余万公里,其中高速公路约1.5万公里.居民收入普遍提高,到2000年年底,人均GDP已超过800美元,沿海地区已达2000-3000美元.按国际发展惯例,当人均GDP超出1000美元,汽车消费市场就将进入快速增长期.我国城市人口约有2亿,略低于美国人口.东部沿海地区大部分居民已

基于SSM的水质检测系统-java水质检测系统

基于SSM的水质检测系统-java水质检测系统 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点:MVC模式.SpringMvc.Mybatis.Spring.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Mybatis框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spring框架进行整合

基于SSM技术的茶馆在线预约系统-java茶馆在线预约系统

基于SSM技术的茶馆在线预约系统-java茶馆在线预约系统 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点:MVC模式.SpringMvc.Mybatis.Spring.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Mybatis框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spring

基于JSP的网上订餐系统-java网上订餐系统源代码系统演示

基于JSP的网上订餐系统-java网上订餐系统源代码系统演示 1.包含源程序,数据库脚本.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善.开发环境:Eclipse ,MySQL 5.1,JDK1.7,Tomcat 7涉及技术点:MVC模式.JavaWeb.JDBC.HTML.CSS.JQUERY.文件上传.购物车等. 系统没用任何框架,前台纯JSP实现,后台servlet映射,适合刚学习J2EE的新手,代码思路清晰,注解详细,数据库用的是mysql5.1,服务器用的tomcat7,JD

基于SSH的网上投票系统-java网上投票系统mysql数据库

基于SSH的网上投票系统-java网上投票系统mysql数据库 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点:MVC模式.Struct.Hibernate.Spring.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Hibernate框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spr

基于SSM框架下的JAVA企业流程审批系统

每天记录学习,每天会有好心情.*^_^* 今天将为大家分析一个企业流程审批系统(现代企业对资金流的控制十分严格,但是绝大部分企业的费用审批还停滞在手动填单.逐级递交.逐级审批的现状,既没有效率也不利于与国际接轨.文中采用基于JAVA技术和mysql数据库开发了一个改变原始审批流程操作的自动审批流程系统,缩短了审批时间,提高了企业的工作效率,真正实现了无纸办公,为电子商务时代企业的发展提供了崭新的模式.),该项目使用框架为SSM(MYECLIPSE),选用开发工具为MYECLIPSE.企业流程审批