使用C++实现ATM系统,谈谈思路及代码实现

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  根据问题要求,恰当定义一个或多个类,注意每个类功能划分的合理性。
模拟 ATM 柜员机程序
内容要求:设计模拟 ATM 柜员机程序。
要求当输入给定的卡号和密码(初始卡号和密码为 123456)时,系统能登录 ATM 柜员机
系统,用户可以按照以下规则进行:
(1)查询余额:初始余额为 10000 元
(2)ATM 取款:每次取款金额为 100 的倍数,总额不超过 5000 元,支取金额不允许透支。
(3)ATM 存款:不能出现负存款。
(4)修改密码:新密码长度不小于 6 位,不允许出现 6 位完全相同的情况,只有旧密码
正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码

注释详细:每个变量都要求有注释说明用途;方法有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
程序的层次清晰,独创性强,可读性强。

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

代码展示:

  以下是一个使用C++实现的模拟ATM系统程序。程序定义了两个类:ATM和``,分别用于处理ATM操作和用户信息。每个类的功能划分合理,代码注释详细,程序层次清晰。

#include <iostream>
#include <string>
#include <vector>using namespace std;class User {
private:string cardNumber;  // 卡号string password;    // 密码double balance;     // 余额public:User(string cardNumber, string password, double balance) : cardNumber(cardNumber), password(password), balance(balance) {}string getNumber() {return cardNumber;}bool verify(string input) {return input == password;}double getBalance() {return balance;}bool deposit(double amount) {if (amount > 0) {balance += amount;return true;}return false;}bool withdraw(double amount) {if (amount > 0 && amount <= balance && ((int)amount % 100 == 0) && amount <= 5000) {balance -= amount;return true;}return false;}bool change(string old, string newPass, string confirm) {if (verify(old) && newPass.length() >= 6 && newPass == confirm) {password = newPass;return true;}return false;}
};class ATM {
private:User* user;  // 当前登录的用户public:ATM() : user(nullptr) {}bool login(vector<User>& users, string cardNumber, string password) {for (auto& u : users) {if (u.getNumber() == cardNumber && u.verify(password)) {user = &u;return true;}}return false;}void logout() {user = nullptr;}void checkBalance() {if (user != nullptr) {cout << "您的余额为: " << user->getBalance() << " 元" << endl;} else {cout << "请先登录!" << endl;}}void deposit(double amount) {if (user != nullptr) {if (user->deposit(amount)) {cout << "存款成功,当前余额为: " << user->getBalance() << " 元" << endl;} else {cout << "存款失败,请输入有效金额!" << endl;}} else {cout << "请先登录!" << endl;}}void withdraw(double amount) {if (user != nullptr) {if (user->withdraw(amount)) {cout << "取款成功,当前余额为: " << user->getBalance() << " 元" << endl;} else {cout << "取款失败,请确认金额是否正确或余额是否充足!" << endl;}} else {cout << "请先登录!" << endl;}}void change(string old, string newPass, string confirm) {if (user != nullptr) {if (user->change(old, newPass, confirm)) {cout << "密码修改成功!" << endl;} else {cout << "密码修改失败,请确认旧密码是否正确以及新密码是否符合要求!" << endl;}} else {cout << "请先登录!" << endl;}}
};int main() {vector<User> users;users.emplace_back("123456", "123456", 10000.0);ATM atm;int choice;string cardNumber, password, old, newPass, confirm;double amount;while (true) {cout << "欢迎使用ATM系统!" << endl;cout << "1. 登录" << endl;cout << "2. 查询余额" << endl;cout << "3. 存款" << endl;cout << "4. 取款" << endl;cout << "5. 修改密码" << endl;cout << "6. 注销" << endl;cout << "7. 退出系统" << endl;cout << "请选择操作: ";cin >> choice;switch (choice) {case 1:cout << "请输入卡号: ";cin >> cardNumber;cout << "请输入密码: ";cin >> password;if (atm.login(users, cardNumber, password)) {cout << "登录成功!" << endl;} else {cout << "登录失败,卡号或密码错误!" << endl;}break;case 2:atm.checkBalance();break;case 3:cout << "请输入存款金额: ";cin >> amount;atm.deposit(amount);break;case 4:cout << "请输入取款金额: ";cin >> amount;atm.withdraw(amount);break;case 5:cout << "请输入旧密码: ";cin >> old;cout << "请输入新密码: ";cin >> newPass;cout << "请确认新密码: ";cin >> confirm;atm.change(old, newPass, confirm);break;case 6:atm.logout();cout << "已注销!" << endl;break;case 7:cout << "退出系统!" << endl;return 0;default:cout << "无效选择,请重新选择!" << endl;break;}}return 0;
}

