ATM模拟功能增强版(开户,查询余额,存款,取款,修改密码,查询登录状态及各种操作记录情况)

ATM模拟功能增强版

模拟ATM的具体功能:该代码可实现开户(多个账户存入vector中),查询余额,存款,取款,修改密码,查询登录状态及各种操作记录情况,但是该代码的主函数使用了大模拟,查看起来可能造成不便(并不是一个好的代码)
当然可以继续对该代码进行优化,可以把主函数中的各项操作写到外面分成几个函数,看起来会直观一些,另外该ATM没有加入显示时间的函数,无法显示时间,可以再对其优化加入。
该代码很多地方进行调试后有些东西没有删除(只是标注为非运行部分)也可以将其删去,不过可能有的地方有助于理解与以后再看,我就没删。。。

#include
#include
#include
#include
#include
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;
vectorjiaoyi;
    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("取出");}
    //余额通过账户类型进行查询

};*/
vectorzhanghu;
struct Data
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
}D;
/*struct Jiaoyi
{
    double money;
    double amount;
    string leixing;            //交易类型:登录/查询/存款/取款/改密码
}J;
vectorjiaoyi;*/
vectordata;
int main()
{
    string caozuo;
    string num;
    string name;
    string safe;
    printf("请选择您要执行的操作:申请新账户请按1\t读取已有账户信息请按2\n");
    int z=0;               //用z来进行对卡号张数进行计数,申请银行卡多一张,z++
    while(cin>>caozuo){
    int y=0;               //用y来进行对卡号次序(张数)的计数(卡号次序不同于卡号),每次操作完进行一次清零
    if(caozuo=="1")
    {
        printf("请您依次输入新创建的账户信息:卡号\t用户名\t密码\n");
        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>safe)                     //密码的判断
    {
        if(safe==zhanghu[y].getsafe())
        {
            printf("登陆成功,欢迎回来!\n");
            printf("用户账号:");
            cout<>caozuo;
            if(caozuo=="1")
            {
                X.J.leixing="查询";
                X.J.amount=zhanghu[y].getamount();
                zhanghu[y].jiaoyi.push_back(X.J);
                printf("用户账号:");
                cout<>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\t返回上一层请按*键\t直接退出请按esc键\n");
                while(cin>>caozuo)
                {
                    if(caozuo=="1")
                    {
                         printf("请输入您接下来要存入的金额:\n");
                         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("感谢您的使用!\n");
                        return 0;
                    }
                    printf("继续存入请按1\t返回上一层请按*键\t直接退出请按esc键\n");
                }
            }
            if(caozuo=="3")
            {
                printf("请输入要取出的金额:\n");
                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("对不起,您的账户余额已不足,请取较少量金钱或及时充值!\n");
                    /*X.J.leixing="尝试取出但余额不足,尝试取出金额为:";                         //对于余额不足未取出的情况不予统计了
                    X.J.money=amount;
                    X.J.amount=zhanghu[y].getamount();
                    zhanghu[y].jiaoyi.push_back(X.J);*/
                }
                printf("继续取出请按1\t返回上一层请按*键\t直接退出请按esc键\n");
                while(cin>>caozuo)
                {
                    if(caozuo=="1")
                    {
                        printf("请输入要取出的金额:\n");
                        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("对不起,您的账户余额已不足,请取较少量金钱或及时充值!\n");
                            /*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("感谢您的使用!\n");
                            return 0;
                    }
                    printf("继续取出请按1\t返回上一层请按*键\t直接退出请按esc键\n");
                }
            }
            if(caozuo=="4")
            {
                printf("请输入原密码:\n");
                cin>>safe;
                while(1){
                if(safe==zhanghu[y].getsafe()){
                    printf("请输入新密码:\n");
                    string newsafe1;
                    string newsafe2;
                    cin>>newsafe1;
                    printf("请再次输入新密码:\n");
                    cin>>newsafe2;
                    if(newsafe1==newsafe2)
                    {
                        zhanghu[y].password(newsafe1);
                        printf("修改成功!\n");
                        X.J.leixing="修改密码";
                        zhanghu[y].jiaoyi.push_back(X.J);
                        break;
                    }
                    else
                        printf("对不起,您两次输入的密码不一致,请您再次输入新密码:\n");
                    }
                    else
                    {
                        printf("对不起,你输入的密码有误,请您再次输入:\n");
                        cin>>safe;
                    }
                }
            }
            if(caozuo=="5")
            {
                vector::iterator it;
                for(it=zhanghu[y].jiaoyi.begin();it!=zhanghu[y].jiaoyi.end();it++)           //begin从零开始计数,y是从1开始(表示第几张卡)
                {
                    if(it->leixing=="登陆")
                    {
                        printf("登陆账号!\n");
                    }
                    if(it->leixing=="查询")
                    {
                        printf("查询余额\t当前余额:");
                        //if((it-1)->leixing=="登陆")
                        cout<amount<amount在更换账户首次查询时会保留上位账户的余额,但是如果存取完再查询就保留当前余额了,所以下面写这两种都是可以的
                       // else
                       // cout<amount<leixing=="存入")
                    {
                        printf("存入金额:");
                        cout<money<<"\t";
                        printf("当前余额:");
                        cout<amount<leixing=="取出")
                    {
                        printf("取出金额:");
                        cout<money<<"\t";
                        printf("当前余额:");
                        cout<amount<leixing=="修改密码")
                    {
                        printf("修改密码\n");
                    }
                }
            }
            if(caozuo=="***")
            {
                break;
            }
            if(caozuo=="esc")
            {
                 printf("感谢您的使用!\n");
                return 0;
            }
        }
    }
    printf("请选择您要执行的操作:申请新账户请按1\t读取已有账户信息请按2\n");

  }
 /* 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<

测试数据:

/*
请选择您要执行的操作:申请新账户请按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
感谢您的使用!
*/

你可能感兴趣的:(C++)