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

C++实现ATM状态机

C++实现ATM状态机

以下是一个使用 C++ 实现的 ATM 状态机示例程序,采用面向对象的方式实现。程序模拟了一个简单的 ATM 系统,包含以下功能:

  1. 用户登录
  2. 查询余额
  3. 存款
  4. 取款
  5. 退出

完整代码

#include<iostream>#include<string>#include<unordered_map>usingnamespacestd;// 定义 ATM 状态的基类classATMState{public:virtualvoidhandle()=0;// 纯虚函数,表示状态处理virtual~ATMState(){}};// 定义 ATM 类classATM{private:unordered_map<string,string>users;// 用户名和密码unordered_map<string,double>balances;// 用户余额ATMState*currentState;// 当前状态string currentUser;// 当前登录用户public:ATM(){// 初始化用户数据users["user1"]="password1";users["user2"]="password2";balances["user1"]=1000.0;balances["user2"]=500.0;currentState=nullptr;}voidsetState(ATMState*state){currentState=state;}voidhandle(){if(currentState){currentState->handle();}}boollogin(conststring&username,conststring&password){if(users.find(username)!=users.end()&&users[username]==password){currentUser=username;returntrue;}returnfalse;}doublegetBalance(){returnbalances[currentUser];}voiddeposit(doubleamount){balances[currentUser]+=amount;}boolwithdraw(doubleamount){if(balances[currentUser]>=amount){balances[currentUser]-=amount;returntrue;}returnfalse;}voidlogout(){currentUser="";}boolisLoggedIn(){return!currentUser.empty();}};// 定义具体状态类classIdleState:publicATMState{private:ATM*atm;public:IdleState(ATM*atm):atm(atm){}voidhandle()override{string username,password;cout<<"Enter username: ";cin>>username;cout<<"Enter password: ";cin>>password;if(atm->login(username,password)){cout<<"Login successful!"<<endl;atm->setState(newMenuState(atm));}else{cout<<"Invalid username or password. Try again."<<endl;}}};classMenuState:publicATMState{private:ATM*atm;public:MenuState(ATM*atm):atm(atm){}voidhandle()override{intchoice;do{cout<<"\nATM Menu:"<<endl;cout<<"1. Check Balance"<<endl;cout<<"2. Deposit"<<endl;cout<<"3. Withdraw"<<endl;cout<<"4. Logout"<<endl;cout<<"Enter your choice: ";cin>>choice;switch(choice){case1:cout<<"Your balance is: $"<<atm->getBalance()<<endl;break;case2:{doubleamount;cout<<"Enter amount to deposit: ";cin>>amount;atm->deposit(amount);cout<<"Deposit successful!"<<endl;break;}case3:{doubleamount;cout<<"Enter amount to withdraw: ";cin>>amount;if(atm->withdraw(amount)){cout<<"Withdrawal successful!"<<endl;}else{cout<<"Insufficient balance!"<<endl;}break;}case4:atm->logout();cout<<"Logged out successfully!"<<endl;atm->setState(newIdleState(atm));return;default:cout<<"Invalid choice. Try again."<<endl;}}while(choice!=4);}};intmain(){ATM atm;atm.setState(newIdleState(&atm));while(true){atm.handle();}return0;}

代码说明

  1. 状态机设计

    • 使用ATMState作为状态的基类,定义了一个纯虚函数handle()
    • IdleStateMenuState是具体的状态类,分别表示 ATM 的空闲状态和菜单状态。
  2. ATM 类

    • ATM类包含用户数据(用户名、密码、余额)和当前状态。
    • 提供了登录、查询余额、存款、取款和注销等功能。
  3. 状态切换

    • IdleState中,用户输入用户名和密码进行登录。如果登录成功,状态切换到MenuState
    • MenuState中,用户可以选择不同的操作,完成后可以返回主菜单或注销。
  4. 动态分配状态

    • 使用new动态分配状态对象,并通过setState()方法切换状态。

运行示例

输入:
Enter username: user1 Enter password: password1 Login successful! ATM Menu: 1. Check Balance 2. Deposit 3. Withdraw 4. Logout Enter your choice: 1
输出:
Your balance is: $1000

扩展功能

  1. 支持更多状态
    • 可以扩展更多状态,例如维护模式、错误状态等。
  2. 持久化存储
    • 将用户数据存储到数据库或文件中,而不是硬编码在程序中。
  3. 安全性
    • 使用加密存储密码,避免明文存储。

通过这种面向对象的设计,可以轻松扩展 ATM 的功能,同时保持代码的清晰和可维护性。

http://www.jsqmd.com/news/299509/

相关文章:

  • 导师严选2026 AI论文工具TOP10:自考论文写作全攻略
  • Java毕设项目推荐-基于SpringBoot的社区公益服务管理平台 基于springboot的社区志愿者服务系统【附源码+文档,调试定制服务】
  • 【计算机毕业设计案例】基于springboot的居民志愿服务智慧系统社区志愿者服务系统(程序+文档+讲解+定制)
  • 学长亲荐8个AI论文平台,助你搞定本科毕业论文!
  • 论文《关于预防人工智能反叛的初步探讨》修订版
  • SMU 2026 ptlks的周报Week 1
  • 2025年少儿编程推荐:五家优选品牌深度全面对比解析
  • 用 CrossOver 体验“魔法世界”:在 Mac 电脑畅玩《霍格沃茨之遗》保姆级教程
  • 2025年少儿编程哪家靠谱?主流上榜五家品牌全面深度解析
  • GLM-ASR-Nano-2512:中文方言识别与低音量语音处理的最佳开源方案
  • 2026年AI智能体替代员工:从理论到实践,小白也能上手的数字员工教程
  • 从入门到精通:RAG系统中检索与生成之间的增强层,收藏级技术指南
  • 【超详细】大模型学习路线图,从入门到应用(建议收藏)
  • 如何系统化的学习金融,投资,理财?
  • 字符串相关
  • 兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆
  • 兰亭妙微:以HTML前端、UI/交互/图标设计赋能数字孪生与大屏设计新标杆
  • 【第三十二周】RAG学习02
  • Lab2-system calls MIT6.1810操作系统工程【持续更新】
  • 学霸同款2026 AI论文写作软件TOP9:研究生开题报告必备测评
  • 面向 OpenHarmony 的 Flutter 应用实战:TodoList 多条件过滤系统的状态管理与性能优化
  • 无状态 Widget 下的实时排序:Flutter for OpenHarmony 中 TodoList 的排序策略与数据流控制
  • 从数据模型到响应式渲染:Flutter for OpenHarmony 上 TodoList 优先级系统的端到端类型安全实践
  • 从系统亮度监听到 UI 重绘:Flutter for OpenHarmony TodoList 深色模式的端到端响应式实现
  • 在 OpenHarmony 上打造智能 TodoList:基于 Flutter 的标签分类与动态过滤实践
  • 数字化种植牙企业
  • 智能摄像头在智能车道路视频采集中的关键技术及应用解析
  • 基于Java的工程车辆成本核算智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 【毕业设计】基于springboot的生日商城的设计与实现(源码+文档+远程调试,全bao定制等)
  • 基于Java的工程材料运费智慧管理系统的设计与实现全方位解析:附毕设论文+源代码