代码说明:

代码说明是对提供的代码进行解释,以下是对您提供的代码的详细说明:

User(用户类)
  • 成员变量

    • cardNumber: 存储用户的卡号。
    • password: 存储用户的密码。
    • balance: 存储用户的账户余额。
  • 构造函数:初始化用户对象的卡号、密码和余额。

  • 成员函数

    • getNumber(): 返回用户的卡号。
    • verify(string input): 验证输入的密码是否与用户密码匹配。
    • getBalance(): 返回用户的当前余额。
    • deposit(double amount): 存款操作,如果存款金额大于0,则增加余额并返回true
    • withdraw(double amount): 取款操作,如果取款金额大于0、不超过余额、是100的倍数且不超过5000,则减少余额并返回true
    • change(string old, string newPass, string confirm): 修改密码操作,如果旧密码正确、新密码长度至少6位、两次输入的新密码一致,则更新密码。
ATM(自动取款机类)
  • 成员变量

    • user: 指向当前登录用户的指针。
  • 构造函数:初始化usernullptr,表示没有用户登录。

  • 成员函数

    • login(vector<User>& users, string cardNumber, string password): 登录操作,通过遍历用户列表来验证卡号和密码,如果找到匹配的用户,则设置当前用户并返回true
    • logout(): 注销操作,将user设置为nullptr
    • checkBalance(): 查询余额操作,如果用户已登录,则显示余额。
    • deposit(double amount): 存款操作,如果用户已登录,调用用户对象的存款方法,并显示结果。
    • withdraw(double amount): 取款操作,同上。
    • change(string old, string newPass, string confirm): 修改密码操作,同上。
主函数 main()
  • 初始化一个用户列表,包含一个示例用户。
  • 创建ATM对象。
  • 提供一个循环菜单,让用户选择不同的操作:
    • 登录、查询余额、存款、取款、修改密码、注销或退出系统。
  • 根据用户的选择执行相应的ATM操作。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1475394.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

Unity实现安卓App预览图片、Pdf文件和视频的一种解决方案

一、问题背景 最近在开发app项目&#xff0c;其中有个需求就是需要在app软件内显示图片、pdf和视频&#xff0c;一开始想的解决方案是分开实现&#xff0c;也就是用Image组件显示图片&#xff0c;找一个加载pdf的插件和播放视频的插件&#xff0c;转念一想觉得太麻烦了&#x…

张量分解(2)——张量运算(内积、外积、直积、范数)

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…

vue3中使用 tilwindcss报错 Unknown at rule @tailwindcss

解决方法&#xff1a; vscode中安装插件 Tailwind CSS IntelliSense 在项目中的 .vscode中 settings.json添加 "files.associations": {"*.css": "tailwindcss"}

桌面快充插线板+伸缩数据线,轻松实现1+1>2

手机、平板、笔记本等电子设备已成为我们日常工作和学习的必备工具。然而,随着设备数量的增加,充电问题也日益凸显。桌面空间有限,多个快充头不仅显得杂乱无章,而且效率低下,无法满足我们高效办公的需求。 在这样的背景下,倍思Nomos氮化镓100W桌面充电站凭借其创新的设计和强大…

HR8870:H桥PWM直流电机驱动IC性能指标和应用方案选型

HR8870芯片描述 HR8870是一款直流有刷电机驱动器&#xff0c;适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器&#xff0c;该驱动器由四个N-MOS组成&#xff0c;能够以高达4.5A的峰值电流双向控制电机。利用电流衰减模式&#xff0c;可通过对输入进行…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多&#xff0c;c包容C语言并对C语言进行了补充&#xff0c;但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念&#xff0c;用关键字namespace来定义。…

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

【Spring Boot】Spring AOP动态代理,以及静态代理

目录 Spring AOP代理一. 代理的概念二. 静态代理三. JDK代理3.1 重写 invoke 方法进⾏功能增强3.2 通过Proxy类随机生成代理对象 四. CGLIB代理4.1 自定义类来重写intercept方法4.2 通过Enhancer类的create方法来创建代理类 五. AOP源码剖析 总结(重中之重&#xff0c;精华) Sp…

ASP.NET MVC-razor编写-2-svg中使用js+添加事件监听

环境&#xff1a;win10 效果 初始状态&#xff1a; 鼠标移入某个text&#xff08;比如KS primer&#xff09;时&#xff0c;text和连接的线条与箭头都变色&#xff1a; 鼠标移出时回复正常。 如果是移入另一种红色的text&#xff08;比如Cell Sceening Tag&#xff09;&…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性,这些属性固定,形成了机器人的个人偏好 在实现过程中,此处使用一个xml配置文件,配置了机器人的个人年龄、性别、职业等内容,同时包含常见有关于…

可信验证解释

学习目标&#xff1a;可信验证解释 可信验证是一种基于计算机技术和安全机制&#xff0c;用于确保系统、程序或数据的完整性和可信性的方法。以下是关于可信验证的详细解释&#xff1a;一、定义与原理 可信验证指的是利用计算机技术和安全机制&#xff0c;对系统、程序或数据…

一.2 程序被其他程序翻译成不同的格式(编译)

hello程序的生命周期是从一个高级C语言程序开始的&#xff0c;因为这种形式能够被人读懂。然而&#xff0c;为了在系统上运行hello.c程序&#xff0c;每条C语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序&#xff08;也称为可执…

【分布式系统】注册中心Zookeeper

目录 一.Zookkeeper 概述 1.Zookkeeper 定义 2.Zookkeeper 工作机制 3.Zookkeeper 特点 4.Zookkeeper 数据结构 5.Zookkeeper 应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 6.Zookkeeper 选举机制 第一次启动选举机制 非第一次…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

揭秘:源代码防泄密的终极秘籍

在当今信息科技高度发达的时代&#xff0c;源代码作为企业最核心的资产之一&#xff0c;其安全性不言而喻。源代码的泄露可能导致企业技术机密被竞争对手获取&#xff0c;进而威胁到企业的市场竞争力和长远发展。因此&#xff0c;源代码防泄密成为了企业信息安全工作的重中之重…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell&#xff1a;WinX, 选择“Windows PowerShell&#xff08;管理员&#xff09;” 输入&#xff1a;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入&#xff1a;y确认修改安全策略 &#xff1a;y确认修改安全策略…

vue + element ui 实现侧边栏导航栏折叠收起

首页布局如下 要求点击按钮,将侧边栏收缩, 通过 row 和 col 组件&#xff0c;并通过 col 组件的 span 属性我们就可以自由地组合布局。 折叠前 折叠后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Java-Sql注入以及如何解决

sql脚本注入: 如果sql语句使用字符串拼接&#xff0c;可能会出现字符串的拼接&#xff0c;导致sql注入。 #是会先进行预编译&#xff0c;传进来的参数通过占位符填入到已经完成编译的语句中去。

树莓派4B_OpenCv学习笔记21:OpenCV_haar人脸识别

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Opencv 版本是4.5.1&#xff1a; ​ Python 版本3.7.3&#xff1a; 今日学习&#xff…