您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-17 14:35 447 查看



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-修改个人信息



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: