@Amir1807

Проверить встречается ли строка больше одного раза?

Это учебная задачка, имеется двумерный массив и при бронирования билета второй раз должно выводится что это место уже занято

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

1. Show the seats
2. Buy a ticket
3. Statistics
0. Exit

> 3

Number of purchased tickets: 0
Percentage: 0.00%
Current income: $0
Total income: $360


1. Show the seats
2. Buy a ticket
3. Statistics
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
3. Statistics
0. Exit

> 3

Number of purchased tickets: 1
Percentage: 2.78%
Current income: $10
Total income: $360


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

Enter a row number:
> 1
Enter a seat number in that row:
> 1

That ticket has already been purchased!

Ниже представлен код:
import java.util.Scanner;

public class Main {
    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();

        System.out.println();

        String[][] arr = createCinema(rows, seats);
        while (true) {
            System.out.println("1. Show the seats\n" +
                    "2. Buy a ticket\n" +
                    "3. Statistics\n" +
                    "0. Exit");
            int choice = scanner.nextInt();
            if (choice == 1) {
                printCinema(arr);
            } else if (choice == 2) {
                System.out.println("Enter a row number: ");
                int checkRow = scanner.nextInt();
                System.out.println("Enter a seat number in that row: ");
                int checkSeat = scanner.nextInt();
                ticketPrice(rows, seats, checkRow);
                arr[checkRow][checkSeat] = "B";
            } else if (choice == 3) {
                int countOfTickets = 0;
                int count = 0;
                double percentage;
                for (int i = 0; i < arr.length; i++) {
                    for (int j = 0; j < arr[i].length; j++) {
                        if (arr[i][j].equals("B")) {
                            countOfTickets++;
                            count += currentIncome(rows, seats, i);
                        }
                    }
                }
                percentage = (double) Math.round(count * 100) / totalIncome(rows, seats);

                System.out.println("Number of purchased tickets: " + countOfTickets);
                System.out.print("Percentage: ");
                System.out.format("%.2f", percentage);
                System.out.println("%");
                System.out.println("Current income: $" + count);
                System.out.println("Total income: $" + totalIncome(rows, seats));
            } else if (choice == 0) {
                break;
            }
        }
    }

    public static String[][] createCinema(int rows, int seats) {
        String[][] arr = new String[rows + 1][seats + 1];
        int count = 1;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (i == 0 && j == 0) {
                    arr[i][j] = " ";
                } else {
                    arr[i][j] = String.valueOf(count);
                    count++;
                }
                if (i > 0 && j == 0) {
                    arr[i][j] = String.valueOf(i);
                } else if (i > 0 && j > 0) {
                    arr[i][j] = "S";
                }
            }
        }
        return arr;
    }

    public static void printCinema(String[][] cinema) {
        System.out.println();
        System.out.println("Cinema: ");
        for (int i = 0; i < cinema.length; i++) {
            for (int j = 0; j < cinema[i].length; j++) {
                System.out.print(cinema[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void ticketPrice(int rows, int seats, int checkRow) {
        System.out.println();
        if (rows * seats <= 60) {
            System.out.println("Ticket price: $10");
        } else {
            if (rows % 2 == 0) {
                if (checkRow <= rows / 2) {
                    System.out.println("Ticket price: $10");
                } else {
                    System.out.println("Ticket price: $8");
                }
            } else {
                if (checkRow <= rows / 2) {
                    System.out.println("Ticket price: $10");
                } else {
                    System.out.println("Ticket price: $8");
                }
            }
        }
    }

    public static int currentIncome(int rows, int seats, int checkRow) {
        if (rows * seats <= 60) {
            return 10;
        } else {
            if (rows % 2 == 0) {
                if (checkRow <= rows / 2) {
                    return 10;
                } else {
                    return 8;
                }
            } else {
                if (checkRow <= rows / 2) {
                    return 10;
                } else {
                    return 8;
                }
            }
        }

    }

    public static int totalIncome(int rows, int seats) {
        return rows * seats * 10;
    }
}
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день. Давным-давно писал аналогичный учебный проект про приобретению билета для кино.
Правда, я тогда уже использовал Hibernate + MySQL.
Вот, тут можно глянуть исходники - https://github.com/hasanli-orkhan/learn-java/tree/...

Скажу, что ваш код реализован некорректно.
Во-первых, Java это ООП язык и соответственно, вам нужно использовать всю мощь ООП. Например, создайте pojo Ticket, у каждого билета своя стоимость, а также булево значение isPurchased и т.д. В общем, гляньте на исходник моего проекта станет ясно.

Такой вариант плох тем, что во-первых это скорее процедурный подход, нежели ООП. Во-вторых, представьте, что у вас завтра изменится стоимость билетов и вам нужно править код в нескольких местах. А завтра заказчик скажет, что валюта не в долларах, а в рублях и вам придется заново править код и т.д.
так не должно быть
public static void ticketPrice(int rows, int seats, int checkRow) {
        System.out.println();
        if (rows * seats <= 60) {
            System.out.println("Ticket price: $10");
        } else {
            if (rows % 2 == 0) {
                if (checkRow <= rows / 2) {
                    System.out.println("Ticket price: $10");
                } else {
                    System.out.println("Ticket price: $8");
                }
            } else {
                if (checkRow <= rows / 2) {
                    System.out.println("Ticket price: $10");
                } else {
                    System.out.println("Ticket price: $8");
                }
            }
        }
    }


Далее если вы оперируете валютой, то лучше использовать BigDecimal, вместо double.

Разделите ваш код на объекты. Например, Cinema, Ticket, Session и др. Далее создайте сервисные классы, в которых будут методы по добавлению фильма, по приобретению билетов и т.д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы