java酒店管理系统小型项目

2023-05-16

前言

学习java这段时间以来,给我的感觉是非常枯燥和乏味的,因为学习编程这个过程就是这样,除此之外我是自学,所以遇到问题只能自己上网找资料,或者看一些大佬的文章来解决问题。不过学习过程中让我接触到了这样一个非常有趣的项目:酒店管理系统的小型项目,实现了一些功能,废话不多说看题目。

题目

        为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能

        要求:

  1.  该系统的用户是:酒店前台。
  2. 酒店使用一个二维数组来模拟。“Room[][] room;”
  3. 酒店中的每一个房间应该是一个java对象:Room
  4. 每一个房间Room应该有:房间编号,房间类型属性,房间是否空闲。
  5. 系统应该对外提供的功能:
    1. 可以预订房间:用户输入房间编号,订房。
    2. 可以退房:用户输入房间编号,退房。
    3. 可以查看所有房间的状态:用户输入某个指令应该可以查看所有房间状态。

思路

看到这样的题目我开始也是有点懵的,不知道到从什么地方下手,对于新手小白来说是很正常的,没有那个编程逻辑。现在来看看我的逻辑吧

        第一:拿到题目我们先把最简单的,自己看的懂得能做的先做了。比如说:题目中提到的每个房间有房间编号,房间类型属性,房间是否空闲,我们就可以先写一个房间类,并且有房间编号,房间类型属性,房间是否空闲这几个属性。

        第二:酒店使用一个二维数组模拟,并且每一个房间应该是一个java对象,我们可以去定义一个酒店类,定义一个二维数组初始化我们的每一个房间对象

        第三:写订房、退房、打印所有房间状态的逻辑代码

        第四:写一个好看的用户页面

代码

Room类

 房间编号,房间类型属性,房间是否空闲3个属性,提供无参构造,有参构造和setting and getter 方法,并且重写toString()方法和equals()方法

public class Room {
    //房间编号
    private int roomsId;
    /**
    *房间类型
    *标准间 单人间 豪华间
    */
    private String type;
    /**
    *房间是否为空
    *true 为空
    *false为不空
    */
    private boolean state;

    //构造方法
    public Room(){

    }

    public Room(int roomsId, String type, boolean state){
        this.roomsId = roomsId;
        this.type = type;
        this.state = state;
    }

    //setter and getter
    public int getRoomsId() {
        return roomsId;
    }

    public void setRoomsId(int roomsId) {
        this.roomsId = roomsId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "Room[" + this.roomsId + "," + this.type + "," + (this.state ? "空闲" : "占用") + "]";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || !(o instanceof Room) ) return false;
        Room room = (Room) o;
        return this.getRoomsId() == room.getRoomsId();
    }
}

Hotel类

 定义一个二维数组,我们在new Hotel对象时调用无参构造方法初始化二维数组和每一个房间,还有我们一个setter and getter方法

public class Hotel{
    //数组
    private Room[][] rooms;

    //构造方法
    public Hotel(){
        //动态初始化房间
        this.rooms = new Room[3][5];
        //二维数组遍历
        for (int i = 0; i < rooms.length; i++) {
            for (int j = 0; j < rooms[i].length; j++) {
                if (i == 0) {
                    rooms[i][j] = new Room((i + 1) * 100 + j + 1, "标准间", true);
                }else if (i == 1){
                    rooms[i][j] = new Room((i + 1) * 100 + j + 1, "单人间", true);
                }else if (i == 2){
                    rooms[i][j] = new Room((i + 1) * 100 + j + 1, "豪华间", true);
                }
            }
        }
    }

    /**
     * 打印所有房间信息
     */
    public void printState(){
        for (int i = 0; i < rooms.length; i++) {
            for (int j = 0; j < rooms[i].length; j++) {
                System.out.print(rooms[i][j] + "\t");
            }
            System.out.println();
        }
    }

    /**
     * 订房
     * @param roomsId
     */
    public void order(int roomsId){
        //获取房间在数组中的下标
        Room room = rooms[roomId / 100 - 1][roomId % 100 -1];
        //修改房间状态
        room.setState(false);
        System.out.println("订房成功" + "," + "房间号是:" + room.getRoomsId());
    }

