c++课程实训-银行系统


main.cpp

/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:main.cpp
*其他说明:无 
*当前版本:V1.0 
*作    者:满星辰
*完成日期:2015年7月17日 
*/  
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include "staff.h"
#include "bank.h"
#include "user.h"
using namespace std;
int main()
{
    cout<<"+----------------------------+"<<endl;
    cout<<"+   Welcome to Bank Manxcc   +"<<endl;
    cout<<"+----------------------------+"<<endl;
    Bank b;
    if(!b.passtaff())    //判断业务员账号和密码是否相符
        exit(1);        // 不相符则退出
    else
        cout<<endl;     //相符则输出回车,为了界面更美观
    b.showMenu();      //显示系统菜单栏
    b.manage();        //系统正式开始工作
    return 0;
}


bank.h

/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:bank.h 
*其他说明:无 
*当前版本:V1.0 
*作    者:满星辰
*完成日期:2015年7月17日 
*/  
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <iostream>
#include <cmath>
#include <iomanip>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <conio.h>
#include "user.h"
using namespace std;
struct business   // 业务信息
{
    string ymd;    //年月日
    string hms;    // 时分秒
    string yongh;   // “用户”
    int yonghnum;    // 用户账号
    string ywinfor;   // 操作信息
    string lius;    //流水账号
};
class Bank
{
public:
    bool passtaff();//业务员信息
    void manage(); //开始工作
    void showMenu();//显示菜单
    void openAccount(); //开户
    void deleteAccount(); //销户
    void saveMoney(); //存款
    void drawMoney(); //取款
    void refer(); //查询
    void transfer(); //转账
    void reportLoss(); //挂失
    void hangSolution(); //解挂
    void unfreeze();    // 解除冻结
    void ywrefer();   // 查询业务
    void yewu(int usernum,string infor);//写入业务
    void yewu_read();//读入业务信息
    int yewu_jis();//返回文件中业务
    void edit();    // 修改个人信息
    void changePassword(); //改密
    void changename();   // 修改用户名
    void changeph();   // 修改手机号
    void changeaddr();   // 修改地址
    int getUser();     //从数组中获取用户下标
    int jis();    //计算文件中的用户数
    void openfile();//导入文件
    void savefile(); //保存文件
private:
    business *yw;         //定义一个业务指针,为了后面实现动态数组
    long ywnum;           //业务数量编号,为10000000+业务数量
    int nownum;           //用户数量
    User *users;          //定义一个用户指针,为了后面实现动态数组
};
#endif // BANK_H_INCLUDED<strong>
</strong>

bank.cpp

