🏆本文收录于「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
: 指向当前登录用户的指针。
-
构造函数:初始化
user
为nullptr
,表示没有用户登录。 -
成员函数:
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电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。