Застрял на этой проблеме с многомерным массивом JAVA в течение некоторого времени, пожалуйста, помогите мне

#java #multidimensional-array

Вопрос:

Для начала программа должна прочитать два целых положительных числа, которые представляют количество строк и мест в каждой строке. Затем он должен распечатать меню со следующими тремя пунктами:

  • Показать, что места должны печатать текущее расположение сидений. Свободные места должны быть обозначены символом S, а занятые места обозначены символом B.
  • Покупая билет, вы должны прочитать координаты места на входе и распечатать стоимость билета, как и на предыдущем этапе. После этого выбранное место должно быть помечено буквой B при вызове пункта Показать места.
  • Выход должен остановить программу.

Вот что я пробовал до сих пор:

 import java.util.Scanner;

public class Main {

  static int rowNum;
  static int seatNum;

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the number of rows:");
    int rows = scanner.nextInt();
    System.out.println("Enter the number of seats in each row:");
    int seats = scanner.nextInt();


    boolean flag = true;
    while (flag != false) {
      System.out.println("1. Show the seats");
      System.out.println("2. Buy a ticket");
      System.out.println("0. Exit");

      int option = scanner.nextInt();

      switch (option) {
      case 1:
        showSeats(rows, seats, rowNum, seatNum);
        break;

      case 2:
        buyTicket(rows, seats);
        break;

      case 0:
        flag = false;
        break;
      }
    }

  }


private static void showSeats(int rows, int seats, int rowNum, int seatNum) {
    char[][] cinemaHall = new char[rows 1][seats 1];
    System.out.println("Cinema:");
    char count = '1';

    for (int i = 0; i <= rows; i  ) {
        for (int j = 0; j <= seats; j  ) {
            cinemaHall[i][j] = 'S';
        }
    }

    for (int i = 0; i < 1; i  ) {
        for (int j = 1; j <= seats; j  ) {
            cinemaHall[0][0] = ' ';
            cinemaHall[0][j] = count;
            count  ;
        }
        count = '1';
    }
    for (int i = 1; i <= rows; i  ) {
        for (int j = 0; j < 1; j  ) {
            cinemaHall[i][j] = count;
            count  ;

        }
    }

    if (cinemaHall[rowNum][seatNum] == 0) {
      for (int i = 0; i <= rows; i  ) {
        for (int j = 0; j <= seats; j  ) {
            System.out.print(cinemaHall[i][j]   " ");
        } System.out.println();
    }
    } else {
      char b = 'B';
      cinemaHall[rowNum][seatNum] = b;
      for (int i = 0; i <= rows; i  ) {
          for (int j = 0; j <= seats; j  ) {
            System.out.print(cinemaHall[i][j]   " ");
          } System.out.println();
      }
    }
  }

private static void buyTicket(int rows, int seats) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter a row number:");
    int rowNum1 = scanner.nextInt();
    rowNum = rowNum1;
    System.out.println("Enter a seat number in that row:");
    int seatNum1 = scanner.nextInt();
    seatNum = seatNum1;

    int first = rows / 2;
    int ticketPrice = 0;

    if (rows * seats < 60) {
        ticketPrice = 10;
    } else if (rowNum <= first) {
        ticketPrice = 10;
    } else {
        ticketPrice = 8;
    }
    System.out.println("Ticket price: $"   ticketPrice);
    System.out.println();

  }
}
 

Ожидаемые результаты:

 Enter the number of rows:
> 7
Enter the number of seats in each row:
> 7

1. Show the seats
2. Buy a ticket
0. Exit
> 1

Cinema:
  1 2 3 4 5 6 7
1 S S S S S S S
2 S S S S S S S
3 S S S S S S S
4 S S S S S S S
5 S S S S S S S
6 S S S S S S S
7 S S S S S S S

1. Show the seats
2. Buy a ticket
0. Exit
> 2

Enter a row number:
> 4
Enter a seat number in that row:
> 5
Ticket price: $10

1. Show the seats
2. Buy a ticket
0. Exit
> 1

Cinema:
  1 2 3 4 5 6 7
1 S S S S S S S
2 S S S S S S S
3 S S S S S S S
4 S S S S B S S
5 S S S S S S S
6 S S S S S S S
7 S S S S S S S

1. Show the seats
2. Buy a ticket
0. Exit
> 2

Enter a row number:
> 6
Enter a seat number in that row:
> 6
Ticket price: $10

1. Show the seats
2. Buy a ticket
0. Exit
> 1

Cinema:
  1 2 3 4 5 6 7
1 S S S S S S S
2 S S S S S S S
3 S S S S S S S
4 S S S S B S S
5 S S S S S S S
6 S S S S S B S
7 S S S S S S S

1. Show the seats
2. Buy a ticket
0. Exit
> 0
 

