第二版银行储蓄系统

代码:

#include <iostream>
#include <iomanip>
#include <windows.h>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <ctype.h>
using namespace std;
const int upnum=2000;//系统最多容纳的用户数
class Bank;
class User
{
public:
    void setUser(int acc,string na,int pw,double mon,double bal,string id,int sta);
    void showName();
    void showBalance(string prompt);//显示账户余额
    bool psaaWordISRight();//判断密码是否正确
    bool ISNormalUser();//存款,取款,转账等功能需要账户处于正常状态,判断账户是否处于正常状态
    friend class Bank;//将Bank设为User的友元类
private:
    int account;//账号
    int password;//密码
    string name;//名字
    double balance;//余额
    double money;//未加利率的金额
    string identificant;//身份证号
    int status;//账户状态:0—正常,1—挂失,2—销户
};
class Bank
{
public:
    Bank();//从文件中读取数据
    ~Bank();//程序结束时将数据存入文件中
    void work();//业务驱动
    void openAccount();//开户
    void cancelAccount();//销户
    void save();//存款
    void withdraw();//取款
    void showAccount();//显示余额
    void transferAccount();//转账
    void reportLoss();//挂失
    void canlelLoss();//解除挂失
    void updatePassword();//修改密码
    int getUser();//输入账号查询用户,返回用户在对象数组的下表
private:
    int N;//实际用户数目
    static double rate;//利率
    User users [upnum];//User数组
};
double Bank::rate=0.0225;
int pass();//业务员登录
int chooseInMenu();//显示菜单并由业务员选择
int intputPassword();//返回键盘输入的密码
int m=0;//记录明细业务
Bank::Bank()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;
    int pw;
    string na;
    double bal;
    string id;
    int sta;
    double mon;
    while (infile>>acc>>na>>pw>>bal>>id>>sta)
    {

        users[i].setUser(acc,na,pw,mon,bal,id,sta);
        i++;
    }
    N=i;
    infile.close();
}
Bank::~Bank()
{
    ofstream outfile("account.txt",ios::out);
    if(!outfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i;
    for(i=0; i<N; i++)
    {
        outfile<<users[i].account<<" ";
        outfile<<users[i].name<<" ";
        outfile<<users[i].password<<" ";
        outfile<<users[i].balance<<" ";
        outfile<<users[i].identificant<<" ";
        outfile<<users[i].status<<" "<<endl;
    }
    outfile.close();
}
void Bank::work()//work函数对业务进行判断
{
    int ichoice;
    do
    {
        ichoice=chooseInMenu();
        switch(ichoice)
        {
        case 1:
            openAccount(); //开户
            break;
        case 2:
            cancelAccount(); //销户
            break;
        case 3:
            save();  //存款
            break;
        case 4:
            withdraw();  //取款
            break;
        case 5:
            showAccount(); //查余额
            break;
        case 6:
            transferAccount();  //转账
            break;
        case 7:
            reportLoss();  //挂失
            break;
        case 8:
            canlelLoss();  //解除挂失
            break;
        case 9:
            updatePassword();  //修改密码
            break;
        case 0:
            cout<<"+++++欢迎再次您使用++++++"<<endl;
        }
    }
    while(ichoice);
}

void Bank::openAccount()
{
    if(N==upnum)
    {
        cout<<"银行用户数目已达上限,不能在开户!"<<endl;
        return ;
    }
    int acc;
    int pw;
    string na;
    double mon;
    double bal;
    string id;
    int sta;
    int ipw1,ipw2;
    int year;
    acc=10001+N;
    cout<<"正在开户......"<<endl;
    acc=10001+N;
    cout<<"账号:"<<acc<<endl;
    cout<<"请输入户主的名字:";
    cin>>na;
    cout<<"请输入身份证号:";
    cin>>id;
    cout<<"请输入密码:";
    ipw1=intputPassword();
    cout<<"确认密码:";
    ipw2=intputPassword();
    if(ipw1==ipw2)
    {
        pw=ipw1;
        sta=0;
        cout<<"存入金额:";
        cin>>bal;
        ofstream outfile1("expence_record.txt",ios::app);//打开文件录入账号和账号之间的存取明细
        if(!outfile1)
        {
            cerr<<"expence_record file cannot open!"<<endl;
            exit(1);
        }
        outfile1<<acc<<" 存入 "<<acc<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" 元"<<endl;
        outfile1.close();//关闭文件
        ofstream outfile2("account.txt",ios::app);//打开文件存将用户信息存入文件
        if(!outfile2)
        {
            cerr<<"account.txt file cannot open!"<<endl;
            exit(1);
        }
        outfile2<<acc<<" "<<na<<" "<<ipw1<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" "<<id<<" "<<sta<<endl;
        outfile2.close();//关闭文件
        cout<<"请输入要存入的期限(年):";
        cin>>year;
        double sum=bal+bal*double(year)*rate;
        cout<<"期限到时,您将拥有";
        cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl;
        users[N].setUser(acc,na,pw,mon,sum,id,sta);
        N++;
        cout<<"成功开启!"<<endl;
    }
    else
    {
        cout<<"两次密码不一致,开启账户失败!"<<endl;
    }
}

void Bank::cancelAccount()//销户函数
{
    int who;
    who=getUser();
    if(who>=0)
    {
        users[who].showName();
        if(users[who].psaaWordISRight())
        {
            users[who].showBalance("余额");
            cout<<"确认销户(y/n)?";
            if(tolower(getchar())=='y')
            {
                users[who].showBalance("销户成功!,本次取款金额为");
                users[who].balance=0;
                users[who].status=2;
            }
            else
            {
                cout<<"您取消了此操作,销户失败"<<endl;
            }
            fflush(stdin);   //清理键盘缓存区已有的输入
        }
    }
}

void Bank::save()//函数账户存钱
{
    int who,year;
    double money;
    who=getUser();//输入所要存款的用户账号
    if(who>=0)
    {
        if(users[who].status==0)//判断账户的是否挂失状态
        {
            users[who].showName();
            if(users[who].psaaWordISRight())
            {
                cout<<"请输入存入的金额:";
                cin>>money;
                ofstream outfile("expence_record.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"expence_record file cannot open!"<<endl;
                    exit(1);
                }
                outfile<<users[who].account<<" 存入 "<<users[who].account<<"  "<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
                outfile.close();
                ifstream infile("expence_record.txt",ios::in);//录入开户后存钱明细
                if(!infile)
                {
                    cerr<<"expence_record file cannot open!"<<endl;
                    exit(1);
                }
                cout<<users[who].account<<" 存入 "<<users[who].account<<"  "<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
                infile.close();
                cout<<"请输入要存入的期限(年):";
                cin>>year;
                double sum=money+money*double(year)*rate;
                cout<<"期限到时,您将拥有"<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl;
            }
        }
        else if(users[who].status==1)
        {
            cout<<"该用户的账户处于挂失状态,存款失败!"<<endl;
        }
        else
        {
            cout<<"该用户的账户已经销户,存款失败!"<<endl;
        }
    }
    return;
}

void Bank::showAccount()//余额及账单显示函数
{
    int who;
    string sta[3]= {"正常","挂失","已经销户"};
    who=getUser();
    if(who>=0)
    {
        users[who].showName();
        if(users[who].psaaWordISRight())
        {
            users[who].showBalance("余额有");
            cout<<"状态为"<<sta[users[who].status]<<endl;
            cout<<"是否要查看您的每一笔账单(y/n)?";
            char ch;
            cin>>ch;
            if(ch=='y')
            {
                cout<<"您的账单如下:"<<endl;
                ifstream infile("expence_record.txt",ios::in);
                if(!infile)
                {
                    cerr<<"expence_record file cannot open!"<<endl;
                    exit(1);
                }
                int r1,r4;
                string r2,r3,r5;
                while(infile>>r1>>r2>>r3>>r4>>r5)
                {
                    if(r1==users[who].account)
                        cout<<r1<<" "<<r2<<" "<<r3<<" "<<r4<<" "<<r5<<" 元"<<endl;
                }
                infile.close();
            }
        }
    }
    return ;
}

void Bank::withdraw()//取款函数
{
    int who;
    double money;
    who=getUser();
    if(who>=0)
    {
        if(users[who].ISNormalUser())
        {
            users[who].showName();
            if(users[who].psaaWordISRight())
            {
                cout<<"输入取款额";
                cin>>money;
                if(money>users[who].balance)//判断所取钱的金额是否大于本有金额
                {
                    cout<<"对不起,您的余额不足!"<<endl;
                }
                else
                {
                    users[who].balance-=money;
                    users[who].showBalance("取款后,您还有");
                    ofstream outfile("expence_record.txt",ios::app);
                    if(!outfile)
                    {
                        cerr<<"expence_record file cannot open!"<<endl;
                        exit(1);
                    }
                    outfile<<users[who].account<<" 取款 "<<users[who].account<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
                    outfile.close();
                }
            }
        }
    }
    return ;
}
void Bank::transferAccount()//转账函数
{
    int whoout,whoin;
    double money;
    whoout=getUser();
    cout<<"转出自";
    if(whoout>=0)
    {
        if(users[whoout].ISNormalUser())
        {
            users[whoout].showName();
            if(users[whoout].psaaWordISRight())//判断所输入的密码是否正确
            {
                cout<<"请输入转入的金额:";
                cin>>money;
                if(money>users[whoout].balance)//判断往外转出的账户的金额是否足够
                    cout<<"金额不足,转账失败!"<<endl;
                else
                {
                    cout<<"转出到:";
                    whoin=getUser();
                    if(whoin>=0)
                    {
                        if(users[whoin].ISNormalUser())
                        {
                            users[whoout].balance-=money;
                            users[whoin].balance+=money;
                            users[whoout].showBalance("转账户,您有");
                            ofstream outfile("expence_record.txt",ios::app);
                            if(!outfile)
                            {
                                cerr<<"expence_record file cannot open!"<<endl;
                                exit(1);
                            }
                            outfile<<users[whoin].account<<" 转账到 "<<users[whoout].account<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl;
                            outfile.close();
                        }
                    }
                }
            }
        }
    }
    return ;
}
void Bank::reportLoss()//挂失函数
{
    int who;
    who=getUser();
    if(who>=0)
    {
        users[who].showName();
        if(users[who].psaaWordISRight())
        {
            if(users[who].status==0)
            {
                users[who].status=1;
                cout<<"挂失成功!"<<endl;
            }
            else if(users[who].status==1)
                cout<<"该账户已经挂失!"<<endl;
            else
                cout<<"该账户已经销户,操作失败!"<<endl;
        }
    }
    return;
}
void Bank::canlelLoss()//解除挂失
{
    int who;
    who=getUser();
    if(who>=0)
    {
        users[who].showName();
        if(users[who].psaaWordISRight())
        {
            if(users[who].status==0)//原来账户状态为0,表示状态正常,1表示挂失状态,2表示销户状态
            {
                cout<<"该用户处于正常状态,不需要解除挂失!"<<endl;
            }
            else if(users[who].status==1)
            {
                users[who].status==0;
                cout<<"解除挂失成功"<<endl;
            }
            else
            {
                cout<<"该用户已销户,操作失败!"<<endl;
            }
        }
    }
    return ;
}
void Bank::updatePassword()//更新密码
{
    int who;
    int iPass1,iPass2;
    who=getUser();
    if(who>=0)
    {
        users[who].showName();
        if(users[who].psaaWordISRight())
        {
            cout<<"新密码:"<<endl;
            iPass1=intputPassword();//输入新密码
            cout<<"确认密码:"<<endl;
            iPass2=intputPassword();
            if(iPass1==iPass2)//进行新密码确认
            {
                users[who].password=iPass1;
                cout<<"密码修改成功!"<<endl;
            }
            else
                cout<<"两次输入的不同,修改失败!"<<endl;
        }
    }

}

int Bank::getUser()//返回函数,对文件中的用户信息进行搜索返回一个大于等于0的数表示找到,否则未找到
{
    int id;
    cout<<"账号:";
    cin>>id;
    int idex=-1;
    int low=0,high=N-1,mid;
    while (low<=high)
    {
        mid=(low+high)/2;
        if(users[mid].account==id)
        {
            idex=mid;
            break;
        }
        else if(users[mid].account>id)
            high=mid-1;
        else
            low=mid+1;
    }
    if(idex<0)
        cout<<"此用户不存在,本次操作失败!"<<endl;
    return idex;
}
void User::setUser(int acc,string na,int pw,double mon,double bal,string id,int sta)
{
    account=acc;
    password=pw;
    name=na;
    money=mon;
    balance=bal;
    identificant=id;
    status=sta;
}
void User::showName()//显示户主姓名
{
    cout<<"户主姓名:"<<name<<endl;
}
void User::showBalance(string prompt)
{
    cout<<prompt<<" "<<balance<<"元"<<endl;
}
bool User::psaaWordISRight()//判断密码是否正确
{
    int iPass;
    bool right=true;
    cout<<"请输入密码:"<<endl;
    iPass=intputPassword();
    if(iPass!=password)
    {
        right=false;
        cout<<"密码输入错误,操作失败!"<<endl;
    }
    return right;
}
bool User::ISNormalUser()//判断用户是否为正常状态
{
    bool normal=true;
    if(status!=0)
    {
        normal=false;
        cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能进行操作!"<<endl;
    }
    return normal;
}


int main()
{
    cout<<endl;
    cout<<"             +-------------------------------------------+"<<endl;
    cout<<"             +                                           +"<<endl;
    cout<<"             +             欢迎来到c++银行               +"<<endl;
    cout<<"             +                                           +"<<endl;
    cout<<"             +-------------------------------------------+"<<endl;
    if(pass())//pass()函数对银行业务员进行账号判断
    {
        Bank b;
        b.work();
    }
    return 0;
}

int intputPassword()//输入密码
{
    char ch;
    int iPass=0;//转换为数字
    int i;
    while(1)
    {
        for(i=0; i<6; ++i)
        {
            ch=getch();
            putchar('*');
            if(isdigit(ch))
            {
                iPass=iPass*10+(ch-48);
            }
            else
            {
                iPass=0;
                break;
            }
        }
        fflush(stdin);//清理键盘缓存区已有的输入
        cout<<endl;
        if(iPass==0)
        {
            cout<<"密码要求全为数字且不能都是0!"<<endl;
            cout<<"请重新输入!";
        }
        else
            break;
    }
    return iPass;
}
int chooseInMenu()
{
    int i;
    while (1)
    {
        cout<<endl;
        cout<<"                  +   请您选择办理的业务选项: +"<<endl;
        cout<<"                  +----------------------------+"<<endl;
        cout<<"                  +  1.开户   2.销户   3.存款  +"<<endl;
        cout<<"                  +  4.取款   5.查询   6.转账  +"<<endl;
        cout<<"                  +  7.挂失   8.解挂   9.改密  +"<<endl;
        cout<<"                  +           0.退出           +"<<endl;
        cout<<"                  +----------------------------+"<<endl<<endl;
        cout<<"请选择您所需要办理的业务序号:";
        cin>>i;
        if(i>=0&&i<=9)
            break;
        else
            cout<<"输入有误,请您重新选择功能!"<<endl;
    }
    return i;
}

int pass()//验证密码是否正确
{
    char sNameInFile[20];
    char sPassInFile[20];
    ifstream infile("password.txt",ios::out);
    if(!infile)
    {
        cerr<<"password file cannot open!"<<endl;
        exit(1);
    }
    infile>>sNameInFile>>sPassInFile;
    infile.close();
    char sName[20];
    char sPass[20];
    char ch;
    int itry=3;
    int right=0;
    do
    {
        cout<<"请输入业务员用户名:"<<endl;
        cin>>sName;
        cout<<"请输入密码"<<endl;
        int i=0;
        while((ch=getch())!='\r')
        {
            sPass[i++]=ch;
            putchar('*');
        }
        sPass[i]='\0';
        fflush(stdin);
        cout<<endl;
        if(strcmp(sName,sNameInFile)==0&&strcmp(sPass,sPassInFile)==0)//判断业务员的账户和密码是否都正确
        {
            right=1;
            break;
        }
        else
        {
            itry--;
            if(itry>0)
            {
                cout<<"超过3次将会退出,您还可以尝试"<<itry<<"次!"<<endl;
            }
            else
            {
                cout<<"对不起,您不能进入系统!"<<endl;
            }
        }
    }
    while(itry);
    return right;
}


登陆:

对已存在用户进行销户:


对所选账户进行存款:


取款:


查询:

转账:



两次转账余额减少显示并储存!


挂失:

解挂:


改密:


退出


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值