【问题标题】:ATM Machine in JavaJava中的ATM机
【发布时间】:2016-02-20 18:09:16
【问题描述】:

我一直试图弄清楚我正在编写的这个程序出了什么问题。这是我正在尝试做的事情的完整描述: 使用在编程练习 9.7 中创建的 Account 类来模拟 ATM 机。在 id 为 0, 1, 的数组中创建十个帐户。 . . , 9, 初始余额 100 美元。系统提示用户输入一个id。如果 id 输入错误,请要求用户输入正确的 id。一旦一个 id 被接受,主菜单就会显示,如示例运行中所示。可以输入选项1查看当前余额,2取款,3存款,4退出主菜单。退出后,系统会再次提示输入 id。因此,系统一旦启动,就不会停止。

该程序现在仅在每次购买后显示默认的 100 美元。我意识到问题是每次交易后都会重新创建我的帐户。我的问题基本上是我能做什么或者我在哪里可以重写帐户创建,所以我避免了这个问题。我是编程新手,所以我还在苦苦挣扎。提前致谢。

import java.util.Date;
import java.util.Scanner;
public class test {

    public static void main(String[] args) {

            mainMenuOptions();      
    }
            //main menu option method
    public static void mainMenuOptions(){
        Scanner input = new Scanner(System.in);
        //enter id
        System.out.println("Enter an id: "); 
        int id = input.nextInt();
        //create accounts
          Account [] accounts = new Account[10];
        //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) { 
            accounts[i] = new Account(i, 100); 
        }
        int index = -1; 
        for(int i = 0; i < accounts.length; i++) {
            if(accounts[i].getid() == id) {
            index = i; 
            i = accounts.length;
            }               
        }
        if(id <= 9){
            //main menu
            mainMenu();
            //user enters choice in main menu   
            int enterchoice = input.nextInt();                          
            if(enterchoice == 1){
                System.out.println("The balance is " + accounts[index].getbalance());
                mainMenuOptions();
            }
            else if(enterchoice == 2){
                System.out.println("Enter an amount to withdraw ");
                double amount = input.nextDouble();
                //withdraw method
                accounts[index].withdraw(amount);
                mainMenuOptions();
            }
            else if(enterchoice == 3){
                System.out.println("Enter an amount to deposit ");
                double amount = input.nextDouble();
                //deposit method
                accounts[index].deposit(amount);
                mainMenuOptions();
            }
            else if(enterchoice == 4){
                mainMenuOptions();
            }   
        }
        else{
            System.out.println("Please enter a correct id");
            mainMenuOptions();
        }

    }
    //main menu method
    public static void mainMenu(){
        System.out.println("Main menu"+"\n1:check balance"+"\n2:withdraw"
                +"\n3:deposit"+"\n4:exit"+"\nEnter a choice");

    }
    }
        class Account{
            private int id = 0;
            private double balance = 0;
            private double withdraw = 0;
            private double deposit = 0;
            private double amount = 0;

            Account(){
            }

            Account(int id, double balance){
                this.id = id;
                this.balance = balance;
            }

            public int getid(){
                return this.id;

            }
            public void setid(int newid){
                id = newid;
            }
            public double getbalance(){
                return this.balance;
            }
            public void withdraw(double amount){
                balance = balance - amount;
            }

            public void deposit(double amount){
                balance = balance + amount;
            }
        }

编辑:当我去检查余额时,它会将我重新循环回扫描仪以获取 ID 和选项。我不确定这里的问题是什么,有人可以尝试运行我的代码或给我一些关于可能是什么问题的见解。谢谢。该程序应该能够通过任何交易选择,模拟 ATM 机,id 是 0-9 之间的数字。这是新的更新代码。

import java.util.Date;

导入 java.util.Scanner;

public class test {

    private static Account[] accounts = new Account[10];