Проблема с моим выводом:
(1) когда показ мест запускается в первый раз, в CinemaHall [0][0] он печатает B, хотя я пытался справиться с этим через блок if-else.
(2)Массив сбрасывается после каждого вызова метода покупки билета, поэтому, когда я покупаю другое место, программа не показывает уже забронированное место.

Комментарии:

1. Вы храните только 2d-массив внутри showSeats , как вы ожидаете buyTicket каким-либо образом взаимодействовать с массивом? У вас должен быть массив, который вы инициализируете в другом месте, и передадите его методам, которые этого требуют.

2. Просто предположение, что при решении этих проблем сначала вы можете подумать, что вам нужен 2D-массив, но в данном случае это не так. Вы можете иметь массив 1D и все равно решить проблему. Выделение mem и назначение элементов массиву дорого. Современные языки (например, Rust) рекомендуют не использовать 2D-массивы. (Если, конечно, у вас нет веских оснований для их наличия)

Ответ №1:

Вам нужно внести несколько изменений в код,

  1. массив 2d-символов необходимо использовать как в статическом контексте, поскольку вы используете один и тот же массив для изменений.
  2. showSeats метод должен проверить, есть ли уже заданное значение для конкретного места, и если нет, измените места.

поэтому после этих изменений код будет выглядеть следующим образом,

 static int rowNum;
static int seatNum;
static char[][] cinemaHall;

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the number of rows:");
    int rows = scanner.nextInt();
    System.out.println("Enter the number of seats in each row:");
    int seats = scanner.nextInt();
    cinemaHall = new char[rows 1][seats 1];

    boolean flag = true;
    while (flag != false) {
        System.out.println("1. Show the seats");
        System.out.println("2. Buy a ticket");
        System.out.println("0. Exit");

        int option = scanner.nextInt();

        switch (option) {
            case 1:
                showSeats(rows, seats, rowNum, seatNum);
                break;

            case 2:
                buyTicket(rows, seats);
                break;

            case 0:
                flag = false;
                break;
        }
    }

}


private static void showSeats(int rows, int seats, int rowNum, int seatNum) {
    System.out.println("Cinema:");
    char count = '1';

    for (int i = 0; i <= rows; i  ) {
        for (int j = 0; j <= seats; j  ) {
            if(cinemaHall[i][j]!='B'){
                cinemaHall[i][j] = 'S';
            }
        }
    }

    for (int i = 0; i < 1; i  ) {
        for (int j = 1; j <= seats; j  ) {
            cinemaHall[0][j] = count;
            count  ;
        }
        count = '1';
    }
    for (int i = 1; i <= rows; i  ) {
        for (int j = 0; j < 1; j  ) {
            cinemaHall[i][j] = count;
            count  ;

        }
    }

    
    char b = 'B';
    cinemaHall[rowNum][seatNum] = b;
    cinemaHall[0][0] = ' ';
    for (int i = 0; i <= rows; i  ) {
        for (int j = 0; j <= seats; j  ) {
            System.out.print(cinemaHall[i][j]   " ");
            } System.out.println();
        }          
    }

private static void buyTicket(int rows, int seats) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter a row number:");
    int rowNum1 = scanner.nextInt();
    rowNum = rowNum1;
    System.out.println("Enter a seat number in that row:");
    int seatNum1 = scanner.nextInt();
    seatNum = seatNum1;

    int first = rows / 2;
    int ticketPrice = 0;

    if (rows * seats < 60) {
        ticketPrice = 10;
    } else if (rowNum <= first) {
        ticketPrice = 10;
    } else {
        ticketPrice = 8;
    }
    System.out.println("Ticket price: $"   ticketPrice);
    System.out.println();

}
 

и пример вывода отображается ниже,

 Enter the number of rows:
5
Enter the number of seats in each row:
5
1. Show the seats
2. Buy a ticket
0. Exit
1
Cinema:
  1 2 3 4 5 
1 S S S S S 
2 S S S S S 
3 S S S S S 
4 S S S S S 
5 S S S S S 
1. Show the seats
2. Buy a ticket
0. Exit
2
Enter a row number:
1
Enter a seat number in that row:
1
Ticket price: $10

1. Show the seats
2. Buy a ticket
0. Exit
1
Cinema:
  1 2 3 4 5 
1 B S S S S 
2 S S S S S 
3 S S S S S 
4 S S S S S 
5 S S S S S 
1. Show the seats
2. Buy a ticket
0. Exit
2
Enter a row number:
2
Enter a seat number in that row:
1
Ticket price: $10

1. Show the seats
2. Buy a ticket
0. Exit
1
Cinema:
  1 2 3 4 5 
1 B S S S S 
2 B S S S S 
3 S S S S S 
4 S S S S S 
5 S S S S S 
1. Show the seats
2. Buy a ticket
0. Exit
0
 

Комментарии:

1. первая часть исходной проблемы все еще существует, при первом запуске метода show seats программа по-прежнему показывает «B» при (0,0).

2. Обновите последний else вход showSeats() с помощью else if(cinemaHall[rowNum][seatNum] > 0)