ATM模拟
该代码只能执行简单的查余额,存款,取款操作(卡号信息由用户输入,默认密码为"000000",默认余额为0)
该代码缺点:功能较少,注释信息,提示信息较多,虽然部分体现了类的思想,但是主函数中仍然是大的模拟,可以优化为操作类或外部函数来使代码具有可读性(这个代码读起来还是挺烦的)。。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
class Account
{
const string num; //账号创建账户对象后不变
//const string name; //客户姓名创建账户后不变
//不过这里不考虑开户情况了(开户时要写入卡号,然后设定用户名(用户名即用户的身份信息(不可变)),这里略去用户名,开户时还要设定初始密码,这里不考虑开户情况,初始密码统一设为"000000"
string safe; //账户密码按道理来说应当可变,但是这里为了简化程序不进行改变了,详解见下改密码函数解释
double balance; //余额可以改变
public:
Account(string num1,string safe1,double amount):num(num1),safe(safe1),balance(amount){}
Account(){};
const string getnum() {return num;}
//const string getname() {return name;}
string getsafe() {return safe;}
double getamount() {return balance;}
//void password(string safe1) {safe=safe1;}
//把密码当做死密码来看(不允许更改了)(构造函数时对其直接进行初始化)
//(因为程序关闭后没有后台记录过程,这次改完密码下次再运行程序密码又被默认初始化了(除非构建信息将密码用户名等信息存起来并模拟刷卡的过程(读取卡与取走卡),并在取走卡之前记录这些操作(这样对金钱的存取记录,用户名的使用,密码的更改就都可以进行查取了)
void deposit(double amount) { balance += amount;}
}acc1;
int main()
{
string caozuo;
string num;
//string name;
string safe;
int error=0; //当error=3时(密码输错达到3次上限,退出程序)
double amount;
printf("请输入卡号:");
cin>>num;
Account acc1(num,"000000",0);
printf("请输入密码:");
while(cin>>safe) //密码的判断
{
if(safe==acc1.getsafe())
{
printf("登陆成功,欢迎回来!\n");
printf("用户账号:");
cout<<acc1.getnum()<<endl;
break;
}
else
{
error++;
if(error==3)
{
printf("对不起,今日您已达到最大错误密码输入上限,怀疑您的身份信息与账户信息不匹配,为了账户的安全,该银行卡已被冻结,请带着您的有效身份证件去营业大厅解冻!");
return 0;
}
printf("密码错误,请再次输入:");
}
}
while(1)
{
printf("请输入您接下来要执行的操作:\t查询余额请按1\t存入金钱请按2\t取出金钱请按3\t直接退出请按esc键\n");
cin>>caozuo;
if(caozuo=="1")
{
printf("用户账号:");
cout<<acc1.getnum()<<"\t";
printf("所剩余额:%llf\n",acc1.getamount());
}
if(caozuo=="2")
{
printf("请输入您要存入的金额:\n");
cin>>amount;
acc1.deposit(amount); //这里不显示余额,只有在查询时才会显示余额(银行ATM的工作原理是这样)
printf("继续存入请按1\t返回上一层请按*键\t直接退出请按esc键\n");
while(cin>>caozuo)
{
if(caozuo=="1")
{
printf("请输入您接下来要存入的金额:\n");
cin>>amount;
acc1.deposit(amount);
}
if(caozuo=="*")
break;
if(caozuo=="esc")
{
printf("感谢您的使用!\n");
return 0;
}
printf("继续存入请按1\t返回上一层请按*\t直接退出请按esc键\n");
}
}
if(caozuo=="3")
{
printf("请输入要取出的金额:\n");
cin>>amount;
if(acc1.getamount()>=amount)
{
double amount_=-amount;
acc1.deposit(amount_);
}
else
{
printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!\n");
}
printf("继续取出请按1\t返回上一层请按*\t直接退出请按esc键\n");
while(cin>>caozuo)
{
if(caozuo=="1")
{
printf("请输入要取出的金额:\n");
cin>>amount;
if(acc1.getamount()>=amount)
{
double amount_=-amount;
acc1.deposit(amount_);
}
else
{
printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!\n");
}
}
if(caozuo=="*")
break;
if(caozuo=="esc")
{
printf("感谢您的使用!\n");
return 0;
}
printf("继续取出请按1\t返回上一层请按*\t直接退出请按esc键\n");
}
}
if(caozuo=="esc")
{
printf("感谢您的使用!\n");
return 0;
}
}
}
测试数据一:
/*
忘密码:
当我们忘记密码或其他人捡到我们的银行卡并试图尝试破解时,ATM会给出三次破解机会,当达到破解上限时会冻结卡号信息,这时就需要去营业大厅解封,确保银行卡丢失时账户的安全性;
(密码默认值"000000")
测试信息如下:
请输入卡号:20182019
请输入密码:123456
密码错误,请再次输入:654321
密码错误,请再次输入:666666
对不起,今日您已达到最大错误密码输入上限,怀疑您的身份信息与账户信息不匹配,为了账户的安全,该银行卡已被冻结,请带着您的有效身份证件去营业大厅解冻!
*/
测试数据二:
/*
正常存取款:
完全依据提示信息即可完成操作:(当我们执行操作时不按提示信息随意进行输入时默认为无效操作)
这里给出一组查余额,存款,取款多次操作的数据(测完的)(自己可以再测,这只是随意的一种情况):
请输入卡号:
20182019
请输入密码:
123456
密码错误,请再次输入:
000000
登陆成功,欢迎回来!
用户账号:20182019
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:0.000000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
2
请输入您要存入的金额:
80
继续存入请按1 返回上一层请按*键 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:80.000000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
2
请输入您要存入的金额:
100.25
继续存入请按1 返回上一层请按*键 直接退出请按esc键
1
请输入您接下来要存入的金额:
100
继续存入请按1 返回上一层请按* 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:280.250000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
2
请输入您要存入的金额:
100
继续存入请按1 返回上一层请按*键 直接退出请按esc键
1
请输入您接下来要存入的金额:
100
继续存入请按1 返回上一层请按* 直接退出请按esc键
1
请输入您接下来要存入的金额:
100
继续存入请按1 返回上一层请按* 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:580.250000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
3
请输入要取出的金额:
0
继续取出请按1 返回上一层请按* 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:580.250000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
3
请输入要取出的金额:
400
继续取出请按1 返回上一层请按* 直接退出请按esc键
1
请输入要取出的金额:
100
继续取出请按1 返回上一层请按* 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:80.250000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
3
请输入要取出的金额:
100
对不起,您的账户余额已不足,请取较少量金钱或及时充值!
继续取出请按1 返回上一层请按* 直接退出请按esc键
1
请输入要取出的金额:
50
继续取出请按1 返回上一层请按* 直接退出请按esc键
1
请输入要取出的金额:
50
对不起,您的账户余额已不足,请取较少量金钱或及时充值!
继续取出请按1 返回上一层请按* 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
1
用户账号:20182019 所剩余额:30.250000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 直接退出请按esc键
esc
感谢您的使用!
*/