银行系统项目设计

/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include "bank.h"
using namespace std;
/*主函数:*/
int main()
{
    cout<<"+----------------------+\n";
    cout<<"+    欢迎光临CSDN银行  +\n";
    cout<<"+----------------------+\n";
    Bank b;
    if (pass())
    {
        Bank b;
        b.work();
    }
    return 0;
}

/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
using namespace std;
const int upNum=2000; //系统最多容纳的用户数
class Bank;
class User
{
public:
    void setUser(int acc, string nam, int pw, double bal,int sta,string add,string sf);
    void showName();
    void showAddress();
    void showSfzh();
    void showBalance(string prompt); //显示余额,前面加上提示词prompt
    bool passwordIsRight();   //校验密码,输入的密码正确则返回true
    bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
    friend class Bank;   //将Bank声明为友元类,方便其访问数据成员
private:
    string address;
    string sfzh;
    int account; //账号
    int password;  //密码
    string name;   //用户名
    double balance;  //账户余额
    int status;  //状态 0-正常  1-挂失  2-销户

};

class Bank
{
public:
    Bank();  //开始前从文件中读数据,存在数组中
    ~Bank();   //程序结束前,将数组中的数据写入到文件中
    void work();  //业务驱动
    void openAccount(); //开户
    void cancelAccount();  //注销账户
    void save();   //存款
    void withdraw();   //取款
    void showAccount(); //查询余额
    void transferAccounts();  //转账
    void reportLoss();  //挂失
    void cancelLoss();  //解除挂失
    void updatePassword();   //更改密码
    int getUser();  //输入账号查询用户,返回用户在对象数组中的下标
    int js();
    void openfile();//从文件中读取数据
    void savefile();//保存数据
private:
    int N;  //实际的用户数目
    User *users;  //加分项目:动态数组
};

int pass();  //业务员登录
int chooseInMenu(); //显示菜单并由业务员选择
int inputPassword();   //返回键盘输入的密码

#endif // BANK_H_INCLUDED

/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:bank.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:构造函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "bank.h"
#include <ctype.h>
using namespace std;


/*
功能:用构造函数读取文件中保存的业务数据
*/
Bank::Bank()
{
    /*ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    N=i;
    users=new User[N];
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {

        users[i].setUser(acc,nam,pw,bal,sta,add,sf);
        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 ].status<<" ";
        outfile<<users[i].address<<" ";
        outfile<<users[i].sfzh<<" ";
        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].status<<endl;
    }
    outfile.close();].status<<endl;
    }
    outfile.close();*/

}
/*********************************************************
* 功能描述:打开account文件函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

void Bank::openfile()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    N=js();
    users=new User[N+1];
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {

        users[i].setUser(acc,nam,pw,bal,sta,add,sf);
        ++i;
    }
    //N = i; //用静态数据成员
    infile.close();
}
/*********************************************************
* 功能描述:保存account文件函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

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);
    }
    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].status<<" ";
        outfile<<users[i].address<<" ";
        outfile<<users[i].sfzh<<endl;
    }
    outfile.close();
    //delete []users;
}
/*********************************************************
* 功能描述:动态数组,用JS()函数使每次业务一直进行
* 输入参数:输入账号,姓名,密码,状态,地址,身份证号
* 输出参数:
* 返回值:i,i+=1000;
* 其它说明:无
************************************************************/

int Bank:: js()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {
        i++;
    }
    infile.close();

    return i;
}

/*********************************************************
* 功能描述:业务办理
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:菜单选择,0时推出循环
************************************************************/


*/
void Bank::work()
{
    int iChoice;   //用于选择系统功能
    //办理业务
    do
    {
        openfile();
        iChoice = chooseInMenu();  //从菜单中获得功能代码
        //users=new User[N+1];
        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 0:
            cout<<"欢迎您再来. "<<endl;
        }
        savefile();
    }
    while(iChoice);
}