    public static void main(String[] args) {
        accounts();
        mainMenuOptions();      
}
    //main menu option method
    public static void mainMenuOptions() {
        Scanner input = new Scanner(System.in);

        int enterchoice = -1;
        int id=-1;
        while (enterchoice != 4) {
          mainMenu();
          System.out.println("Enter an id: ");
          id = input.nextInt();
          //enter id
          System.out.println("Enter choice:  ");
           enterchoice = input.nextInt();

          int index = -1;
          for (int i = 0; i < accounts.length; i++) {
            if (accounts[i].getid() == id) {
              index = i;
              break;
            }
          }
          if (enterchoice == 1) {
            System.out.println("The balance is " + accounts[index].getbalance());       
          } else if (enterchoice == 2) {
            System.out.println("Enter an amount to withdraw ");
            double amount = input.nextDouble();
            //withdraw method
            accounts[index].withdraw(amount);               
          } else if (enterchoice == 3) {
            System.out.println("Enter an amount to deposit ");
            double amount = input.nextDouble();
            //deposit method
            accounts[index].deposit(amount);
          } 
        }
      }

     public static void accounts() {
        //create accounts
        //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) {
            accounts[i] = new Account(i, 100);
        }
    }
    //main menu method
    public static void mainMenu(){
        System.out.println("Main menu"+"\n1:check balance"+"\n2:withdraw"
                +"\n3:deposit"+"\n4:exit");

    }
    }
        class Account{
            private int id = 0;
            private double balance = 0;
            private double withdraw = 0;
            private double deposit = 0;
            private double amount = 0;

            Account(){
            }

            Account(int id, double balance){
                this.id = id;
                this.balance = balance;
            }

            public int getid(){
                return this.id;

            }
            public void setid(int newid){
                id = newid;
            }
            public double getbalance(){
                return this.balance;
            }
            public void withdraw(double amount){
                balance = balance - amount;
            }

            public void deposit(double amount){
                balance = balance + amount;
            }
        }

【问题讨论】:

  • 您想在您的程序中使用循环进行多笔交易,并且您想保存您的帐户信息以便在您重新启动程序时不会丢失吗?顺便说一句,我建议您在 IDE 中使用格式化程序以使代码更具可读性。
  • 是的,该程序有多个 id (0-9) 代表一个帐户。输入 id 1 后,您可以根据需要多次提取/存款或检查我们的余额,直到您点击退出命令。这一切都很好,只是余额将始终保持在起始 100 美元,因为我目前每次都在 mainMenuOptions 中重新创建这些帐户。我知道这是问题所在,我只需要关于将其移至何处或如何防止它不断重新创建 10 个帐户的帮助。

标签: java arrays methods


【解决方案1】:

每次“事务”完成时,您都在递归调用 mainMenuOptions()。此函数每次都会重新创建所有帐户。

您应该只创建一次帐户,最好是在 mainMenuOptions() 外部调用的单独函数上,在主调用之后和 mainMenuOptions() 之前。为此,您必须将 accounts 数组设为主类(测试)的属性或将其传递给 mainMenuOptions()。

