news 2026/6/14 19:56:55

C++实现ATM状态机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 的功能,同时保持代码的清晰和可维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 9:21:57

答辩现场,评审组教授最不满意的 5 种回答方式,切记!切记!切记!

很多同学在答辩结束后都会说一句话&#xff1a;“其实我都会&#xff0c;但不知道为什么老师一直追问。”问题往往不在不会&#xff0c; 而在回答方式不对。站在评审组教授的角度&#xff0c; 下面这 5 种回答方式&#xff0c; 是最容易让他们皱眉、甚至继续追问的。一、“这个…

作者头像 李华
网站建设 2026/6/15 10:20:27

程序员必看!企业级私有化部署开源大模型选型与实战指南(建议收藏)

文章介绍了支持私有化部署的开源大模型选型与部署指南&#xff0c;包括国际主流和中文优秀模型。详细分析了个人开发、中小企业和大规模生产三种场景下的硬件配置、软件框架和性价比方案&#xff0c;帮助企业和开发者根据需求选择合适的模型和部署架构&#xff0c;实现数据安全…

作者头像 李华
网站建设 2026/6/15 10:29:10

从零开始:Gitee 仓库创建与本地项目纳管全流程详解

目录 一、Gitee 仓库创建:打好代码托管的基础 1.1 准备工作 1.2 仓库创建步骤 二、本地生成 SSH 公钥:实现免密提交代码 2.1 SSH 公钥的作用原理 2.2 本地生成 SSH 公钥的步骤 步骤 1:检查 Git 环境 步骤 2:打开命令行工具 步骤 3:执行生成公钥的命令 2.3 将公钥…

作者头像 李华
网站建设 2026/6/15 3:34:42

走向全栈:前后端状态认知差异与设计边界的深度探讨

文章目录 引言&#xff1a;为何关注前后端状态认知差异全栈开发的兴起与前后端分离的现状状态管理在现代应用中的重要性前后端协作中的常见误解 登录态的归属&#xff1a;前端状态还是后端状态&#xff1f;登录态的定义与实现方式前端如何管理登录态后端对登录态的支持与要求案…

作者头像 李华
网站建设 2026/6/12 15:01:43

Java毕设选题推荐:基于Java的小说三体科幻社区管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华