/*********************************************************
* 功能描述:开户
* 输入参数:户主姓名,密码,身份证号,家庭住址
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

void Bank::openAccount()
{

    //下面正常办理开户业务
    // users=new User[N+1];
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//住址
    string sf;//身份证号
    cout<<"正在开户"<<endl;
    acc=10001+N;
    cout<<"账号:"<<acc<<endl;
    cout<<"户主姓名:";
    cin>>nam;
    cout<<"身份证号:";
    cin>>sf;
    cout<<"家庭住址:";
    cin>>add;
    int iPass1, iPass2;
    cout<<"密码:";
    iPass1=inputPassword();  //输入密码1
    cout<<"确认密码:";
    iPass2=inputPassword();  //输入密码2
    cout<<"地址:"<<add<<endl;//怎么没有显示
    //cin>>add;但是我明明保存了地址信息在文本
    if(iPass1==iPass2)
    {
        pw=iPass1;
        sta=0; //账户状态为“正常”
        cout<<"存入金额:";
        cin>>bal;

        users[N].setUser(acc, nam, pw, bal, sta,add,sf);
        N++; //正式用户数增加1,确认了新用户已经加入
        cout<<"成功开户!"<<endl;
    }
    else
    {
        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;  //状态变为注销
            }
            else
            {
                cout<<"你取消了操作,销户失败!"<<endl;
            }
            fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作
        }
    }
}

/*********************************************************
* 功能描述:存款
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证账户存在,且处于正常状态
************************************************************/

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("存款后,您有");
        }
        else if(users[who].status==1)
        {
            cout<<"该用户处于挂失状态,存款失败!"<<endl;
        }
        else
        {
            cout<<"该用户已经销户,存款失败!"<<endl;
        }
    }
    return;
}


/*********************************************************
* 功能描述:取款
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证账户存在,且处于正常状态,另外,余额要足够取
************************************************************/

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)  //亲,不玩透支
                {
                    cout<<"余额不足,取款失败!"<<endl;
                }
                else
                {
                    users[who].balance-=money;
                    users[who].showBalance("取款后,还有");
                }
            }
        }

    }
    return;
}


/*********************************************************
* 功能描述:查询账户
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:显示账户信息
************************************************************/

void Bank::showAccount()
{
    int who;
    string sta[3]= {"正常","挂失","已经销户"};
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            users[who].showBalance("余额");
            cout<<"状态:"<<sta[users[who].status]<<endl;
        }
    }
    return;
}


/*********************************************************
* 功能描述:转账
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
************************************************************/

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)  //亲,不玩透支
                {
                    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("转账后,您还有");
                        }
                    }
                }
            }
        }
    }
    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;
                cout<<"挂失成功"<<endl;
            }
            else if(users[who].status==1)
            {
                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)
            {
                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)   //说明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;
            }
            else
            {
                cout<<"两次输入不同,修改失败!"<<endl;
            }
        }
    }
    return;
}

/*
功能:
入口参数:
返回值:
说明:
  由账号自动产生,使按账号有序,本模块采用二分查找
*/
/*********************************************************
* 功能描述:输入账号查询用户,返回用户在数组中的下标
* 输入参数:要查询用户的账号
* 输出参数:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)
* 返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-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
}

/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:user.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:构造函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include "bank.h"
using namespace std;

void User::setUser(int acc, string nam, int pw, double bal,int sta,string add,string sf)
{
    account=acc;
    password=pw;
    name=nam;
    balance=bal;
    status=sta;
    address=add;
    sfzh=sf;
}
/*********************************************************
* 功能描述:显示户主姓名
* 输入参数:
* 输出参数:户主姓名
* 返回值:
* 其它说明:无
************************************************************/

}

void User::showName()
{
    cout<<"户主姓名:"<<name<<endl;
}
/*********************************************************
* 功能描述:显示户主地址
* 输入参数:
* 输出参数:住址
* 返回值:
* 其它说明:无
************************************************************/
void User::showAddress()
{
    cout<<"地址:"<<address<<endl;
}
/*********************************************************
* 功能描述:显示户主身份证号
* 输入参数:
* 输出参数:身份证号
* 返回值:
* 其它说明:无
************************************************************/
void User::showSfzh()
{
    cout<<"身份证号:"<<sfzh<<endl;
}
/*********************************************************
* 功能描述:显示户主余额
* 输入参数:
* 输出参数:提示词Prompt和元
* 返回值:
* 其它说明:无
************************************************************/
void User::showBalance(string prompt)
{
    cout<<prompt<<" "<<balance<<" 元"<<endl;
}
/*********************************************************
* 功能描述:布尔函数,密码前后输入一样才能pass
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:返回真假0或1
************************************************************/
bool User::passwordIsRight()
{
    int iPass;
    bool right = true;
    cout<<"输入密码:";
    iPass=inputPassword();
    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;
}

#include <iostream>
/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:work.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;


}
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>

#include "bank.h"
using namespace std;
/*
功能:验证用户密码
返回值:密码正确,返回1;
        不能通过密码验证,返回0
*/
/*********************************************************
* 功能描述:判断能否读入文件
* 输入参数:输入业务员身份证号及业务员姓名密码
* 输出参数:
* 返回值:当业务员姓名及密码一致方可以进入银行操作系统
* 其它说明:关于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);清除输入缓存区
************************************************************/

int pass()
{
    char sNameInFile[20];   //由文件中读出的业务员用户名
    char sPassInFile[20];  //文件中保存的密码,这一版本中,用字符保存密码
    ifstream infile("password.txt",ios::in);
    if(!infile)
    {
        cout<<"password file cannot open!"<<endl;
        exit(1);
    }
    infile>>sNameInFile>>sPassInFile;
    infile.close();

    char sName[20];   //业务员登录时输入的用户名
    char sPass[20];  //业务员登录时输入的密码
    char sSfzh[20];//业务员登陆时输入的身份证号
    char ch;
    int iTry=3;   //进入系统时尝试的次数
    int right = 0;  //要返回的结果:0-不正确 1-正确

    //进入系统,密码三次不对将退出
    do
    {
        cout<<"请输入业务员身份证号:";
        cin>>sSfzh;
        cout<<"请输入业务员用户名:";
        cin>>sName;
        cout<<"请输入密码:";
        int i=0;
        while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
        {
            sPass[i++]=ch;
            putchar('*');   //接受任何字符,屏幕上只显示*
        }
        sPass[i]='\0';
        fflush(stdin);
        cout<<endl;;
        if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
        {
            right = 1;
            break;
        }
        else
        {
            iTry--;
            if(iTry>0)
                cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
            else
            {
                cout<<"对不起,你不能进入系统"<<endl;;
            }
        }
    }
    while(iTry);
    return right;
}
/*********************************************************
* 功能描述:显示菜单并由业务员选择
* 输入参数:
* 输出参数:
* 返回值:用户选择的功能,范围0-9
* 其它说明:无
************************************************************/
int 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<<"+                     0 退出 +"<<endl;
        cout<<"+----------------------------+"<<endl;
        cout<<"请输入操作指令:";
        cin>>i;
        if(i>=0 && i<=9)
            break;

/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include "bank.h"
using namespace std;
/*主函数:*/
int main()
{
    cout<<"+----------------------+\n";
    cout<<"+    欢迎光临CSDN银行  +\n";
    cout<<"+----------------------+\n";
    Bank b;
    if (pass())
    {
        Bank b;
        b.work();
    }
    return 0;
}


/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:main.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
using namespace std;
const int upNum=2000; //系统最多容纳的用户数
class Bank;
class User
{
public:
    void setUser(int acc, string nam, int pw, double bal,int sta,string add,string sf);
    void showName();
    void showAddress();
    void showSfzh();
    void showBalance(string prompt); //显示余额,前面加上提示词prompt
    bool passwordIsRight();   //校验密码,输入的密码正确则返回true
    bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
    friend class Bank;   //将Bank声明为友元类,方便其访问数据成员
private:
    string address;
    string sfzh;
    int account; //账号
    int password;  //密码
    string name;   //用户名
    double balance;  //账户余额
    int status;  //状态 0-正常  1-挂失  2-销户

};

class Bank
{
public:
    Bank();  //开始前从文件中读数据,存在数组中
    ~Bank();   //程序结束前,将数组中的数据写入到文件中
    void work();  //业务驱动
    void openAccount(); //开户
    void cancelAccount();  //注销账户
    void save();   //存款
    void withdraw();   //取款
    void showAccount(); //查询余额
    void transferAccounts();  //转账
    void reportLoss();  //挂失
    void cancelLoss();  //解除挂失
    void updatePassword();   //更改密码
    int getUser();  //输入账号查询用户,返回用户在对象数组中的下标
    int js();
    void openfile();//从文件中读取数据
    void savefile();//保存数据
private:
    int N;  //实际的用户数目
    User *users;  //加分项目:动态数组
};

int pass();  //业务员登录
int chooseInMenu(); //显示菜单并由业务员选择
int inputPassword();   //返回键盘输入的密码

#endif // BANK_H_INCLUDED


/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:bank.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:构造函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include <fstream>
#include <cstdlib>
#include "bank.h"
#include <ctype.h>
using namespace std;


