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-修改个人信息
相关文章推荐
- C/C++程序设计05(泛型编程、容器、STL)
- C++课程实训——银行系统
- c++课程实训 银行储蓄系统
- <2015年大一C++实训项目>银行储蓄系统
- C++11的一些功能
- 【STL】C++使用STL处理替换字符串操作。
- 黑马程序员-C语言基础知识-流程控制
- C++ 全局对象构造和析构
- ##..C++程序设计项目实训——银行储蓄系统
- 转:关于C++ const 的全面总结
- VC++中MCI播放音频文件 【转】
- firefox浏览器调用C++编写的ocx的方法
- NULL和nullptr和nil和Nil还有NSNull
- C++中的delete浅析
- 用c语言编写身份证号码是否合法
- C++面试知识点总结
- Manacher算法-求字符串中最长回文串
- AC自动机应用 多模式匹配 多个单词在文章中出现的次数-C语言实现
- 【c++】模拟实现boost库里的scoped_ptr
- [C++] Excel文件读写