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

使用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.lryc.cn/news/394829.html

相关文章:

  • 相机光学(二十四)——CRA角度
  • python函数和c的区别有哪些
  • 速看!这主食冻干评测极可能被商家恶意举报~PR、希喂和SC真实测评
  • 股票数据分析(K线图、均值图、MACD图、RSI图)--股票日数据
  • 重写equals()方法为什么同时要重写hashcode()
  • 安全及应用(更新)
  • Hadoop权威指南-读书笔记-03-Hadoop分布式文件系统
  • Rust入门实战 编写Minecraft启动器#2建立资源模型
  • 小白学C++(第一天)基础入门
  • 谷歌正在试行人脸识别办公室安全系统
  • 【CSS01】CSS概述,使用样式的必要性,CSS语法及选择器
  • PostgreSQL的pg_bulkload工具
  • 【Java伴学笔记】Day-01 命令行|环境|编译解释运行|Java的相关分支|Java的特性|字面量
  • 如何使用Vue3创建在线三维模型展示?
  • 使用ndoe实现自动化完成增删改查接口
  • 排序 -- 手撕归并排序(递归和非递归写法)
  • 防火墙基础及登录(华为)
  • 【Vue】使用html、css实现鱼骨组件
  • Python的多态
  • 001uboot体验
  • Flask之电子邮件
  • Vue 2 与 ECharts:结合使用实现动态数据可视化
  • .net core Redis 使用有序集合实现延迟队列
  • linux 安装Openjdk1.8
  • 鸿蒙系统:未来智能生态的引领者
  • Java语言程序设计——篇二(1)
  • 水果商城系统 SpringBoot+Vue
  • 半导体制造企业 文件共享存储应用
  • 深入分析 Android BroadcastReceiver (九)
  • 从数据到洞察:DataOps加速AI模型开发的秘密实践大公开!