/*
功能:用构造函数读取文件中保存的业务数据
*/
Bank::Bank()
{
    /*ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    N=i;
    users=new User[N];
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {

        users[i].setUser(acc,nam,pw,bal,sta,add,sf);
        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 ].status<<" ";
        outfile<<users[i].address<<" ";
        outfile<<users[i].sfzh<<" ";
        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].status<<endl;
    }
    outfile.close();].status<<endl;
    }
    outfile.close();*/

}
/*********************************************************
* 功能描述:打开account文件函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

void Bank::openfile()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    N=js();
    users=new User[N+1];
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {

        users[i].setUser(acc,nam,pw,bal,sta,add,sf);
        ++i;
    }
    //N = i; //用静态数据成员
    infile.close();
}
/*********************************************************
* 功能描述:保存account文件函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

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);
    }
    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].status<<" ";
        outfile<<users[i].address<<" ";
        outfile<<users[i].sfzh<<endl;
    }
    outfile.close();
    //delete []users;
}
/*********************************************************
* 功能描述:动态数组,用JS()函数使每次业务一直进行
* 输入参数:输入账号,姓名,密码,状态,地址,身份证号
* 输出参数:
* 返回值:i,i+=1000;
* 其它说明:无
************************************************************/

int Bank:: js()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<"open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//地址
    string sf;//身份证号
    while(infile>>acc>>nam>>pw>>bal>>sta>>add>>sf)   //当读取成功……
    {
        i++;
    }
    infile.close();

    return i;
}

/*********************************************************
* 功能描述:业务办理
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:菜单选择,0时推出循环
************************************************************/


*/
void Bank::work()
{
    int iChoice;   //用于选择系统功能
    //办理业务
    do
    {
        openfile();
        iChoice = chooseInMenu();  //从菜单中获得功能代码
        //users=new User[N+1];
        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 0:
            cout<<"欢迎您再来. "<<endl;
        }
        savefile();
    }
    while(iChoice);
}

/*********************************************************
* 功能描述:开户
* 输入参数:户主姓名,密码,身份证号,家庭住址
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

void Bank::openAccount()
{

    //下面正常办理开户业务
    // users=new User[N+1];
    int acc;   //账号
    string nam;   //姓名
    int pw;   //密码
    double bal;   //金额
    int sta;   //状态
    string add;//住址
    string sf;//身份证号
    cout<<"正在开户"<<endl;
    acc=10001+N;
    cout<<"账号:"<<acc<<endl;
    cout<<"户主姓名:";
    cin>>nam;
    cout<<"身份证号:";
    cin>>sf;
    cout<<"家庭住址:";
    cin>>add;
    int iPass1, iPass2;
    cout<<"密码:";
    iPass1=inputPassword();  //输入密码1
    cout<<"确认密码:";
    iPass2=inputPassword();  //输入密码2
    cout<<"地址:"<<add<<endl;//怎么没有显示
    //cin>>add;但是我明明保存了地址信息在文本
    if(iPass1==iPass2)
    {
        pw=iPass1;
        sta=0; //账户状态为“正常”
        cout<<"存入金额:";
        cin>>bal;

        users[N].setUser(acc, nam, pw, bal, sta,add,sf);
        N++; //正式用户数增加1,确认了新用户已经加入
        cout<<"成功开户!"<<endl;
    }
    else
    {
        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;  //状态变为注销
            }
            else
            {
                cout<<"你取消了操作,销户失败!"<<endl;
            }
            fflush(stdin);  //清除了getchar()时在键盘缓存中的遗留,以免影响后续操作
        }
    }
}

/*********************************************************
* 功能描述:存款
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证账户存在,且处于正常状态
************************************************************/

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("存款后,您有");
        }
        else if(users[who].status==1)
        {
            cout<<"该用户处于挂失状态,存款失败!"<<endl;
        }
        else
        {
            cout<<"该用户已经销户,存款失败!"<<endl;
        }
    }
    return;
}


/*********************************************************
* 功能描述:取款
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证账户存在,且处于正常状态,另外,余额要足够取
************************************************************/

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)  //亲,不玩透支
                {
                    cout<<"余额不足,取款失败!"<<endl;
                }
                else
                {
                    users[who].balance-=money;
                    users[who].showBalance("取款后,还有");
                }
            }
        }

    }
    return;
}


/*********************************************************
* 功能描述:查询账户
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:显示账户信息
************************************************************/

