[英]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.