大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
前言
学习java这段时间以来,给我的感觉是非常枯燥和乏味的,因为学习编程这个过程就是这样,除此之外我是自学,所以遇到问题只能自己上网找资料,或者看一些大佬的文章来解决问题。不过学习过程中让我接触到了这样一个非常有趣的项目:酒店管理系统的小型项目,实现了一些功能,废话不多说看题目。
题目
为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能
要求:
- 该系统的用户是:酒店前台。
- 酒店使用一个二维数组来模拟。“Room[][] room;”
- 酒店中的每一个房间应该是一个java对象:Room
- 每一个房间Room应该有:房间编号,房间类型属性,房间是否空闲。
- 系统应该对外提供的功能:
- 可以预订房间:用户输入房间编号,订房。
- 可以退房:用户输入房间编号,退房。
- 可以查看所有房间的状态:用户输入某个指令应该可以查看所有房间状态。
思路
看到这样的题目我开始也是有点懵的,不知道到从什么地方下手,对于新手小白来说是很正常的,没有那个编程逻辑。现在来看看我的逻辑吧
第一:拿到题目我们先把最简单的,自己看的懂得能做的先做了。比如说:题目中提到的每个房间有房间编号,房间类型属性,房间是否空闲,我们就可以先写一个房间类,并且有房间编号,房间类型属性,房间是否空闲这几个属性。
第二:酒店使用一个二维数组模拟,并且每一个房间应该是一个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();
}
}
}
效果
解决问题
虽然我们把题目中提到的要求都实现了,但是我们想让我们的项目变的好看就需要解决项目中的一些问题:
- 如果我们输入的房间编号超过数组长度,我们不想让它提示数组索引长度异常这个错误,而是提示“该房间不存在”或者提示“别的信息”。
- 如果我们的房间已经被预订了,客户输入已被预订的房间是不是提示客户“此房间被预订,不能再被预订”,或者退房时,客户不小心输错房间号,把一间空房给退了,此时我们是不是要提示客户“此房间是空房,不能操作退房”。
针对以上问题我们要修改我们的订房方法和退房方法,修改如下:
针对第一个问题,我是将传过来的房间编号,通过计算分别存到一个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() + "," + "退房成功");
}
最终的运行效果
总结
最后总结一下,后面的优化代码我也是根据自己的想法写出来的,所以不知道写的好不好,写的不好可以指出来,通过这个项目我学习到了很多,除了一些逻辑外,更多的是学习到了分析题目的能力,刚开始拿到题目是会有些迷茫不知道从何处下手,不多我们可以先把自己会写会做的给做了,慢慢的思路就清晰了。除此之外,通过项目可以复习自己所学到的知识,正所谓“温故而知新”,我们在学习了新的知识后,不能忘记旧的知识。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193052.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...