void Bank::showAccount()
{
    int who;
    string sta[3]= {"正常","挂失","已经销户"};
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].passwordIsRight())
        {
            users[who].showBalance("余额");
            cout<<"状态:"<<sta[users[who].status]<<endl;
        }
    }
    return;
}


/*********************************************************
* 功能描述:转账
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
************************************************************/

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)  //亲,不玩透支
                {
                    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("转账后,您还有");
                        }
                    }
                }
            }
        }
    }
    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;
                cout<<"挂失成功"<<endl;
            }
            else if(users[who].status==1)
            {
                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)
            {
                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)   //说明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;
            }
            else
            {
                cout<<"两次输入不同,修改失败!"<<endl;
            }
        }
    }
    return;
}

/*
功能:
入口参数:
返回值:
说明:
  由账号自动产生,使按账号有序,本模块采用二分查找
*/
/*********************************************************
* 功能描述:输入账号查询用户,返回用户在数组中的下标
* 输入参数:要查询用户的账号
* 输出参数:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)
* 返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-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
}


/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:user.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

/*********************************************************
* 功能描述:构造函数
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:无
************************************************************/

}
#include <iostream>
#include "bank.h"
using namespace std;

void User::setUser(int acc, string nam, int pw, double bal,int sta,string add,string sf)
{
    account=acc;
    password=pw;
    name=nam;
    balance=bal;
    status=sta;
    address=add;
    sfzh=sf;
}
/*********************************************************
* 功能描述:显示户主姓名
* 输入参数:
* 输出参数:户主姓名
* 返回值:
* 其它说明:无
************************************************************/

}

void User::showName()
{
    cout<<"户主姓名:"<<name<<endl;
}
/*********************************************************
* 功能描述:显示户主地址
* 输入参数:
* 输出参数:住址
* 返回值:
* 其它说明:无
************************************************************/
void User::showAddress()
{
    cout<<"地址:"<<address<<endl;
}
/*********************************************************
* 功能描述:显示户主身份证号
* 输入参数:
* 输出参数:身份证号
* 返回值:
* 其它说明:无
************************************************************/
void User::showSfzh()
{
    cout<<"身份证号:"<<sfzh<<endl;
}
/*********************************************************
* 功能描述:显示户主余额
* 输入参数:
* 输出参数:提示词Prompt和元
* 返回值:
* 其它说明:无
************************************************************/
void User::showBalance(string prompt)
{
    cout<<prompt<<" "<<balance<<" 元"<<endl;
}
/*********************************************************
* 功能描述:布尔函数,密码前后输入一样才能pass
* 输入参数:
* 输出参数:
* 返回值:
* 其它说明:返回真假0或1
************************************************************/
bool User::passwordIsRight()
{
    int iPass;
    bool right = true;
    cout<<"输入密码:";
    iPass=inputPassword();
    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;
}


#include <iostream>
/***********************************************************
* 版权所有(C)2015, 烟台大学计算机与控制工程学院
* All rights reserved.
*
* 文件名称:work.cpp
* 文件标识:无
* 内容摘要:该代码用于获取满足后缀要求的第一个文件
* 其它说明:无
* 当前版本:V1.0
* 作    者:范星月
* 完成日期:2015.7.17
*
* 修改记录:
* 修改日期:
* 版 本 号:V1.0
* 修 改 人:范星月
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;


}
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>

#include "bank.h"
using namespace std;
/*
功能:验证用户密码
返回值:密码正确,返回1;
        不能通过密码验证,返回0
*/
/*********************************************************
* 功能描述:判断能否读入文件
* 输入参数:输入业务员身份证号及业务员姓名密码
* 输出参数:
* 返回值:当业务员姓名及密码一致方可以进入银行操作系统
* 其它说明:关于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);清除输入缓存区
************************************************************/

