1.示例截图:

2.功能说明
程序功能说明
这个 ATM 模拟器实现了以下核心功能:
用户账户管理:
初始化了几个测试账户用于演示
支持登录和登出功能
PIN 验证和锁定机制(尝试 3 次错误后锁定)
基本交易操作:
余额查询:显示当前账户余额
取款:从账户中提取现金
存款:向账户中存入现金
转账:向其他账户转账
交易记录:
记录每笔交易的详细信息
支持查看历史交易记录
使用方法
程序启动后,首先需要登录(使用测试账户)
卡号:1234567890,PIN:1234
卡号:0987654321,PIN:4321
卡号:5678901234,PIN:5678
登录后,可以选择各种交易操作:
查询余额
取款
存款
转账
查看交易记录
登出或退出
所有操作都会实时更新账户余额和交易记录
3.程序代码:
package mainimport ("bufio""fmt""os""strconv""strings""time"
)// 账户结构
type Account struct {AccountNumber stringPin stringBalance float64Transactions []Transaction
}// 交易记录结构
type Transaction struct {Type string // 交易类型:存款、取款、转账Amount float64 // 交易金额Timestamp time.Time // 交易时间ToAccount string // 转账目标账户(仅在转账时使用)
}// ATM 结构
type ATM struct {Accounts map[string]*Account // 账户映射表,键为卡号CurrentAccount *Account // 当前登录的账户
}// 创建新的 ATM
func NewATM() *ATM {// 初始化一些测试账户accounts := make(map[string]*Account)// 添加几个测试账户accounts["1234567890"] = &Account{AccountNumber: "1234567890",Pin: "1234",Balance: 1000.00,Transactions: []Transaction{},}accounts["0987654321"] = &Account{AccountNumber: "0987654321",Pin: "4321",Balance: 5000.00,Transactions: []Transaction{},}accounts["5678901234"] = &Account{AccountNumber: "5678901234",Pin: "5678",Balance: 2500.00,Transactions: []Transaction{},}return &ATM{Accounts: accounts,}
}// 主菜单
func (atm *ATM) ShowMainMenu() {reader := bufio.NewReader(os.Stdin)for {if atm.CurrentAccount == nil {fmt.Println("\n===== ATM 模拟器 =====")fmt.Println("1. 登录")fmt.Println("2. 退出")fmt.Print("请选择操作: ")choice, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)continue}choice = strings.TrimSpace(choice)switch choice {case "1":atm.Login()case "2":fmt.Println("感谢使用,再见!")returndefault:fmt.Println("无效选择,请重试。")}} else {fmt.Println("\n===== 欢迎使用 ATM 服务 =====")fmt.Printf("当前账户: %s\n", atm.CurrentAccount.AccountNumber)fmt.Println("1. 查询余额")fmt.Println("2. 取款")fmt.Println("3. 存款")fmt.Println("4. 转账")fmt.Println("5. 查看交易记录")fmt.Println("6. 登出")fmt.Println("7. 退出")fmt.Print("请选择操作: ")choice, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)continue}choice = strings.TrimSpace(choice)switch choice {case "1":atm.CheckBalance()case "2":atm.Withdraw()case "3":atm.Deposit()case "4":atm.Transfer()case "5":atm.ShowTransactions()case "6":atm.Logout()case "7":fmt.Println("感谢使用,再见!")returndefault:fmt.Println("无效选择,请重试。")}}}
}// 登录功能
func (atm *ATM) Login() {reader := bufio.NewReader(os.Stdin)fmt.Print("请输入卡号: ")accountNumber, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}accountNumber = strings.TrimSpace(accountNumber)account, exists := atm.Accounts[accountNumber]if !exists {fmt.Println("卡号不存在,请重试。")return}// 尝试3次PIN输入for attempts := 0; attempts < 3; attempts++ {fmt.Print("请输入PIN: ")pin, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}pin = strings.TrimSpace(pin)if pin == account.Pin {atm.CurrentAccount = accountfmt.Println("登录成功!")return} else {fmt.Printf("PIN错误,还有%d次尝试机会。\n", 2-attempts)}}fmt.Println("尝试次数过多,账户已锁定。")
}// 登出功能
func (atm *ATM) Logout() {atm.CurrentAccount = nilfmt.Println("已成功登出。")
}// 查询余额
func (atm *ATM) CheckBalance() {if atm.CurrentAccount == nil {fmt.Println("请先登录。")return}fmt.Printf("当前余额: ¥%.2f\n", atm.CurrentAccount.Balance)
}// 取款功能
func (atm *ATM) Withdraw() {if atm.CurrentAccount == nil {fmt.Println("请先登录。")return}reader := bufio.NewReader(os.Stdin)fmt.Print("请输入取款金额: ¥")amountStr, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}amountStr = strings.TrimSpace(amountStr)amount, err := strconv.ParseFloat(amountStr, 64)if err != nil {fmt.Println("请输入有效的金额。")return}if amount <= 0 {fmt.Println("取款金额必须大于0。")return}if amount > atm.CurrentAccount.Balance {fmt.Println("余额不足。")return}// 模拟取款过程fmt.Println("正在处理取款请求...")time.Sleep(1 * time.Second)atm.CurrentAccount.Balance -= amount// 添加交易记录atm.CurrentAccount.Transactions = append(atm.CurrentAccount.Transactions, Transaction{Type: "取款",Amount: amount,Timestamp: time.Now(),})fmt.Printf("取款成功!已取出 ¥%.2f\n", amount)fmt.Printf("当前余额: ¥%.2f\n", atm.CurrentAccount.Balance)
}// 存款功能
func (atm *ATM) Deposit() {if atm.CurrentAccount == nil {fmt.Println("请先登录。")return}reader := bufio.NewReader(os.Stdin)fmt.Print("请输入存款金额: ¥")amountStr, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}amountStr = strings.TrimSpace(amountStr)amount, err := strconv.ParseFloat(amountStr, 64)if err != nil {fmt.Println("请输入有效的金额。")return}if amount <= 0 {fmt.Println("存款金额必须大于0。")return}// 模拟存款过程fmt.Println("正在处理存款请求...")time.Sleep(1 * time.Second)atm.CurrentAccount.Balance += amount// 添加交易记录atm.CurrentAccount.Transactions = append(atm.CurrentAccount.Transactions, Transaction{Type: "存款",Amount: amount,Timestamp: time.Now(),})fmt.Printf("存款成功!已存入 ¥%.2f\n", amount)fmt.Printf("当前余额: ¥%.2f\n", atm.CurrentAccount.Balance)
}// 转账功能
func (atm *ATM) Transfer() {if atm.CurrentAccount == nil {fmt.Println("请先登录。")return}reader := bufio.NewReader(os.Stdin)fmt.Print("请输入目标账户卡号: ")targetAccountNumber, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}targetAccountNumber = strings.TrimSpace(targetAccountNumber)if targetAccountNumber == atm.CurrentAccount.AccountNumber {fmt.Println("不能向自己的账户转账。")return}targetAccount, exists := atm.Accounts[targetAccountNumber]if !exists {fmt.Println("目标账户不存在。")return}fmt.Print("请输入转账金额: ¥")amountStr, err := reader.ReadString('\n')if err != nil {fmt.Println("读取输入错误:", err)return}amountStr = strings.TrimSpace(amountStr)amount, err := strconv.ParseFloat(amountStr, 64)if err != nil {fmt.Println("请输入有效的金额。")return}if amount <= 0 {fmt.Println("转账金额必须大于0。")return}if amount > atm.CurrentAccount.Balance {fmt.Println("余额不足。")return}// 模拟转账过程fmt.Println("正在处理转账请求...")time.Sleep(1 * time.Second)atm.CurrentAccount.Balance -= amounttargetAccount.Balance += amount// 添加交易记录atm.CurrentAccount.Transactions = append(atm.CurrentAccount.Transactions, Transaction{Type: "转账",Amount: amount,Timestamp: time.Now(),ToAccount: targetAccountNumber,})targetAccount.Transactions = append(targetAccount.Transactions, Transaction{Type: "接收转账",Amount: amount,Timestamp: time.Now(),ToAccount: atm.CurrentAccount.AccountNumber,})fmt.Printf("转账成功!已向账户 %s 转账 ¥%.2f\n", targetAccountNumber, amount)fmt.Printf("当前余额: ¥%.2f\n", atm.CurrentAccount.Balance)
}// 显示交易记录
func (atm *ATM) ShowTransactions() {if atm.CurrentAccount == nil {fmt.Println("请先登录。")return}transactions := atm.CurrentAccount.Transactionsif len(transactions) == 0 {fmt.Println("没有交易记录。")return}fmt.Println("\n===== 交易记录 =====")fmt.Println("序号\t类型\t\t金额\t\t时间\t\t\t目标账户")for i, tx := range transactions {target := ""if tx.ToAccount != "" {target = tx.ToAccount}fmt.Printf("%d\t%s\t\t¥%.2f\t\t%s\t%s\n",i+1, tx.Type, tx.Amount, tx.Timestamp.Format("2006-01-02 15:04:05"), target)}
}func main() {fmt.Println("===== ATM 模拟器启动 =====")atm := NewATM()atm.ShowMainMenu()
}