Упражнение Java ООП

Упражнение с банкоматом

Он просит пользователя ввести идентификатор, затем проверяет правильность идентификатора и отображает главное меню с четырьмя вариантами.

Проблема

Проблема в том, что когда пользователь выбирает вариант, программа завершается ... но мне нужно, чтобы после запуска системы она никогда не останавливалась, пока пользователь не выберет 4 (это вариант выхода), а затем начнется все сначала.

вопрос в книге

(Игра: банкомат) Используйте класс Account, созданный в программном упражнении 9.7, для имитации банкомата. Создайте десять учетных записей в массиве с идентификатором 0, 1, . . . , 9 и начальный баланс $100. Система предлагает пользователю ввести идентификатор. Если идентификатор введен неправильно, попросите пользователя ввести правильный идентификатор. Как только идентификатор принят, отображается главное меню, как показано в примере запуска. Вы можете ввести вариант 1 для просмотра текущего баланса, 2 для снятия денег, 3 для внесения денег и 4 для выхода из главного меню. После выхода система снова запросит идентификатор. Таким образом, однажды запустив систему, она не остановится.

import java.util.Scanner;

public class Account {

    private int id;
    private double balance;
    private static double annualIntrestRate;
    private java.util.Date dateCreated;

    public Account() {

    }

    public Account(int id) {
        this.id = id;
        balance = 100;
        dateCreated = new java.util.Date();

    }

    public void setAnnualIntrest(double intrest) {
        annualIntrestRate = intrest;

    }

    public void setBalance(double newBalance) {
        balance = newBalance;
    }

    public void setID(int newID) {
        id = newID;
    }

    public double getBalance() {
        return balance;
    }

    public int getID() {
        return id;
    }

    public java.util.Date getDate() {
        return dateCreated;
    }

    public static double getMonthlyIntrestRate() {

        return ((annualIntrestRate / 12) / 100);
    }

    public double getMonthlyIntrest() {
        return (balance * getMonthlyIntrestRate());
    }

    public double withDraw(double withDrawAmount) {
        return balance = balance - withDrawAmount;
    }

    public double deposit(double depositeAmount) {
        return balance = balance + depositeAmount;
    }


    public static void main(String[] args) {

        Account[] accounts = new Account[10];
        for (int i = 0; i < accounts.length; i++) {
            accounts[i] = new Account(i);
        }

        Scanner input = new Scanner(System.in);

        System.out.print("Enter an ID: ");
        int enteredID = input.nextInt();


        while (enteredID != accounts[enteredID].getID()) {

            System.out.print("enter correct id!");
            enteredID = input.nextInt();


        }
        if (enteredID == accounts[enteredID].getID()) {


            System.out.println("Main Menu: ");
            System.out.println("1: check balance");
            System.out.println("2: withdraw");
            System.out.println("3: deposit");
            System.out.println("4: exit");

            System.out.print("Enter a choice: ");
            int choice = input.nextInt();

            if (choice == 1) {
                System.out.println("The balance is: " + accounts[enteredID].getBalance());
            } else if (choice == 2) {
                System.out.print("Enter withdraw amount: ");
                int withdrawAmount = input.nextInt();
                accounts[enteredID].withDraw(withdrawAmount);
            } else if (choice == 3) {
                System.out.print("Enter deposit amount: ");
                int depositAmount = input.nextInt();
                accounts[enteredID].deposit(depositAmount);
            } else if (choice == 4) {
                System.out.print("Enter an ID: ");
                enteredID = input.nextInt();
            }
        }


    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 689
3

Ответы 3

В вашей программе отсутствуют две основные части вопроса:

1) После выхода система снова запросит идентификатор. Таким образом, однажды запустив систему, она не остановится.

Это означает, что как только начнется реальная работа в вашем основном методе (первый «введите идентификатор»), программа не должна быть остановлена ​​​​внутренне; только через Ctrl-C, если он работает в терминале, или кнопку «Стоп», если он работает в среде IDE.

Для реализации этого вам понадобится внешний цикл while:

while(true) {
    // the rest of the code goes in here
}

вокруг всего тела «работы» в вашем основном методе.

2) После того, как идентификатор принят, отображается главное меню, как показано в примере запуска. Вы можете ввести вариант 1 для просмотра текущего баланса, 2 для снятия денег, 3 для внесения денег и 4 для выхода из главного меню.

Я предполагаю, что это означает, что до тех пор, пока не будет введена опция 4, меню должно продолжать появляться после того, как пользователь завершит задачу 1, 2 или 3, что означает, что для этой части кода необходимо использовать ДРУГОЙ цикл, т.е.:

boolean shouldExit = false;
while (!shouldExit) {
    // print menu and do your logic checking when a value is entered.
    if (choice == 4) {
        shouldExit = true; // This will break out of this loop, and go back to the first "enter an id".
    }
}

Надеюсь, это поможет вам двигаться в правильном направлении.

