当前位置: 首页 > web >正文

ATM 模拟器 Golang 程序--示例

 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()
}

http://www.xdnf.cn/news/13737.html

相关文章:

  • 【二分答案1-----切木棒】
  • 基于YOLOv11与单目测距的实战教程:从目标检测到距离估算
  • 嵌入式通信模块实战新范式:基于虚拟仿真平台的NB-IoT核心技能训练——零硬件损耗的全栈式实验方案,重构物联网通信教学逻辑
  • 基于多面体模型的编译优化技术
  • Ubuntu 绑定Conda
  • 在 Vue 3 中修改 el-select 组件接收的 prop 值
  • Parasoft C++Test软件集成测试(部件测试)_操作指南
  • 【3D插件推荐】PolyCloth v2.07 超强布料模拟工具(附图文安装教程与下载)
  • 力扣面试150题--单词接龙
  • stm32cubeide中编译非flash起始地址开始的程序
  • 解决vscode中使用debuger运行app.py但是报错No module named app的方法
  • kali2024 由于没有公钥,无法验证下列签名---解决方案
  • docker compose搭建elk 8.6.2
  • AS610x奇力科技电池管理系统(BMS)模拟前端(AFE)
  • Linux 与 Windows 系统挖矿程序清理
  • nt!CcGetDirtyPages函数分析
  • 如何将 iPhone 中的短信导出为 PDF
  • [vela os_5] 中断系统 | 任务调度 | 日志系统
  • C++代码随想录刷题知识分享-----替换数字字符 —— 字符串空间扩展与逆向填充技巧
  • AI大模型从0到1记录学习 大模型技术之机器学习 day27-day60
  • 大数据学习(137)-大数据组件运行时角色
  • 【数据传输常用命令】:docker常用命令
  • AbMole推荐:Z-VAD-FMK,让凋亡/焦亡/坏死性凋亡机制研究更上一层楼
  • 一[3]、ubuntu18.04环境 利用 yolov8 训练开源列车数据集,并实现列车轨道检测
  • 遍历对象属性,for...in和Object.keys到底用哪个?
  • 「Unity3D」使用C#调用Android的震动功能,有三种方式
  • C++之容器适配器介绍 以及 STL--stack queue deque
  • 【氮化镓】GaN HEMT器件中Ec-0.9eV缺陷位置识别
  • [前端]HTML模拟实现一个基于摄像头的手势识别交互页面
  • AI集成运维管理平台的架构与核心构成解析