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

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

相关文章:

  • 油烟净化设备安装规范
  • 基于SpringBoot的校园网上求职系统设计与实现
  • 双系统(win+linux)根目录扩容(不掉GPU驱动)
  • 【leetcode】226. 翻转二叉树
  • 一分钟了解MCP
  • 无人机安防系统是什么?主流无人机安防平台有哪些?
  • iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署
  • @RequestBody和@ResponseBody注解的作用是什么
  • 告别手动做PPT!4款AI工具实现自动化生成
  • 使用 VLC Media Player 轻松提取视频中的音频文件
  • Python 实现 Web 请求与响应
  • AI 工具打造专业级 PPT 配图:从文字到视觉的高效转化指南
  • 关键领域软件测试新范式:如何在安全合规前提下提升效率?
  • 岗位竞聘竞选报告个人简历PPT模版分享
  • xhtml2pdf中文屏幕溢出问题
  • 【数据传输常用命令】:服务器与本地之间的数据传输
  • 服务器-客户端下kafka的消息处理流程
  • SpreadJS 中 HTML Canvas 的性能优势深度解析
  • 基于 Nginx 服务器的泛域名 SSL 证书申请与部署
  • 自建RustDesk服务器
  • seo1网站查询/网络营销概述
  • 淘宝网那样的网站模板/百度全网营销
  • 网站上传独立服务器/百度大数据查询
  • 时时彩怎么建设网站/百度软件开放平台
  • 江西网站开发企业/官网seo优化
  • 徐州企业建站程序/百度热搜榜排名今日第一