课程实训——银行系统

来源:互联网 发布:2016融资租赁行业数据 编辑:程序博客网 时间:2024/06/05 22:48
/*
 * Copyright (c) 2014, 烟台大学计算机学院
 * All rights reserved.
 * 文件名称:test.cpp
 * 作    者:李晓凯
 * 完成日期:2015年 7 月 17 日
 * 版 本 号:v1.0
 *

* 问题描述:编写一个银行系统来模拟完成银行的各种业务

* 输入描述:见运行图

* 程序输出:见运行图

 */


利用多文件组织,将程序放在5个文件中。

head.h

/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录2:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#ifndef HEAD_H_INCLUDED#define HEAD_H_INCLUDED#include <iostream>#include <conio.h>#include <cstring>#include <cstdio>#include <fstream>#include <cstdlib>#include <ctype.h>#include "head.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,char 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;//未加利率的金额    char identificant[18];//身份证号    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();//修改密码    void showRate();//显示利率    void repayLoan();//贷款    int getUser();//输入账号查询用户,返回用户在对象数组的下表private:    int N;//实际用户数目    double rate;//存款利率    static double rate2;//贷款利率    User *users;//User指针};int pass();//业务员登录int chooseInMenu();//显示菜单并由业务员选择int intputPassword();//返回键盘输入的密码#endif // HEAD_H_INCLUDED


work.cpp

/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录3:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建贷款*********************************************/#include "head.h"using namespace std;/*********************************************功能描述:输入密码*输入参数:无*输出参数:密码*返回值: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-'0');            }            else            {                iPass=0;                break;            }        }        fflush(stdin);//清理键盘缓存区已有的输入        cout<<endl;        if(iPass==0)        {            cout<<"密码要求全为数字且不能都是0!"<<endl;            cout<<"请重新输入!";        }        else            break;    }    return iPass;}/*********************************************功能描述:业务选择*输入参数:无*输出参数:选项*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int chooseInMenu(){    int i;    while (1)    {        cout<<endl;        cout<<"+-------------------------+\n";        cout<<"+ 1.开户  2.销户  3.存款  +\n";        cout<<"+ 4.取款  5.查询  6.转账  +\n";        cout<<"+ 7.挂失  8.解挂  9.改密  +\n";        cout<<"+ 10.贷款         0.退出  +\n";        cout<<"+-------------------------+\n";        cout<<"请输入操作指令";        cin>>i;        if(i>=0&&i<=10)            break;        else            cout<<"请重新选择功能!"<<endl;    }    return i;}/*********************************************功能描述:验证密码是否正确*输入参数:无*输出参数:正确-1   错误-0*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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;}



main.cpp:

/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录1:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#include "head.h"using namespace std;int main(){    cout<<"+-----------------------------------+\n";    cout<<"+      欢迎使用坑你点没商量银行     +\n";    cout<<"+-----------------------------------+\n";    if(pass())    {        Bank b;        b.work();    }    return 0;}



user.cpp

/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录4:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建*********************************************/#include "head.h"using namespace std;/*********************************************功能描述:建立用户*输入参数:账号,姓名,密码,余额,身份证号,状态等*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void User::setUser(int acc,string na,int pw,double mon,double bal,char id[],int sta){    account=acc;    password=pw;    name=na;    money=mon;    balance=bal;    strcpy(identificant,id);    status=sta;}void User::showName(){    cout<<"户主姓名:"<<name<<endl;}void User::showBalance(string prompt){    cout<<prompt<<" "<<balance<<"元"<<endl;}/*********************************************功能描述:验证密码是否正确*输入参数:无*输出参数:正确-true  错误-false*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/bool User::psaaWordISRight(){    int iPass;    bool right=true;    cout<<"请输入密码:"<<endl;    iPass=intputPassword();    if(iPass!=password)    {        right=false;        cout<<"密码输入错误,操作失败!"<<endl;    }    return right;}/*********************************************功能描述:验证账户是否处于正常状态*输入参数:无*输出参数:是-true  否-false*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/bool User::ISNormalUser(){    bool normal=true;    if(status!=0)    {        normal=false;        cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能进行操作!"<<endl;    }    return normal;}



bank.cpp

/*********************************************版权所有 (C++)2014,lixiaokai**文件名称:main.cpp*文件标识:无*内容摘要:改代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作者:李晓凯*完成日期:2015-7-18**修改记录1:*修改日期:2015-7-18*版本号:2015-7-18*修改人:lixiaokai*修改内容:创建身份证号,贷款,利息,记录每笔账单*********************************************/#include "head.h"#include <time.h>using namespace std;double Bank::rate2=0.0485;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;    char id[18];    int sta;    double mon;    users=new User[2000];    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();}/*********************************************功能描述:系统工作函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::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 10:            repayLoan();            break;        case 0:            cout<<"欢迎您再来O(∩_∩)O  "<<endl;        }    }    while(ichoice);}/*********************************************功能描述:开户函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::openAccount(){    if(N==upnum)    {        cout<<"银行用户数目已达上限,不能在开户!"<<endl;        return ;    }    int acc;    int pw;    string na;    double mon;    double bal;    char id[18];    int sta;    int ipw1,ipw2;    double year;    acc=10001+N;    cout<<"正在开户......"<<endl;    acc=10001+N;    cout<<"账号:"<<acc<<endl;    cout<<"请输入户主的名字:";    cin>>na;    while(1)    {        cout<<"请输入身份证号:";        cin>>id;        if(strlen(id)!=18)        {            cout<<"您的身份证号不足18位!"<<endl;            continue;        }        else            break;    }    cout<<"请输入密码:";    ipw1=intputPassword();    cout<<"确认密码:";    ipw2=intputPassword();    if(ipw1==ipw2)    {        pw=ipw1;        sta=0;        cout<<"存入金额:";        cin>>bal;        ofstream outfile("expence_record.txt",ios::app);        if(!outfile)        {            cerr<<"expence_record file cannot open!"<<endl;            exit(1);        }        time_t timep;        struct tm *p;        time(&timep);        p=localtime(&timep);//读取当前时间        outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 ";        outfile<<acc<<" 存入 "<<acc<<" "<<bal<<" 元"<<endl;//存款记录存入文件        outfile.close();        showRate();        cout<<"请输入要存入的期限(年):";        cin>>year;        double sum;        if(year>=1&&year<=3)            sum=bal+bal*year*0.02;        else if(year==4||year==5)            sum=bal+bal*year*0.032;        else if(year>5)            sum=bal+bal*year*0.0445;        cout<<"期限到时,您将拥有"<<sum<<"元"<<endl;        users[N].setUser(acc,na,pw,mon,sum,id,sta);        N++;        cout<<"成功开启!"<<endl;    }    else    {        cout<<"两次密码不一致,开启账户失败!"<<endl;    }}/*********************************************功能描述:销户函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::cancelAccount(){    int who;    who=getUser();    if(who>=0)    {        users[who].showName();        if(users[who].psaaWordISRight())        {            users[who].showBalance("余额");            if(users[who].balance<0)                cout<<"您还有贷款没处理,不能销户!"<<endl;            else            {                cout<<"确认销户(y/n)?";                if(tolower(getchar())=='y')                {                    users[who].showBalance("销户成功!,本次取款金额为");                    users[who].balance=0;                    users[who].status=2;                }                else                {                    cout<<"您取消了此操作,销户失败"<<endl;                }            }            fflush(stdin);        }    }}/*********************************************功能描述:存款函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::save(){    int who;    double year,money;    who=getUser();    if(who>=0)    {        if(users[who].status==0)        {            users[who].showName();            cout<<"请输入存入的金额:";            cin>>money;            ofstream outfile("expence_record.txt",ios::app);            if(!outfile)            {                cerr<<"expence_record file cannot open!"<<endl;                exit(1);            }            time_t timep;            struct tm *p;            time(&timep);            p=localtime(&timep);//读取当前时间            outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 ";            outfile<<users[who].account<<" 存入 "<<users[who].account<<" "<<money<<" 元"<<endl;//存款记录存入文件            outfile.close();            showRate();            cout<<"请输入要存入的期限(年):";            cin>>year;            if(year>=1&&year<=3)                users[who].balance+=(money+money*0.02*year);            else if(year==4&&year==5)                users[who].balance+=(money+money*0.032*year);            else if(year>5)                users[who].balance+=(money+money*0.0445*year);            users[who].showBalance("存款后,您有");        }        else if(users[who].status==1)        {            cout<<"该用户的账户处于挂失状态,存款失败!"<<endl;        }        else        {            cout<<"该用户的账户已经销户,存款失败!"<<endl;        }    }    return;}/*********************************************功能描述:显示函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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,r3,y,m,d;                string r2,r4,r5,ch1,ch2,ch3;                while(infile>>y>>ch1>>m>>ch2>>d>>ch3>>r1>>r2>>r3>>r4>>r5)                {                    if(r1==users[who].account&&r3==users[who].account)                        cout<<y<<ch1<<m<<ch2<<d<<ch3<<" "<<r2<<" "<<r4<<" "<<r5<<endl;                    else if(r1==users[who].account)                        cout<<y<<ch1<<m<<ch2<<d<<ch3<<" "<<r2<<" "<<r3<<"("<<users[r3-10000].name<<")"<<" "<<r4<<" "<<r5<<endl;                }                infile.close();            }        }    }    return ;}/*********************************************功能描述:取款函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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);                    }                    time_t timep;                    struct tm *p;                    time(&timep);                    p=localtime(&timep);//读取当前时间                    outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 ";                    outfile<<users[who].account<<" 取款 "<<users[who].account<<" "<<money<<" 元"<<endl;//取款记录存入文件                    outfile.close();                }            }        }    }    return ;}/*********************************************功能描述:转账*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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);                            }                            time_t timep;                            struct tm *p;                            time(&timep);                            p=localtime(&timep);//读取当前时间                            outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 ";                            outfile<<users[whoin].account<<" 转账到 "<<users[whoout].account<<" "<<money<<" 元"<<endl;//转账记录存入文件                            outfile<<1900+p->tm_year<<" 年 "<<1+p->tm_mon<<" 月 "<<p->tm_mday<<" 日 ";                            outfile<<users[whoout].account<<" 收到 "<<users[whoin].account<<" "<<money<<" 元"<<endl;                            outfile.close();                        }                    }                }            }        }    }    return ;}/*********************************************功能描述:挂失*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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;}/*********************************************功能描述:解挂函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::canlelLoss(){    int who;    who=getUser();    if(who>=0)    {        users[who].showName();        if(users[who].psaaWordISRight())        {            if(users[who].status==0)            {                cout<<"该用户处于正常状态,不需要解除挂失!"<<endl;            }            else if(users[who].status==1)            {                users[who].status=0;                cout<<"解除挂失成功"<<endl;            }            else            {                cout<<"该用户已销户,操作失败!"<<endl;            }        }    }    return ;}/*********************************************功能描述:改密函数*输入参数:无*输出参数:密码*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/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;        }    }}/*********************************************功能描述:贷款函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::repayLoan(){    int who;    double money,year;    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                {                    cout<<"请输入贷款期限(年)";                    cin>>year;                    money-=users[who].balance;                    users[who].balance=-(money+money*rate2);                    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<<" "<<users[who].balance<<" 元"<<endl;//贷款记录存入文件                    outfile.close();                    cout<<"到期时您需要还"<<users[who].balance<<" 元"<<endl;                }            }        }    }}/*********************************************功能描述:查询用户函数*输入参数:无*输出参数:用户序号*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/int Bank::getUser(){    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;}/*********************************************功能描述:显示利率函数*输入参数:无*输出参数:无*返回值:0-成功  其他-失败*其他说明:消息字段之间用分号(;)分隔********************************************/void Bank::showRate(){    cout<<"银行当前的利率情况如下:"<<endl;    cout<<"   1~3年        2.00%"<<endl;    cout<<"   4~5年        3.20%"<<endl;    cout<<"   5年以上      4.45%"<<endl;}


 




学习心得:

虽然是在老师代码的基础上该写了这个庞大的银行系统,但还是从中学到了很多知识,以前多文件存储还不是很熟悉,现在感觉熟练的许多,还有就是在这环环相扣的函数中写来写去,觉得逻辑思维能力明显提高哈,当然也在这其中发现了自己的一些不足,比如多与动态数组就有点陌生,想在个程序里加上的,结果加上之后,也不知道是什么问题,在文件中存储的用户信息都成了代码,所以就没有加成功,望有大神可以来指导我一下,万分感谢!

还有就是,想弄一个活期的存储,结果想了想,然后百度了下,感觉超麻烦,so,就弄了个定取存款,等以后能力在高一点的时候再改吧!↖(^ω^)↗


0 0
原创粉丝点击