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
感谢您的使用!

*/