2014-11-03 113 views
0

我正在做一个atm程序,我很难找出如何让它实际存入和取出。余额自动以$ 0开头,但我无法获得任何我输入的内容以实际添加或减去它我做错了什么?Java ATM程序

public class ATM { 
static Scanner keyboard = new Scanner(System.in); 
static String acctNum, pwd, result; 
static double oldBalance, newBalance, deposit, withdraw; 
static int choose; 

public static void main(String[] args) { 
    for (int run = 0; run < 3; run++) { 
     System.out.println("Enter your account number"); 
     acctNum = keyboard.nextLine(); 
     System.out.println("Enter your account password"); 
     pwd = keyboard.nextLine(); 

     result = checkID(acctNum, pwd); 
     if (!result.equals("ERROR")) { 
      break; 
     } else if (run == 2) {// you cannot try to log in anymore than 3 
           // times 
      System.out.println("MAXIMUM TRIES EXCEEDED"); 
      return; 
     } 

    } 
    menu(); 
} 

public static String checkID(String acctNum, Object pwd) { 
    String result = "ERROR"; 
    String a = "44567-5 mypassword 520.36"; 
    String b = "1234567-6 anotherpassword 48.20"; 
    String c = "4321-0 betterpassword 96.74"; 

    if (acctNum.equals("44567-5") && pwd.equals("mypassword")) { 
     result = "520.36"; 
    } else if (acctNum.equals("1234567-6") && pwd.equals("anotherpassword")) { 
     result = "48.20"; 
    } else if (acctNum.equals("4321-0") && pwd.equals("betterpassword")) { 
     result = "96.74"; 
    } 
    System.out.println(result); 
    return result; 
} 

public static int menu() { 
    System.out 
      .println("Choose one of the following: \n1.Display Balance\n2.Deposit\n3.Withdraw\n4.Log Out"); 
    choose = keyboard.nextInt(); 

    if (choose == 1) {// 1. Display Balance 
     displayBalance(); 
     menu(); 
     return 1; 

    } 
    if (choose == 2) {// 2. Deposit 
     deposit(); 
     menu(); 
     return 2; 

    } 
    if (choose == 3) {// 3. Withdraw 
     withdraw(); 
     menu(); 
     return 3; 

    } 
    if (choose == 4) {// 4. Log out 
     System.out.println("You are logged out."); 
     return 4; 

    } 
    if (choose <= 5) {// type in anything greater than 4 and you will get a 
         // system error 
     System.out.println("System Error"); 
     menu(); 
     return 5; 
    } 
    if (choose >= 1) {// type in anything less than 1 and you will get a 
         // system error 
     System.out.println("System Error"); 
     menu(); 
     return 6; 
    } 
    return choose; 

} 

public static double deposit() { 
    System.out.println("How much would you like to deposit?"); 
    deposit = keyboard.nextInt(); 
    System.out.println((deposit + oldBalance)==newBalance);// deposit money into balance 
    return 2; 
} 

public static double displayBalance() { 
    System.out.println("Total balance is: $" + oldBalance); 
    oldBalance = 0.00; 
    return 1; 
} 

public static double withdraw() { 
    System.out.println("How much would you like to withdraw?"); 
    withdraw = keyboard.nextInt(); 
    System.out.println(newBalance + withdraw);// withdraw money from balance 
    return 3; 
} 

}

+2

你不改变平衡的价值观......还,不使用递归的方法调用此,使用'做-while'循环,而不是(你'menu'方法中) – MadProgrammer 2014-11-03 00:57:23

回答

1

几个意见:

  1. 你的类不应该声明oldBalance,存款,取款和全局变量。取款方法不应该有权访问存款变量,反之亦然。尽可能多地限制变量的范围是一种很好的编程习惯。由于“存款”变量在此方法之外并不是真正需要的,因此绝对没有理由将其作为全局变量。关于“当前的平衡”也不能这样说。该类的所有方法都需要这个变量:存款,取款,显示余额等等。因此,为什么要把它变成全局的是一个很好的理由(但是,如果你能用较小的范围解决问题,你应该这样做)。

  2. 我不明白为什么deposit()withdrawal()需要返回任何东西。

deposit()withdrawal()最简单的实现是简单地将用户输入添加到currentBalance并将其保存在currentBalance

public void deposit() 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.printn("Enter deposit amount:); 
    double amount = input.nextDouble(); 
    System.out.println("Your deposit amount: " + amount); 
    currentBalance += amount; 
    System.out.println("Your new balance is: + currentBalance); 
} 

public void withdrawal() 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.printn("Enter withdrawal amount:); 
    double amount = input.nextDouble(); 
    System.out.println("Your withdrawal amount: " + amount); 
    currentBalance -= amount; 
    System.out.println("Your new balance is: + currentBalance); 
} 

您永远不会保存当前余额。 ==运算符是比较运算符,不是赋值运算符。当你做这样的事情:

System.out.println((deposit + oldBalance)==newBalance); 

或者这样:

System.out.println(newBalance + withdraw); 

所有你做的是将值传递给println()方法,而不是更新是应该保持平衡的变量。实际上,第一个应该打印false(除非存款和oldBalance都为零)。如果你看一下我的代码示例,currentBalance += amount;简写为currentBalance = currentBalance + amount;,这意味着“这amount添加到currentBalance并将其存储在currentBalance。因为我重用currentBalance,我消除了一个oldBalance变量的需要。

0

全面运行的代码

import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowAdapter; 
import java.io.IOException; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import java.util.ArrayList; 
import java.util.Scanner; 

/** 
    A simulation of an automatic teller machine 
*/ 

public class ATM { 
static Scanner keyboard = new Scanner(System.in); 
static String acctNum, pwd, result; 
static double oldBalance, newBalance, deposit, withdraw,currentBalance; 
static int choose; 

public static void main(String[] args) { 
    for (int run = 0; run < 3; run++) { 
     System.out.println("Enter your account number"); 
     acctNum = keyboard.nextLine(); 
     System.out.println("Enter your account password"); 
     pwd = keyboard.nextLine(); 

     result = checkID(acctNum, pwd); 
     if (!result.equals("ERROR")) { 
      break; 
     } else if (run == 2) {// you cannot try to log in anymore than 3 
           // times 
      System.out.println("MAXIMUM TRIES EXCEEDED"); 
      return; 
     } 

    } 
    menu(); 
} 

public static String checkID(String acctNum, Object pwd) { 
    String result = "ERROR"; 
    String a = "44567-5 mypassword 520.36"; 
    String b = "1234567-6 anotherpassword 48.20"; 
    String c = "4321-0 betterpassword 96.74"; 

    if (acctNum.equals("2345") && pwd.equals("2345")) { 
     result = "520.36"; 
    } else if (acctNum.equals("1234567-6") && pwd.equals("anotherpassword")) { 
     result = "48.20"; 
    } else if (acctNum.equals("4321-0") && pwd.equals("betterpassword")) { 
     result = "96.74"; 
    } 
    System.out.println(result); 
    return result; 
} 

public static int menu() { 
    System.out.println("Choose one of the following: \n1.Display Balance\n2.Deposit\n3.Withdraw\n4.Log Out"); 
    choose = keyboard.nextInt(); 

    if (choose == 1) {// 1. Display Balance 
     displayBalance(); 
     menu(); 
     return 1; 

    } 
    if (choose == 2) {// 2. Deposit 
     deposit(); 
     menu(); 
     return 2; 

    } 
    if (choose == 3) {// 3. Withdraw 
     withdraw(); 
     menu(); 
     return 3; 

    } 
    if (choose == 4) {// 4. Log out 
     System.out.println("You are logged out."); 
     return 4; 

    } 
    if (choose <= 5) {// type in anything greater than 4 and you will get a 
         // system error 
     System.out.println("System Error"); 
     menu(); 
     return 5; 
    } 
    if (choose >= 1) {// type in anything less than 1 and you will get a 
         // system error 
     System.out.println("System Error"); 
     menu(); 
     return 6; 
    } 
    return choose; 

} 

public static void deposit() 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter deposit amount:"); 
    double amount = input.nextDouble(); 
    System.out.println("Your deposit amount: " + amount); 
    currentBalance += amount; 
    System.out.println("Your new balance is: " + currentBalance); 
} 

public static double displayBalance() { 
    System.out.println("Total balance is: $" + currentBalance); 
    oldBalance = 0.00; 
    return 1; 
} 

public static void withdraw() 
{ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter withdrawal amount: "); 
    double amount = input.nextDouble(); 
    System.out.println("Your withdrawal amount: " + amount); 
    currentBalance -= amount; 
    System.out.println("Your new balance is: " + currentBalance); 
} 
} 
0
package shraam.bank.atm; 

    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.Scanner; 
    import java.util.logging.Level; 


    public class CalculateMoneyAtm { 
     static Integer initialtwothousandrupees = 0; 
     static Integer initialhundressrupees = 0; 
     static Integer initialfiftyrupees = 0; 
     static Integer initialtenrupees = 0; 

     static Integer twothousandrupees = 0; 
     static Integer hundressrupees = 0; 
     static Integer fiftyrupees = 0; 
     static Integer tenrupees = 0; 
     static Integer totalAmount = 0; 

     public static void main(String[] args) { 

      ATMStatus atmStatus = new ATMStatus(); 
      getMoney(atmStatus); 

     }//end of psvm 

     public static void reRun(ATMStatus atmStatus) { 
      MyLog.logit().info("Would u like to credit more money ? y/n"); 
      System.out.println("Would u like to credit more money ? y/n "); 
      Scanner input = new Scanner(System.in); 
      String choice = input.nextLine(); 
      if (choice.equals("y") || choice.equals("Y")) { 
       getMoney(atmStatus); 
      } 
      if (choice.equals("n") || choice.equals("N")) { 
       System.exit(1); 
      } else { 
       MyLog.logit().log(Level.SEVERE, "Invalid Input :"+choice); 
       System.out.println("Invalid Input"); 
      } 
      reRun(atmStatus); 
     } 

     public static void getMoney(ATMStatus atmStatus) { 
      twothousandrupees = 0; 
      hundressrupees = 0; 
      fiftyrupees = 0; 
      tenrupees = 0; 
      totalAmount = 0; 
      Integer amountInt=0; 
      System.out.println("Currency Avaialbe in ATM"); 
      for (String key : atmStatus.getAvaialableMoney().keySet()) { 
       System.out.println(atmStatus.getAvaialableMoney().get(key) + ":" 
         + key + " Notes"); 
      } 

      for (String key : atmStatus.getAvaialableMoney().keySet()) { 
       if (key.equals("2000")) 
        initialtwothousandrupees = atmStatus.getAvaialableMoney().get(key); 
       if (key.equals("100")) 
        initialhundressrupees = atmStatus.getAvaialableMoney().get(key); 
       if (key.equals("50")) 
        initialfiftyrupees = atmStatus.getAvaialableMoney().get(key); 
       if (key.equals("10")) 
        initialtenrupees = atmStatus.getAvaialableMoney().get(key); 
      } 

      Scanner input = new Scanner(System.in); 
      System.out.print("Enter Money > "); 
      String amount = input.nextLine(); 
      try { 
       try{ 
       amountInt = Integer.parseInt(amount); 
       if(amountInt%10!=0) 
       { 
        System.out.println("Please enter amount in multiple of 10 "); 
        reRun(atmStatus); 
       } 
       }catch(NumberFormatException ne){ 
        MyLog.logit().log(Level.SEVERE, ne.getMessage()); 
       } 
       System.out.print("Required Amount : "); 
       System.out.println(amount); 

       totalAmount = ((initialtwothousandrupees * 2000) + (initialhundressrupees * 100) 
         + (initialfiftyrupees * 50) + (initialtenrupees * 10)); 
       System.out 
         .println("Total Available amount in ATM : " + totalAmount); 
       if (totalAmount < amountInt) { 
        System.out 
          .println("Total Avaialble amount is less in atm, Sorry for Inconvience"); 
        reRun(atmStatus); 
       } 


       while (amountInt >= 2000 && initialtwothousandrupees > 0) { 
        initialtwothousandrupees = initialtwothousandrupees - 1; 
        twothousandrupees++; 
        amountInt = amountInt - 2000; 
       } 

       while (amountInt >= 100 && initialhundressrupees > 0) { 
        initialhundressrupees = initialhundressrupees - 1; 
        hundressrupees++; 
        amountInt = amountInt - 100; 
       } 

       while (amountInt >= 50 && initialfiftyrupees > 0) { 
        initialfiftyrupees = initialfiftyrupees - 1; 
        fiftyrupees++; 
        amountInt = amountInt - 50; 
       } 
       while (amountInt >= 10 && initialtenrupees > 0) { 
        initialtenrupees = initialtenrupees - 1; 
        tenrupees++; 
        amountInt = amountInt - 10; 
       } 
       if (amountInt > 0) { 
        System.out.println("No avalable balance in this unit"); 
        reRun(atmStatus); 
       } else { 
        System.out.println("Plz take your money in currency"); 
        Map<String, Integer> avaialableMoney = new HashMap<String, Integer>(); 
        System.out.println("  No of 2000:"+ twothousandrupees); 
        System.out.println("  No of 100:"+ hundressrupees); 
        System.out.println("  No of 50:"+ fiftyrupees); 
        System.out.println("  No of 10:"+ tenrupees); 
        avaialableMoney.put("2000", (initialtwothousandrupees)); 
        avaialableMoney.put("100", (initialhundressrupees)); 
        avaialableMoney.put("50", (initialfiftyrupees)); 
        avaialableMoney.put("10", (initialtenrupees)); 
        atmStatus.setAvaialableMoney(avaialableMoney); 
       } 
       //return amountInt; 
      } catch (Exception e) { 
       MyLog.logit().log(Level.SEVERE, e.getMessage()); 
      } 
      System.out.println("Take your Amount = "+(2000*twothousandrupees+100*hundressrupees+50*fiftyrupees+10*tenrupees)); 
      reRun(atmStatus); 

     }//end of getMoney 
    } 

    package shraam.bank.atm; 

    import java.util.HashMap; 
    import java.util.Map; 
    import java.util.logging.Level; 

    public class ATMStatus { 
     public Map<String,Integer> avaialableMoney=new HashMap<String,Integer>(); 
     public ATMStatus(){ 
       MyLog.logit().log(Level.INFO, " ATMStatus Initialized"); 

     avaialableMoney.put("2000", 10); 
     avaialableMoney.put("100", 10); 
     avaialableMoney.put("50", 10); 
     avaialableMoney.put("10", 10); 
     } 
     public Map<String, Integer> getAvaialableMoney() { 
      return this.avaialableMoney; 
     } 
     public void setAvaialableMoney(Map<String, Integer> avaialableMoney) { 
      this.avaialableMoney = avaialableMoney; 
     } 

    } 

    package shraam.bank.atm; 

    import java.io.IOException; 
    import java.util.logging.FileHandler; 
    import java.util.logging.Logger; 
    import java.util.logging.SimpleFormatter; 

    public class MyLog { 

     public static Logger logit() 
     { 
      Logger logger = Logger.getLogger("MyLog"); 
      FileHandler fh; 

      try { 

       // This block configure the logger with handler and formatter 
       fh = new FileHandler("C:/ArunTest/temp/MyLogFile.log"); 
       logger.addHandler(fh); 
       SimpleFormatter formatter = new SimpleFormatter(); 
       fh.setFormatter(formatter); 

       // the following statement is used to log any messages 
       logger.info("My first log"); 

      } catch (SecurityException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return logger; 
     } 

    } 
// 
output: 
Nov 27, 2016 10:43:48 PM shraam.bank.atm.MyLog logit 
INFO: My first log 
Nov 27, 2016 10:43:48 PM shraam.bank.atm.ATMStatus <init> 
SEVERE: ATMStatus 
Currency Avaialbe in ATM 
10:100 Notes 
10:2000 Notes 
10:50 Notes 
10:10 Notes 
Enter Money > 540 
Required Amount : 540 
Total Available amount in ATM : 21600 
Plz take your money in currency 
    No of 2000:0 
    No of 100:5 
    No of 50:0 
    No of 10:4 
Take your Amount = 540 
Nov 27, 2016 10:43:52 PM shraam.bank.atm.MyLog logit 
INFO: My first log 
Nov 27, 2016 10:43:52 PM shraam.bank.atm.CalculateMoneyAtm reRun 
INFO: Would u like to credit more money ? y/n 
Would u like to credit more money ? y/n 
y 
Currency Avaialbe in ATM 
5:100 Notes 
10:2000 Notes 
10:50 Notes 
6:10 Notes 
Enter Money > 2060 
Required Amount : 2060 
Total Available amount in ATM : 21060 
Plz take your money in currency 
    No of 2000:1 
    No of 100:0 
    No of 50:1 
    No of 10:1 
Take your Amount = 2060 
Nov 27, 2016 10:44:04 PM shraam.bank.atm.MyLog logit 
INFO: My first log 
Nov 27, 2016 10:44:04 PM shraam.bank.atm.CalculateMoneyAtm reRun 
INFO: Would u like to credit more money ? y/n 
Would u like to credit more money ? y/n