    /**
     * 退房
     * @param roomsId
     */
    public void exit(int roomsId){
        //获取房间在数组中的下标
        Room room = rooms[roomId / 100 - 1][roomId % 100 -1];
        //修改房间状态
        room.setState(true);
        System.out.println( "房间号:"+ room.getRoomsId() + "," + "退房成功");
    }

    //setter and getter
    public Room[][] getRooms() {
        return rooms;
    }

    public void setRooms(Room[][] rooms) {
        this.rooms = rooms;
    }
}

HotelTest类

这里我们写一个好看的用户界面,这样我们的题目上的功能就算写完了。

public class HotelTest {
    public static void main(String[] args) {
        Hotel hotel = new Hotel();
        System.out.println("欢迎使用酒店管理系统");
        System.out.println("=======================================================");
        System.out.println("我们有以下业务:" + "[1]订房" + "\t" + "[2]退房" + "\t" + "[3]查看房间信息" + "\t" + "[0]退出系统");
        Scanner s = new Scanner(System.in);
        while (true){
            System.out.print("请选择你的业务:");
            int result = s.nextInt();
            switch (result){
                case 1:
                    System.out.print("请输入订房的房间编号:");
                    int i = s.nextInt();
                    hotelManagement.order(i);
                    break;
                case 2:
                    System.out.print("请输入退房的房间编号:");
                    int x = s.nextInt();
                    hotelManagement.exit(x);
                    break;
                case 3:
                    hotelManagement.printState();
                    break;
                case 0:
                    System.out.print("成功退出系统");
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入错误,请重新选择业务");
                    break;
            }
            System.out.println();
        }

    }
}

 效果

a08ce7aba6034f13a74bbab488ea0705.png

解决问题 

 虽然我们把题目中提到的要求都实现了,但是我们想让我们的项目变的好看就需要解决项目中的一些问题:

  1. 如果我们输入的房间编号超过数组长度,我们不想让它提示数组索引长度异常这个错误,而是提示“该房间不存在”或者提示“别的信息”。
  2. 如果我们的房间已经被预订了,客户输入已被预订的房间是不是提示客户“此房间被预订,不能再被预订”,或者退房时,客户不小心输错房间号,把一间空房给退了,此时我们是不是要提示客户“此房间是空房,不能操作退房”。

针对以上问题我们要修改我们的订房方法和退房方法,修改如下:

        针对第一个问题,我是将传过来的房间编号,通过计算分别存到一个int类型的变量中,然后判断它是否大于数组的长度-1,大于就提示“该房间不存在”,其次第二个问题就很容易解决我们只要判断房间状态是否true或者false就行了,订房的时房间状态为true订房,false为房间已有预定,退房操作也是同理。

订房

public void order(int roomsId){
        //楼层
        int floor = roomsId / 100 - 1;
        //间,房间
        int between = roomsId % 100 - 1;
        //判断房间编号是否大于数组的长度
        if (floor > rooms.length -1 || between > rooms[floor].length -1;){
            System.out.println("该房间不存在");
            return;
        }
        Room room = rooms[floor][between];
        //判断房间状态是false的时候,那就提示订房失败
        if (!(room.isState())){
            System.out.println("订房失败,房间已有预定");
            return;
        }
        //程序执行到此处说明房间是true,执行订房
        room.setState(false);
        System.out.println("订房成功" + "," + "房间号是:" + room.getRoomsId());
    }

 退房

public void exit(int roomsId){
        //楼层
        int floor = roomsId / 100 - 1;
        //间,房间
        int between = roomsId % 100 - 1;
        //判断房间编号是否大于数组的长度
        if (floor > rooms.length -1 || between > rooms[floor].length -1;){
            System.out.println("该房间不存在");
            return;
        }
        Room room = rooms[floor][between];
        //判断房间状态,如果是true那就是空房,所以不能退房
        if (room.isState()){
            System.out.println("退房失败,该房间是空房");
            return;
        }
        //程序执行到此处说明房间是false,执行退房操作
        room.setState(true);
        System.out.println( "房间号:"+ room.getRoomsId() + "," + "退房成功");
    }

优化代码

此时我们会发现订房和退房中floor和between这两个属性我们都需要用到,那么我们可不可以将它们两个写出实例属性呢?答案是可以的。将它们拿出来写成实例属性,并且进行封装,提供setter and getter方法,其次写一个方法用于去计算我们的楼层和房间。

