0

これはコースワーク用です。私はプログラム全体を構築しました、そしてそれはこの1つのことを除いてすべてを正しく行います。

「Schedule」というクラスがあります。このメソッドはスケジュールの最後にあります。

public void bookSeatMenu()
    {   boolean leaveBookSeatMenu = false;
        String seatBookingMenuStr;
        int seatBookingMenuInt = 14;
        boolean isInteger = false;
        Scanner input = new Scanner(System.in);
        System.out.println("Press 1 to add an individual booking, 2 to cancel a booked seat or 3 to go back");

        seatBookingMenuStr = input.nextLine();
                  try {
                      seatBookingMenuInt = Integer.parseInt(seatBookingMenuStr);
                      isInteger = true;
                    }

                    catch (NumberFormatException e) {

                    }
                  switch (seatBookingMenuInt) {
                      case 1: 
                        bookSeat();
                        break;
                      case 2:
                        cancelSeat();
                        break;
                      case 3:
                        leaveBookSeatMenu = true;
                        break;
                      default:
                        System.out.println("Invalid Choice");
                    } while (leaveBookSeatMenu == false);

                } 

スイッチメニューがどのようなものかご存知の方もいらっしゃると思いますが、ここで間違えた場合に備えて、とにかくそこに入れてみようと思いました。

先に進むと、私にはbookSeat方法があります。これは、ユーザーが座席を予約する場所です(これは正常に機能します)。その後bookSeatMenu()、メニューを表示するだけで表示されます。しかし、その後は前のものに戻りません。

   public void bookSeat()
   {
       Scanner input = new Scanner(System.in);
       boolean isSeatBooked = true;
       showSeatPlan();
       int seatNum = 0;
       int rowNum = 90;
       int columnNum = 16;
       boolean isInt = false;

       while (isSeatBooked == true)
       {
           System.out.println("Please pick column of a seat to book");
           columnNum = input.nextInt();

           System.out.println("Please pick row of a seat to book");
           rowNum = input.nextInt();


           seatNum = (columnNum + ((rowNum) * 15));

           if (seats[seatNum] == false)
           {
               isSeatBooked = false;
           }
           else
           {
               System.out.println("This seat is already booked");
            }
       }

       seats[seatNum] = true;


       System.out.println("");
       bookSeatMenu();
   }

今では愛やお金のためではなく、席を予約した後、前のメニューに戻すことができます。

基本的に、プロセスは次のとおりです。

座席を予約->bookSeatMenuに移動->4を押して戻る->前のメニューに移動します。

座席を予約しないと、プログラムは前もってメニューに戻ってくれますが、その後はコマンドプロンプトの新しい行に進み続け、他に何もせず、エラーも発生しません。

私はこれがBlueJの問題かもしれないと言いたくなりますが、悪い職人が彼のツールを非難し、私は「あの男」になりたくありません

また、「テストクラス」を作成する必要があります。これまで「テストクラス」を使用したことがなく、誰も購入しなかった「教科書」を確認するように求められたため、実際にはわかりません。

4

1 に答える 1

4

ないswitch...whileので、問題は3を選択するとすぐにwhile(true);、無限ループになってしまうことだと思います。

正しい擬似コード:

do {
   // read System.in

   // handle menu options with your switch
} while(...)

ちなみに、デザインは悪い私見です。モデルについて考えて(あなたの場合、、、、のようなものが表示されます)Room、それらのオブジェクトを相互に作用させる必要があります。SeatSchedulerMenu

public class Room {
    private Seat[][] seats;
    public String toString() {
        // like showSeatPlan() using toString() of Seat
    }
}

public class Seat {
    private int row, column;
    private boolean isBooked;
    public void book() { /* ... */ }
    public void cancel() { /* ... */ }
    public String toString() { /* "X" or " " */ }
}

public final class Scheduler {
   // "main class" with a "main" method
}

public class Menu {
    private Room room;
    public String toString() {
        // print out menu
    }
    public void bookSeat() { /* ... */ }
    public void cancelSeat() { /* ... */ }
}

(そんな感じ)

テスト部分の場合、各クラスにはテストクラスがあり、各メソッドには、例として、次のテストメソッドがありますSeat

public class Seat {
    public void book() { 
        if (this.isBooled) {
           throw new CannotBookException("seats is taken!");
        }
        this.isBooled = true;
    }
}

public class SeatTest {
    @Test // when I book a seat, it's markedas booked.
    public void testBook() {
        final Seat seat = new Seat();
        seat.book();
        assertTrue(seat.isBooked)
    }

    @Test(expected = CannotBookException.class) // when I book an already booked seat, I get an exception.
    public void testBookAlreadBooked() {
        final Seat seat = new Seat();
        // book the seat
        seat.book();
        assertTrue(seat.isBooked)

        // try to book again
        seat.book();
    }
}
于 2012-05-04T05:32:14.287 に答える