[英]Having a hard time determining the starting point of my design
对于我的CS课程,我必须编制一个酒店登记/结账系统。 该计划必须能够检查人员进出。 该计划在入住时为客人分配第一个可用房间。 如果没有免费房间,它也会这么说。 酒店有四个房间。
在作业中,它说需要有4个班级:Assignment5,Hotel,Room和Guest。
Assignment5类用于与用户交互。
酒店类有四个房间和所有操作房间的方法。
客房类有1位客人。 如果客房是空的,客人可以办理入住手续。如果客人要离开,则需要清空房间。
访客类:访客具有名字和姓氏。
在菜单中需要有4个选项:1显示可用房间和职业的状态。 2检查选项3检查选项4结束程序选项。
好的,所以我知道我应该为自己完成任务。 但是,我不知道它是什么,但从作业开始,我有很大的问题切割小块的东西。 另外这个任务是学习使用不同的类,我真的不明白在这种情况下我应该采取哪些步骤。
有人可以通过提供一些提示来帮助我开始吗? 我一直盯着我的屏幕好几个小时,只是觉得我可以用一些小小的见解让我开始。 任何帮助都非常赞赏!
好了,到目前为止帮忙了。
* *首先,非常感谢你的帮助,你们真棒! 已经连续7个小时了,仍然卡住了。 我现在的问题是它不能编译。 它说:
Java:28: checkIn(Gast) in Hotel cannot be applied to (java.lang.String)
hotel.checkIn("Guido");
^
1 error
也许,有人看看我现在这样做的方式是在正确的道路上吗? 我感谢JavaGeek的计划,但我想通过自己来学习它。
到目前为止,我有以下内容:
import java.util.Scanner;
public class bopgave5 {
public static void main(String[] args) {
boolean opnieuw = false;
do {
int invoer = menu();
if (invoer == 2){
Hotel hotel = new Hotel();
hotel.checkIn("Guido");
opnieuw = true;
}
else if (invoer == 4)
opnieuw = false;
else
opnieuw = true;
}
while (opnieuw == true);
}
public static int menu (){
Scanner sc = new Scanner(System.in);
System.out.println("MENU: [1] Statusoverzicht");
System.out.println(" [2] Check-in");
System.out.println(" [3] Check-out");
System.out.println(" [4] Einde");
System.out.print("Uw invoer: ");
int invoer = sc.nextInt();
return invoer;
}
}
class Hotel {
Kamer kamer1, kamer2, kamer3, kamer4;
Hotel (){
kamer1 = new Kamer();
kamer2 = new Kamer();
kamer3 = new Kamer();
kamer4 = new Kamer();
}
void checkIn(Gast nieuweGast) {
if (kamer1.gast == null) {
kamer1.gast = nieuweGast;
System.out.println("Gast " + nieuweGast.naam + " krijgt kamer 1");
return;
}
else if (kamer2.gast == null) {
kamer2.gast = nieuweGast;
System.out.println("Gast " + nieuweGast.naam + " krijgt kamer 2");
return;
}
else if (kamer3.gast == null) {
kamer3.gast = nieuweGast;
System.out.println("Gast " + nieuweGast.naam + " krijgt kamer 3");
return;
}
else if (kamer4.gast == null) {
kamer4.gast = nieuweGast;
System.out.println("Gast " + nieuweGast.naam + " krijgt kamer 5");
return;
}
else {
System.out.println("hotel is vol");
return;
}
}
}
class Kamer {
Gast gast;
Kamer() {
gast = null;
}
}
class Gast {
String naam;
Gast(String nieuweNaam) {
naam = nieuweNaam;
}
}
所以你有4个班级。
在作业中,它说需要有4个班级: Assignment5,Hotel,Room和Guest 。
责任分工如下:
Assignment5类用于与用户交互 。
酒店类有四个房间和所有操作房间的方法。 (特别强调:“房间”是复数)
客房类有1位客人。 如果客房是空的,客人可以办理入住手续。如果客人要离开,则需要清空房间。 (或换句话说,操作单个房间)
访客类:访客具有名字和姓氏。
首先,您可能想要确定每个对象所具有的“状态”。 IOW,您需要确定每个对象具有的属性/实例字段。 让我们从一个例子开始: Guest类:guest有一个名字和一个姓氏 。 。 对所有其他类做同样的事情。
接下来,您需要确定所需的方法。 让我们从另一个例子开始: Room class有1位客人。 如果客房是空的,客人可以办理入住手续 。 如果客人离开房间需要清空 。 。 最重要的是,每个类都需要一些构造函数。
接下来,对于每个方法,如果需要返回值,则需要查找方法所需的参数及其返回值。 例如,对于入住方法,您需要房间和客人; 在您办理登机手续之前,您需要检查房间是否空了。
更新 :
我现在的问题是:如何让它工作,有4个房间,签入1人后,检查第二个人将把它放在另一个房间?
你的老师有一个很好的建议,把它分成几块。
基本上,你有问题:“ 检查第二个人应该把他放在另一个房间 ”。
那么,我们如何打破这个呢? 首先,我们需要找到一个空房间 ,所以我们需要一个方法(比如findEmptyRoom()
),在我们找到一个可用的房间后,我们需要检查客人进入那个房间 ,所以我们需要另一种方法(说checkIn()
)。 所以,我们找到一个空房间,然后我们检查了客人进入那个房间,然后我们就完成了。
下一步,我们打破findEmptyRoom()
。 酒店拥有4间客房 (假设我们存储room1
, room2
, room3
,和room4
成员变量,或者,你可以使用数组,如果你已经在课堂上学习一下吧)。 要找到四个房间中哪一个是空的,我们需要问一个房间是否空 ; 所以我们需要另一种方法(比如isEmpty()
)。 为了找到一个空房间,问室1个,如果room1
是空回room1
,否则问室2,如果room2
是空回room2
,否则问室3,如果room3
为空,返回room3
,否则问室4,如果room4
是空,返回room4
。 否则,所有房间都被占用。 [注意:如果所有房间都被占用,你需要弄清楚要做什么]。 一个数组将使这个过程更容易,你只需要遍历数组,并询问它是否为空并返回房间,如果它是空的,否则继续检查下一个房间。
接下来,我们打破checkIn()。 那么, checkIn()
需要知道什么来完成检查过程? 它需要知道两个信息: room
和guest
。 由于checkIn()
是一个房间的类的实例方法, room
是隐含的,所以我们只需要一个参数,即guest
。 所以void checkIn(Guest guest)
应该设置房间的guest成员变量。
接下来,我们打破isEmpty()。 我们怎么知道房间是空的? 如果一个房间里面有一个客人,那么它就被占用了,否则就是空的。 因此, isEmpty()
检查guest成员变量是否引用有效guest虚拟机,如果它是有效guest虚拟机则返回true,否则返回false。 在Java中, null
通常用于标记某些内容不是有效对象,因此您可以检查guest成员变量是否为null
(显然,当guest虚拟机签出时,您需要将guest成员变量设置为null)。
为其他进程做同样的事情。 将问题分解成小块,直到你确信你可以使用一块。
UPDATE2:
您收到的错误消息:
Java:28: checkIn(Gast) in Hotel cannot be applied to (java.lang.String)
hotel.checkIn("Guido");
是因为你将一个String( "Guido"
)传递给一个带有Gast参数的函数( void checkIn(Gast nieuweGast) {...}
)。 你应该传递一个Gast对象:
// declare a variable called g, with type Gast
Gast g;
// create a new Gast object, passing "Guido" as parameter
// to Gast's constructor, and assign the new object to g
g = new Gast("Guido");
// call hotel.checkIn(Gast) function with g as the argument,
// i.e. the Gast object we just created in the previous line
hotel.checkIn(g);
或更简单地说:
hotel.checkIn(new Gast("Guido"));
没有为你解决这个问题,我建议你这样做。
考虑需要执行的每个操作,然后绘制为完成该操作而需要进行的逻辑。 然后,通过明确的完成该任务所需的逻辑操作列表,仔细考虑可以将操作分解为哪些组件以及每个子任务应该去哪里。 这将使您了解类图应该是什么样子。 一旦你绘制了逻辑,类/方法的图表并实现了一个部分,就转到下一部分。 此时,您可能会发现某些内容的结构不允许将其重用于下一个任务,因此请对其进行重构(修改代码结构)以使其更具可重用性。
例如,解决办理登机手续的问题。 你需要先做什么? 那么,首先你需要确定是否有空房。 你是怎样做的? 你需要问所有的房间(按照你的设计,如果我没记错的话)。 因此,我们现在可以确定我们需要一个房间方法告诉我们它们是可用的。 也许先解决这个问题。 然后检查免费房间部分。 这可能发生在酒店课上。 您需要遍历房间并询问他们是否有空。 在此之后,如果有免费房间,或者没有空房,您需要决定该怎么办。 如果没有,我猜您会显示错误消息? 如果有免费房间,您需要办理登机手续。 写下来。 冲洗并重复。 不久,你将有一个正常运作的程序。
这里要记住的重要一点是,有很多不同的方法可以以面向对象的方式实现这一点。 当你刚刚学习OO设计和编程的基础知识时,重要的是不要过于依赖完美的设计并潜入其中。然后当你正在实施它时,我相信你会说“嘿,如果我这样做,它会变得更好”。 我想将此视为一个迭代学习过程。
尝试给类有用的成员。 这个问题的“酒店”是什么? 当他们有有用的成员时,对他们有什么有用的操作,这些方法呢?
字段:房间应该有房间号。 一个房间应该知道客人住在那个房间里。 客人应该有一个名字。 酒店应该有一系列的房间,名字,地址? 也许这里的地址没用。
方法:一个房间应该有一个方法来查看它是否为空,如果它不是空的,那么客人留在那里。 酒店应该有一种方法可以告诉您有多少房间,或者给您实际的房间。 所有入住酒店的客人? 等等等
你会发现你必须不断改进,改变,修复模型才能满足要求。 例如,“登记入住”可能需要在您尚未拥有的房间内使用新方法。
//Guest.java
package hotelcheckinsystem;
class Guest {
private String name;
public String getName() {
return name;
}
public Guest(String name) {
super();
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
//Room.java
package hotelcheckinsystem;
class Room {
private Guest guest;
public Guest getGuest() {
return guest;
}
public void setGuest(Guest guest) {
this.guest = guest;
}
public void removeGuest() {
guest.setName("");
}
public boolean isEmpty() {
if (this.getGuest().getName().equalsIgnoreCase("")) {
return true;
}
return false;
}
}
//Hotel.java
package hotelcheckinsystem;
public class Hotel {
private Room[] rooms = new Room[4];
public Hotel() {
for (int i = 0; i < 4; ++i) {
rooms[i] = new Room();
Guest guest = new Guest("");
rooms[i].setGuest(guest);
}
}
public void assignRoomToGuest(String name) {
int i;
for (i = 0; i < 4; ++i) {
if (rooms[i].isEmpty()) {
Guest guest = new Guest(name);
rooms[i].setGuest(guest);
System.out.println("Room number " + i + " assigned to " + name);
return;
}
}
if (i == 4) {
System.out.println("No empty Rooms to assign to " + name);
}
}
public void emptyRoom(int roomNo) {
if (roomNo > 3) {
System.out.println("please enter number between 0 to 3");
return;
}
rooms[roomNo].removeGuest();
System.out.println("Room number " + roomNo + " is empty now!.");
}
}
//Main.java
import java.util.Scanner;
import hotelcheckinsystem.*;
public class Main {
public static void main(String[] args) {
Hotel hotel = new Hotel();
while (true) {
System.out.println("Enter the Option: ");
System.out.println("1. Check in. \n2. Check out. \n3. Exit");
Scanner sc = new Scanner(System.in);
int option = sc.nextInt();
switch (option) {
case 1:
System.out.println("Enter the guests name");
hotel.assignRoomToGuest(sc.next());
break;
case 2:
System.out.println("Enter the Room number");
hotel.emptyRoom(sc.nextInt());
break;
case 3:
System.exit(0);
}
}
}
}
样品运行: -
输入选项:
报到。
查看。
出口
1
输入客人姓名
空
房间号0指定为空
输入选项:
报到。
查看。
出口
1
输入客人姓名
一种
1号房间分配给A
输入选项:
报到。
查看。
出口
1
输入客人姓名
乙
2号房间分配给B
输入选项:
报到。
查看。
出口
1
输入客人姓名
C
3号房间分配给C
输入选项:
报到。
查看。
出口
1
输入客人姓名
d
没有空房间分配给D.
输入选项:
报到。
查看。
出口
2
输入房间号码
1
1号房间现在空了!
输入选项:
报到。
查看。
出口
1
输入客人姓名
d
分配给D的1号房间
输入选项:
报到。
查看。
出口
3
我可以看到你已经编写了一些代码,但是对于你的下一个类似的任务,我会按照以下方式编写类。
为什么?
访客非常容易编码。 完成后再转到Room。 房间需要班级宾客。 完成房间后去代码酒店。 酒店将使用房间。
根据您的(荷兰语)代码可以理解,您将guest虚拟机存储为String。 这不是作业的目的。 它应该存储一个Guest对象。
我希望这能帮到您。
我加入这个有点晚了,但错误的原因是你试图检查一个名为Guido的字符串,而不是一个名字字段为Guido的Guest(Gast)。 您需要一些如下所示的行:
Gast guido = new Gast("Guido");
hotel.checkIn(guido); // this was previously hotel.checkIn("Guido")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.