Java中的ATM机

时间:2016-02-20 18:09:17

标签: java arrays methods

我一直试图找出这个我正在编写的程序出了什么问题。下面是我试图做的完整描述: 使用在编程实践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;

import 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;
            }
        }

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您正在拨打mainMenuOptions(),这会使所有帐户初始化为100美元。

我怀疑你希望保持程序运行,而你正试图通过调用mainMenuOptions()来实现这一目标。

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

  • mainMenuOptions()之外的帐户初始化,使用一次调用一次的单独方法。
  • 然后实际调用您从用户收到选项的main方法,并仅在用户输入Exit选项时退出 - 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");

  }

答案 3 :(得分:1)

好的,所以我终于厌倦了加载你的代码并查看它。现在这看起来像是一项家庭作业,所以我不打算发布解决方案,因为如果你不知道如何自己解决这些问题,那么你将成为一个糟糕的程序员。所以我会给你一个很大的暗示。

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

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

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

想一想,你很快就会意识到为什么你会遇到问题。您仍然必须将帐户对象放在mainMenuOptions之外以防止帐户被销毁,但您还必须对该初始化循环执行某些操作。

在将帐户移到班级后运行您的代码,并尝试通过存款,转换帐户,存款,切换回第一个帐户并进行余额查询来玩2个帐户。

如果您仍然遇到问题,请在代码的初始化帐户余额部分插入一个断点。我非常肯定你会在额头拍打自己并且大喊大叫#wt;我在想什么?&#34;

我相信你的男人。你有这个。如果你需要另一个提示,请打我回去。

另外,请注意,当您将帐户对象置于课堂下时,请确保帐户对象也是静态的。无法将静态引用作为动态对象。 IDE会咆哮你。 EX:

    public class test {

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

public static void main(String[] args) {

        mainMenuOptions();      
}

答案 4 :(得分:0)

所以你可以像这样做:

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;
        }               
    }

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

我曾经遇到过同样的问题,我将数据全部收集在一个arraylist中。我在类级别声明了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方法的空间中生效,并在必要时将其用作参数。

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

答案 5 :(得分:-1)

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

  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将最终变量从大到小除以a / b,其中a> = b。

如果用户需要210欧元,您将获得:

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

完成。

很简单。