簡體   English   中英

很難確定我的設計的起點

[英]Having a hard time determining the starting point of my design

對於我的CS課程,我必須編制一個酒店登記/結賬系統。 該計划必須能夠檢查人員進出。 該計划在入住時為客人分配第一個可用房間。 如果沒有免費房間,它也會這么說。 酒店有四個房間。

在作業中,它說需要有4個班級:Assignment5,Hotel,Room和Guest。

  1. Assignment5類用於與用戶交互。

  2. 酒店類有四個房間和所有操作房間的方法。

  3. 客房類有1位客人。 如果客房是空的,客人可以辦理入住手續。如果客人要離開,則需要清空房間。

  4. 訪客類:訪客具有名字和姓氏。

在菜單中需要有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間客房 (假設我們存儲room1room2room3 ,和room4成員變量,或者,你可以使用數組,如果你已經在課堂上學習一下吧)。 要找到四個房間中哪一個是空的,我們需要問一個房間是否空 ; 所以我們需要另一種方法(比如isEmpty() )。 為了找到一個空房間,問室1個,如果room1是空回room1 ,否則問室2,如果room2是空回room2 ,否則問室3,如果room3為空,返回room3 ,否則問室4,如果room4是空,返回room4 否則,所有房間都被占用。 [注意:如果所有房間都被占用,你需要弄清楚要做什么]。 一個數組將使這個過程更容易,你只需要遍歷數組,並詢問它是否為空並返回房間,如果它是空的,否則繼續檢查下一個房間。

接下來,我們打破checkIn()。 那么, checkIn()需要知道什么來完成檢查過程? 它需要知道兩個信息: roomguest 由於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. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

房間號0指定為空

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

一種

1號房間分配給A

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

2號房間分配給B

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

C

3號房間分配給C

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

d

沒有空房間分配給D.

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

2

輸入房間號碼

1

1號房間現在空了!

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

1

輸入客人姓名

d

分配給D的1號房間

輸入選項:

  1. 報到。

  2. 查看。

  3. 出口

3

我可以看到你已經編寫了一些代碼,但是對於你的下一個類似的任務,我會按照以下方式編寫類。

  1. 客人
  2. 房間
  3. 旅館
  4. Assignment5 < - 這是最復雜的一個,你可以做到最后。

為什么?

訪客非常容易編碼。 完成后再轉到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM