首頁 Java java教程 java實作ATM提款專案的範例程式碼

java實作ATM提款專案的範例程式碼

Jun 04, 2017 am 09:20 AM

這篇文章主要為大家詳細介紹了java實作ATM提款專案的實作程式碼,具有一定的參考價值,有興趣的朋友可以參考一下

專案要求:

  1、使用者需要從控制台輸入帳號密碼,帳號或密碼不正確報異常

  2、每日提款的金額有限制(100,300# 00),否則報異常

  3、每次取款都要有記錄,並在下次取款時顯示出來

思路:

  1 、先在「銀行類別」裡產生一些使用者(跳過了註冊環節)

  2、可使用List集合儲存提款日誌

  3、可使用Map集合將「使用者名稱」和對應的使用者資訊建立「鍵值關係」

  4、使用while循環控制流程

#專案實作程式碼:

管理類別(含main方法):

import java.util.Scanner;
public class Manager {
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    
    //创建BankServer()类对象
    BankServer server = new BankServer();
    //创建User类对象,先令其为空
    User user = null;
    //调用creatAccount()方法生成四个用户
    server.creatAccount();
    
    //while循环控制流程
    while(true){
      System.out.println("请输入您的账号:");
      String id = input.nextLine();
      System.out.println("请输入您的密码:");
      String password = input.nextLine();
      try {
        user=server.chick(id, password);//调用chick()方法,让user有意义
        System.out.println("===========欢迎进入银行取款系统===========");
        System.out.println("您的账户余额为:"+user.getMoney());
        while(true){
          System.out.println("请输入您的取款金额(必须大于100,小于30000):");
          double money = input.nextDouble();
          server.getMoney(user, money);
          input.nextLine();
          System.out.println("请问您需要继续取款吗? Y or N");
          String selec = input.nextLine();
          if(selec.equalsIgnoreCase("N")){
            System.out.println("欢迎使用!");
            break;
          }
        }
      } catch (Exception e) {
        System.out.println(">>> 账号/密码错误!请重新登录输入 <<<");
      }
    }
  }

}
登入後複製

使用者類別(User類別):

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class User {
  private double balance;//用户账户金额
  private String id;//用户账号名
  private String passward;//用户密码
  private List<String> list=new ArrayList<>() ;//用于存储用户取款记录的日志集合
  
  //无参构造方法
  public User() {
    super();
  }
  //有参构造方法
  public User(String id, String passward,double money) {
    super();
    this.balance = money;
    this.id = id;
    this.passward = passward;
  }
  
  //各个属性的set和get方法
  public double getMoney() {
    return balance;
  }
  public void setMoney(int money) {
    this.balance = money;
  }
  public String getAccount() {
    return id;
  }
  public void setAccount(String account) {
    this.id = account;
  }
  public String getPassward() {
    return passward;
  }
  public void setPassward(String passward) {
    this.passward = passward;
  }
  public List<String> getList() {
    return list;
  }
  public void setList(List<String> list) {
    this.list = list;
  }
  public double getBalance() {
    return balance;
  }
  public void setBalance(double balance) {
    this.balance = balance;
  }
  
  /**
   * 因为账户的密码被装在map集合中,不方便直接访问,所以在User类中定义一个检查密码是否正确的方法
   * 其返回一个布尔类型的值
   * @param password
   * @return
   */
  public boolean checkPassword(String password){
    if(password.equals(this.passward)){
      return true;
    }else{
      return false;
    }
  }
  
  
  /**
   * 与上面的方法同理,判断取款金额是否合理的方法,返回一个布尔类型的值
   * @param money
   * @return
   * @throws Exception
   */
  public boolean getMoney(double money) throws Exception {

    if (money < 100 || money > 5000) {  //规定每次取款金额的范围,超过这个范围则抛出异常
      throw new Exception("取款金额不合理!取款金额必须大于100,小于5000");
    }
    if (this.balance < money) {//这个判断条件被许多人忽略,当账户内余额不足时,抛出异常
      throw new Exception("您的余额不足!");
    }
    //从帐号余额中扣除相应金额
    this.balance -= money;
    
    //将取款记录到日志中
    String logStr = User.currentTime()+"\t取款 " + money +"元, 余额:"+this.balance;
    this.list.add(logStr);  //将记录添加进list集合中
    return true;  //返回true
    
  }
  /**
   * 获取当前时间的方法
   * @return
   */
  public static String currentTime(){
    long ct = System.currentTimeMillis();
    Date d = new Date(ct);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:ss:mm");
    return sdf.format(d);
  }
}
登入後複製

銀行服務類別(BankServer類別):

import java.util.HashMap;
import java.util.Map;
/**
 * 银行服务类,实现用户的创建
 * @author 
 *
 */
public class BankServer {
  //声明四个常量表示账户用户名
  final String AC1 = "1111-111111-1111AA";
  final String AC2 = "2222-222222-2222BB";
  final String AC3 = "3333-333333-3333CC";
  final String AC4 = "4444-444444-4444DD";
  //声明四个常量,用于存储密码,每个账户有一个专属的密码
  final String PASSWORD1 = "111111";
  final String PASSWORD2 = "222222";
  final String PASSWORD3 = "333333";
  final String PASSWORD4 = "444444";

  //声明一个静态常量规定初始金额为100000元
  public static final Double BALANCE = 100000.00;
  
  //创建一个map集合用于存储用户账号和对应的账户信息
  Map<String, User> map = new HashMap<>();
  
  /**
   * 生成用户的方法,将用户存入map集合中
   */
  public void creatAccount(){
    map.put(AC1, new User(AC1,PASSWORD1,BALANCE));
    map.put(AC2, new User(AC2,PASSWORD2,BALANCE));
    map.put(AC3, new User(AC3,PASSWORD3,BALANCE));
    map.put(AC4, new User(AC4,PASSWORD4,BALANCE));
  }
  
  /**
   * 比较用户从控制台输入的数据是否和银行预先存储的账户一样
   * @param id
   * @param password
   * @return
   * @throws Exception
   */
  public User chick(String id,String password) throws Exception{
    User Account = null;  //此时的Account对象为null
    //密码已经被放进map集合中,不好取出,所以需要在User类中定义一个checkPassword方法,其返回的是布尔类型的值(详情见User类)
    if(map.containsKey(id) ){  
      Account=map.get(id);  //如果账户名对上了,则调用map集合的get()方法给Account对象赋值
      if(Account.checkPassword(password)){
        System.out.println("登录成功!");  //如果密码也对上了,提示“登录成功”,否则抛出异常
      }else{
        throw new Exception("密码错误");
      }
    }else{
      throw new Exception("账号/密码错误!");
    }
    return Account;    //返回一个Account对象
  } 
  /**
   * 这是一个取钱并将记录存入list集合的方法
   * @param loginUA
   * @param money
   */
  public void getMoney(User user, double money) {
    try {
      //用户余额已经被放进map集合中,同理,在User类中定义一个getMoney()方法,其返回的是布尔类型的值
      if(user.getMoney(money)){
        System.out.println("取款成功,用户当前余额:"+user.getBalance());
        System.out.println("==============================");
        //输出日志
        for (String str : user.getList()) {
          System.out.println(str);
        }
      }
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}
登入後複製

運行結果1(正確地輸入了帳號密碼):

運行結果2錯誤地輸入了帳號密碼):

#

以上是java實作ATM提款專案的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles