#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:
Вам нужно внести несколько изменений в код,
- массив 2d-символов необходимо использовать как в статическом контексте, поскольку вы используете один и тот же массив для изменений.
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)