还有下面的判断房间编号是否大于数组长度,我们可以定义一个方法,返回值为Boolean类型,这样我们在if()的条件语句中可以直接调用这个方法,就不用写那么长了。

代码如下:

在Hotel类中添加floor和betwe这两个属性,并且属性私有化,提供setter and getter方法。

    //楼层
    private int floor;
    //间,房间
    private int between;

提供计算楼层和房间的方法和判断房间编号是否大于数组长度方法(这里的方法名随便取的,不要在意)

    //用于计算楼层和间数的方法
    public void count(int roomsId){
        this.floor = roomsId / 100 - 1;
        this.between = roomsId % 100 - 1;
    }

    //用于判断楼层和单间是否越过数组长度的方法
    public boolean isArrRoom(){
        return floor > rooms.length -1 || between > rooms[floor].length -1;
    }

最终的订房和退房的方法

 订房:

public void order(int roomsId){
        //调用方法计算楼层和间数
        count(roomsId);
        //调用方法判断楼层和单间是否越过数组长度
        if (isArrRoom()){
            System.out.println("该房间不存在");
            return;
        }
        Room room = rooms[floor][between];
        //判断房间状态,如果不是false那就是true。那就提示订房失败
        if (!(room.isState())){
            System.out.println("订房失败,房间已有预定");
            return;
        }
        //程序执行到此处说明房间是true,执行订房
        room.setState(false);
        System.out.println("订房成功" + "," + "房间号是:" + room.getRoomsId());
    }

退房:

public void exit(int roomsId){
        //调用方法计算楼层和间数
        count(roomsId);
        //调用方法判断楼层和单间是否越过数组长度
        if (isArrRoom()){
            System.out.println("该房间不存在");
            return;
        }
        Room room = rooms[floor][between];
        //判断房间状态,如果是true那就是空房,所以不能退房
        if (room.isState()){
            System.out.println("退房失败,该房间是空房");
            return;
        }
        //程序执行到此处说明房间是false,执行退房操作
        room.setState(true);
        System.out.println( "房间号:"+ room.getRoomsId() + "," + "退房成功");
    }

最终的运行效果

 

