• ATM模拟(查余额,存款,取款)


    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("登陆成功,欢迎回来!
    ");
                printf("用户账号:");
                cout<<acc1.getnum()<<endl;
                break;
            }
            else
            {
                error++;
                if(error==3)
                {
                    printf("对不起,今日您已达到最大错误密码输入上限,怀疑您的身份信息与账户信息不匹配,为了账户的安全,该银行卡已被冻结,请带着您的有效身份证件去营业大厅解冻!");
                    return 0;
                }
                printf("密码错误,请再次输入:");
            }
        }
        while(1)
        {
                printf("请输入您接下来要执行的操作:	查询余额请按1	存入金钱请按2	取出金钱请按3	直接退出请按esc键
    ");
                cin>>caozuo;
                if(caozuo=="1")
                {
                    printf("用户账号:");
                    cout<<acc1.getnum()<<"	";
                    printf("所剩余额:%llf
    ",acc1.getamount());
                }
                if(caozuo=="2")
                {
                    printf("请输入您要存入的金额:
    ");
                    cin>>amount;
                    acc1.deposit(amount);       //这里不显示余额,只有在查询时才会显示余额(银行ATM的工作原理是这样)
                    printf("继续存入请按1	返回上一层请按*键	直接退出请按esc键
    ");
                    while(cin>>caozuo)
                    {
                        if(caozuo=="1")
                        {
                             printf("请输入您接下来要存入的金额:
    ");
                             cin>>amount;
                             acc1.deposit(amount);
                        }
                        if(caozuo=="*")
                            break;
                        if(caozuo=="esc")
                        {
                            printf("感谢您的使用!
    ");
                            return 0;
                        }
                        printf("继续存入请按1	返回上一层请按*	直接退出请按esc键
    ");
                    }
                }
                if(caozuo=="3")
                {
                    printf("请输入要取出的金额:
    ");
                    cin>>amount;
                    if(acc1.getamount()>=amount)
                    {
                         double amount_=-amount;
                         acc1.deposit(amount_);
                    }
                    else
                    {
                        printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!
    ");
                    }
                    printf("继续取出请按1	返回上一层请按*	直接退出请按esc键
    ");
                    while(cin>>caozuo)
                    {
                        if(caozuo=="1")
                        {
                            printf("请输入要取出的金额:
    ");
                            cin>>amount;
                            if(acc1.getamount()>=amount)
                            {
                                double amount_=-amount;
                                acc1.deposit(amount_);
                            }
                            else
                            {
                                printf("对不起,您的账户余额已不足,请取较少量金钱或及时充值!
    ");
                            }
                        }
                        if(caozuo=="*")
                           break;
                        if(caozuo=="esc")
                        {
                             printf("感谢您的使用!
    ");
                                return 0;
                        }
                        printf("继续取出请按1	返回上一层请按*	直接退出请按esc键
    ");
                    }
                }
                if(caozuo=="esc")
                {
                     printf("感谢您的使用!
    ");
                    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
    感谢您的使用!
    
    */
    
  • 相关阅读:
    《构建之法》阅读笔记07
    学习进度条——第六周
    《构建之法》阅读笔记06
    团队开发
    《构建之法》阅读笔记05
    数组3——返回二维数组中最大联通子数组的和
    学习进度条——第五周
    坯布检验管控系统
    DateTime日期格式转换,不受系统格式的影响
    多层下firebird自增长字段的处理
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12130013.html
Copyright © 2020-2023  润新知