Попробуйте код ниже:

 import java.util.Scanner;
 public class Account {
   private int id;
   private double balance;
   private static double annualInterestRate;
   private java.util.Date dateCreated;
   public Account() { }
   public Account(int id) {
       this.id = id;
       this.balance = 100;
       this.dateCreated = new java.util.Date();
   }

   public void setAnnualInterest(double interest) {
       annualInterestRate = interest;
   }

   public void setBalance(double newBalance) {
       balance = newBalance;
   }

   public void setID(int newID) {
       id = newID;
   }

   public double getBalance() {
       return balance;
   }

   public int getID() {
       return id;
   }

   public java.util.Date getDate() {
       return dateCreated;
   }

   public static double getMonthlyInterestRate() {
       return ((annualInterestRate / 12) / 100);
   }

   public double withDraw(double withDrawAmount) {
       return balance = balance - withDrawAmount;
   }

   public double deposit(double depositAmount) {
       return balance = balance + depositAmount;
   }


   public static void main(String[] args) {

      Account[] accounts = new Account[10];
      for (int i = 0; i < accounts.length; i++) {
         accounts[i] = new Account(i);
      }
      Scanner input = new Scanner(System.in);
      System.out.print("Enter an ID: ");
      int enteredID;
      do {
         enteredID = input.nextInt();
         if (enteredID <= 9 && enteredID >=0 && enteredID == accounts[enteredID].getID()) {
            System.out.println("Main Menu: ");
            System.out.println("1: check balance");
            System.out.println("2: withdraw");
            System.out.println("3: deposit");
            System.out.println("4: exit");
             do {
                System.out.print("Enter a choice: ");
                int choice = input.nextInt();
                input.nextLine();
                 if (choice == 1) {
                    System.out.println("The balance is: " + accounts[enteredID].getBalance());
                 } else if (choice == 2) {
                     System.out.print("Enter withdraw amount: ");
                     int withdrawAmount = input.nextInt();
                     accounts[enteredID].withDraw(withdrawAmount);
                 } else if (choice == 3) {
                     System.out.print("Enter deposit amount: ");
                     int depositAmount = input.nextInt();
                     accounts[enteredID].deposit(depositAmount);
                 } else if (choice == 4) {
                     System.out.println("Exit");
                     System.out.println("Enter an ID");
                     break;
                 }
              } while (true);
           }
           else{
               System.out.print("enter correct id!");
           }

       }while(true);
   }
}

Я рекомендую использовать оператор switch вместо лестницы if-else.

                  // same as above code
                   System.out.print("Enter a choice: ");
                   int choice = input.nextInt();
                   input.nextLine();
                   switch(choice) {
                    case 1:
                        System.out.println("The balance is: " + accounts[enteredID].getBalance());
                        break;
                    case 2:
                        System.out.print("Enter withdraw amount: ");
                        int withdrawAmount = input.nextInt();
                        accounts[enteredID].withDraw(withdrawAmount);
                        break;
                    case 3:
                        System.out.print("Enter deposit amount: ");
                        int depositAmount = input.nextInt();
                        accounts[enteredID].deposit(depositAmount);
                        break;
                    case 4:
                        System.out.println("Exit");
                        System.out.println("Enter an ID");
                        break;
                }
            } while (true);
        }

импортировать java.util.Scanner;

Аккаунт открытого класса {

private int id;
private double balance;
private static double annualIntrestRate;
private java.util.Date dateCreated;

public Account() {

}

public Account(int id) {
    this.id = id;
    balance = 100;
    dateCreated = new java.util.Date();

}

public void setAnnualIntrest(double intrest) {
    annualIntrestRate = intrest;

}

public void setBalance(double newBalance) {
    balance = newBalance;
}

public void setID(int newID) {
    id = newID;
}

public double getBalance() {
    return balance;
}

public int getID() {
    return id;
}

public java.util.Date getDate() {
    return dateCreated;
}

public static double getMonthlyIntrestRate() {

    return ((annualIntrestRate / 12) / 100);
}

public double getMonthlyIntrest() {
    return (balance * getMonthlyIntrestRate());
}

public double withDraw(double withDrawAmount) {
    return balance = balance - withDrawAmount;
}

public double deposit(double depositeAmount) {
    return balance = balance + depositeAmount;
}


public static void main(String[] args) {

    Account[] accounts = new Account[10];
    for (int i = 0; i < accounts.length; i++) {
        accounts[i] = new Account(i);
    }

    Scanner input = new Scanner(System.in);

    System.out.print("Enter an ID: ");
    int enteredID = input.nextInt();
    boolean shouldExit = false;

    while (true) {

        if (enteredID >9) {

            System.out.print("enter correct id: ");
            enteredID = input.nextInt();



        }


        if (enteredID == accounts[enteredID].getID()) {


            System.out.println("Main Menu: ");
            System.out.println("1: check balance");
            System.out.println("2: withdraw");
            System.out.println("3: deposit");
            System.out.println("4: exit");

            System.out.print("Enter a choice: ");
            int choice = input.nextInt();

            if (choice == 1) {
                System.out.println("The balance is: " + accounts[enteredID].getBalance());
                continue;
            } else if (choice == 2) {
                System.out.print("Enter withdraw amount: ");
                int withdrawAmount = input.nextInt();
                accounts[enteredID].withDraw(withdrawAmount);
                continue;
            } else if (choice == 3) {
                System.out.print("Enter deposit amount: ");
                int depositAmount = input.nextInt();
                accounts[enteredID].deposit(depositAmount);
                continue;
            }

            shouldExit = false;
            while (!shouldExit) {
                if (choice == 4) {
                    System.out.print("Enter an ID: ");
                    enteredID = input.nextInt();

                    shouldExit = true;


                }

            }
        }


    }


}

}

Другие вопросы по теме