总结 

        最后总结一下,后面的优化代码我也是根据自己的想法写出来的,所以不知道写的好不好,写的不好可以指出来,通过这个项目我学习到了很多,除了一些逻辑外,更多的是学习到了分析题目的能力,刚开始拿到题目是会有些迷茫不知道从何处下手,不多我们可以先把自己会写会做的给做了,慢慢的思路就清晰了。除此之外,通过项目可以复习自己所学到的知识,正所谓“温故而知新”,我们在学习了新的知识后,不能忘记旧的知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java酒店管理系统小型项目 的相关文章

  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 51--定时器/计数器,串口,中断的巧妙关系

    目录 什么是中断 什么是定时器计数器 什么是串口 开始 直接配置中断 中断 43 定时器 计数器 串口 43 中断 总结 中断查询次序号 xff1a 什么是中断 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的 xff0c 中
  • 字符串查找函数Strstr函数的实现(详细易懂)

    首先 xff0c 字符串查找函数是在目的字符串中查找源字符串的首次出现的具体位置 xff0c 若找到了便返回该位置的地址 xff0c 若没有找到 xff0c 则返回空指针NULL char strstr const char arr1 co
  • ROS安装与Rviz的摄像头视频采集与标定

    文章目录 一 ROS的安装与配置1 添加 ROS 软件源 xff0c 将下列命令输入到 Ubuntu 的终端执行2 添加密钥 xff0c 将下列命令输入到 Ubuntu 的终端执行3 安装desktop full4 初始化rostep5 设
  • ros2的基本使用/基础知识——ros2节点

    1 节点是什么 每个节点只负责单独的模块 xff08 例如 xff1a 控制车轮转动 xff1b 从激光雷达处获得数据 xff1b 处理激光雷达的数据 xff1b 负责定位 xff09 照相机 地盘 控制 2 节点之间如何交互 xff1f
  • SSH秘钥登录配置与系统日志管理

    配置 sshd 服务 SSH xff08 Secure Shell xff09 是一种能够以安全的方式提供远程登录的协议 xff0c 也是目前远程管理 Linux 系统 的首选方式 在此之前 xff0c 一般使用 FTP 或 Telnet
  • 关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案

    问题现象 xff1a root 64 gvt NUC6CAYH apt get install net tools E Could not get lock var lib dpkg lock frontend open 11 Resour
  • vscode报错vue/multi-word-component-names处理

    vue multi word component names是用于检测当前的组件名称是否使用驼峰或多单词命名 错误截图如下 xff1a 1 可以修改 eslintrc js文件的配置 module exports 61 root true
  • Android SDK的安装步骤

    1 Android SDK下载 https www androiddevtools cn 2 解压Android SDK压缩包 放在没有中文的目录里面 3 打开Android sdk windows文件夹 xff0c 双击SDK manag
  • Apollo control之PID算法

    Apollo studio 官网 xff1a Apollo开发者社区 baidu com 目录 1 PID简介 2 PID调参思路 3 代码 4 解决积分饱和的方法 4 1 IC 积分遇限削弱法 4 2 BC 反馈抑制抗饱和 1 PID简介
  • TCP通信模型(C语言实现)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 今天我们来分享TCP通信模型 xff0c 并且用C语言实现它 目录 一 我们将实现三个示例功能 xff1a 二 TCP服务器搭建流程 xff08 1 xff
  • 场景文本识别中的字符感知采样与校正(Character-Aware Sampling and Rectification for Scene Text Recognition)

    摘要 由于形状和纹理变化较大 xff0c 曲面场景文本识别在多媒体社会中是一项具有挑战性的任务 以前的方法通过等距离采样提取和校正文本行来解决这一问题 xff0c 这忽略了字符级别信息并导致字符失真 为了解决这个问题 xff0c 本文提出了
  • MyBatisPlus中的likeLeft和likeRight

    在使用MyBatisPlus来匹配身份证后6位时遇到了likeLeft和likeRight的问题 xff1a likeLeft时匹配最左边还是匹配最右边 xff1f 所以来一个简单的测试 xff08 通过打印 成功 失败 来判断 xff09
  • 计算机网络第一章总结

    目录 1 1计算机网络再信息时代中的作用 1 2互联网的概述 1 2 1网络 xff0c 互联网和因特网 1 2 2互联网基础结构的三个阶段 1 2 3互联网的标准化工作 1 3互联网的组成 1 3 1三种交换方式 1 4计算机网络的类别
  • Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column……报错的解决办法

    问题原因 xff1a 这个报错是执行有GROUP BY的语句时出现的 原因是MySQL启用了默认的only full group by SQL模式 导致GROUP BY语句报错 解决办法 xff1a 打开mysql的安装目录找到my ini
  • 【Linux安全管理】Firewalld详解

    目录 1 与iptables不同 2 配置防火墙 3 firewalld区域概念 4 filewalld 配置生效 5 firewalld服务 firewalld 端口映射 富规则 rich rule 1 与iptables不同 firew
  • C++之class和struct的区别

    在C语言中 xff0c struct是一个数据类型 xff0c 所以struct内不能定义函数 xff1b 在C 43 43 中保留了struct关键字 xff0c 并且进行了补充 xff0c struct类似于class xff0c 可以
  • QEMU使用virtio磁盘(Ubuntu/windows)

    环境 宿主环境 xff1a windows 10 pro QEMU版本 xff1a 3 1 客户机 xff1a windows2003 virtio是一种半虚拟化技术 xff0c window2003安装盘不带驱动程序 xff0c 所以首先
  • 创建一个ArrayList<String> 集合,通过反射向集合中添加Integer类型的数据

    1 思路 创建一个ArrayList lt String gt 集合 通过反射获取到ArrayList的Class对象通过Class类获取到ArrayList中的add方法 2 所需关键知识 获取Class类有三种方法 xff1a xff0
  • Git分支&标签

    目录 一 xff0c 分支 环境的的功能及特点 分支的策略 分支的相关指令 二 xff0c 标签 1 查看所有标签 2 创建tag 3 删除tag 4 分支与版本 一 xff0c 分支 1 分支的命名规范 dev test pre pro
  • java酒店管理系统小型项目

    前言 学习java这段时间以来 xff0c 给我的感觉是非常枯燥和乏味的 xff0c 因为学习编程这个过程就是这样 xff0c 除此之外我是自学 xff0c 所以遇到问题只能自己上网找资料 xff0c 或者看一些大佬的文章来解决问题 不过学