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

news2024/9/20 19:10:55

🏆本文收录于「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.coloradmin.cn/o/1907437.html

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

相关文章

权限维持-Linux-内核加载 LKM-Rootkit 后门

免责声明:本文仅做技术交流与学习... 目录 权限维持-Linux-内核加载 LKM-Rootkit 后门 项目地址: 安装: 隐藏用法: 将 root 权限授予非特权用户 隐藏文件、目录和内核模块 隐藏进程 隐藏 TCP 和 UDP 连接 高级玩法(c/s) 攻击机上(客户端)安装: 设置连接配置 权限维持…

代码随想录算法训练营第四十七天|1143.最长公共子序列、 1035.不相交的线、53. 最大子序和、392.判断子序列

1143.最长公共子序列 题目链接&#xff1a;1143.最长公共子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1]) 思路&#xff1a; 如果text1[i - 1] 与 text2[j - 1]相同&#xff0c;那么找到了一个公共元素&#xff…

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案&#xff01; 详细功能见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

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

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

PHP宝藏神器多功能投票系统源码小程序

&#x1f389;发现宝藏神器&#xff01;一键解锁“多功能投票小程序”的无限可能✨ &#x1f308; 开篇安利&#xff1a;告别繁琐&#xff0c;拥抱高效&#xff01; Hey小伙伴们&#xff0c;是不是经常为组织活动、收集意见而头疼不已&#xff1f;&#x1f92f; 今天就要给大…

融云入驻首个数字生态出海基地,加速构建数字经济出海创新生态

7 月 3 日&#xff0c;“2024 全球数字经济大会”重要专题论坛“2024 数字生态出海发展论坛”在北京国家会议中心举行。 论坛由全球数字经济大会组委会主办&#xff0c;北京市经济和信息化局、北京市政务服务和数据管理局、大兴区人民政府共同承办。来自阿联酋、日本、古巴、…

挖到宝了,一个可自动根据设定兴趣主题爬取实时信息的AI挖掘工具。

在这个信息爆炸的时代&#xff0c;我们每天都被海量的资讯淹没。 无论是工作需要还是个人兴趣&#xff0c;我们都希望能够及时获取到最新、最有价值的信息。然而&#xff0c;手动搜索、筛选这些信息不仅耗时耗力&#xff0c;还常常让人感到疲惫。 今天&#xff0c;我给大家推…

【Python】Python中TODO的用法解析

目录 一.Python中的TODO是什么 二.Python中什么时候使用TODO 三.Pycharm中关于TODO的使用方式 一.Python中的TODO是什么 在Python中&#xff0c; TODO 通常不是一个语言内置的关键字或功能&#xff0c;而是被用作一种注释约定&#xff0c;来标记代码中需要进一步实现或改进的…

【Linux】touch

我们在介绍ls这个命令时&#xff0c;提到每个文件在Linux下面都会记录许多的时间参数&#xff0c;其实是有三个主要的变动时间&#xff0c;那么三个时间的意义是什么&#xff1f; 修改时间&#xff08;modification time&#xff0c;mtime)&#xff1a;当该文件的【内容数据】…

mongoDB教程(五):命名规范

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

香蕉云编+uniapp打包ios的开发包和生产包

登录香蕉云编&#xff0c;找到 云编-ios证书生成&#xff0c;新建CSR文件&#xff0c;并下载csr文件。 登录苹果开发者中心&#xff0c;进入证书页面。 1.创建一个证书&#xff0c;选择ios Distribution类型即可&#xff0c;这是个通用的证书&#xff0c;既能用来打正式包又能…

想要做好非标设备行业的项目管理,这篇指南请收好!

近年来&#xff0c;随着制造业的快速发展和产业升级的不断推进&#xff0c;非标设备行业迎来了广阔的发展前景。一方面&#xff0c;制造业的快速发展带来了对非标设备的旺盛需求&#xff0c;尤其是在汽车、电子、航空航天等高端制造业领域&#xff0c;非标自动化设备的应用越来…

协议转换网关的工作原理-天拓四方

在当今数字化和网络化的社会中&#xff0c;不同系统和设备之间的通信至关重要。然而&#xff0c;由于技术多样性、厂商差异以及应用需求的复杂性&#xff0c;不同的系统和设备常常采用不同的通信协议&#xff0c;这使得它们之间的直接通信变得困难。为了解决这一问题&#xff0…

解决线程不安全问题的几种方式

线程不安全问题 日常生活中我们会经常碰到在不同的平台上买各种票的问题&#xff0c;例如在App、线下售票窗口等购买火车票、电影票。这里面就存在着线程安全的问题&#xff0c;因为当多个线程访问同一个资源时&#xff0c;会导致数据出错&#xff0c;例如甲和乙两人同时看中了…

深度解析:当下流行的人工智能大模型生成逻辑

在过去的几年里&#xff0c;人工智能领域经历了前所未有的革新&#xff0c;其中最引人注目的就是大规模预训练模型的崛起。这些模型&#xff0c;如GPT系列、BERT、T5、DALLE和CLIP等&#xff0c;凭借其强大的语言理解和生成能力&#xff0c;已经在自然语言处理&#xff08;NLP&…

ctfshow(web入门-信息搜集)

1.web1 直接F12查看即可 2.web2 根据提示使用抓包工具 3.web3 根据提示使用burp抓包&#xff0c;然后参数使用repeater模块进行发送 4.web4 根据提示先访问robots 5.web5 6.web6 使用dirsearch 即可www.zip 7.web7 8.web8 9.web9 10. web10 11.web11 12.web12 根据提示在底…

wordpress的restfull API使用教程,之如何用postman调试API,以便能使用vue等前端框架开发主题

文章目录 API开发手册在postman中调试这里以 post 一篇文章为例&#xff0c;讲解如何调试&#xff1a; 步骤 1&#xff1a;生成应用密码步骤 2&#xff1a;配置Postman步骤 3&#xff1a;创建文章 参考链接 API开发手册 官方API手册&#xff1a;https://developer.wordpress.o…

京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?

这是一本Python入门书。无论您是想学习编程的小学生&#xff0c;还是想参加计算机竞赛的中学生&#xff0c;抑或是计算机相关专业的大学生&#xff0c;甚至是正在从事软件开发的职场人&#xff0c;本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用&#xf…

07.C2W2.Part-of-Speech (POS) Tagging and Hidden Markov Models

往期文章请点这里 目录 OverviewPart of Speech TaggingMarkov ChainsMarkov Chains and POS TagsPOS tags as StatesTransition probabilitiesThe transition matrixInitial probabilities Hidden Markov ModelsEmission probabilitiesSummary Calculating ProbabilitiesTran…