很难确定我的设计的起点

时间:2010-10-09 16:03:59

标签: java

对于我的CS课程,我必须编制酒店登记/结账系统。该计划必须能够检查人员进出。该计划在入住时为客人分配第一个可用房间。如果没有免费房间,它也会这么说。酒店有四个房间。

在作业中,它说需要有4个班级:Assignment5,Hotel,Room,&访客。

  1. Assignment5类用于与用户进行交互。

  2. 酒店课程有四个房间和所有操作房间的方法。

  3. 房间类有1位客人。如果客房是空的,客人可以办理入住手续。如果客人离开,客房需要清空。

  4. 来宾类:来宾有姓名和姓氏。

  5. 在菜单中需要有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;
        }
    }
    

6 个答案:

答案 0 :(得分:5)

所以你有4节课。

  

在作业中,它说需要   成为4个班级: Assignment5,Hotel,   房间,&旅客

责任分工:

  

Assignment5类是为了   与用户的互动

     

酒店班有四个房间   操作房间的方法。 (特别强调:“房间”是复数)

     

房间类有1位客人。 如果是房间   客人可以办理入住手续。如果是   客人离开房间需要   清空。(或换句话说,操作单个房间)

     

来宾类:来宾有一个名字   和姓氏。

首先,您可能想要确定每个对象所具有的“状态”。 IOW,您需要确定每个对象具有的属性/实例字段。让我们从一个示例开始: Guest class:来宾有名字姓氏。对所有其他课程都这样做。

接下来,您需要确定所需的方法。让我们从另一个例子开始: Room class有1位客人。如果客房是空的,客人可以办理入住手续。如果客人离开房间需要清空。最重要的是,每个类都需要一些构造函数。

接下来,对于每个方法,您希望找到方法所需的参数及其返回值(如果需要返回值)。例如,对于签入方法,您需要会议室和访客;在您办理登机手续之前,您需要检查房间是否空了。

<强>更新

我现在的问题是:我怎样才能让它有4个房间的工作,在1个人办理入住手续后,第二个人入住会把它放在另一个房间?

你的老师有一个很好的建议,把它分成几块。

基本上,你有问题:“检查第二个人应该把他放在另一个房间”。

那么,我们如何打破这个呢?首先,我们需要找到一个空房间,所以我们需要一个方法(比如findEmptyRoom()),在我们找到一个可用的房间后,我们需要签入客人进入那个房间,所以我们需要另一种方法(比如checkIn())。所以,我们找到一个空房间,然后我们检查了客人进入那个房间,然后我们就完成了。