int pass()
{
    char sNameInFile[20];   //由文件中读出的业务员用户名
    char sPassInFile[20];  //文件中保存的密码,这一版本中,用字符保存密码
    ifstream infile("password.txt",ios::in);
    if(!infile)
    {
        cout<<"password file cannot open!"<<endl;
        exit(1);
    }
    infile>>sNameInFile>>sPassInFile;
    infile.close();

    char sName[20];   //业务员登录时输入的用户名
    char sPass[20];  //业务员登录时输入的密码
    char sSfzh[20];//业务员登陆时输入的身份证号
    char ch;
    int iTry=3;   //进入系统时尝试的次数
    int right = 0;  //要返回的结果:0-不正确 1-正确

    //进入系统,密码三次不对将退出
    do
    {
        cout<<"请输入业务员身份证号:";
        cin>>sSfzh;
        cout<<"请输入业务员用户名:";
        cin>>sName;
        cout<<"请输入密码:";
        int i=0;
        while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
        {
            sPass[i++]=ch;
            putchar('*');   //接受任何字符,屏幕上只显示*
        }
        sPass[i]='\0';
        fflush(stdin);
        cout<<endl;;
        if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
        {
            right = 1;
            break;
        }
        else
        {
            iTry--;
            if(iTry>0)
                cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
            else
            {
                cout<<"对不起,你不能进入系统"<<endl;;
            }
        }
    }
    while(iTry);
    return right;
}
/*********************************************************
* 功能描述:显示菜单并由业务员选择
* 输入参数:
* 输出参数:
* 返回值:用户选择的功能,范围0-9
* 其它说明:无
************************************************************/
int 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<<"+                     0 退出 +"<<endl;
        cout<<"+----------------------------+"<<endl;
        cout<<"请输入操作指令:";
        cin>>i;
        if(i>=0 && i<=9)
            break;
        else
            cout<<"请重新选择功能"<<endl;;
    }
    return i;
}
/*********************************************************
* 功能描述:输入密码
* 输入参数:
* 输出参数:
* 返回值:整型的密码值
* 其它说明:技术说明:
(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数
(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数
(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入
附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符,本例仅作为参考
************************************************************/
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,或6位全0后正常退出for循环
        {
            cout<<"密码要求全为数字,且不能全0!"<<endl;;
            cout<<"请重新输入密码: ";
        }
        else
            break;
    }
    return iPass;
}











        else
            cout<<"请重新选择功能"<<endl;;
    }
    return i;
}
/*********************************************************
* 功能描述:输入密码
* 输入参数:
* 输出参数:
* 返回值:整型的密码值
* 其它说明:技术说明:
(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数
(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数
(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入
附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符,本例仅作为参考
************************************************************/
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,或6位全0后正常退出for循环
        {
            cout<<"密码要求全为数字,且不能全0!"<<endl;;
            cout<<"请重新输入密码: ";
        }
        else
            break;
    }
    return iPass;
}

运行截图:

 

加分截图1:

加分截图2:

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目名称:Bank Account Management System 银行账户管理系统 简称BAM 项目描述:这是一个基于C/S结构的银行账户在线管理系统,用户可以通过ATM终端界面来操作自己的银行账户. 项目实施方式:这是一个同步练习,随着达内CoreJava课程的深入,这个项目将趋于完整,学员的任务是随着知识点的深入,完成每一个进阶的项目要求. 项目一 练习1:(面向对象基础语法) 写一个账户类(Account),属性: id:账户号码 长整数 password:账户密码 name:真实姓名 personId:身份证号码 字符串类型 email:客户的电子邮箱 balance:账户余额 方法: deposit: 存款方法,参数是double型的金额 withdraw:取款方法,参数是double型的金额 构造方法: 有参和无参,有参构造方法用于设置必要的属性 练习2:(封装) 将Account类作成完全封装,注意:要辨别每个属性的set/get方法是否需要公开 练习3:(继承,多态) 银行的客户分为两类,储蓄账户(SavingAccount)和信用账户(CreditAccount),区别在于储蓄账户不允许透支,而信用账户可以透支,并允许用户设置自己的透支额度. 注意:CreditAccount需要多一个属性 ceiling 透支额度 为这两种用户编写相关的类 同时要求编写Bank类,属性: 1.当前所有的账户对象的集合,存放在数组中 2.当前账户数量 方法: 1.用户开户,需要的参数:id,密码,密码确认,姓名,身份证号码,邮箱,账户类型(int),返回新创建的Account对象 2.用户登录,参数:id,密码 返回Account对象,提示 用s1.equals(s2)判断s1和s2两个字符串内容是否相等 3.用户存款,参数:id,存款数额,返回修改过的Account对象 4.用户取款,参数:id,取款数额,返回修改过的Account对象 5.设置透支额度 参数:id,新的额度 ,返回修改过的Account对象.这个方法需要验证账户是否是信用账户 用户会通过调用Bank对象以上的方法来操作自己的账户,请分析各个方法需要的参数 另外,请为Bank类添加几个统计方法 1.统计银行所有账户余额总数 2.统计所有信用账户透支额度总数 写个主方法测试你写的类 项目二 练习4:(语言高级特性,三个修饰符) 1.修改Account类,银行用户的账号(id)是自动生成的,初始值为100000,第一个开户的用户id为100001,第二个为100002,依此类推. 提示:构造对象的时候采用static属性为id赋值 2.对于Account类,有两个方法,存款方法和取款方法,请修改这两个方法. 存款方法改为不允许子类修改 取款方法根据不同的子类而不同,因此,改为抽象方法,在两个子类中分别实现 3.将Bank类作成单例 项目三 练习5:(接口) 为SavingAccount和CreditAccount各自添加一个子类 LoanSavingAccount类:用户可以贷款,不可以透支 LoanCreditAccount类:用户可以贷款,可以透支 说明:贷款和透支是不一样的,透支指的是账户余额小于0,而贷款用户需要一个贷款额的属性. 在ATM机上,用户可以选择贷款,也可以选择还贷款,而还贷款就是要把账户余额上的资金转到贷款额上 例如:用户余额10000元,贷款额100000元,用户可以选择还款5000元,则用户余额变为5000,贷款额变为95000元. 利用接口来抽象出LoanSavingAccount类和LoanCreditAccount类的共性 接口中的方法: requestLoan:贷款 payLoan:还贷 getLoan:获取用户贷款总额 为Bank类添加三个方法, 贷款:参数 id,贷款额,返回修改过的Account对象 还贷款:参数 id,还款额,返回修改过的Account对象 统计所有账户贷款的总数 练习6:(Object) 为Account类及其子类添加toString方法和equals方法 项目四 练习7:(Exception) 为BAM添加几个异常类 BalanceNotEnoughException :用于取钱的时候余额不足的情况(包括账户余额超过透支额的情况) RegisterException:用于开户异常的情况,例如密码两次输入不一致等情况 LoginException:用户登录异常的情况,例如id错误,密码错误 LoanException:贷款额不能为负数,如果用户试图将贷款额置为负数,则会抛出这个异常 以上四个异常类有一个共同的父类 BusinessException 并妥善的处理这些异常 项目五 练习8:(集合) 改写Bank类,采用集合的方式来管理多个Account对象 为Bank类添加一个方法 打印所有用户的总资产排名 说明:一个用户可能会有多个账号,以身份证号为准.总资产指多个账户余额的总和,不需要考虑贷款账户的贷款额 项目六 练习9:(GUI) 为BAM添加用户界面 需要以下几个类: BAMClient 其中会包含一个Frame,这是用户主界面 MainPanel:主界面,用户可以选择开户或者登录 RegisterPanel:用户开户具体用到的界面 LoginPanel:用户登录需要的界面 BusinessPanel:界面上会显示账户的功能 至少包括存款和取款,对于可透支的用户,还允许用户修改透支额度,对于贷款用户,还允许用户贷款和还贷款 注:本练习的界面布局不做要求,请阅读现有代码,添加事件处理代码 提示:在开户或者登录之后都会跳到BusinessPanel,而用户点击了交易之后,界面停留在BusinessPanel 要随时注意在BusinessPanel上根据数据的变化更新显示信息 项目七 在该加资源保护的地方加上,没有标准 项目八 练习10:(I/O) 修改Bank类,账户信息会采用对象序列化的方式存放在文件中.当Bank对象生成的时候会读取文件,设置账户集合.当账户信息改变的时候,会随时更新文件 设计一个FileDAO类(文件数据访问对象),负责对文件的访问,包括存放账户,提取账户等方法,在Bank类中,会通过FileDAO对象来访问文件 注意:如果已有的账户对象会存在文件中,那么为新的账户对象分配id的做法也应相应的改变,过去的用static属性的做法不再合适,应该改为,把下一个可用的id存放在一个文件中,每创建一个新对象的时候都会读取这个文件,获得新对象的id,并且修改文件中的id,使其加1.这个工作可以放在Account类的构造方法中 项目九 练习11:(网络) 在现有的BAM中,用户是通过界面直接访问Bank对象的,将其改为C/S结构,由界面充当客户端,通过TCP协议访问服务器端的Bank对象. 提示:客户端和服务器端需要通过对象来传递信息,这里会使用对象序列化技术.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值