前言
学习java这段时间以来,给我的感觉是非常枯燥和乏味的,因为学习编程这个过程就是这样,除此之外我是自学,所以遇到问题只能自己上网找资料,或者看一些大佬的文章来解决问题。不过学习过程中让我接触到了这样一个非常有趣的项目:酒店管理系统的小型项目,实现了一些功能,废话不多说看题目。
为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能
要求:
看到这样的题目我开始也是有点懵的,不知道到从什么地方下手,对于新手小白来说是很正常的,没有那个编程逻辑。现在来看看我的逻辑吧
第一:拿到题目我们先把最简单的,自己看的懂得能做的先做了。比如说:题目中提到的每个房间有房间编号,房间类型属性,房间是否空闲,我们就可以先写一个房间类,并且有房间编号,房间类型属性,房间是否空闲这几个属性。
第二:酒店使用一个二维数组模拟,并且每一个房间应该是一个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() + "," + "退房成功");
}
最终的运行效果
最后总结一下,后面的优化代码我也是根据自己的想法写出来的,所以不知道写的好不好,写的不好可以指出来,通过这个项目我学习到了很多,除了一些逻辑外,更多的是学习到了分析题目的能力,刚开始拿到题目是会有些迷茫不知道从何处下手,不多我们可以先把自己会写会做的给做了,慢慢的思路就清晰了。除此之外,通过项目可以复习自己所学到的知识,正所谓“温故而知新”,我们在学习了新的知识后,不能忘记旧的知识。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。