【讨论】:

    【解决方案2】:

    尝试将您的帐户对象移到 mainmenuoptions 方法之外,并在该类下声明它。

    您的对象在调用后在方法结束时被销毁。

    【讨论】:

    • 将其设为私有?我不确定如何移动帐户创建,因为它与方法中的其他所有内容如此相关。
    • 你只需将其滑入课堂区域并将其设为私有即可。这将解决它重置的问题。
    【解决方案3】:

    您正在调用 mainMenuOptions(),这将使所有帐户初始化回 100 美元。

    我怀疑您希望保持程序运行,并且无论如何您都试图通过调用mainMenuOptions() 来实现。

    要保持程序运行,请尝试:

    • 在调用一次的单独方法中初始化mainMenuOptions() 之外的帐户。
    • 然后实际调用 main 方法,您从用户那里收到一个选项,并且只有在用户输入退出选项时才退出 - 4

    示例:

    mainMenu();
    System.out.println("Enter Option: "); 
    int option = input.nextInt();
    while(option != 4) { // keep looping unless user wants to exit
    // process the option [deposit, withdrawal etc]
    
    mainMenu();
    System.out.println("Enter Option: "); 
    int option = input.nextInt();
    }
    
    //at this point the user selected exit and you can terminate or do whatever
    

    你可以试试这样的。这个想法是不断询问用户的选择,直到他决定离开。你可以适应你的需要。

    编辑:

        public class test {
    
          private static Account[] accounts = new Account[10];
    
      public static void main(String[] args) {
    
          accounts();
          mainMenuOptions();
        }
        //main menu option method
      public static void mainMenuOptions() {
        Scanner input = new Scanner(System.in);
    
        int enterchoice = -1;
        int id=-1;
        while (enterchoice != 4) {
          mainMenu();
          System.out.println("Enter choice: ");
          enterchoice = input.nextInt();
          //enter id
          System.out.println("Enter an id: ");
           id = input.nextInt();
    
          int index = -1;
          for (int i = 0; i < accounts.length; i++) {
            if (accounts[i].getid() == id) {
              index = i;
              break;
            }
          }
          if (enterchoice == 1) {
            System.out.println("The balance is " + accounts[index].getbalance());
          } else if (enterchoice == 2) {
            System.out.println("Enter an amount to withdraw ");
            double amount = input.nextDouble();
            //withdraw method
            accounts[index].withdraw(amount);
          } else if (enterchoice == 3) {
            System.out.println("Enter an amount to deposit ");
            double amount = input.nextDouble();
            //deposit method
            accounts[index].deposit(amount);
          } 
        }
      }
    
      public static void accounts() {
        //create accounts
        //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) {
          accounts[i] = new Account(i, 100);
        }
      }
    
      //main menu method
      public static void mainMenu() {
        System.out.println("Main menu" + "\n1:check balance" + "\n2:withdraw" + "\n3:deposit" + "\n4:exit" + "\nEnter a choice");
    
      }
    

    【讨论】:

    • 你是说像我刚刚在编辑中那样做吗?我知道我必须从方法中删除它,但我不确定下一步该怎么做
    • 这是第一步。但正如您可能已经意识到的那样,一旦您退出 accounts() 方法,您就会丢失 accounts 变量中的所有内容。您需要将“帐户”移动到该类的实例变量中。
    • 对不起,我现在很困惑。你能告诉我这个例子吗?我一直在努力让它工作几个小时
    • 现在看看。想法是移动类下的帐户。您还在 mainMenuOptions 方法中使用了不存在的变量索引。您编辑的程序甚至无法编译。
    • 我正在尝试使其成为该类的实例,但帐户上仍然存在“无法对非静态方法进行静态引用”。你能给我解释一下吗,我以为我做到了,但我不知道为什么它不能编译
    【解决方案4】:

    好的,所以我终于生气到加载您的代码并查看它。现在这看起来像是一项家庭作业,所以我不会发布解决方案,因为如果您不知道如何自己解决这些问题,您将成为一个糟糕的编码员。所以我要给你一个很大的提示。

    查看您创建帐户的位置下方的注释行。你在那里做了一个 For 循环。

    //initialize 100 dollars
        for (int i = 0; i < accounts.length; i++) { 
            accounts[i] = new Account(i, 100); 
        }
    

    我想问你一个问题,如果我调用 mainMenuOptions 并运行这段代码,下次运行这个方法时,当我到达这个循环时会发生什么?

    想一想,您会很快意识到自己遇到问题的原因。您仍然必须将帐户对象放在 mainMenuOptions 之外,以防止帐户被破坏,但您还必须对初始化循环做一些事情。

    将账户移到班级级别后运行代码,并尝试通过存款、切换账户、存款、切换回第一个账户和查询余额来玩其中的 2 个账户。

    如果您仍然遇到问题,请在代码的初始化帐户余额部分插入一个断点。我很肯定你会拍自己的额头并大喊“我在想什么?”

    我对你有信心。你得到了这个。如果您需要其他提示,请回击我。

    附带说明,当您将帐户对象放在类下时,请确保您也将其设为静态。不能有静态引用动态对象。 IDE 会冲你咆哮。例如:

        public class test {
    
    private static Account [] accounts = new Account[10];
    
    public static void main(String[] args) {
    
            mainMenuOptions();      
    }
    

    【讨论】:

      【解决方案5】:

      所以你可以这样做兄弟:

      public class test {
      
      private Account [] accounts = new Account[10];
      
      public static void main(String[] args) {
      
              mainMenuOptions();      
      }
              //main menu option method
      public static void mainMenuOptions(){
          Scanner input = new Scanner(System.in);
          //enter id
          System.out.println("Enter an id: "); 
          int id = input.nextInt();
      
          //initialize 100 dollars
          for (int i = 0; i < accounts.length; i++) { 
              accounts[i] = new Account(i, 100); 
          }
          int index = -1; 
          for(int i = 0; i < accounts.length; i++) {
              if(accounts[i].getid() == id) {
              index = i; 
              i = accounts.length;
              }               
          }
      

      现在对象存在于方法之外,因此当方法关闭时,它不会破坏对象。这些帐户将持续存在,您应该能够从那里做您想做的事情。

      前段时间我遇到了同样的问题,我的数据全部存储在数组列表中。我在类级别声明了 Object,它存在于我的 For 语句的每个循环中,导致列表中的条目加倍。我将它移到 For 语句中,并意识到每次 For 语句完成一个循环时,它都会破坏对象并重新实例化它。

      试一试,我认为它应该可以解决每次调用 mainMenuOptions() 方法时重新创建帐户对象的问题。

      如果您担心大型应用程序中的内存溢出,您也可以像其他发帖人所说的那样在主程序中创建它

       public class test {
      
      public static void main(String[] args) {
              Account [] accounts = new Account[10];
              mainMenuOptions(accounts);      
      }
              //main menu option method
      public static void mainMenuOptions(Account accounts){
          Scanner input = new Scanner(System.in);
          //enter id
          System.out.println("Enter an id: "); 
          int id = input.nextInt();
      
          //initialize 100 dollars
          for (int i = 0; i < accounts.length; i++) { 
              accounts[i] = new Account(i, 100); 
          }
          int index = -1; 
          for(int i = 0; i < accounts.length; i++) {
              if(accounts[i].getid() == id) {
              index = i; 
              i = accounts.length;
              }               
          }
      

      在这个版本中,您已经创建了对象以存在于 main 方法中。在这里,我实例化了对象并将其作为参数传递给 mainMenuOptions。这样,如果您决定不希望它对 main 中的所有子方法全局可用,您现在可以使其仅存在于 main 方法的空间中,并在必要时将其用作参数。

      这两种解决方案都可以使用。我的第一个建议是快速而肮脏,因为它是一个小程序。但是,在较大的程序中,您可能希望使用第二种方法来防止该对象可用于该类中包含的其他方法。

      【讨论】:

      • 实现后如何消除错误,例如方法 mainMenuOptions() 之类的错误不适用于 main 方法中的参数(Account[])
      【解决方案6】:

      您可以兑换货币的应用程序的理念如下:

      1. 定义最终变量,如
          private final int EURO200 = 200;
          private final int EURO50 = 50;
          private final int EURO20 = 20;
          private final int EURO10 = 10;
          private final int EURO5 = 5;
      
      1. 从用户那里获取金额,然后用最终变量从大到小除以条件 a/b where a>=b。

      如果用户需要 210 欧元,那么您会得到:

      210/200 = 1 //(rest 10) One 200 euro bill
      10/10 = 1   //(rest 0)  One 10 euro bill
      

      完成。

      很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多