ATM模拟功能增强版
模拟ATM的具体功能:该代码可实现开户(多个账户存入vector中),查询余额,存款,取款,修改密码,查询登录状态及各种操作记录情况,但是该代码的主函数使用了大模拟,查看起来可能造成不便(并不是一个好的代码)
当然可以继续对该代码进行优化,可以把主函数中的各项操作写到外面分成几个函数,看起来会直观一些,另外该ATM没有加入显示时间的函数,无法显示时间,可以再对其优化加入。
该代码很多地方进行调试后有些东西没有删除(只是标注为非运行部分)也可以将其删去,不过可能有的地方有助于理解与以后再看,我就没删。。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
/*class Account
{
class Zhanghu;
class record;
}acc1;*/ //想用Account这个大类来连接Zhanghu与record这两个小类,不过发现没有用到。。。
class Zhanghu
{
string num; //账号创建账户对象后不变
string name; //客户姓名创建账户后不变
string safe; //账户密码可变
double balance; //余额可以改变
public:
struct Jiaoyi
{
double money;
double amount;
string leixing; //交易类型:登录/查询/存款/取款/改密码
}J;
vector<Jiaoyi>jiaoyi;
string getnum() {return num;}
string getname() {return name;}
string getsafe() {return safe;}
double getamount() {return balance;}
Zhanghu(){};
//Zhanghu(string num1,string name1,string safe1,double balance1):num(num1),name(name1),safe(safe1),balance(balance1){};
void scanf(string num1,string name1,string safe1)
{
num=num1;
name=name1;
safe=safe1;
}
void password(string safe1) {safe=safe1;}
void deposit(double amount) { balance += amount;}
}X;
/*class Record //也是想把交易记录分成两个小类(交易方式与交易时间),但是也没能实现。。。
{
struct Data;
struct Jiaoyi;
public:
void cun(){printf("存入");}
void qu() {printf("取出");}
//余额通过账户类型进行查询
};*/
vector<Zhanghu>zhanghu;
struct Data
{
int year;
int month;
int day;
int hour;
int minute;
int second;
}D;
/*struct Jiaoyi
{
double money;
double amount;
string leixing; //交易类型:登录/查询/存款/取款/改密码
}J;
vector<Jiaoyi>jiaoyi;*/
vector<Data>data;
int main()
{
string caozuo;
string num;
string name;
string safe;
printf("请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
");
int z=0; //用z来进行对卡号张数进行计数,申请银行卡多一张,z++
while(cin>>caozuo){
int y=0; //用y来进行对卡号次序(张数)的计数(卡号次序不同于卡号),每次操作完进行一次清零
if(caozuo=="1")
{
printf("请您依次输入新创建的账户信息:卡号 用户名 密码
");
cin>>num;
cin>>name;
cin>>safe;
X.scanf(num,name,safe);
zhanghu.push_back(X);
z++;
// zhanghu[z].num.push_back(num); //如果使用向量则不行(不可操作class隐私数据)
}
if(caozuo=="2"){
int error=0; //当error=3时(密码输错达到3次上限,退出程序)
double amount;
printf("请输入卡号:");
while(cin>>num)
{
if(num=="*")
break;
int x=0;
for(int i=0;i<z;i++) //前提保证卡号永远不重复,否则只能读取最后的卡号信息
{
if(num==zhanghu[i].getnum())
{
x=1;
y=i;
}
}
if(x==1)
break;
else
{
y=0; //下次寻找前清零
printf("账号错误,请您再次输入,如果您想要返回上一层请按*
");
}
}
if(num=="*")
{
printf("请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
");
continue;
}
printf("请输入密码:");
while(cin>>safe) //密码的判断
{
if(safe==zhanghu[y].getsafe())
{
printf("登陆成功,欢迎回来!
");
printf("用户账号:");
cout<<zhanghu[y].getnum()<<" ";
printf("用户名:");
cout<<zhanghu[y].getname()<<endl;
X.J.leixing="登陆"; //统计登陆操作
zhanghu[y].jiaoyi.push_back(X.J);
break;
}
else
{
error++;
if(error==3)
{
printf("对不起,今日您已达到最大错误密码输入上限,怀疑您的身份信息与账户信息不匹配,为了账户的安全,该银行卡已被冻结,请带着您的有效身份证件去营业大厅解冻!");
return 0;
}
printf("密码错误,请再次输入:");
}
}
while(1){
printf("请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
");
cin>>caozuo;
if(caozuo=="1")
{
X.J.leixing="查询";
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);
printf("用户账号:");
cout<<zhanghu[y].getnum()<<" ";
printf("用户名:");
cout<<zhanghu[y].getname()<<" ";
printf("所剩余额:%llf
",zhanghu[y].getamount());
}
if(caozuo=="2")
{
printf("请输入您要存入的金额:
");
cin>>amount;
zhanghu[y].deposit(amount); //这里不显示余额,只有在查询时才会显示余额(银行ATM的工作原理是这样)
X.J.leixing="存入";
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);
printf("继续存入请按1 返回上一层请按*键 直接退出请按esc键
");
while(cin>>caozuo)
{
if(caozuo=="1")
{
printf("请输入您接下来要存入的金额:
");
cin>>amount;
zhanghu[y].deposit(amount);
X.J.leixing="存入";
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);
}
if(caozuo=="*")
break;
if(caozuo=="esc")
{
printf("感谢您的使用!
");
return 0;
}
printf("继续存入请按1 返回上一层请按*键 直接退出请按esc键
");
}
}
if(caozuo=="3")
{
printf("请输入要取出的金额:
");
cin>>amount;
if(zhanghu[y].getamount()>=amount)
{
double amount_=-amount;
zhanghu[y].deposit(amount_);
X.J.leixing="取出";
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);
}
else
{
printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!
");
/*X.J.leixing="尝试取出但余额不足,尝试取出金额为:"; //对于余额不足未取出的情况不予统计了
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);*/
}
printf("继续取出请按1 返回上一层请按*键 直接退出请按esc键
");
while(cin>>caozuo)
{
if(caozuo=="1")
{
printf("请输入要取出的金额:
");
cin>>amount;
if(zhanghu[y].getamount()>=amount)
{
double amount_=-amount;
zhanghu[y].deposit(amount_);
X.J.leixing="取出";
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);
}
else
{
printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!
");
/*X.J.leixing="尝试取出但余额不足,尝试取出金额为:";
X.J.money=amount;
X.J.amount=zhanghu[y].getamount();
zhanghu[y].jiaoyi.push_back(X.J);*/
}
}
if(caozuo=="*")
break;
if(caozuo=="esc")
{
printf("感谢您的使用!
");
return 0;
}
printf("继续取出请按1 返回上一层请按*键 直接退出请按esc键
");
}
}
if(caozuo=="4")
{
printf("请输入原密码:
");
cin>>safe;
while(1){
if(safe==zhanghu[y].getsafe()){
printf("请输入新密码:
");
string newsafe1;
string newsafe2;
cin>>newsafe1;
printf("请再次输入新密码:
");
cin>>newsafe2;
if(newsafe1==newsafe2)
{
zhanghu[y].password(newsafe1);
printf("修改成功!
");
X.J.leixing="修改密码";
zhanghu[y].jiaoyi.push_back(X.J);
break;
}
else
printf("对不起,您两次输入的密码不一致,请您再次输入新密码:
");
}
else
{
printf("对不起,你输入的密码有误,请您再次输入:
");
cin>>safe;
}
}
}
if(caozuo=="5")
{
vector<Zhanghu::Jiaoyi>::iterator it;
for(it=zhanghu[y].jiaoyi.begin();it!=zhanghu[y].jiaoyi.end();it++) //begin从零开始计数,y是从1开始(表示第几张卡)
{
if(it->leixing=="登陆")
{
printf("登陆账号!
");
}
if(it->leixing=="查询")
{
printf("查询余额 当前余额:");
//if((it-1)->leixing=="登陆")
cout<<it->amount<<endl; //写成it->amount在更换账户首次查询时会保留上位账户的余额,但是如果存取完再查询就保留当前余额了,所以下面写这两种都是可以的
// else
// cout<<it->amount<<endl;
}
if(it->leixing=="存入")
{
printf("存入金额:");
cout<<it->money<<" ";
printf("当前余额:");
cout<<it->amount<<endl;
}
if(it->leixing=="取出")
{
printf("取出金额:");
cout<<it->money<<" ";
printf("当前余额:");
cout<<it->amount<<endl;
}
if(it->leixing=="修改密码")
{
printf("修改密码
");
}
}
}
if(caozuo=="***")
{
break;
}
if(caozuo=="esc")
{
printf("感谢您的使用!
");
return 0;
}
}
}
printf("请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
");
}
/* D.year=1;
J.leixing="查询";
data.push_back(D);
jiaoyi.push_back(J);
D.year=2;
J.leixing="存入";
data.push_back(D);
jiaoyi.push_back(J);
for(int i=0;i<=1;i++)
{
cout<<data[i].year<<" "<<jiaoyi[i].leixing<<endl;
}
*/
return 0;
}
测试数据:
/*
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
2
请输入卡号:2019
账号错误,请您再次输入,如果您想要返回上一层请按*
2018
账号错误,请您再次输入,如果您想要返回上一层请按*
*
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
1
请您依次输入新创建的账户信息:卡号 用户名 密码
2018
。。。
2018
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
1
请您依次输入新创建的账户信息:卡号 用户名 密码
2019
。
2019
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
2
请输入卡号:2018
请输入密码:2018
登陆成功,欢迎回来!
用户账号:2018 用户名:。。。
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
1
用户账号:2018 用户名:。。。 所剩余额:0.000000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
2
请输入您要存入的金额:
200
继续存入请按1 返回上一层请按*键 直接退出请按esc键
1
请输入您接下来要存入的金额:
300
继续存入请按1 返回上一层请按*键 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
3
请输入要取出的金额:
600
对不起,您的账户余额已不足,请取较少量金钱或及时充值!
继续取出请按1 返回上一层请按*键 直接退出请按esc键
1
请输入要取出的金额:
400
继续取出请按1 返回上一层请按*键 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
4
请输入原密码:
2019
对不起,你输入的密码有误,请您再次输入:
2018
请输入新密码:
2019
请再次输入新密码:
2020
对不起,您两次输入的密码不一致,请您再次输入新密码:
请输入新密码:
2019
请再次输入新密码:
2019
修改成功!
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
5
登陆账号!
查询余额 当前余额:0
存入金额:200 当前余额:200
存入金额:300 当前余额:500
取出金额:400 当前余额:100
修改密码
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
***
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
2
请输入卡号:2019
请输入密码:2019
登陆成功,欢迎回来!
用户账号:2019 用户名:。
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
1
用户账号:2019 用户名:。 所剩余额:0.000000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
5
登陆账号!
查询余额 当前余额:0
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
2
请输入您要存入的金额:
1000
继续存入请按1 返回上一层请按*键 直接退出请按esc键
*
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
***
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
2
请输入卡号:2018
请输入密码:2018
密码错误,请再次输入:2019
登陆成功,欢迎回来!
用户账号:2018 用户名:。。。
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
1
用户账号:2018 用户名:。。。 所剩余额:100.000000
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
5
登陆账号!
查询余额 当前余额:0
存入金额:200 当前余额:200
存入金额:300 当前余额:500
取出金额:400 当前余额:100
修改密码
登陆账号!
查询余额 当前余额:100
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
***
请选择您要执行的操作:申请新账户请按1 读取已有账户信息请按2
2
请输入卡号:2019
请输入密码:2019
登陆成功,欢迎回来!
用户账号:2019 用户名:。
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
5
登陆账号!
查询余额 当前余额:0
存入金额:1000 当前余额:1000
登陆账号!
请输入您接下来要执行的操作: 查询余额请按1 存入金钱请按2 取出金钱请按3 修改密码请按4 查询操作记录请按5
返回主菜单请按***键 直接退出请按esc键
esc
感谢您的使用!
*/