/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:bank.cpp
*其他说明:无
*当前版本:V1.0
*作    者:满星辰
*完成日期:2015年7月17日
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <stdio.h>
#include <fstream>
#include <ctime>
#include "staff.h"
#include "bank.h"
using namespace std;
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:inputPassword
 *功能描述:一位一位接受密码,同时输出*号,保证密码全为数字且不全为0
 *输入参数:无
 *输出参数:密码
 *返回值:完整的密码
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
int 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
        {
            cout<<"密码要求全为数字,且不能全0!"<<endl;;
            cout<<"请重新输入密码: ";
        }
        else
            break;
    }
    return iPass;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:passtaff
 *功能描述:输入业务员账号和密码(acc-业务员账号,ch-一位一位输出密码),输入密码时输出*号,账号密码相符则返回true,错误三次则返回false
 *输入参数:无
 *输出参数:bool型
 *返回值:true or false,账号密码相符返回true,不相符且错误三次返回false
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
bool Bank::passtaff()
{
    Staff s1;
    string acc;
    char ch;
    cout<<"请输入业务员账户:";
    cin>>acc;
    for(int j=0; j<3; ++j)
    {
        int pw=0;
        cout<<"请输入密码:";
        for(int i=0; i<6; i++)
        {
            ch=getch();  //输入但不显示
            putchar('*');   //输出*
            pw=pw*10+(ch-'0');
        }
        if(s1.pass(acc,pw))
        {
            return true;
        }
        else
        {
            cout<<"\n用户名或密码错误。"<<endl;
        }
    }
    cout<<"\n错误三次,系统自动退出。"<<endl;
    return false;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showMenu
 *功能描述:显示菜单栏:1-开户、2-销户、3-存款、4-取款、5-查询、6-转账、7-挂失、8-解挂、9-解冻、10-业务查询、11-修改个人
            信息,0-退出
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::showMenu()//显示菜单
{
    cout<<"+----------------------------+"<<endl;
    cout<<"+ 1.开户    2.销户    3.存款 +"<<endl;
    cout<<"+ 4.取款    5.查询    6.转账 +"<<endl;
    cout<<"+ 7.挂失    8.解挂    9.解冻 +"<<endl;
    cout<<"+ 10.业务查询                +"<<endl;
    cout<<"+ 11.修改个人信息            +"<<endl;
    cout<<"+                     0.退出 +"<<endl;
    cout<<"+----------------------------+"<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:manage
 *功能描述:系统开始工作,输入指令(order-操作指令),进行相应的操作,在输入的指令不为0时,一直进行下去,流程为:
            进入while循环:从文件中导入用户的信息->从文件中导入业务信息->输入指令->进入switch进行相应操作->保存用户信息
            到文件->从文件中导入用户的信息...
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::manage() //开始工作
{
    int order=1;
    do
    {
        if(order==0)
            exit(1);
        openfile();
        yewu_read();
        cout<<"请输入操作指令:";
        cin>>order;
        switch(order)
        {
        case 1:
            openAccount();
            break;
        case 2:
            deleteAccount();
            break;
        case 3:
            saveMoney();
            break;
        case 4:
            drawMoney();
            break;//取款
        case 5:
            refer();
            break;//查询
        case 6:
            transfer();
            break;//转账
        case 7:
            reportLoss();
            break;//挂失
        case 8:
            hangSolution();
            break;//解挂
        case 9:
            unfreeze();
            break;
        case 10:
            ywrefer();
            break;
        case 11:
            edit();
            break;
        }
        savefile();
    }
    while(1);
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:openAccount
 *功能描述:开户,输入用户密码,金额,身份证,住址,手机号。两次密码输入不一致,则开户失败;开户金额低于50元,开户失败
            开户成功,将用户信息保存到数组中
            nam[20]-户主姓名、Pass1-第一次输入的密码、Pass2-第二次输入的密码、mon-开户金额、id[19]-身份证、ad[64]-家庭
            住址、ph[12]-手机号
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::openAccount()  //开户
{
    int acc;   //账号
    char nam[20];   //姓名
    int pw;   //密码
    double mon;   //金额
    char id[19];   //身份证
    char ad[32];   //住址
    char ph[12];   // 手机号
    int sta;   //状态
    cout<<"正在开户"<<endl;
    acc=10001+nownum;
    cout<<"账号:"<<acc<<endl;
    cout<<"户主姓名:";
    cin>>nam;
    int Pass1, Pass2;
    cout<<"密码:";
    Pass1=inputPassword();  //输入密码1
    cout<<"确认密码:";
    Pass2=inputPassword();  //输入密码2
    if(Pass1==Pass2)
    {
        pw=Pass1;
        sta=0; //账户状态为“正常”
        cout<<"存入金额:";
        cin>>mon;
        if(mon>=50)
        {
            cout<<"预留手机号:";
            cin>>ph;
            cout<<"身份证号:";
            cin>>id;
            cout<<"家庭住址:";
            cin>>ad;
            users[nownum].setUser(acc, nam, pw, mon, sta,ph,id,ad);
            ++nownum; //正式用户数增加1,确认了新用户已经加入
            cout<<"开户成功!"<<endl;
            fflush(stdin); //清除键盘缓存区中已经有的输入
            yewu(acc,"开户操作,开户成功!");
        }
        else
            cout<<"开户金额不得少于50元!"<<endl;
    }
    else
    {
        cout<<"两次密码不一致,未成功开户!"<<endl;
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:deleteAccount
 *功能描述:销户,查找到用户账户后,判断用户状态,状态为0(正常)则进行输入密码,密码正确,再输入确认信息,确认信息为y
            则将用户状态置为2(销户),并取出账户余额,销户成功
            账号、密码、getchar-确认信息
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::deleteAccount()
{
    int who;  //查找到该账号在数组中对应的下标
    who=getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].isNormalUser())
        {
            if(users[who].passwordIsRight())
            {
                users[who].showMoney("余额:");   //提示"余额"二字,显示金额
                cout<<"确认销户(y/n)?";
                if(getchar()=='y'||getchar()=='Y')
                {
                    users[who].showMoney("销户成功!本次取款金额为:");
                    users[who].money=0;  //取款后余额变0
                    users[who].status=2;  //状态变为注销
                    yewu(who+10001,"销户操作,销户成功!");
                }
                else
                {
                    cout<<"你取消了操作,销户失败!"<<endl;
                    yewu(who+10001,"销户操作,销户失败!错误原因:取消操作。");
                }
                fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作
            }
        }
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:saveMoney
 *功能描述:存款,输入账户存在且状态为0(正常)则进行存款,如果状态不正常,则根据状态的不同而输出相应的错误
            如果存款失败则输出错误原因:
            状态为1-挂失状态、状态为2-销户状态、状态为3-冻结状态
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::saveMoney() //存款
{
    int who;
    double money;
    who=getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        if(users[who].status==0)
        {
            users[who].showName();
            cout<<"输入存款额:";
            cin>>money;
            users[who].money+=money;
            users[who].showMoney("存款后,金额为:");
            yewu(who+10001,"存款操作,存款成功!");
        }
        else if(users[who].status==1)
        {
            cout<<"该用户处于挂失状态,存款失败!"<<endl;
            yewu(who+10001,"存款操作,存款失败!错误原因:该账户处于挂失状态。");
        }
        else if(users[who].status==2)
        {
            cout<<"该用户已经销户,存款失败!"<<endl;
            yewu(who+10001,"存款操作,存款失败!错误原因:该账户已销户。");
        }
        else
        {
            cout<<"该用户处于冻结状态,存款失败!"<<endl;
            yewu(who+10001,"存款操作,存款失败!错误原因:该账户处于冻结状态。");
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:drawMoney
 *功能描述:取款,输入账号密码正确且状态正确则进行取款,账户余额不足取款金额则取款失败
            输入:账号、密码、money-取款金额
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::drawMoney()    //取款
{
    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].money)
                {
                    cout<<"余额不足,取款失败!"<<endl;
                    yewu(who+10001,"取款操作,操作失败!错误原因:余额不足。");
                }
                else
                {
                    users[who].money-=money;
                    users[who].showMoney("取款后,余额为:");
                    yewu(who+10001,"取款操作,取款成功!");
                }
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:refer
 *功能描述:查询用户信息,输入账号密码,显示用户信息,账号密码不相符,则查询失败
            根据用户当前的status(0-3)输出相应账户状态
            0-正常、1-挂失、2-销户、3-冻结
            输入账号密码
            输出showName-用户姓名、showMoney-余额、showph-手机号、showid-身份证、showad-用户地址
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::refer()    //查询用户信息
{
    int who;
    string sta[4]= {"正常","挂失","已经销户","冻结"};
    who=getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            users[who].showMoney("余额:");
            if(users[who].status==0)
            {
                users[who].showph();
                users[who].showid();
                users[who].showad();
            }
            cout<<"状态:"<<sta[users[who].status]<<endl;
            yewu(who+10001,"查询操作,查询成功!");
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:transfer
 *功能描述:转账,将一个用户的部分存款转给另一个用户
            转出账户的账号密码要相符否则转账失败;转入账户要存在否则失败;转账金额大于转出账户余额则失败
            输入:whoout-转出账户、whoin-转入账户、money-转帐金额
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::transfer()    //转账
{
    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].money)
                {
                    cout<<"余额不足,转账失败!"<<endl;
                    yewu(whoout+10001,"转账操作,转账失败!错误原因:余额不足。");
                }
                else
                {
                    cout<<"转出到";
                    whoin = getUser();  //根据账号查询用户,返回用户的下标
                    if(whoin>=0)   //说明id账户存在
                    {
                        if(users[whoin].isNormalUser())
                        {
                            users[whoout].money-=money;
                            users[whoin].money+=money;
                            users[whoout].showMoney("转账后,余额为:");
                            yewu(whoout+10001,"转账操作,转账成功!");
                        }
                    }
                }
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:reportLoss
 *功能描述:挂失,输入账号密码,相符则挂失成功、否则失败
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
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;
                cout<<"挂失成功"<<endl;
                yewu(who+10001,"挂失操作,挂失成功!");
            }
            else if(users[who].status==1)
            {
                cout<<"该账户已经处于挂失状态"<<endl;
                yewu(who+10001,"挂失操作,挂失失败!错误原因:该账户已经处于挂失状态。");
            }
            else if(users[who].status==2)
            {
                cout<<"该账户已销户,不能挂失"<<endl;
                yewu(who+10001,"挂失操作,挂失失败!错误原因:该账户已销户。");
            }
            else
            {
                cout<<"该账户已经处于冻结状态"<<endl;
                yewu(who+10001,"挂失操作,挂失失败!错误原因:该账户已经处于冻结状态。");
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:hangSolution
 *功能描述:解除挂失。输入账号密码,账号密码不相符则解挂失败;账号处于挂失状态才可挂失,否则挂失失败且输出错误原因
            挂失成功or错误原因:状态为正常、销户、冻结
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::hangSolution() //解挂
{
    int who;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            if(users[who].status==0)
            {
                cout<<"该账户处于正常状态,不需要解除挂失"<<endl;
                yewu(who+10001,"解挂操作,解挂失败!错误原因:该账户处于正常状态。");
            }
            else if(users[who].status==1)
            {
                users[who].status=0;
                cout<<"解除挂失成功"<<endl;
                yewu(who+10001,"解挂操作,解挂成功!");
            }
            else if(users[who].status==2)
            {
                cout<<"该账户已销户,操作无效"<<endl;
                yewu(who+10001,"解挂操作,解挂失败!错误原因:该账户已销户。");
            }
            else
            {
                cout<<"该账户处于冻结状态,不需要解除挂失"<<endl;
                yewu(who+10001,"解挂操作,解挂失败!错误原因:该账户处于冻结状态。");
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:unfreeze
 *功能描述:解除冻结。输入账号密码,账号密码不相符则解挂失败;账号处于冻结状态才可挂失,否则挂失失败且输出错误原因
            解冻成功or错误原因:状态为正常、销户、挂失
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::unfreeze()    // 解除冻结
{
    int who;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            if(users[who].status==0)
            {
                cout<<"该账户处于正常状态,不需要解除冻结"<<endl;
                yewu(who+10001,"解冻操作,解冻失败!错误原因:该账户处于正常状态。");
            }
            else if(users[who].status==1)
            {
                cout<<"该账户处于挂失状态,不需要解除冻结"<<endl;
                yewu(who+10001,"解冻操作,解冻失败!错误原因:该账户处于挂失状态。");
            }
            else if(users[who].status==2)
            {
                cout<<"该账户处于销户状态,不需要解除冻结"<<endl;
                yewu(who+10001,"解冻操作,解冻失败!错误原因:该账户处于销户状态。");
            }
            else
            {
                users[who].status=0;
                cout<<"解冻成功!"<<endl;
                yewu(who+10001,"解冻操作,解冻成功!");
            }
        }
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:ywrefer
 *功能描述:业务查询。输入查询方式,1-用户账户查询,2-流水账号查询
            输入:账号密码、choose-查询方式
            1-用户账户查询:输出该用户进行过的全部业务信息
            2-流水账号查询:输出该流水账号记录的信息
 *输入参数:
 *输出参数:
 *返回值:
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::ywrefer()
{
    int choose;
    cout<<"+----------查询方式----------+"<<endl;
    cout<<"1.用户账号查询"<<endl;
    cout<<"2.流水账号查询"<<endl;
    cout<<"请输入查询方式:";
    cin>>choose;
    if(choose==1)
    {
        int who,j=0;
        business b;
        who = getUser();  //根据账号查询用户,返回用户的下标
        ifstream infile("business_information.txt",ios::in);
        if(!infile)
        {
            cerr<<"open error!"<<endl;
            exit(1);
        }
        while(infile>>b.ymd>>b.hms>>b.yongh>>b.yonghnum>>b.ywinfor>>b.lius)
        {
            if(yw[j].yonghnum==who+10001)
                cout<<yw[j].ymd<<" "<<yw[j].hms<<" "<<yw[j].yongh<<" "<<yw[j].yonghnum<<" "<<yw[j].ywinfor<<endl;
            ++j;
        }
    }
    else if(choose=2)
    {
        long i;
        cout<<"请输入流水账号:";
        cin>>i;
        if(i<=ywnum&&i>10000000)
            cout<<i<<":\t"<<yw[i-10000001].ymd<<" "<<yw[i-10000001].hms<<" "<<yw[i-10000001].yongh<<" "<<yw[i-10000001].yonghnum<<" "<<yw[i-10000001].ywinfor<<endl;
        else
            cout<<"输入错误!该流水账号不存在!"<<endl;
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:yewu(int usernum,string infor)
 *功能描述:将用户信息写入文件。取系统当前时间:年月日时分秒,打开业务信息文件且使指针停在文件末尾,写入年/月/日
            时:分:秒,用户usernum 进行infor操作,流水账号为++ywnum
            保存结束,释放业务数组占用的空间
 *输入参数:usernum-用户账号,infor-业务操作信息
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::yewu(int usernum,string infor)//写入信息
{
    time_t t;
    tm *lt;
    t = time(NULL);
    lt = localtime(&t);
    ofstream ywfile("business_information.txt",ios::app);
    if(!ywfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    ywfile<<lt->tm_year+1900<<"/"<<lt->tm_mon+1<<"/"<<lt->tm_mday<<" "<<lt->tm_hour<<":"<<lt->tm_min<<":"<<lt->tm_sec<<'\t';
    ywfile<<"用户 "<<usernum<<" 进行"<<infor<<" "<<"流水账号为:"<<++ywnum<<endl;
    ywfile.close();
    delete []yw;
    cout<<"流水账号:"<<ywnum<<endl;
}
/*动态
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:yewu_read
 *功能描述:从文件中读取业务信息,根据文件中业务的数量,开辟一段连续的空间,大小为文件中的业务数+1
            读取业务信息:年月日 时分秒 “用户” 用户账号 业务操作信息 流水账号
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::yewu_read()//读入业务
{
    long i=0;
    ifstream infile("business_information.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    yw=new business[yewu_jis()+1];
    while(infile>>yw[i].ymd>>yw[i].hms>>yw[i].yongh>>yw[i].yonghnum>>yw[i].ywinfor>>yw[i].lius)
    {
        ++i;
    }
    infile.close();
    ywnum=i+10000000;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:yewu_jis
 *功能描述:计算出文件中的业务数量并返回
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
int Bank::yewu_jis()//返回文件中业务
{
    long i=0;
    business b;
    ifstream infile("business_information.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while(infile>>b.ymd>>b.hms>>b.yongh>>b.yonghnum>>b.ywinfor>>b.lius)
    {
        ++i;
    }
    infile.close();
    return i;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:edit
 *功能描述:修改用户的个人信息,显示4项可修改信息,输入要修改的项目
            输入:choose-修改项目、账号密码
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::edit()
{
    int choose;
    cout<<"+----------修改项目----------+"<<endl;
    cout<<"1.用户名"<<endl;
    cout<<"2.密码"<<endl;
    cout<<"3.预留手机号"<<endl;
    cout<<"4.家庭住址"<<endl;
    cout<<"请输入您要修改的项目:";
    cin>>choose;
    switch(choose)
    {
    case 1:
        changename();
        break;
    case 2:
        changePassword();
        break;
    case 3:
        changeph();
        break;
    case 4:
        changeaddr();
        break;
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:changePassword
 *功能描述:修改密码,输入账号密码,相符则输入新密码(iPass1),确认密码(iPass2),两次输入一致,修改密码成功
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::changePassword() //改密
{
    int who;
    int iPass1, iPass2;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            cout<<"新密码:";
            iPass1=inputPassword();  //输入密码1
            cout<<"确认密码:";
            iPass2=inputPassword();  //输入密码2
            if(iPass1==iPass2)
            {
                users[who].password=iPass1;
                cout<<"修改成功!"<<endl;
                yewu(who+10001,"修改密码操作,修改密码成功!");
            }
            else
            {
                cout<<"两次输入不同,修改失败!"<<endl;
                yewu(who+10001,"修改密码操作,修改密码失败!错误原因:两次密码输入不同。");
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:changename
 *功能描述:修改用户名,输入账号密码,相符则输入新用户名,输入确认信息,确认信息为y则修改成功
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::changename()   //修改用户名
{
    int who;
    char nam[20];
    char qr;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].isNormalUser())
        {
            if(users[who].passwordIsRight())
            {
                cout<<"新用户名:";
                gets(nam);
                cout<<"确认(y/n)?";
                cin>>qr;
                if(qr=='y'||qr=='Y')
                {
                    for(int i=0; i<20; ++i)
                        users[who].name[i]=nam[i];
                    cout<<"修改成功!"<<endl;
                    yewu(who+10001,"修改用户名操作,修改用户名成功!");
                }
                else
                {
                    yewu(who+10001,"修改用户名操作,修改用户名失败!错误原因:未确认信息。");
                }
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:changeph
 *功能描述:修改预留手机号,输入账号密码,相符则输入新手机号(ph[19]),输入确认信息(qr),确认信息为y则修改成功
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::changeph()   //修改预留手机号
{
    int who;
    char ph[12];
    char qr;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].isNormalUser())
        {
            if(users[who].passwordIsRight())
            {
                cout<<"新手机号:";
                gets(ph);
                cout<<"确认(y/n)?";
                cin>>qr;
                if(qr=='y'||qr=='Y')
                {
                    for(int i=0; i<12; ++i)
                        users[who].phone[i]=ph[i];
                    users[who].phone[11]='\0';
                    fflush(stdin); //清除键盘缓存区中已经有的输入
                    cout<<"修改成功!"<<endl;
                    yewu(who+10001,"修改预留手机号操作,修改预留手机号成功!");
                }
                else
                {
                    yewu(who+10001,"修改预留手机号操作,修改预留手机号失败!错误原因:未确认信息。");
                }
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:changeaddr
 *功能描述:修改用户住址,输入账号密码,相符则输入新住址(ad[32]),输入确认信息(qr),确认信息为y则修改成功
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::changeaddr()   //修改用户住址
{
    int who;
    char ad[32];
    char qr;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].isNormalUser())
        {
            if(users[who].passwordIsRight())
            {
                cout<<"新住址:";
                gets(ad);
                cout<<"确认(y/n)?";
                cin>>qr;
                if(qr=='y'||qr=='Y')
                {
                    for(int i=0; i<32; ++i)
                        users[who].addr[i]=ad[i];
                    cout<<"修改成功!"<<endl;
                    fflush(stdin); //清除键盘缓存区中已经有的输入
                    yewu(who+10001,"修改用户地址操作,修改用户地址成功!");
                }
                else
                {
                    yewu(who+10001,"修改用户地址操作,修改用户地址失败!错误原因:未确认信息。");
                }
            }
        }
    }
    return;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:getUser
 *功能描述:输入用户账号,使用二分查找,查找到用户账号相符的那一个用户对象,返回其数组下标
 *输入参数:无
 *输出参数:无
 *返回值:index-用户数组下标
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
int Bank::getUser()   //从数组中获取用户下标
{
    int id;
    cout<<"账号:";
    cin>>id;
    int index=-1;
    int low=0, high=nownum-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
}
/*二进制
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:jis
 *功能描述:计算出用户文件中的用户人数
 *输入参数:无
 *输出参数:无
 *返回值:文件中的用户数
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
int Bank::jis()   //计算文件中的用户数
{
    int i=0;
    User s1;
    ifstream infile("users.dat",ios::in|ios::binary);
    while(1)
    {
        infile.read((char*)&s1,sizeof(s1));
        if(infile.eof())
            break;
        ++i;
    }
    infile.close();
    return i;
}
/*二进制+动态
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:openfile
 *功能描述:从文件中导入用户数据。开辟一段连续的空间,大小为文件中的用户数+1
            将文件中的数据导入的数组中
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::openfile()//导入文件
{
    ifstream infile("users.dat",ios::in|ios::binary);
    int i=0;
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    nownum=jis();
    users=new User[nownum+1];
    while(1)
    {
        infile.read((char*)&users[i],sizeof(users[i]));
        if(infile.eof())
            break;
        ++i;
    }
    infile.close();
}
/*二进制
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:savefile
 *功能描述:打开并清空文件中的数据后关闭。以二进制形式打开文件,将数组中的用户数据保存到文件中,释放掉用户数组空间
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void Bank::savefile() //保存文件
{
    ofstream qingkfile("users.dat",ios::trunc);
    qingkfile.close();
    ofstream outfile("users.dat",ios::out|ios::binary);
    if(!outfile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    for(int i=0; i<nownum; ++i)
    {
        outfile.write((char*)&users[i],sizeof(users[i]));
    }
    outfile.close();
    delete []users; //释放空间,等下一次打开文件时重新开辟
    return;
}

user.h

/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:user.h
*其他说明:无
*当前版本:V1.0
*作    者:满星辰
*完成日期:2015年7月17日
*/
#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
class User
{
public:
    User(){}                //无参构造函数
    void setUser(int acc, char nam[], int pw, double mon, int sta,char ph[],char id[],char ad[]);     //将用户数据保存到对象中
    bool isNormalUser();             //判断账号状态是否正常
    bool passwordIsRight();          //判断输入的账号密码是否相符
    void showName();                 //输出用户姓名
    void showMoney(string xs);       //输出余额
    void showph();                   //输出手机号
    void showid();                   //输出身份证号
    void showad();                   //输出地址
    friend class Bank;               //将Bank类声明为友缘类,使得Bank类可随便调用函数
    friend ostream& operator<<(ostream &out, User &s);            //输出用户数据
    friend istream& operator>>(istream &in, User &s);             //输入用户数据
private:
    int account;                     //用户账号
    char name[20];                   //用户姓名
    int password;                    //密码
    double money;                    //余额
    int status;                      //状态
    char phone[12];                  //手机号
    char addr[32];                   //地址
    char id_card[19];                //身份证
};
#endif // USER_H_INCLUDED

user.cpp

/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:user.cpp
*其他说明:无
*当前版本:V1.0
*作    者:满星辰
*完成日期:2015年7月17日
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <conio.h>
#include "user.h"
using namespace std;
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:inputpassw
 *功能描述:一位一位接受密码(ch),同时输出*号,保证密码全为数字且不全为0
 *输入参数:无
 *输出参数:无
 *返回值:完整的密码
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
int inputpassw()
{
    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;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:setUser(int acc, char nam[], int pw, double mon, int sta,char ph[],char id[],char ad[])
 *功能描述:将用户信息保存到对象中,账号,姓名,密码,余额,状态,手机号,身份证号,地址,一一对应
            输入:acc-账号、nam-姓名、pw-密码、mon-余额、sta-状态、ph[]-手机号、id[]-身份证号、ad[]-住址
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::setUser(int acc, char nam[], int pw, double mon, int sta,char ph[],char id[],char ad[])          //将用户数据保存到对象中
{
    account=acc;
    for(int i=0; i<20; ++i)
        name[i]=nam[i];
    password=pw;
    money=mon;
    status=sta;
    for(int i=0; i<12; ++i)
    {
        phone[i]=ph[i];
    }
    fflush(stdin); //清除键盘缓存区中已经有的输入
    for(int i=0; i<19; ++i)
    {
        id_card[i]=id[i];
    }
    fflush(stdin); //清除键盘缓存区中已经有的输入
    for(int i=0; i<32; ++i)
    {
        addr[i]=ad[i];
    }
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:passwordIsRight
 *功能描述:判断输入的密码(iPass)是否正确。密码错误三次,账号自动冻结
 *输入参数:无
 *输出参数:无
 *返回值:密码正确返回true,密码错误三次后返回false
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
bool User::passwordIsRight()
{
    int i=0;
    int iPass;
    bool right=false;
    for(; i<3; ++i)
    {
        cout<<"输入密码:";
        iPass=inputpassw();
        if(iPass==password)
        {
            right = true;
            break;
        }
        else
            cout<<"输入密码错误!"<<endl;
    }
    if(i==3&&right==false)
    {
        cout<<"密码错误三次,该账户自动冻结"<<endl;
        status=3;
    }
    return right;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showName
 *功能描述:输出用户姓名
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::showName()
{
    cout<<"用户名:"<<name<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showMoney
 *功能描述:输出账户余额,提示字符
 *输入参数:提示字符
 *输出参数:账户余额,提示字符
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::showMoney(string xs)
{
    cout<<xs<<money<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showph
 *功能描述:输出用户手机号
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::showph()
{
    cout<<"预留手机号:"<<phone<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showid
 *功能描述:输出用户身份证号
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::showid()
{
    cout<<"身份证号:"<<id_card<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:showad
 *功能描述:输出用户家庭住址
 *输入参数:无
 *输出参数:无
 *返回值:无
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
void User::showad()
{
    cout<<"家庭住址:"<<addr<<endl;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:isNormalUser
 *功能描述:判断用户是否处于正常状态,是则返回true,如不是则返回false,根据不同状态进行提示
            不是正常状态,则输出对应状态:1-挂失、2-销户、3-冻结
 *输入参数:无
 *输出参数:无
 *返回值:状态正常返回true or 状态不正常返回false
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
bool User::isNormalUser()
{
    bool normal = true;
    if(status!=0)
    {
        normal = false;
        if(status==3)
            cout<<"该账户处于冻结状态,不能继续操作..."<<endl;
        else
            cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能继续操作..."<<endl;
    }
    return normal;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:operator<<(ostream &out, User &u)
 *功能描述:输出用户数据:
            账号、姓名、密码、余额、状态、手机号、身份证号、地址
 *输入参数:无
 *输出参数:无
 *返回值:out
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
ostream& operator<<(ostream &out, User &u)
{
    out<<u.account<<'\t'<<u.name<<'\t'<<u.password<<'\t'<<u.money<<'\t'<<u.status<<'\t'<<u.phone<<'\t'<<u.id_card<<'\t'<<u.addr;
    return out;
}
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:operator>>(istream &in, User &u)
 *功能描述:输入用户数据:
            账号、姓名、密码、余额、状态、手机号、身份证号、地址
 *输入参数:无
 *输出参数:无
 *返回值:in
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
istream& operator>>(istream &in, User &u)
{
    in>>u.account>>u.name>>u.password>>u.money>>u.status>>u.phone>>u.id_card>>u.addr;
    return in;
}

staff.h

/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:staff.h
*其他说明:无
*当前版本:V1.0
*作    者:满星辰
*完成日期:2015年7月17日
*/
#ifndef STAFF_H_INCLUDED
#define STAFF_H_INCLUDED
#include <iostream>
#include <cmath>
using namespace std;
struct staffTatus
{
    string account;    //业务员账号
    int password;      //业务员密码
};
class Staff
{
public:
    bool pass(string sacc,int ps);      //判断业务员账号密码是否相符
private:
    staffTatus stafft;                  //定义一个业务员
};
#endif // STAFF_H_INCLUDED

staff.cpp

/*
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*
*文件名称:staff.cpp
*其他说明:无
*当前版本:V1.0
*作    者:满星辰
*完成日期:2015年7月17日
*/
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include "staff.h"
using namespace std;
/*
 *----------------------------------------------------------------------------------------------------------------------*
 *函数名称:pass(string sacc,int ps)
 *功能描述:打开业务员文件,每导入一次业务员的账号密码就进行一次判断,判断输入的账号密码是否和导入的账号密码一致
 *输入参数:sacc-业务员账号、ps-业务员密码
 *输出参数:无
 *返回值:业务员账号密码正确返回true or 业务员账号密码错误返回false,
 *说明:
 *----------------------------------------------------------------------------------------------------------------------*
 */
bool Staff::pass(string sacc,int ps)            //判断业务员账号密码是否相符
{
    bool judge=false;
    fstream infile("staff.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    while(!infile.eof())
    {
        infile>>stafft.account>>stafft.password;
        if(stafft.account==sacc&&ps==stafft.password)
        {
            judge=true;
            break;
        }
    }
    infile.close();
    return judge;
}

运行结果:

0-业务员登录

      登录错误三次,系统自动退出


1-开户测试

    示例1-正常开户
    示例2-两次密码输入不一致,开户失败
    示例3-开户存款低于50元,开户失败


2-销户测试

示例1-正常销户
示例2-处于销户状态的账户不得进行销户操作
示例3-处于挂失状态的账户不得进行销户操作
示例4-处于冻结状态的账户不得进行销户操作


3-存款测试

示例1-正常存款
示例2-处于销户状态的账户不得进行存款操作
示例3-处于冻结状态的账户不得进行存款操作
示例4-处于挂失状态的账户不得进行存款操作


4-取款测试

示例1-正常取款
示例2-处于销户状态的账户不得进行取款操作
示例3-处于冻结状态的账户不得进行取款操作
示例4-处于挂失状态的账户不得进行取款操作
示例5-账户密码错误3次,该账户自动冻结


5-查询测试

示例1-正常查询
示例2-处于销户状态的账户查询时不显示身份证号、手机号、家庭住址
示例3-处于冻结状态的账户查询时不显示身份证号、手机号、家庭住址
示例4-处于挂失状态的账户查询时不显示身份证号、手机号、家庭住址


6-转账测试

示例1-正常转账
示例2-转出账户余额时余额不足,转账失败
示例3-转入转出时如有冻结、挂失、销户状态的账户,转账失败


7-挂失测试



8-解挂测试



9-解冻测试


10-业务查询


11-修改个人信息


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值