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


    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
    感谢您的使用!
    */
    
  • 相关阅读:
    Javascript Promise对象学习
    JavaScript 判断一个对象的数据类型。
    Angular SEO方案
    【GOF23设计模式】迭代器模式
    【GOF23设计模式】责任链模式
    【GOF23设计模式】享元模式
    【GOF23设计模式】外观模式
    【GOF23设计模式】装饰模式
    【GOF23设计模式】组合模式
    【GOF23设计模式】桥接模式
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12130012.html
Copyright © 2020-2023  润新知