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\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<z;i++)                               //前提保证卡号永远不重复,否则只能读取最后的卡号信息
        {
            if(num==zhanghu[i].getnum())
            {
                x=1;
                y=i;
            }
        }
        if(x==1)
        break;
        else
        {
            y=0;                                //下次寻找前清零
            printf("账号错误,请您再次输入,如果您想要返回上一层请按*\n");
        }
    }
    if(num=="*")
    {
        printf("请选择您要执行的操作:申请新账户请按1\t读取已有账户信息请按2\n");
        continue;
    }
    printf("请输入密码:");
    while(cin>>safe)                     //密码的判断
    {
        if(safe==zhanghu[y].getsafe())
        {
            printf("登陆成功,欢迎回来!\n");
            printf("用户账号:");
            cout<<zhanghu[y].getnum()<<"\t";
            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("请输入您接下来要执行的操作:\t查询余额请按1\t存入金钱请按2\t取出金钱请按3\t修改密码请按4\t查询操作记录请按5\n返回主菜单请按***键\t直接退出请按esc键\n");
            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()<<"\t";
                printf("用户名:");
                cout<<zhanghu[y].getname()<<"\t";
                printf("所剩余额:%llf\n",zhanghu[y].getamount());
            }
            if(caozuo=="2")
            {
                printf("请输入您要存入的金额:\n");
                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\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<Zhanghu::Jiaoyi>::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<<it->amount<<endl;           //写成it->amount在更换账户首次查询时会保留上位账户的余额,但是如果存取完再查询就保留当前余额了,所以下面写这两种都是可以的
                       // else
                       // cout<<it->amount<<endl;
                    }
                    if(it->leixing=="存入")
                    {
                        printf("存入金额:");
                        cout<<it->money<<"\t";
                        printf("当前余额:");
                        cout<<it->amount<<endl;
                    }
                    if(it->leixing=="取出")
                    {
                        printf("取出金额:");
                        cout<<it->money<<"\t";
                        printf("当前余额:");
                        cout<<it->amount<<endl;
                    }
                    if(it->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<<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
感谢您的使用!
*/
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个模拟程序可以分为以下几个功能模块: 1. 用户账户管理:包括账户信息的存储、验证和修改操作。 2. 存款功能用户可以输入存款金额,程序会将该金额加入用户账户余额中。 3. 取款功能用户可以输入取款金额,程序会将该金额从用户账户余额中减去。 4. 余额查询功能用户可以查询当前账户余额。 5. 密码修改功能用户可以修改登录密码。 下面是一个简单的实现示例,采用Python语言编写: ```python # 用户账户信息 account = { '123456': { 'password': '123456', 'balance': 5000 }, '654321': { 'password': '654321', 'balance': 3000 } } # 存款功能 def deposit(): card_number = input('请输入您的银行卡号:') amount = float(input('请输入存款金额:')) if card_number in account: account[card_number]['balance'] += amount print('存款成功,当前余额为:', account[card_number]['balance']) else: print('账户不存在') # 取款功能 def withdraw(): card_number = input('请输入您的银行卡号:') amount = float(input('请输入取款金额:')) if card_number in account: if account[card_number]['balance'] >= amount: account[card_number]['balance'] -= amount print('取款成功,当前余额为:', account[card_number]['balance']) else: print('余额不足') else: print('账户不存在') # 余额查询功能 def check_balance(): card_number = input('请输入您的银行卡号:') if card_number in account: print('当前余额为:', account[card_number]['balance']) else: print('账户不存在') # 密码修改功能 def change_password(): card_number = input('请输入您的银行卡号:') if card_number in account: password = input('请输入原密码:') if account[card_number]['password'] == password: new_password = input('请输入新密码:') account[card_number]['password'] = new_password print('密码修改成功') else: print('密码错误') else: print('账户不存在') # 主程序 while True: print('请选择操作:') print('1. 存款') print('2. 取款') print('3. 余额查询') print('4. 密码修改') print('0. 退出') choice = input() if choice == '1': deposit() elif choice == '2': withdraw() elif choice == '3': check_balance() elif choice == '4': change_password() elif choice == '0': break else: print('输入有误,请重新选择') ``` 以上就是一个简单的ATM柜员机模拟程序,可以根据实际需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值