下一步,我们打破findEmptyRoom()。我们的酒店有 4个房间(假设我们存储room1room2room3room4作为成员变量,您也可以使用一个数组,如果你已经在课堂上了解它)。要查找四个房间中哪一个是空的,我们需要询问房间是否为空;所以我们需要另一种方法(比如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成员变量设置为当客人签出时为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"));

答案 1 :(得分:2)

如果没有为你解决这个问题,我建议你这样做。

考虑需要执行的每个操作,然后绘制为完成该操作而需要进行的逻辑。然后,通过明确的完成该任务所需的逻辑操作列表,仔细考虑可以将操作分解为哪些组件以及每个子任务应该去哪里。这将使您了解类图应该是什么样子。一旦你绘制了逻辑,类/方法的图表并实现了一个部分,就转到下一部分。此时,您可能会发现某些内容的结构不允许将其重新用于下一个任务,因此请对其进行重构(修改代码结构)以使其更具可重用性。

例如,解决办理登机手续的问题。你需要先做什么?那么,首先你需要确定是否有空房。你是怎样做的?你需要问所有的房间(按照你的设计,如果我没记错的话)。因此,我们现在可以确定我们需要一个房间方法告诉我们它们是可用的。也许先解决这个问题。然后检查免费房间部分。这可能发生在酒店课上。您需要遍历房间并询问他们是否有空。在此之后,如果有免费房间,或者没有空房,您需要决定该怎么办。如果没有,我猜您会显示错误消息?如果有免费房间,您需要办理登机手续。写下来。冲洗并重复。不久之后,你将有一个正常运作的程序。

这里要记住的重要一点是,有许多不同的方法可以以面向对象的方式实现这一点。当你刚刚学习OO设计和编程的基础知识时,重要的是不要过于依赖完美的设计并潜入其中。然后当你正在实施它时,我相信你会说“嘿,如果我这样做,它会变得更好”。我喜欢将此视为一个迭代学习过程。

答案 2 :(得分:2)

从对象开始,域

尝试为课程提供有用的成员。这个问题的“酒店”是什么?当他们有有用的成员时,对他们有什么有用的操作,方法?

字段:房间应该有房间号码。一个房间应该知道客人住在那个房间里。客人应该有一个名字。酒店应该有一系列的房间,名字,地址?也许这里的地址没用。

方法:一个房间应该有一个方法来查看它是否为空,以及如果客人不为空,那么客人将留在那里。酒店应该有一种方法可以告诉您有多少房间,或者给您实际的房间。所有入住酒店的客人?等等,等等。

您会注意到您必须不断改进,更改和修复您的模型才能满足要求。例如,“登记入住”可能需要在您尚未拥有的房间内使用新方法。

答案 3 :(得分:1)

//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. 退房。

  4.   
  5. 退出

  6.         

    1

         

    输入访客姓名

         

         

    房间号0指定为空

         

    输入选项:

         
        
    1. 签到。

    2.   
    3. 退房。

    4.   
    5. 退出

    6.         

      1

           

      输入访客姓名

           

      A

           

      1号房间分配给A

           

      输入选项:

           
          
      1. 签到。

      2.   
      3. 退房。

      4.   
      5. 退出

      6.         

        1

             

        输入访客姓名

             

             

        分配给B

        的2号房间      

        输入选项:

             
            
        1. 签到。

        2.   
        3. 退房。

        4.   
        5. 退出

        6.         

          1

               

          输入访客姓名

               

          C

               

          分配给C的房间号3

               

          输入选项:

               
              
          1. 签到。

          2.   
          3. 退房。

          4.   
          5. 退出

          6.         

            1

                 

            输入访客姓名

                 

            d

                 

            没有空房间分配给D

                 

            输入选项:

                 
                
            1. 签到。

            2.   
            3. 退房。

            4.   
            5. 退出

            6.         

              2

                   

              输入房间号

                   

              1

                   

              1号房间现在空了!。

                   

              输入选项:

                   
                  
              1. 签到。

              2.   
              3. 退房。

              4.   
              5. 退出

              6.         

                1

                     

                输入访客姓名

                     

                d

                     

                分配给D的房间号1

                     

                输入选项:

                     
                    
                1. 签到。

                2.   
                3. 退房。

                4.   
                5. 退出

                6.         

                  3

答案 4 :(得分:0)

我可以看到你已经编写了一些代码,但是对于你的下一个类似的任务,我会用以下方式编写类。

  1. 访客
  2. 饭店
  3. Assignment5&lt; - 这是最复杂的一个,你终于可以做了。
  4. 为什么?

    访客非常容易编码。完成后再转到Room。房间需要班级宾客。完成房间后去代码酒店。酒店将使用房间。

    从您的(荷兰语)代码中我可以理解,您将guest虚拟机存储为String。这不是作业的目的。它应该存储一个Guest对象。

    我希望这会对你有所帮助。

答案 5 :(得分:0)

我加入这个有点晚了,但错误的原因是你试图检查一个名为Guido的字符串,而不是一个名字字段为Guido的Guest(Gast)。您需要以下几行:
Gast guido = new Gast("Guido");
hotel.checkIn(guido); // this was previously hotel.checkIn("Guido")