杰瑞科技汇

Java如何实现ATM柜员机模拟程序?

ATM柜员机模拟程序 (Java实现)

下面是一个完整的ATM柜员机模拟程序的Java实现,包含基本功能如存款、取款、查询余额、转账等。

Java如何实现ATM柜员机模拟程序?-图1
(图片来源网络,侵删)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class ATM {
    // 存储所有账户信息
    private static Map<String, Account> accounts = new HashMap<>();
    // 当前登录的账户
    private static Account currentAccount = null;
    // 扫描器用于用户输入
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        // 初始化一些测试账户
        initializeAccounts();
        while (true) {
            if (currentAccount == null) {
                showLoginMenu();
            } else {
                showMainMenu();
            }
        }
    }
    // 初始化测试账户
    private static void initializeAccounts() {
        accounts.put("123456", new Account("123456", "123456", 1000.0));
        accounts.put("654321", new Account("654321", "654321", 2000.0));
    }
    // 显示登录菜单
    private static void showLoginMenu() {
        System.out.println("\n===== ATM系统 =====");
        System.out.println("1. 登录");
        System.out.println("2. 退出");
        System.out.print("请选择操作: ");
        int choice = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        switch (choice) {
            case 1:
                login();
                break;
            case 2:
                System.out.println("感谢使用ATM系统,再见!");
                System.exit(0);
                break;
            default:
                System.out.println("无效的选择,请重新输入。");
        }
    }
    // 登录功能
    private static void login() {
        System.out.print("请输入卡号: ");
        String cardNumber = scanner.nextLine();
        System.out.print("请输入密码: ");
        String password = scanner.nextLine();
        Account account = accounts.get(cardNumber);
        if (account != null && account.getPassword().equals(password)) {
            currentAccount = account;
            System.out.println("登录成功!");
        } else {
            System.out.println("卡号或密码错误,请重试。");
        }
    }
    // 显示主菜单
    private static void showMainMenu() {
        System.out.println("\n===== 主菜单 =====");
        System.out.println("1. 查询余额");
        System.out.println("2. 取款");
        System.out.println("3. 存款");
        System.out.println("4. 转账");
        System.out.println("5. 交易记录");
        System.out.println("6. 退出登录");
        System.out.print("请选择操作: ");
        int choice = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        switch (choice) {
            case 1:
                checkBalance();
                break;
            case 2:
                withdraw();
                break;
            case 3:
                deposit();
                break;
            case 4:
                transfer();
                break;
            case 5:
                showTransactionHistory();
                break;
            case 6:
                logout();
                break;
            default:
                System.out.println("无效的选择,请重新输入。");
        }
    }
    // 查询余额
    private static void checkBalance() {
        System.out.println("\n当前余额: " + currentAccount.getBalance());
    }
    // 取款
    private static void withdraw() {
        System.out.print("请输入取款金额: ");
        double amount = scanner.nextDouble();
        scanner.nextLine(); // 消耗换行符
        if (amount <= 0) {
            System.out.println("取款金额必须大于0。");
            return;
        }
        if (amount > currentAccount.getBalance()) {
            System.out.println("余额不足。");
            return;
        }
        currentAccount.withdraw(amount);
        System.out.println("取款成功!当前余额: " + currentAccount.getBalance());
    }
    // 存款
    private static void deposit() {
        System.out.print("请输入存款金额: ");
        double amount = scanner.nextDouble();
        scanner.nextLine(); // 消耗换行符
        if (amount <= 0) {
            System.out.println("存款金额必须大于0。");
            return;
        }
        currentAccount.deposit(amount);
        System.out.println("存款成功!当前余额: " + currentAccount.getBalance());
    }
    // 转账
    private static void transfer() {
        System.out.print("请输入转入账户卡号: ");
        String targetCardNumber = scanner.nextLine();
        Account targetAccount = accounts.get(targetCardNumber);
        if (targetAccount == null) {
            System.out.println("转入账户不存在。");
            return;
        }
        if (targetAccount == currentAccount) {
            System.out.println("不能向自己转账。");
            return;
        }
        System.out.print("请输入转账金额: ");
        double amount = scanner.nextDouble();
        scanner.nextLine(); // 消耗换行符
        if (amount <= 0) {
            System.out.println("转账金额必须大于0。");
            return;
        }
        if (amount > currentAccount.getBalance()) {
            System.out.println("余额不足。");
            return;
        }
        currentAccount.withdraw(amount);
        targetAccount.deposit(amount);
        System.out.println("转账成功!当前余额: " + currentAccount.getBalance());
    }
    // 显示交易记录
    private static void showTransactionHistory() {
        List<Transaction> history = currentAccount.getTransactionHistory();
        System.out.println("\n===== 交易记录 =====");
        if (history.isEmpty()) {
            System.out.println("暂无交易记录。");
            return;
        }
        for (Transaction transaction : history) {
            System.out.println(transaction);
        }
    }
    // 退出登录
    private static void logout() {
        currentAccount = null;
        System.out.println("已退出登录。");
    }
}
// 账户类
class Account {
    private String cardNumber;
    private String password;
    private double balance;
    private List<Transaction> transactionHistory;
    public Account(String cardNumber, String password, double balance) {
        this.cardNumber = cardNumber;
        this.password = password;
        this.balance = balance;
        this.transactionHistory = new ArrayList<>();
    }
    public String getCardNumber() {
        return cardNumber;
    }
    public String getPassword() {
        return password;
    }
    public double getBalance() {
        return balance;
    }
    public List<Transaction> getTransactionHistory() {
        return transactionHistory;
    }
    public void withdraw(double amount) {
        balance -= amount;
        transactionHistory.add(new Transaction("取款", -amount));
    }
    public void deposit(double amount) {
        balance += amount;
        transactionHistory.add(new Transaction("存款", amount));
    }
}
// 交易记录类
class Transaction {
    private String type;
    private double amount;
    private String timestamp;
    public Transaction(String type, double amount) {
        this.type = type;
        this.amount = amount;
        this.timestamp = java.time.LocalDateTime.now().toString();
    }
    @Override
    public String toString() {
        return String.format("%s - 金额: %.2f - 时间: %s", type, amount, timestamp);
    }
}

功能说明

这个ATM模拟程序包含以下功能:

  1. 用户登录:使用卡号和密码登录系统
  2. 查询余额:查看当前账户余额
  3. 取款:从账户中提取现金
  4. 存款:向账户存入现金
  5. 转账:向其他账户转账
  6. 交易记录:查看所有交易历史
  7. 退出登录:安全退出系统

使用方法

  1. 运行程序后,会显示登录菜单
  2. 输入"1"进行登录,初始测试账户:
    • 卡号: 123456, 密码: 123456, 余额: 1000
    • 卡号: 654321, 密码: 654321, 余额: 2000
  3. 登录成功后显示主菜单,可以执行各种操作
  4. 选择"6"退出登录回到登录界面

扩展建议

如果需要进一步增强这个程序,可以考虑:

  1. 添加账户创建功能
  2. 实现密码修改功能
  3. 添加账户锁定机制(多次输错密码)
  4. 实现更详细的交易记录分类
  5. 添加定期存款等功能
  6. 实现GUI界面(使用Swing或JavaFX)

这个程序使用了面向对象的设计,将账户和交易记录封装为类,使代码结构清晰,易于维护和扩展。

Java如何实现ATM柜员机模拟程序?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