C++实现ATM状态机
C实现ATM状态机以下是一个使用 C 实现的 ATM 状态机示例程序采用面向对象的方式实现。程序模拟了一个简单的 ATM 系统包含以下功能用户登录查询余额存款取款退出完整代码#includeiostream#includestring#includeunordered_mapusingnamespacestd;// 定义 ATM 状态的基类classATMState{public:virtualvoidhandle()0;// 纯虚函数表示状态处理virtual~ATMState(){}};// 定义 ATM 类classATM{private:unordered_mapstring,stringusers;// 用户名和密码unordered_mapstring,doublebalances;// 用户余额ATMState*currentState;// 当前状态string currentUser;// 当前登录用户public:ATM(){// 初始化用户数据users[user1]password1;users[user2]password2;balances[user1]1000.0;balances[user2]500.0;currentStatenullptr;}voidsetState(ATMState*state){currentStatestate;}voidhandle(){if(currentState){currentState-handle();}}boollogin(conststringusername,conststringpassword){if(users.find(username)!users.end()users[username]password){currentUserusername;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;coutEnter username: ;cinusername;coutEnter password: ;cinpassword;if(atm-login(username,password)){coutLogin successful!endl;atm-setState(newMenuState(atm));}else{coutInvalid 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;cout1. Check Balanceendl;cout2. Depositendl;cout3. Withdrawendl;cout4. Logoutendl;coutEnter your choice: ;cinchoice;switch(choice){case1:coutYour balance is: $atm-getBalance()endl;break;case2:{doubleamount;coutEnter amount to deposit: ;cinamount;atm-deposit(amount);coutDeposit successful!endl;break;}case3:{doubleamount;coutEnter amount to withdraw: ;cinamount;if(atm-withdraw(amount)){coutWithdrawal successful!endl;}else{coutInsufficient balance!endl;}break;}case4:atm-logout();coutLogged out successfully!endl;atm-setState(newIdleState(atm));return;default:coutInvalid choice. Try again.endl;}}while(choice!4);}};intmain(){ATM atm;atm.setState(newIdleState(atm));while(true){atm.handle();}return0;}代码说明状态机设计使用ATMState作为状态的基类定义了一个纯虚函数handle()。IdleState和MenuState是具体的状态类分别表示 ATM 的空闲状态和菜单状态。ATM 类ATM类包含用户数据用户名、密码、余额和当前状态。提供了登录、查询余额、存款、取款和注销等功能。状态切换在IdleState中用户输入用户名和密码进行登录。如果登录成功状态切换到MenuState。在MenuState中用户可以选择不同的操作完成后可以返回主菜单或注销。动态分配状态使用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扩展功能支持更多状态可以扩展更多状态例如维护模式、错误状态等。持久化存储将用户数据存储到数据库或文件中而不是硬编码在程序中。安全性使用加密存储密码避免明文存储。通过这种面向对象的设计可以轻松扩展 ATM 的功能同时保持代码的清晰和可维护性。

相关新闻

导师严选2026 AI论文工具TOP10:自考论文写作全攻略

导师严选2026 AI论文工具TOP10:自考论文写作全攻略

2026/7/5 6:47:15 阅读更多 →
兰亭妙微:以HTML前端、UI/交互/图标设计赋能数字孪生与大屏设计新标杆

兰亭妙微:以HTML前端、UI/交互/图标设计赋能数字孪生与大屏设计新标杆

2026/7/8 3:37:31 阅读更多 →
兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆

兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆

2026/7/6 15:28:24 阅读更多 →

最新新闻

Cadence IC618 动态比较器噪声仿真:PSS+Pnoise 与 Transient Noise 双方法对比

Cadence IC618 动态比较器噪声仿真:PSS+Pnoise 与 Transient Noise 双方法对比

Cadence IC618 动态比较器噪声仿真:PSSPnoise 与 Transient Noise 双方法对比在高速ADC设计中,动态比较器的噪声特性直接影响系统信噪比和有效位数。传统静态比较器的噪声分析方法无法直接应用于受时钟控制的动态结构,工程师常面临PSSPnoise谐…

2026/7/9 20:26:39 阅读更多 →
Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例

Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例

Web系统GUI设计实战:3种页面结构对比与Axure RP原型设计案例在数字化浪潮席卷各行各业的今天,Web系统的界面设计质量直接影响着用户体验和业务转化效率。一个优秀的GUI设计不仅需要满足功能需求,更要通过科学的页面结构和流畅的交互逻辑降低用…

2026/7/9 20:24:39 阅读更多 →
锂电池主动均衡系统设计与BQ25887应用解析

锂电池主动均衡系统设计与BQ25887应用解析

1. 项目背景与核心需求在锂电池组管理系统中,电池单元之间的电压差异是一个长期存在的技术难题。当多个电芯串联使用时,由于制造工艺、使用环境和老化程度的差异,各单体电池的容量和内阻会逐渐产生偏差。这种不平衡会导致整个电池组的可用容量…

2026/7/9 20:18:33 阅读更多 →
TLE 6208-6 G与PIC24FJ256GA110的直流电机控制方案

TLE 6208-6 G与PIC24FJ256GA110的直流电机控制方案

1. 项目背景与核心器件选型在工业自动化和嵌入式控制领域,直流电机因其结构简单、控制方便等优点被广泛应用。要实现精确的速度和方向控制,需要高性能的驱动芯片与微控制器协同工作。TLE 6208-6 G是英飞凌推出的六通道半桥驱动器,特别适合汽车…

2026/7/9 20:16:33 阅读更多 →
终极变量命名神器:VARBook如何让中文程序员告别命名困扰

终极变量命名神器:VARBook如何让中文程序员告别命名困扰

终极变量命名神器:VARBook如何让中文程序员告别命名困扰 【免费下载链接】varbook 适合中文程序员的变量命名助手,NLP翻译,规范变量命名,定制化变量命名规则 项目地址: https://gitcode.com/gh_mirrors/va/varbook 你是否曾…

2026/7/9 20:16:33 阅读更多 →
学习Python编程4,日期和时间

学习Python编程4,日期和时间

Python提供了内建模块用来以多种格式处理日期与时间。DateTime模块是一个很流行的日期时间对象处理模块,包括时区,时间差,时间算术运算。模块还提供了许多格式选项用来以不同的方式显示日期和时间。此外,Time模块提供的时间值处理…

2026/7/9 20:14:32 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