实训项目银行储蓄系统

来源:互联网 发布:centos 6.5搭建lnmp 编辑:程序博客网 时间:2024/05/16 17:28

问题:

/*  * Copyright (c) 2015, 烟台大学计算机与控制工程学院  * All rights reserved.  * 文件名称:bank  * 作    者:郝俊宇   * 完成日期:2015年 7 月17 日  * 版 本 号:v1.0  * 问题描述:该银行储蓄系统是一个可以支持多名储户开户、存款、取款、转帐、改密、挂失、解挂、销户等功能的系统              该项目使用了对象的指针数组,扩充了原有的功能,用二进制的方式保存文件 */ 


代码:

main.cpp

/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:main.cpp*文件标识:无*内容摘要:主函数,进入银行界面*其他说明:无*当前版本:v1.0*作    者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include "bank.h"using namespace std;/************************************************功能描述:主函数,进入银行界面,开始工作*输入参数:无*输出参数:无*返回值:0*其他说明:无***********************************************/int main(){    cout<<"+----------------------+"<<endl;    cout<<"+   欢迎光临CSDN银行   +"<<endl;    cout<<"+----------------------+"<<endl;    if(pass())//pass()密码正确返回1,错误返回0    {        Bank b;//建立一个对象        b.work();//开始工作    }    return 0;}


bank.h

/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:bank.h*文件标识:无*内容摘要:银行类和用户类,还有业务员登录,显示菜单,由键盘输入密码等普通函数*其他说明:无*当前版本:v1.0*作    者:郝俊宇*完成日期:20150715**修改记录1:*修改日期:20150716*版本号:v1.0*修改人:HaoJunyu*修改内容:修改对象指针数组************************************************/#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 a,char *n,int p,char *id,char *add,double b,int s);//输入用户信息    void showName();//显示姓名    void showBalance();//显示余额    bool passwordisright();//判断密码是否正确,正确返回true    bool isnormaluser();//判断用户账号是否正常,正常返回true    friend class Bank;private:    int account;//账号    int password;//密码    char name[20];//名字    char ID[18];//身份证号    char address[20];//家庭住址    double balance;//余额    int status;//状态 0-正常,1-开户,2-销户};class Bank{public:    Bank();//从文件中读取数据    ~Bank();//将数据存到文件中    void work();//登录    void openaccount();//开户    void closeaccount();//销户    void addmoney();//存款    void cutmoney();//取款    void showaccount();//查询    void transfraccount();//转账    void reportofloss();//挂失    void cancelofloss();//解挂    void changepassword();//改密    int getUser();//输入账号查询用户,返回用户在数组中的下标    void openfile();//用二进制读取文件    void savefile();//用二进制保存数据存到文件中private:    int N;//实际的用户数目    User *users[upNum];//对象指针数组};int pass();//业务员登录int choosemenu();//显示菜单,选择业务int inputpassword();//键盘输入密码#endif // BANK_H_INCLUDED


work.cpp

/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:work.cpp*文件标识:无*内容摘要:业务员登录银行系统,从文件中读取业务员的信息,登录后的菜单显示,输入密码等功能*其他说明:无*当前版本:v1.0*作    者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include <fstream>#include <conio.h>//使用getch()#include <cstdlib>#include <cstring>#include <ctype.h>//使用isdigit(ch),字符串处理#include "bank.h"using namespace std;/************************************************功能描述:业务员登录*输入参数:输入业务员姓名,密码*输出参数:如果密码正确将显示菜单,三次密码错误将退出*返回值:密码正确返回1,错误返回0*其他说明:从文件中读取业务员信息,判断从文件中输出的业务员信息和业务员输入的信息是否相同,密码输错三次将退出***********************************************/int pass()//业务员登录{    char ynameinfile[20];//由文件读取业务员姓名    char ypasswordinfile[20];//文件中保存的业务员的密码    ifstream infile("password.txt",ios::in);    if(!infile)    {        cout<<"password file can not open!"<<endl;        exit(1);    }    infile>>ynameinfile>>ypasswordinfile;    infile.close();    char yname[20];//业务员登录是输入的用户名    char ypassword[20];//业务员登录时输入的密码    char ch;    int itry=3;//进入系统后可尝试输入密码的次数    int right=0;//要返回的结果0-不正确1-正确    //密码输错三次将退出    do    {        cout<<"请输入业务员用户名:";        cin>>yname;        cout<<"请输入密码:";        int j=0;        while((ch=getch())!='\r')//输入字符不显示在屏幕上        {            ypassword[j++]=ch;            putchar('*');//每输入一个字符,显示一个*        }        ypassword[j]='\0';        fflush(stdin);//为避免键盘缓存区中未读出的字符影响程序,清除输入缓存区        cout<<endl;        if(strcmp(ypassword,ypasswordinfile)==0&&strcmp(yname,ynameinfile)==0)        {            right=1;            break;//用户名和密码正确,退出程序,返回1        }        else        {            itry--;            if(itry>0)            {                cout<<"用户名或密码错误!"<<endl;                cout<<"输错三次将退出,你还可以尝试"<<itry<<"次!"<<endl;            }            else                cout<<"对不起,密码输错三次,你不能进入系统!"<<endl;        }    }    while(itry);    return right;}/************************************************功能描述:选择菜单*输入参数:输入要操作功能的序号*输出参数:无*返回值:功能序号*其他说明:无***********************************************/int choosemenu(){    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;}/************************************************功能描述:输入密码*输入参数:输入密码但不显示出来,只显示**输出参数:**返回值:密码*其他说明:无***********************************************/int inputpassword(){    char ch;//输入的字符串密码    int password=0;//将输入的字符串密码转换成数字    int i;    while(1)    {        for(i=0; i<6; i++)        {            ch=getch();//输入但不显示            putchar('*');//输出*            if(isdigit(ch))//判断字符串里的数字是否为0-9            {                password=password*10+(ch-'0');//将字符转换成数字            }            else            {                password=0;                break;            }        }        fflush(stdin);//清楚键盘中已经有的输入        cout<<endl;        if(password==0)        {            cout<<"密码要求全为数字,且不能为0!"<<endl;            cout<<"请重新输入密码:";        }        else            break;    }    return password;}


user.cpp

/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:user.cpp*文件标识:无*内容摘要:用户类的成员函数,包括输入用户信息,显示姓名,显示余额,判断密码是否正确,判断用户是否正常*其他说明:无*当前版本:v1.0*作    者:郝俊宇*完成日期:20150715**修改记录1:无*修改日期:无*版本号:v1.0*修改人:HaoJunyu*修改内容:无************************************************/#include <iostream>#include "bank.h"using namespace std;/************************************************功能描述:输入用户信息*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void User::setUser(int a,char *n,int p,char *i,char *add,double b,int s){    account=a;    password=p;    strcpy(name,n);    strcpy(ID,i);    strcpy(address,add);    balance=b;    status=s;}/************************************************功能描述:显示姓名*输入参数:无*输出参数:输出用户姓名*返回值:无*其他说明:无***********************************************/void User::showName(){    cout<<"户主姓名:"<<name<<endl;}/************************************************功能描述:显示余额*输入参数:无*输出参数:输出余额*返回值:无*其他说明:无***********************************************/void User::showBalance(){    cout<<balance<<"元"<<endl;}/************************************************功能描述:判断密码是否正确*输入参数:无*输出参数:判断密码是否正确*返回值:正确返回true,错误返回false*其他说明:无***********************************************/bool User::passwordisright(){    int password1;    bool right=true;    cout<<"输入密码:";    password1=inputpassword();    if(password1!=password)    {        right=false;        cout<<"输入密码错误,不能继续操作!"<<endl;    }    return right;}/************************************************功能描述:判断用户账号是否正常*输入参数:无*输出参数:输出用户是否正常*返回值:正常返回true,否则返回false*其他说明:无***********************************************/bool User::isnormaluser(){    bool normal=true;    if(status!=0)//0是正常    {        normal=false;        if(status==1)            cout<<"该账户处于挂失状态,不能继续操作!"<<endl;        if(status==2)            cout<<"该账户处于销户状态,不能继续操作!"<<endl;    }    return normal;}


bank.cpp

/***********************************************版权所有 (C)2015,HaoJunyu*文件名称:bank.cpp*文件标识:无*内容摘要:银行类的成员函数,包括从文件中读取数据,往文件中保存数据,柜台业务中的开户,销户,存款,取款,查询,转账,挂失,解挂,改密*其他说明:无*当前版本:v1.0*作    者:郝俊宇*完成日期:20150715**修改记录1:*修改日期:20150716*版本号:v1.0*修改人:HaoJunyu*修改内容:修改对象指针数组************************************************/#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;//账号    char na[20];//用户名    int pass;//密码    char id[18];//身份证号   char add[20];//家庭住址    double ba;//余额    int sta;//状态    while(infile>>acc>>na>>pass>>id>>add>>ba>>sta)//读取成功后    {        users[i]=new User;        users[i]->setUser(acc,na,pass,id,add,ba,sta);        i++;        openfile();    }    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]->ID<<" ";        outfile<<users[i]->address<<" ";        outfile<<users[i]->balance<<" ";        outfile<<users[i]->status<<" ";        outfile<<endl;        savefile();    }    outfile.close();}/************************************************功能描述:用二进制读取文件*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::openfile(){    ifstream infile("account.txt",ios::in);    if(!infile)    {        cerr<<"can not open ascii file!"<<endl;        exit(1);    }    int i;    for(i=0; i<N; ++i)    {        infile.read((char*)&users[i],sizeof(User));    }    infile.close();}/************************************************功能描述:用二进制保存文件*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::savefile(){    int i;    ofstream binaryFile("erjinzhi.txt",ios::out|ios::binary);    if(!binaryFile)    {        cerr<<"can not open binary file!"<<endl;        exit(1);    }    else        for(i=0; i<N; ++i)        {            binaryFile.write((char*)&users[i],sizeof(User));        }    binaryFile.close();    return;}/************************************************功能描述:办理业务,根据输入的序号选择功能*输入参数:无*输出参数:无*返回值:无*其他说明:无***********************************************/void Bank::work(){    int i;//用于选择功能    do    {        i=choosemenu();//从菜单中获取功能序号        switch(i)        {        case 1:            openaccount();//开户            break;        case 2:            closeaccount();//销户            break;        case 3:            addmoney();//存款            break;        case 4:            cutmoney();//取款            break;        case 5:            showaccount();//查询            break;        case 6:            transfraccount();//转账            break;        case 7:            reportofloss();//挂失            break;        case 8:            cancelofloss();//解挂            break;        case 9:            changepassword();//改密            break;        case 0:            cout<<"欢迎您再来!"<<endl;        }    }    while(i);}/************************************************功能描述:开户*输入参数:输入用户信息*输出参数:开户是否成功*返回值:无*其他说明:只要保证银行用户没有达到上限就行,然后就是正常开户,开户要确保两次密码相同,否则开户失败***********************************************/void Bank::openaccount(){    if(N==upNum)    {        cout<<"银行用户数已经达到上限,不能再开户";        return ;    }//正常办理开户    int acc;//账号    char na[20];//用户名    int pass;//密码    char id[18];//身份证号    char add[20];//家庭住址    double ba;//余额    int sta;//状态    cout<<"正在开户"<<endl;    acc=10001+N;    cout<<"账号:"<<acc<<endl;    cout<<"用户姓名:";    cin>>na;    int password1,password2;    cout<<"密码:";    password1=inputpassword();//输入密码    cout<<"确认密码:";    password2=inputpassword();//确认密码    if(password1==password2)    {        pass=password1;        sta=0;//账户状态正常        cout<<"身份证号:";        gets(id);        cout<<"住址:";        gets(add);        cout<<"存入金额:";        cin>>ba;        users[N]=new User;        users[N]->setUser(acc,na,pass,id,add,ba,sta);        N++;//正常用户增加1        cout<<"开户成功!"<<endl;    }    else    {        cout<<"两次密码不一致,开户未成功!"<<endl;    }}/************************************************功能描述:销户*输入参数:无*输出参数:判断是否销户成功*返回值:无*其他说明:首先要保证该账户存在,其次是密码正确,最后是注销,注销又分三种情况:1.正常注销 2.账号在挂始中暂时不能注销 3.账号已经注销,不能再次注销***********************************************/void Bank::closeaccount(){    int j;//查找该账号在数组中对应的下标    j=getUser();//根据账号查询用户,返回用户下标    if(j>=0)//说明账号存在    {        users[j]->showName();//显示用户名        if(users[j]->passwordisright())//判断密码是否正确        {            if(users[j]->status==2)//用户已经注销            {                cout<<"该账户已经注销,本次操作失败!"<<endl;            }            if(users[j]->status==1)//用户正在挂失中            {                cout<<"该账户正在挂失中,请解挂后再注销!"<<endl;            }            if(users[j]->status==0)//用户正常            {                cout<<"余额:";                users[j]->showBalance();//显示余额                cout<<"确认销户(y/n)?";                if(tolower(getchar())=='y')//判断输入的字符是否等于y                {                    cout<<"取款";                    users[j]->showBalance();//显示余额                    cout<<"销户成功!"<<endl;                    users[j]->balance=0;//取款后余额为0                    users[j]->status=2;//状态变为注销                }                else                {                    cout<<"你取消了操作,销户失败!"<<endl;                }                fflush(stdin);//清除getchar()在键盘中的缓存遗留,以免影响后续操作            }        }    }    return ;}/************************************************功能描述:存款*输入参数:存款额*输出参数:存款是否成功*返回值:无*其他说明:首先账号要存在,其次是存款又分三种情况:1.该账户正常存款 2.该账户正在挂失中不能存款 3.该账户已经注销不能存款***********************************************/void Bank::addmoney(){    int i;    double money;    i=getUser();//根据账号查询用户下标    if(i>=0)//说明账户存在    {        if(users[i]->status==0)//用户正常        {            users[i]->showName();//显示姓名            cout<<"存款额:";            cin>>money;            users[i]->balance=users[i]->balance+money;            cout<<"现余额共计";            users[i]->showBalance();//显示余额            cout<<"存款成功!"<<endl;        }        else if(users[i]->status==1)//用户正在挂失中        {            cout<<"该用户正处于挂失状态,存款失败!"<<endl;        }        else        {            cout<<"该用户已经注销,存款失败!"<<endl;        }    }    return;}/************************************************功能描述:取款*输入参数:取款额*输出参数:是否取款成功*返回值:无*其他说明:首先要保证账号存在,其次是密码正确,最后是取款分三种情况:1.该账户正常取款 分两种情况:余额不足和余额充足2.该账户在挂失中不能存款 3.该账户已经注销,存款失败***********************************************/void Bank::cutmoney(){    int i;    double money;    i=getUser();//根据账号查询用户,返回用户的下标    if(i>=0)//账户要存在    {        if(users[i]->isnormaluser())//用户处在正常状态        {            users[i]->showName();//显示姓名            if(users[i]->passwordisright())//密码要正确            {                cout<<"取款额:";                cin>>money;                if(money>users[i]->balance)//余额要足够                {                    cout<<"余额不足,取款失败!"<<endl;                }                else                {                    users[i]->balance=users[i]->balance-money;                    cout<<"取款后还有";                    users[i]->showBalance();//显示余额                }            }        }    }    return;}/************************************************功能描述:查询,显示所有信息*输入参数:无*输出参数:输出查询结果*返回值:无*其他说明:无***********************************************/void Bank::showaccount(){    int i;    string sta[3]= {"正常","挂失","已经注销"};    i=getUser();//根据账号查询用户,返回用户的下标    if(i>=0)    {        users[i]->showName();//显示姓名        if(users[i]->passwordisright())//判断密码是否正确        {            cout<<"余额:";            users[i]->showBalance();//显示余额            cout<<"当前状态:"<<sta[users[i]->status]<<endl;            cout<<"身份证号:"<<users[i]->ID<<endl;            cout<<"住址:"<<users[i]->address<<endl;            cout<<"查询完毕!"<<endl;        }    }    return ;}/************************************************功能描述:转账*输入参数:需要转账的金额*输出参数:判断是否转账成功*返回值:无*其他说明:首先两个用户都要存在,其次转出账号要正常,密码要正确,最后是转账分两种情况:一.余额不足,转账失败二.余额充足,分三种情况:1.转入账号正常,顺利转账 2.转入账号正在挂失,不能转账 3.转入账号已经注销,转账失败***********************************************/void Bank::transfraccount(){    int out,in;    double money;    cout<<"转出";    out=getUser();//根据账号查询用户,返回用户的下标    if(out>=0)//说明账户存在    {        if(users[out]->isnormaluser())//判断转出账号是否正常        {            users[out]->showName();//显示姓名            if(users[out]->passwordisright())//判断转出账号密码是否正确            {                cout<<"转账金额:";                cin>>money;                if(money>users[out]->balance)//余额不足                    cout<<"余额不足,转账失败!"<<endl;                else                {                    cout<<"转入";                    in=getUser();//根据账号查询用户,返回用户的下标                    if(in>=0)//说明账户存在                    {                        if(users[in]->status==0)//转入账号正常                        {                            users[out]->balance=users[out]->balance-money;//转出后的余额                            users[in]->balance=users[in]->balance+money;//转入后的余额                            cout<<"转账成功!余额";                            users[out]->showBalance();//显示转出后的余额                        }                        else if(users[in]->status==1)//转入用户正在挂失中                        {                            cout<<"转入账号正在挂失,请暂时不要转账!"<<endl;                        }                        else                        {                            cout<<"该账户已经注销,转账失败!"<<endl;                        }                    }                }            }        }    }    return ;}/************************************************功能描述:挂失*输入参数:无*输出参数:判断账号是否挂失成功*返回值:无*其他说明:首先用户要存在,其次密码要正确,最后挂失分三种情况 :1.该用户处在正常状态 2.该用户正在挂失 3.该用户已经注销***********************************************/void Bank::reportofloss(){    int i;    i=getUser();//根据账号查询用户,返回用户的下标    if(i>=0)//说明账户存在    {        users[i]->showName();//显示姓名        if(users[i]->passwordisright())//判断密码是否正确        {            if(users[i]->status==0)//用户正常            {                users[i]->status=1;//因为要挂失,所以用户要从0变为1                cout<<"挂失成功!"<<endl;            }            else if(users[i]->status==1)//用户正在挂失中            {                cout<<"该账户正处于挂失状态!"<<endl;            }            else            {                cout<<"该账户已经注销,不能挂失!"<<endl;            }        }    }    return ;}/************************************************功能描述:解挂*输入参数:无*输出参数:判断账号是否解挂成功*返回值:无*其他说明:首先该用户要存在,其次密码要正确,最后解挂要分三种情况:1.该用户正常不需要解挂2.该用户已经挂失,可以正常解挂3.该用户已经注销,操作失败***********************************************/void Bank::cancelofloss(){    int i;    i=getUser();//根据账号查询用户,返回用户的下标    if(i>=0)//说明账户存在    {        users[i]->showName();//显示姓名        if(users[i]->passwordisright())//判断密码是否正确        {            if(users[i]->status==0)//用户正常            {                cout<<"该账户处于正常状态,不需要解除挂失"<<endl;            }            else if(users[i]->status==1)//用户正在挂失中            {                users[i]->status=0;//因为要解除挂失,所以状态要从1变为0                cout<<"解除挂失成功"<<endl;            }            else            {                cout<<"该账户已销户,操作无效"<<endl;            }        }    }    return ;}/************************************************功能描述:改密*输入参数:想要修改的密码,以及确认修改的密码*输出参数:判断密码是否修改成功*返回值:无*其他说明:首先用户要存在,其次密码要正确,最后改密分三种情况:1.该用户正常可以改密2.该用户正在挂失不能改密3.该用户已经注销,操作失败***********************************************/void Bank::changepassword(){    int i;    int password1,password2;    i=getUser();//根据账号查询用户,返回用户的下标    if(i>=0)//用户要存在    {        users[i]->showName();//显示姓名        if(users[i]->passwordisright())//密码要正确        {            if(users[i]->status==0)//用户正常            {                cout<<"新密码:";                password1=inputpassword(); //输入密码1                cout<<"确认密码:";                password2=inputpassword();//输入密码2                if(password1==password2)//输入的新密码要和确认的密码相同                {                    users[i]->password=password1;//用户密码变为新密码                    cout<<"修改成功!"<<endl;                }                else                {                    cout<<"两次密码不相同,修改失败!"<<endl;                }            }            if(users[i]->status==1)//用户正在挂失中            {                cout<<"该账户正在挂失中,请解挂后再改密码!"<<endl;            }            if(users[i]->status==2)//用户已经注销            {                cout<<"该账户已经注销,操作失败!"<<endl;            }        }    }    return ;}/************************************************功能描述:输入账号查询用户在数组中的下标*输入参数:要查找的账号*输出参数:是否找到要查找的参数*返回值:如果为负数则是没有找到该账号,如果返回一个正数则是找到对应的账号*其他说明:二分查找查找失败返回一个负数***********************************************/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;//那么最大的值为中间一个用户账号-1        else            low=mid+1;//如果中间一个用户的账号小于输入的账号,那么最小值为中间用户账号+1    }    if(index<0)        cout<<"该用户不存在,操作失败!"<<endl;    return index;//如果找到了index在0-N-1之间,没有找到index=-1;}


编译通过:

 

运行结果:

password文件夹内容截图:

account文件夹内容截图:

account运行后内容截图:

0 0
原创粉丝点击