实训项目——银行储蓄系统

来源:互联网 发布:淘宝如何入驻拼多多 编辑:程序博客网 时间:2024/05/18 02:17

头文件:bank.h

/**版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院*All rights reserved.**文件名称:bank.h*文件标识:无*内容摘要:该代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作    者:刘佳琦*完成日期:2015年7月16日**修改记录:*修改日期:无*版本号:V1.0*修改人:刘佳琦*修改内容:*/#ifndef BANK_H_INCLUDED#define BANK_H_INCLUDED#include <cstring>using namespace std;//const int upNum=2000; //系统最多容纳的用户数class Bank;class Work;class Person{public:    int inputPassword();   //返回键盘输入的密码    bool passwordIsRight();   //校验密码,输入的密码正确则返回true    //void setPerson(string nam, int pw);    void showName();//显示姓名    friend class Bank;    int getpassword();//返回密码    string getname();//返回姓名protected:    int password;  //密码    string name;   //用户名};class User:public Person{public:    void setUser(long int acc, string nam, int pw, double bal,int sta,string idd,string add);//赋值    void showName();    void showBalance(string prompt); //显示余额,前面加上提示词prompt    bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示    friend class Manager;    friend class Bank;   //将Bank声明为友元类,方便其访问数据成员private:    long int account; //账号    double balance;  //账户余额    string address;//地址    string id;//身份证    int status;  //状态 0-正常  1-挂失  2-销户  3-冻结};class Manager:public Person{public:    int getManager(string nam);//用姓名查询管理员,返回管理员数组的下标    int chooseInMenu();//进入系统    int js();//计算管理员账户数目    void open();//打开文件    void setmanager(string nam, int pw);//赋值    int managerlogin();//管理员登录private:    int n;//管理员数目    Manager *managers;//管理员账户信息用指针数组保存};class Work{public:    friend class Bank;private:    string ymd;//年月日    string hms;//时分秒    long int usernum;//用户账号    string workinfor;//业务内容};class Bank{public:    Bank();  //构造函数    void Acc_dong();//冻结    void Acc_Jiedong(); //解冻    int jishu();//计数    void openfile();//打开文件    void savefile();//保存文件    void work();  //业务驱动    void openAccount(); //开户    void cancelAccount();  //注销账户    void save();   //存款    void withdraw();   //取款    void showAccount(); //查询余额    void transferAccounts();  //转账    void reportLoss();  //挂失    void cancelLoss();  //解除挂失    void updatePassword();   //更改密码    int getUser();  //输入账号查询用户,返回用户在对象数组中的下标    void searchwork(long int a);//查询业务    void readwork();//读取业务    void savework(long int usernum,string infor);//保存业务private:    Work yw[20000];//保存业务信息的数组    int N;  //实际的用户数目    int n;  //实际的业务数目    User *users;  //动态数组};#endif // BANK_H_INCLUDED




主函数:main.cpp

/**版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院*All rights reserved.**文件名称:main.cpp*文件标识:无*内容摘要:该代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作    者:刘佳琦*完成日期:2015年7月16日**修改记录:*修改日期:无*版本号:V1.0*修改人:刘佳琦*修改内容:*/#include <iostream>#include <ctime>#include "bank.h"using namespace std;/*主函数:*/int main(){    cout<<"+----------------------+\n";    cout<<"+    欢迎光临模拟银行  +\n";    cout<<"+----------------------+\n";    Bank b;    Manager m;    if (m.managerlogin())    {        Bank b;        b.work();    }    return 0;}


实现进入系统必需的基础函数:work.cpp

/**版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院*All rights reserved.**文件名称:work.cpp*文件标识:无*内容摘要:该代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作    者:刘佳琦*完成日期:2015年7月16日**修改记录:*修改日期:无*版本号:V1.0*修改人:刘佳琦*修改内容:*/#include <iostream>#include <fstream>#include <conio.h>#include <cstdlib>#include <cstring>#include <ctype.h>#include "bank.h"using namespace std;/***********************功能描述:管理员登录*输入参数:无*输出参数:无*返回值:无*其它说明:无**********************/int Manager::managerlogin(){    open();    char sName[20];   //业务员登录时输入的用户名    int iTry=3;   //进入系统时尝试的次数    int right = 0;  //要返回的结果:0-不正确 1-正确    //进入系统,密码三次不对将退出    do    {        cout<<"请输入业务员用户名:";        cin>>sName;        int who;  //查找到该账号在数组中对应的下标        who = getManager(sName);  //根据姓名查询管理员,返回管理员的下标        if(who<n)        {            if(managers[who].passwordIsRight())            {                right = 1;                break;            }            else            {                iTry--;                if(iTry>0)                    cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;                else                {                    cout<<"对不起,你不能进入系统"<<endl;;                }            }        }        else if (who==n)            cout<<"该管理员不存在,本次操作失败!"<<endl;    }    while(iTry);    return right;}/*关于getch()的一点说明:所在头文件:conio.h函数用途:从控制台读取一个字符,但不显示在屏幕上函数原型:int getch(void)返回值:读取的字符在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。为避免键盘缓存区中未读出的字符影响程序,用fflush(stdin);清除输入缓存区*//***********************************功能描述:显示菜单并由业务员选择*输入参数:无*输出参数:无*返回值:用户选择的功能,范围0-11*其它说明:无**********************************/int Manager::chooseInMenu(){    int i;    while(1)    {        cout<<endl;;        cout<<"+----------------------------+"<<endl;        cout<<"+ 1 开户    2 销户    3 存款 +"<<endl;        cout<<"+ 4 取款    5 查询    6 转账 +"<<endl;        cout<<"+ 7 挂失    8 解挂    9 改密 +"<<endl;        cout<<"+ 10冻结    11解冻    0 退出 +"<<endl;        cout<<"+----------------------------+"<<endl;        cout<<"请输入操作指令:";        cin>>i;        if(i>=0 && i<=11)            break;        else            cout<<"请重新选择功能"<<endl;;    }    return i;}/************************功能描述:打开文件*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************/void Manager::open(){    ifstream infile("manager.txt",ios::in);    if(!infile)    {        cerr<<"open error!"<<endl;        exit(1);    }    int i=0;    string nam;   //姓名    int pw;   //密码    n=js();    managers=new Manager[n+1];    while(infile>>nam>>pw)        //while(infile>>mangers[i].name>>mangers[i].password)    {        managers[i].setmanager(nam,pw);        ++i;    }    infile.close();}/*************************************功能描述:计数*输入参数:无*输出参数:无*返回值:无*其它说明:计算当前管理员账户有多少*************************************/int Manager::js(){    string nam;   //姓名    int pw;   //密码    int i=0;    ifstream infile("manager.txt");    while(infile>>nam>>pw)    {        ++i;    }    infile.close();    return i;}/***********************************功能描述:赋值*输入参数:无*输出参数:无*返回值:无*其它说明:无**********************************/void Manager::setmanager(string nam, int pw){    name=nam;    password=pw;}/***********************************************************功能描述:返回密码*输入参数:无*输出参数:无*返回值:password 用户密码*其它说明:password为私有成员,为了调用它,必须用公共接口***********************************************************/int Person::getpassword(){    return password;}/***********************************************************功能描述:返回姓名*输入参数:无*输出参数:无*返回值: name 用户姓名*其它说明:name为私有成员,为了调用它,必须用公共接口***********************************************************/string Person::getname(){    return name;}/*********************************************************************************************功能描述:输入密码*输入参数:无*输出参数:无*返回值:整型的密码值*其它说明:(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入**********************************************************************************************/int Person::inputPassword(){    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;  //退出for循环后,再次接受            }        }        fflush(stdin); //清除键盘缓存区中已经有的输入        cout<<endl;;        if(iPass==0)  //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环        {            cout<<"密码要求全为数字,且不能全0!"<<endl;;            cout<<"请重新输入密码: ";        }        else            break;    }    return iPass;}/**********************************************************************功能描述:查询当前管理员*输入参数:无*输出参数:无*返回值:返回管理员账号在数组中的下标或者当值不在0~N-1之间时返回-1*其它说明:无*********************************************************************/int Manager::getManager(string nam){    int i=0;    while(i<n)    {        if(managers[i].name==nam)        {            break;   //找到了,立即退出循环        }        i++;    }    return i; //若找到,其值在0~N-1间,否则,保持-1}

实现基础功能所必需的基础函数:user.cpp

/**版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院*All rights reserved.**文件名称:user.cpp*文件标识:无*内容摘要:该代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作    者:刘佳琦*完成日期:2015年7月16日**修改记录:*修改日期:无*版本号:V1.0*修改人:刘佳琦*修改内容:*/#include <iostream>#include "bank.h"using namespace std;/****************功能描述:赋值*输入参数:无*输出参数:无*返回值:无*其他说明:无****************/void User::setUser(long int acc, string nam, int pw, double bal,int sta,string idd,string add){    name=nam;    password=pw;    account=acc;    balance=bal;    status=sta;    id=idd;    address=add;}/************************功能描述:显示户主姓名*输入参数:无*输出参数:getnum()//返回用户姓名 string型*返回值:无*其他说明:无***********************/void User::showName(){    cout<<"户主姓名:"<<getname()<<endl;}/***********************功能描述:显示余额*输入参数:无*输出参数:prompt //操作描述 string型            balance//金额     double型*返回值:无*其他说明:无***********************/void User::showBalance(string prompt){    cout<<prompt<<" "<<balance<<" 元"<<endl;}/***********************功能描述:验证密码*输入参数:无*输出参数:无*返回值:1 成功 0 失败*其他说明:无***********************/bool Person::passwordIsRight(){    int iPass;    bool right = true;    cout<<"输入密码:";    iPass=inputPassword();    if(iPass!=getpassword())    {        right = false;        cout<<"输入密码错误,不能继续操作!"<<endl;    }    return right;}/*****************************功能描述:判断用户当前状态*输入参数:无*输出参数:n //用户当前状态 string型*返回值:0 正常状态 1 不是一种状态*其他说明:无*****************************/bool User::isNormalUser(){    bool normal = true;    string n;    if(status!=0)    {        normal = false;        if(status==1)            n="挂失";        else if(status==2)            n="销户";        else if(status==3)            n="冻结";        cout<<"该账户处于"<<n<<"状态,不能继续操作..."<<endl;    }    return normal;}


实现功能:bank.cpp

