当前位置: 首页 > 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电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


相关文章:

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

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…...

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系&#xff08;一&#xff09;   2.芯片CRA角度与镜头选型的匹配关…...

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…...

速看!这主食冻干评测极可能被商家恶意举报~PR、希喂和SC真实测评

我是一名专注于宠物健康的营养师&#xff0c;日常大部分时间都在与猫咪和狗狗为伴&#xff0c;对它们入店时的身体状况往往能迅速做出初步判断。当前&#xff0c;多数家养猫咪面临的肥胖和肝损伤问题尤为突出&#xff0c;尽管医疗干预能缓解病情&#xff0c;但要从根本上解决还…...

股票数据分析(K线图、均值图、MACD图、RSI图)--股票日数据

数据 数据是上证指数日行情数据&#xff0c;股票代码000002.sz&#xff0c;原始数据shdata示例如下&#xff1a; 读取数据&#xff1a; import numpy as np import pandas as pd import mplfinance as mpf import matplotlib.pyplot as plt from datetime import datetime imp…...

重写equals()方法为什么同时要重写hashcode()

equals()方法 equals()方法是Object类中的一个方法&#xff0c;在Object类中&#xff0c;equals等同于。 在不同的类中&#xff0c;往往会对equals()按需求进行重写。重写的目的都是&#xff1a;用于比较两个对象是否 "相等"。如果两个对象的内容相同&#xff0c;那…...

安全及应用(更新)

一、账号安全 1.1系统帐号清理 #查看/sbin/nologin结尾的文件并统计 [rootrootlocalhost ~]# grep /sbin/nologin$ /etc/passwd |wc -l 40#查看apache登录的shell [rootrootlocalhost ~]# grep apache /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin#改变…...

Hadoop权威指南-读书笔记-03-Hadoop分布式文件系统

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈&#x1f601;有兴趣的小伙伴可以去看看原著&#x1f60a; 第三章 Hadoop分布式文件系统 当数据集的大小超过一台独立的物理计算机的存储能力时&#xff0c;就有必要对它进行分…...

Rust入门实战 编写Minecraft启动器#2建立资源模型

首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息&#xff0c;之后我们需要将json文件解析成这几个结构体&#xff0c;所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…...

小白学C++(第一天)基础入门

温馨提醒&#xff1a;本篇文章&#xff0c;请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字&#xff0c;使用格式格式如下&#xff1a; namespace 空间名 { } 其中{ }内的命名空间的成员&#xff0c;可以定义…...

谷歌正在试行人脸识别办公室安全系统

内容提要&#xff1a; &#x1f9ff;据美国消费者新闻与商业频道 CNBC 获悉&#xff0c;谷歌正在为其企业园区安全测试面部追踪技术。 &#x1f9ff;测试最初在华盛顿州柯克兰的一间办公室进行。 &#x1f9ff;一份内部文件称&#xff0c;谷歌的安全和弹性服务 (GSRS) 团队将…...

【CSS01】CSS概述,使用样式的必要性,CSS语法及选择器

文章目录 一、什么是样式二、使用样式的必要性三、使用样式的几种方式四、CSS基本语法&#xff1a;五、CSS的注释六、CSS选择器——重点相关单词 一、什么是样式 概念&#xff1a; Cascade [kˈskeɪd] Style Sheet [ʃiːt] 级联样式单/表&#xff0c;层叠样式表 CSS有化腐…...

PostgreSQL的pg_bulkload工具

PostgreSQL的pg_bulkload工具 pg_bulkload 是一个针对 PostgreSQL 提供高性能批量数据加载的工具。相较于内置的 COPY 命令&#xff0c;pg_bulkload 更加灵活并且在许多情况下性能更高。它支持数据的强制加载、数据过滤、数据转换以及错误处理等多种功能&#xff0c;非常适合需…...

【Java伴学笔记】Day-01 命令行|环境|编译解释运行|Java的相关分支|Java的特性|字面量

一、关于命令行 图形化界面的缺点 需要加载图片等一系列资源 效率较低 命令行 CMDMicrosoft Learn-CMDWindows CMD常用命令大全&#xff08;值得收藏&#xff09; 二、环境 什么是JDK JDK是Java Development Kit的缩写&#xff0c;意为Java开发工具包。它是一个用于开发Java应用…...

如何使用Vue3创建在线三维模型展示?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关的技术博客 代码应用场景介绍 本段代码使用 RoughJS 库在 HTML5 Canvas 上创建了手绘风格的图像&#xff0c;展示了 RoughJS 库的强大功能&#xff0c;可用于创建具有有机手绘外观的图形。 代码基本…...

使用ndoe实现自动化完成增删改查接口

使用ndoe实现自动化完成增删改查接口 最近工作内容比较繁琐&#xff0c;手里需要开发的项目需求比较多&#xff0c;常常在多个项目之间来回切换&#xff0c;有时候某些分支都不知道自己开发了什么、做了哪些需求&#xff0c; 使用手写笔记的方式去记录分支到头来也是眼花缭乱&a…...

排序 -- 手撕归并排序(递归和非递归写法)

一、基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…...

防火墙基础及登录(华为)

目录 防火墙概述防火墙发展进程包过滤防火墙代理防火墙状态检测防火墙UTM下一代防火墙&#xff08;NGFW&#xff09; 防火墙分类按物理特性划分软件防火墙硬件防火墙 按性能划分百兆级别和千兆级别 按防火墙结构划分单一主机防火墙路由集成式防火墙分布式防火墙 华为防火墙利用…...

【Vue】使用html、css实现鱼骨组件

文章目录 预览图组件测试案例 预览图 组件 <template><div class"context"><div class"top"><div class"label-context"><div class"label" v-for"(item, index) in value" :key"index&qu…...

Python的多态

在 Python 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是指不同的对象可以对相同的消息&#xff08;方法调用&#xff09;做出不同的响应。 简单来说&#xff0c;多态允许使用一个统一的接口来操作不同类型的对象&#xff0c;而这些对象会根据自身的类型来执行相应…...

001uboot体验

1.uboot的作用&#xff1a; 上电->uboot启动->关闭看门狗、初始化时钟、sdram、uart等外设->把内核文件从flash读取到SDRAM->引导内核启动->挂载根文件系统->启动根文件系统的应用程序 2.uboot编译 uboot是一个通用的裸机程序&#xff0c;为了适应各种芯片&…...

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…...

Vue 2 与 ECharts:结合使用实现动态数据可视化

在现代前端开发中&#xff0c;数据可视化变得越来越重要。ECharts 是一个强大的数据可视化库&#xff0c;而 Vue 2 则是一个流行的前端框架。本文将介绍如何将 Vue 2 和 ECharts 结合使用&#xff0c;以实现动态数据可视化。 安装与配置 首先&#xff0c;确保你的项目中已经安…...

.net core Redis 使用有序集合实现延迟队列

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的&#xf…...

linux 安装Openjdk1.8

一、在线安装 1、更新软件包 sudo apt-get update 2、安装openjdk sudo apt-get install openjdk-8-jdk 3、配置openjdk1.8 openjdk默认会安装在/usr/lib/jvm/java-8-openjdk-amd64 vim ~/.bashrc export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME${J…...

鸿蒙系统:未来智能生态的引领者

在当今这个日新月异的互联网领域&#xff0c;操作系统作为连接硬件与软件的桥梁&#xff0c;其重要性不言而喻。随着华为鸿蒙系统&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;一场关于操作系统未来的讨论再次被推向高潮。 鸿蒙OS&#xff0c;华为的全新力作&#xff…...

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质&#xff08;数据结构&#xff09;数据的取值范围&#xff08;字节大小&#xff09;数据的存储方式参与的运算 Java是一门强类…...

水果商城系统 SpringBoot+Vue

1、技术栈 技术栈&#xff1a;SpringBootVueMybatis等使用环境&#xff1a;Windows10 谷歌浏览器开发环境&#xff1a;jdk1.8 Maven mysql Idea 数据库仅供学习参考 【已经答辩过的毕业设计】 项目源码地址 2、功能划分 3、效果演示...

半导体制造企业 文件共享存储应用

用户背景&#xff1a;半导体设备&#xff08;上海&#xff09;股份有限公司是一家以中国为基地、面向全球的微观加工高端设备公司&#xff0c;为集成电路和泛半导体行业提供具竞争力的高端设备和高质量的服务。 挑战&#xff1a;芯片的行业在国内迅猛发展&#xff0c;用户在上海…...

深入分析 Android BroadcastReceiver (九)

文章目录 深入分析 Android BroadcastReceiver (九)1. Android 广播机制的扩展应用与高级优化1.1 广播机制的扩展应用1.1.1 示例&#xff1a;有序广播1.1.2 示例&#xff1a;粘性广播1.1.3 示例&#xff1a;局部广播 1.2 广播机制的高级优化1.2.1 示例&#xff1a;使用 Pending…...