/**版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院*All rights reserved.**文件名称:bank.cpp*文件标识:无*内容摘要:该代码用于获取满足后缀要求的第一个文件*其他说明:无*当前版本:V1.0*作    者:刘佳琦*完成日期:2015年7月16日**修改记录:*修改日期:无*版本号:V1.0*修改人:刘佳琦*修改内容:*/#include <iostream>#include <fstream>#include <cstdlib>#include "bank.h"#include <ctype.h>#include <ctime>using namespace std;/********************功能描述:构造函数*输入参数:无*输出参数:无*返回值:无*其他说明:无*******************/Bank::Bank(){}/***********************************************功能描述:读取文件*输入参数:无*输出参数:无*返回值:无*其他说明:打开文件,读取文件中保存的业务数据**********************************************/void Bank::openfile(){    ifstream infile("account.txt",ios::in);    if(!infile)    {        cerr<<"open error!"<<endl;        exit(1);    }    int i=0;    long int acc;   //账号    string nam;   //姓名    int pw;   //密码    double bal;   //金额    int sta;   //状态    string idd;    string add;    N=jishu();    users=new User[N+1];    while(infile>>acc>>nam>>pw>>bal>>sta>>idd>>add)        //while(infile>>users[i].account>>users[i].name>>users[i].password>>users[i].balance>>users[i].status)    {        users[i].setUser(acc,nam,pw,bal,sta,idd,add);        ++i;    }    infile.close();}/*********************************************************************************功能描述:保存文件*输入参数:无*输出参数:无*返回值:无*其他说明:将数据保存到文件中,每次保存前嫌清空之前的内容,数据之间用空格分隔*********************************************************************************/void Bank::savefile(){    ofstream qing("account.txt",ios::trunc);//若文件存在,清空数据    qing.close();    ofstream outfile("account.txt",ios::out);    if(!outfile)    {        cerr<<"open error!"<<endl;        exit(1);    }    for(int i=0; i<N; ++i)    {        outfile<<users[i].account<<" "<<users[i].name<<" "<<users[i].password<<" "<<users[i].balance<<" "<<users[i].status<<" "<<users[i].id<<" "<<users[i].address<<endl;    }    outfile.close();    delete[]users;    return;}/********************************************************* *功能描述:计数 *输入参数:无 *输出参数:无 *返回值:  i-当前账户数量 *其他说明:计算当前账户有多少,便于开辟相应的空间大小 ********************************************************/int Bank::jishu(){    long int acc;   //账号    string nam;   //姓名    int pw;   //密码    double b;   //金额    string idd;    string add;    int sta;   //状态    int i=0;    ifstream infile("account.txt");    while(infile>>acc>>nam>>pw>>b>>sta>>idd>>add)    {        ++i;    }    infile.close();    return i;}/***********************************************功能描述:读取文件*输入参数:无*输出参数:无*返回值:无*其他说明:打开文件,读取文件中保存的业务数据***********************************************/void Bank::readwork(){    int i=0;    ifstream infile("work_information.txt",ios::in);    if(!infile)    {        cerr<<"open error!"<<endl;        exit(1);    }    while(infile>>yw[i].ymd>>yw[i].hms>>yw[i].usernum>>yw[i].workinfor)    {        ++i;    }    infile.close();}/**********************************功能描述:保存业务*输入参数:无*输出参数:无*返回值:无*其他说明:保存每一笔业务到文件中**********************************/void Bank::savework(long int usernum,string infor){    time_t t;    tm *lt;//定义一个指针用来指向获取到的时间    t = time(NULL);    lt = localtime(&t);//获取当前时间,直接调用标准库内函数    ofstream workfile("work_information.txt",ios::app);    if(!workfile)    {        cerr<<"open error!"<<endl;        exit(1);    }    workfile<<lt->tm_year+1900<<"/"<<lt->tm_mon+1<<"/"<<lt->tm_mday<<" "<<lt->tm_hour<<":"<<lt->tm_min<<":"<<lt->tm_sec<<'\t';//年从1900年开始,月从0开始    workfile<<usernum;    workfile<<"进行"<<infor<<endl;    workfile.close();}/*******************************************************功能描述:办理业务*输入参数:iChoice(序号) int型*输出参数:无*返回值:无*其他说明:用户自行选择功能,然后调用相应函数实现功能*******************************************************/void Bank::work(){    Manager m;    int iChoice;   //用于选择系统功能    //办理业务    do    {        iChoice = m.chooseInMenu();  //从菜单中获得功能代码        readwork();//读取业务信息        openfile();//读取用户信息        switch(iChoice)        {        case 1:            openAccount(); //开户            break;        case 2:            cancelAccount();  //注销账户            break;        case 3:            save();  //存款            break;        case 4:            withdraw();   //取款            break;        case 5:            showAccount(); //查询余额            break;        case 6:            transferAccounts();  //转账            break;        case 7:            reportLoss();  //挂失            break;        case 8:            cancelLoss();  //解除挂失            break;        case 9:            updatePassword();   //更改密码            break;        case 10:            Acc_dong();//冻结            break;        case 11:            Acc_Jiedong();//解冻            break;        case 0:            cout<<"欢迎您再来. "<<endl;        }        savefile();    }    while(iChoice);}/*****************************************功能描述:查询业务*输入参数:无*输出参数:ymd //年月日 string型           hms //时分秒 string型           usernum //账户名 long int型           workinfor //业务信息 string型*返回值:无*其他说明:查询当前用户下每一笔业务明细*****************************************/void Bank::searchwork(long int a)//查询业务{    int i=0;    ifstream infile("work_information.txt",ios::in);    if(!infile)    {        cerr<<"open error!"<<endl;        exit(1);    }    while(infile>>yw[i].ymd>>yw[i].hms>>yw[i].usernum>>yw[i].workinfor)    {        ++i;        if(yw[i].usernum==a)        {            cout<<yw[i].ymd<<" "<<yw[i].hms<<" ";            cout<<yw[i].usernum<" ";            cout<<yw[i].workinfor<<endl;        }        n=i;    }    infile.close();}/*********************************************************功能描述:冻结账户*输入参数:无*输出参数:无*返回值:无*其他说明:找到账户,确保它在正常状态下,并将其状态改为3-冻结即可。********************************************************/void Bank::Acc_dong()//冻结账户{    int who;  //查找到该账号在数组中对应的下标    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            if(users[who].status==0)            {                users[who].status=3;                savework(users[who].account,"冻结操作,挂失成功!");                cout<<"冻结成功!"<<endl;            }            else if(users[who].status==1)            {                savework(users[who].account,"冻结操作,冻结失败!失败原因:该用户处于挂失状态");                cout<<"该账户已经处于挂失状态,冻结失败"<<endl;            }            else if(users[who].status==3)            {                savework(users[who].account,"冻结操作,冻结失败!失败原因:该用户处于冻结状态");                cout<<"该用户已处于冻结状态"<<endl;            }            else            {                cout<<"该账户已销户,不能冻结"<<endl;            }        }    }}/***********************************************功能描述:解除冻结账户*输入参数:无*输出参数:无*返回值:无*其他说明:找到账户,并将其状态改为1-正常即可 解除冻结前先检查账户是否已经被冻结**********************************************/void Bank::Acc_Jiedong()//解除冻结{    int who;  //查找到该账号在数组中对应的下标    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            if(users[who].status!=3)            {                savework(users[who].account,"解冻操作,解冻失败!失败原因:该账户未冻结,无需解冻");                cout<<"该账户未冻结,无需解冻!"<<endl;                cout<<endl;                cout<<"请按任意键返回主菜单:";                cout<<endl;                fflush(stdin);                getchar();                work();            }            cout<<"解冻成功!"<<endl;            savework(users[who].account,"解冻操作,解冻成功!");            cout<<endl;            users[who].status=0;        }    }}/********************************************************************************************* *功能描述:开户 *输入参数:    acc;   //账号 long int型    nam;   //姓名 string型    pw;   //密码  int型    bal;   //金额 double 型    sta;   //状态 int型    idd;   //身份证号 string型    add;   //地址 string型*输入参数:无*输出参数:无*返回值:无 *其他说明:在进入系统时,在读入数据过程中,已经记录了用户数为N,在数组中对应下标为0~N-1  开户时要增加一个用户,只要为下标为N的数组元素置值,并在成功之后令N++即可。  账号由系统自动生成(10001+序号),保证其连续,这样在顺序增加的时候,就保证了其有序。*********************************************************************************************/void Bank::openAccount(){    //下面正常办理开户业务    long int acc;   //账号    string nam;   //姓名    int pw;   //密码    double bal;   //金额    int sta;   //状态    string idd;    string add;    cout<<"正在开户"<<endl;    acc=10001+N;    cout<<"账号:"<<acc<<endl;    cout<<"户主姓名:";    cin>>nam;    cout<<"身份证号:";    cin>>idd;    cout<<"家庭住址:";    cin>>add;    int iPass1, iPass2;    cout<<"密码:";    iPass1=users[N].inputPassword();  //输入密码1    cout<<"确认密码:";    iPass2=users[N].inputPassword();  //输入密码2    if(iPass1==iPass2)    {        pw=iPass1;        sta=0; //账户状态为“正常”        cout<<"存入金额:";        cin>>bal;        users[N].setUser(acc, nam, pw, bal, sta,idd,add);        N++; //正式用户数增加1,确认了新用户已经加入        cout<<"成功开户!"<<endl;        savework(acc,"开户操作,开户成功!");    }    else    {        savework(acc,"开户操作,开户失败!");        cout<<"两次密码不一致,未成功开户!"<<endl; //没有N++,则读入的值无效    }}/********************************************功能描述:注销账户*输入参数:无*输出参数:无*返回值:无*其他说明:找到账户,并将其状态改为2-注销即可。注销前应该检查余额,应该先取款再注销********************************************/void Bank::cancelAccount(){    int who;  //查找到该账号在数组中对应的下标    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            users[who].showBalance("余额");   //提示"余额"二字,显示金额            cout<<"确认销户(y/n)?";            if(tolower(getchar())=='y')            {                users[who].showBalance("销户成功!本次取款金额为");                users[who].balance=0;  //取款后余额变0                users[who].status=2;  //状态变为注销                savework(users[who].account,"销户操作,销户成功!");            }            else if(users[who].status==2)            {                savework(users[who].account,"销户操作,销户失败!失败原因:该用户处于冻结状态");                cout<<"该用户已处于冻结状态,销户失败!"<<endl;            }            else            {                savework(users[who].account,"销户操作,销户失败!失败原因:用户取消操作");                cout<<"你取消了操作,销户失败!"<<endl;            }            fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作        }    }}/********************************************功能描述:存款*输入参数: money //存款额    double型*输出参数:无*返回值:无*其他说明:需要保证账户存在,且处于正常状态********************************************/void Bank::save(){    int who;    double money;    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        if(users[who].status==0)        {            users[who].showName();            cout<<"输入存款额:";            cin>>money;            users[who].balance+=money;            users[who].showBalance("存款后,您有");            savework(users[who].account,"存款操作,存款成功!");        }        else if(users[who].status==1)        {            savework(users[who].account,"存款操作,存款失败!失败原因:该用户处于挂失状态");            cout<<"该用户处于挂失状态,存款失败!"<<endl;        }        else if(users[who].status==2)        {            savework(users[who].account,"存款操作,存款失败!失败原因:该用户处于冻结状态");            cout<<"该用户已处于冻结状态,存款失败"<<endl;        }        else        {            savework(users[who].account,"存款操作,存款失败!失败原因:该用户处于注销状态");            cout<<"该用户已经销户,存款失败!"<<endl;        }    }    return;}/********************************************************************功能描述:取款*输入参数:money //取款金额 double型*输出参数:无*返回值:无*其他说明:需要保证账户存在,且处于正常状态,另外,余额要足够取********************************************************************/void Bank::withdraw(){    int who;    double money;    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        if(users[who].isNormalUser())        {            users[who].showName();            if(users[who].passwordIsRight())            {                cout<<"输入取款额:";                cin>>money;                if(money>users[who].balance)  //账户里的金钱必须大于取款的金额                {                    savework(users[who].account,"取款操作,取款失败!失败原因:该用户账户余额不足");                    cout<<"余额不足,取款失败!"<<endl;                }                else                {                    users[who].balance-=money;                    users[who].showBalance("取款后,还有");                    savework(users[who].account,"取款操作,取款成功!");                }            }        }    }    return;}/************************功能描述:查询账户*输入参数:无*输出参数:无*返回值:无*其他说明:显示账户信息***********************/void Bank::showAccount(){    int who;    string sta[4]= {"正常","挂失","已经销户","冻结"};    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            users[who].showBalance("余额");            cout<<"状态:"<<sta[users[who].status]<<endl;            cout<<"需要继续查询业务明细么(y/n)?";            if(tolower(getchar())=='y')            {                searchwork(users[who].account);            }        }    }    return;}/*********************************************************************************功能描述:转账*输入参数:money //转账金额 double型*输出参数:无*返回值:无*其他说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够********************************************************************************/void Bank::transferAccounts(){    int whoout, whoin;    double money;    cout<<"转出自";    whoout = getUser();  //根据账号查询用户,返回用户的下标    if(whoout>=0)   //说明id账户存在    {        if(users[whoout].isNormalUser())        {            users[whoout].showName();            if(users[whoout].passwordIsRight())            {                cout<<"输入转账金额:";                cin>>money;                if(money>users[whoout].balance)  //亲,不玩透支                {                    savework(users[whoout].account,"转账操作,转账失败!失败原因:该用户账户余额不足");                    cout<<"余额不足,转账失败!"<<endl;                }                else                {                    cout<<"转出到";                    whoin = getUser();  //根据账号查询用户,返回用户的下标                    if(whoin>=0)   //说明id账户存在                    {                        if(users[whoin].isNormalUser())                        {                            users[whoout].balance-=money;                            users[whoin].balance+=money;                            users[whoout].showBalance("转账后,您还有");                            savework(users[whoout].account,"转账操作,转账成功!");                        }                    }                }            }        }    }    return;}/*********************************************************功能描述:挂失账户*输入参数:无*输出参数:无*返回值:无*其他说明:当用户已处于挂失、销户和冻结状态时,操作无效*********************************************************/void Bank::reportLoss(){    int who;    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            if(users[who].status==0)            {                users[who].status=1;                savework(users[who].account,"挂失操作,挂失成功!");                cout<<"挂失成功"<<endl;            }            else if(users[who].status==1)            {                savework(users[who].account,"挂失操作,挂失失败!失败原因:该用户处于挂失状态");                cout<<"该账户已经处于挂失状态"<<endl;            }            else if(users[who].status==2)            {                savework(users[who].account,"挂失操作,挂失失败!失败原因:该用户处于冻结状态");                cout<<"该用户已处于冻结状态"<<endl;            }            else            {                cout<<"该账户已销户,不能挂失"<<endl;            }        }    }    return;}/***********************************************************功能描述:解除挂失*输入参数:无*输出参数:无*返回值:无*其他说明:当账户已处于正常,销户,冻结状态,解除挂失失败***********************************************************/void Bank::cancelLoss(){    int who;    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            if(users[who].status==0)            {                savework(users[who].account,"解除挂失操作,解除挂失失败!失败原因:该用户处于正常状态状态,不需要解除挂失");                cout<<"该账户处于正常状态,不需要解除挂失"<<endl;            }            else if(users[who].status==1)            {                users[who].status=0;                cout<<"解除挂失成功"<<endl;                savework(users[who].account,"解除挂失操作,解除挂失成功!");            }            else if(users[who].status==2)            {                savework(users[who].account,"解除操作,解除挂失失败!失败原因:该用户处于冻结状态");                cout<<"该用户已处于冻结状态"<<endl;            }            else            {                savework(users[who].account,"解除挂失操作,解除挂失失败!失败原因:该用户处于销户状态,操作无效");                cout<<"该账户已销户,操作无效"<<endl;            }        }    }    return;}/***********************功能描述:改密码*输入参数:无*输出参数:无*返回值:无*其他说明:无**********************/void Bank::updatePassword(){    int who;    int iPass1, iPass2;    who = getUser();  //根据账号查询用户,返回用户的下标    if(who>=0)   //说明id账户存在    {        users[who].showName();        if(users[who].passwordIsRight())        {            cout<<"新密码:";            iPass1=users[who].inputPassword();  //输入密码1            cout<<"确认密码:";            iPass2=users[who].inputPassword();  //输入密码2            if(iPass1==iPass2)            {                users[who].password=iPass1;                cout<<"修改成功!"<<endl;                savework(users[who].account,"修改密码操作,修改密码成功!");            }            else            {                savework(users[who].account,"修改密码操作,修改密码失败!失败原因:两次密码输入不同");                cout<<"两次输入不同,修改失败!"<<endl;            }        }    }    return;}/*****************************************************************************功能描述:输入账号查询用户,返回用户在数组中的下标*输入参数:id//要查询用户的账号 int型*输出参数:无*返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)*其他说明:由账号自动产生,使按账号有序,本模块采用二分查找*****************************************************************************/int Bank::getUser(){    int id;    cout<<"账号:";    cin>>id;    int index=-1;    int low=0, high=N-1, mid;    while(low<=high)    {        mid = (low+high)/2;        if(users[mid].account==id)        {            index=mid;            break;   //找到了,立即退出循环        }        else if (users[mid].account>id)            high=mid-1;        else            low=mid+1;    }    if (index<0)        cout<<"该用户不存在,本次操作失败!"<<endl;    return index; //若找到,其值在0~N-1间,否则,保持-1}



运行结果:

 

 

0 0
原创粉丝点击