C++项目实训:银行储蓄系统
2015-07-18 13:44
471 查看
/*********************************************************** * 版权所有(C)2015, lishangze。 * * 文件名称:main.cpp * 文件标识:无 * 内容摘要:该代码用于获取满足后缀要求的第一个文件 * 其它说明:无 * 当前版本:V1.0 * 作 者:李尚泽 * 完成日期:2015/07/18 * * 修改记录: * 修改日期:2015/07/18 * 版本号:V1.0 * 修改人:Li Shangze * 修改内容:创建 **********************************************************/ #include <iostream> #include <iomanip> #include <windows.h> #include <cstring> #include <fstream> #include <cstdlib> #include <conio.h> #include <ctype.h> using namespace std; const int upnum=2000;//系统最多容纳用户数 class Bank;//声明 class User//用户类 { public: void setUser(int acc,string na,int pw,double mon,double bal,string id,int sta);//设置用户信息 void showName();//输出姓名信息 void showBalance(string prompt);//显示账户余额 bool passWordISRight();//判断密码是否正确 bool ISNormalUser();//存款,取款,转账等功能需要账户处于正常状态,判断账户是否处于正常状态 friend class Bank;//将Bank设为User的友元类 private: int account;//账号 int password;//密码 string name;//名字 double balance;//余额 double money;//未加利率的金额 string identificant;//身份证号 int status;//账户状态:0—正常,1—挂失,2—销户 }; class Bank//银行类 { public: Bank();//从文件中读取数据 ~Bank();//程序结束时将数据存入文件中 void work();//业务驱动 void openAccount();//开户 void cancelAccount();//销户 void save();//存款 void withdraw();//取款 void showAccount();//显示余额 void transferAccount();//转账 void reportLoss();//挂失 void canlelLoss();//解除挂失 void updatePassword();//修改密码 int getUser();//输入账号查询用户,返回用户在对象数组的下标 private: int N;//实际用户数目 static double rate;//利率 User users [upnum];//User数组 }; double Bank::rate=0.0225;//年利率 int pass();//业务员登录 int chooseInMenu();//显示菜单并由业务员选择 int inputPassword();//返回键盘输入的密码 int m=0;//记录明细业务
/********************************************************* * 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">从文件读取数据</span> * 返回值:0-成功 1-失败 ************************************************************/ Bank::Bank()//从文件读取数据 { ifstream infile("account.txt",ios::in); if(!infile) { cerr<<"open error!"<<endl; exit(1); } int i=0; int acc; int pw; string na; double bal; string id; int sta; double mon; while (infile>>acc>>na>>pw>>bal>>id>>sta) { users[i].setUser(acc,na,pw,mon,bal,id,sta); i++; } N=i; infile.close(); }
/********************************************************* * 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">向文件存入数据</span> * 返回值:0-成功 1-失败 ************************************************************/ 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].identificant<<" "; outfile<<users[i].status<<" "<<endl; } outfile.close(); }
<pre name="code" class="cpp">/********************************************************* * 功能描述:<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">启动工作系统</span> * 返回值:用户选择的各种功能 ************************************************************/void Bank::work()//启动工作系统{ int ichoice; system("cls"); do { ichoice=chooseInMenu(); switch(ichoice) { case 1: openAccount(); //开户 break; case 2: cancelAccount(); //销户 break; case 3: save(); //存款
break; case 4: withdraw(); //取款 break; case 5: showAccount(); //查余额 break; case 6: transferAccount(); //转账 break; case 7: reportLoss(); //挂失 break; case 8: canlelLoss(); //解除挂失 break; case 9: updatePassword(); //修改密码 break; case 0: cout<<"谢谢使用!"<<endl; Sleep(1000);
system("cls"); cout<<"+--------------------------+"<<endl; cout<<"1.开户 "<<"2 .销户"<<endl; cout<<"3.存钱 "<<"4 .取款"<<endl; cout<<"5.查询 "<<"6 .转账"<<endl; cout<<"7.挂失 "<<"8 .解挂"<<endl; cout<<"9.改密 "<<"10.退出"<<endl; cout<<"+--------------------------+"<<endl; break;
} } while(ichoice);}
<pre name="code" class="cpp">/********************************************************* * 功能描述:实现开户功能,由业务员输入各种信息,完成开户 ************************************************************/void Bank::openAccount()//实现开户功能{ if(N==upnum) { cout<<"银行用户数已达上限,无法开户!"<<endl; return; } int acc; int pw; string na; double mon; double bal; string id; int sta; int ipw1,ipw2; int year; acc=10001+N; Sleep(1000); cout<<"可以开户!"<<endl; acc=10001+N;
cout<<"请输入账号:"<<acc<<endl; cout<<"请输入用户名:"; cin>>na; cout<<"请输入身份证号:"; cin>>id; cout<<"请输入密码:"; ipw1=inputPassword(); cout<<"请再输一次:"; ipw2=inputPassword(); if(ipw1==ipw2) { pw=ipw1; sta=0; cout<<"存款金额:"; cin>>bal; ofstream outfile1("expence_record.txt",ios::app);
if(!outfile1) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile1<<acc<<" 存入 "<<acc<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" 元"<<endl; outfile1.close(); ofstream outfile2("account.txt",ios::app); if(!outfile2) { cerr<<"account.txt
file cannot open!"<<endl; exit(1); } outfile2<<acc<<" "<<na<<" "<<ipw1<<" "<<setiosflags(ios::fixed)<<setprecision(2)<<bal<<" "<<id<<" "<<sta<<endl; outfile2.close(); cout<<"请输入存入期限(年):"; cin>>year; double sum=bal+bal*double(year)*rate; cout<<"届时账户总额为:"; cout<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl;
users
.setUser(acc,na,pw,mon,sum,id,sta); N++; cout<<"开户成功!"<<endl; } else { cout<<"两次密码输入不一致,开户失败!"<<endl; }}
/********************************************************* * 功能描述:确认后销户,并取出余额,清楚内存缓冲区中的数据 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::cancelAccount()//实现销户功能 { int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].passWordISRight()) { users[who].showBalance("余额"); cout<<"确认销户(y/n)?"; if(tolower(getchar())=='y') { users[who].showBalance("销户成功!本次取款金额为:"); users[who].balance=0; users[who].status=2; } else { cout<<"您已取消此操作,销户失败!"<<endl; } fflush(stdin); //清理键盘缓存区已有的输入 } } }
/********************************************************* * 功能描述:实现存款的功能,计算利息,并显示届时账户总额 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::save()//实现存款功能 { int who,year; double money; who=getUser(); if(who>=0) { if(users[who].status==0) { users[who].showName(); if(users[who].passWordISRight()) { cout<<"请输入存款金额:"; cin>>money; ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile<<users[who].account<<" 存入 "<<users[who].account<<" " <<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl; outfile.close(); ifstream infile("expence_record.txt",ios::in); if(!infile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } cout<<users[who].account<<" 存入 "<<users[who].account<<" "<<setiosflags(ios::fixed) <<setprecision(2)<<money<<" 元"<<endl; infile.close(); cout<<"请输入存款期限(年):"; cin>>year; double sum=money+money*double(year)*rate; cout<<"届时账户总额为:"<<setiosflags(ios::fixed)<<setprecision(2)<<sum<<"元"<<endl; } } else if(users[who].status==1) { cout<<"该用户账户已挂失,存款失败!"<<endl; } else { cout<<"该用户账户已销户,存款失败!"<<endl; } } return; }
/********************************************************* * 功能描述:查看账户的状态,<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">以及账户进行过的每一笔交易记录</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">* 返回值:0-成功 其他-失败</span>
************************************************************/ void Bank::showAccount()//查看账户及交易信息 { int who; string sta[3]= {"正常","已挂失","已销户"}; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].passWordISRight()) { users[who].showBalance("余额为"); cout<<"状态为:"<<sta[users[who].status]<<endl; cout<<"是否要查看您的每一笔账单(y/n)?"; char ch; cin>>ch; if(ch=='y') { cout<<"您的账单如下:"<<endl; ifstream infile("expence_record.txt",ios::in); if(!infile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } int r1,r3; string r2,r4,r5; while(infile>>r1>>r2>>r3>>r4>>r5) { if(r1==users[who].account&&r3==users[who].account) cout<<r2<<" "<<r4<<" "<<r5<<endl; else if(r1==users[who].account) cout<<r2<<" "<<r3<<"("<<users[r3-10000].name<<")"<<" "<<r4<<" "<<r5<<endl; } infile.close(); } } } return ; }
/********************************************************* * 功能描述:实现取款功能,余额不足时该操作无法执行,并将信息写入文件 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::withdraw()//实现取款功能 { int who; double money; who=getUser(); if(who>=0) { 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("当前余额为:"); ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile<<users[who].account<<" 取款 "<<users[who].account<<" "<<setiosflags(ios::fixed) <<setprecision(2)<<money<<" 元"<<endl; outfile.close(); } } } } return ; }
/********************************************************* * 功能描述:在已存在的两个账户间进行转账,并显示余额,
余额不足时转账无法完成。 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::transferAccount()//实现转账功能 { int whoout,whoin; double money; whoout=getUser(); if(whoout>=0) { if(users[whoout].ISNormalUser()) { users[whoout].showName(); if(users[whoout].passWordISRight()) { cout<<"请输入转账金额:"; cin>>money; if(money>users[whoout].balance) cout<<"余额不足,转账失败!"<<endl; else { whoin=getUser(); if(whoin>=0) { if(users[whoin].ISNormalUser()) { users[whoout].balance-=money; users[whoin].balance+=money; users[whoout].showBalance("已转账,当前余额为:"); ofstream outfile("expence_record.txt",ios::app); if(!outfile) { cerr<<"expence_record file cannot open!"<<endl; exit(1); } outfile<<users[whoin].account<<" 转入到 :"<<users[whoout].account<<" " <<setiosflags(ios::fixed)<<setprecision(2)<<money<<" 元"<<endl; outfile.close(); } } } } } } return; }
/********************************************************* * 功能描述:进行账户的挂失操作,只有在账户处于正常的状态下才可以进行挂失操作 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::reportLoss()//实现挂失功能 { int who; who=getUser(); if(who>=0) { 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; }
/********************************************************* * 功能描述:实现挂失的解除,只有在账户处于已挂失的状态下才可以进行解挂,否则该操作无法完成 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::canlelLoss()//实现解除挂失功能 { int who; who=getUser(); if(who>=0) { 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 ; }
/********************************************************* * 功能描述:更改密码,先输入原密码,正确后,两次输入新密码完成改密工作, * 两次输入不一致,则改密失败。 * 返回值:0-成功 其他-失败 ************************************************************/ void Bank::updatePassword()//实现改密功能 { int who; int iPass1,iPass2; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].passWordISRight()) { cout<<"请输入新密码:"<<endl; iPass1=inputPassword(); cout<<"请再输一次:"<<endl; iPass2=inputPassword(); if(iPass1==iPass2) { users[who].password=iPass1; cout<<"密码修改成功!"<<endl; } else cout<<"两次输入不一致,修改失败!"<<endl; } } }
/********************************************************* * 功能描述:输入账号查询用户,利用二分查找的算法 * 返回值:返回用户在对象数组的下标 ************************************************************/ int Bank::getUser() { int id; cout<<"请输入账号:"; cin>>id; int idex=-1; int low=0,high=N-1,mid; while (low<=high) { mid=(low+high)/2; if(users[mid].account==id) { idex=mid; break; } else if(users[mid].account>id) high=mid-1; else low=mid+1; } if(idex<0) cout<<"此用户不存在,本次操作失败!"<<endl; return idex; }
/********************************************************* * 功能描述:设置用户的各项信息 * 返回值:0-成功 其他-失败 ************************************************************/ void User::setUser(int acc,string na,int pw,double mon,double bal,string id,int sta)//设置用户信息 { account=acc; password=pw; name=na; money=mon; balance=bal; identificant=id; status=sta; }
/********************************************************* * 功能描述:输出姓名信息 * 返回值:0-成功 其他-失败 ************************************************************/ void User::showName()//输出姓名信息 { cout<<"户主姓名:"<<name<<endl; } void User::showBalance(string prompt)//显示账户余额 { cout<<prompt<<" "<<balance<<"元"<<endl; }
/********************************************************* * 功能描述:判断密码是否正确 * 返回值:right-成功 false-失败 ************************************************************/ bool User::passWordISRight()//判断密码是否正确 { int iPass; bool right=true; cout<<"请输入密码:"<<endl; iPass=inputPassword(); if(iPass!=password) { right=false; cout<<"密码错误!"<<endl; } return right; }
/********************************************************* * 功能描述:判断账户状态是否合适 * 返回值:normal-成功 false-失败 ************************************************************/ bool User::ISNormalUser()//判断账户状态是否合适 { bool normal=true; if(status!=0) { normal=false; cout<<"该账户"<<(status==1?"已挂失":"已销户")<<"状态,无法执行此操作!"<<endl; } return normal; }
/********************************************************* * 功能描述:输入密码 * 返回值:其他-成功 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-48); } else { iPass=0; break; } } fflush(stdin);//清理键盘缓存区已有的输入 cout<<endl; if(iPass==0) { cout<<"密码应全为数字且不全为0!"<<endl; cout<<"请重新输入!"<<endl; } else break; } return iPass; }
/********************************************************* * 功能描述:由业务员选择菜单功能,执行各项操作 * 返回值:0-成功 其他-失败 ************************************************************/ int chooseInMenu()//菜单功能选择 { int i; while (1) { Sleep(300); cout<<"MIND THE SECURITY AROUND YOU!"<<endl; cout<<"THE SYSTEM IS LOADING YOU , PLEASE WAIT!"<<endl; Sleep(2000); system("cls"); cout<<"+--------------------------+"<<endl; cout<<"请选择办理业务:"<<endl; cout<<endl; cout<<"1.开户 "<<"2 .销户"<<endl; cout<<"3.存款 "<<"4 .取款"<<endl; cout<<"5.查询 "<<"6 .转账"<<endl; cout<<"7.挂失 "<<"8 .解挂"<<endl; cout<<"9.改密 "<<"10.退出"<<endl; cout<<"+--------------------------+"<<endl; cin>>i; if(i>=0&&i<=9) break; else cout<<"输入有误,请重新选择功能!"<<endl; } return i; }
/********************************************************* * 功能描述:验证业务员操作是否正确,当业务员输入的信息与password文档中预存的
信息一致时,则操作可以进行,进入主菜单 * <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">返回值:0-成功 其他-失败</span>
************************************************************/ int pass()//验证密码是否正确 { char sNameInFile[20]; char sPassInFile[20]; ifstream infile("password.txt",ios::out); if(!infile) { cerr<<"password file cannot open!"<<endl; exit(1); } infile>>sNameInFile>>sPassInFile; infile.close(); char sName[20]; char sPass[20]; char ch; int itry=3; int right=0; int q; for(q=0; q<8; q++) { Sleep(100); } system("cls"); do { cout<<"+--------------------------+"<<endl; cout<<"PLEASE INPUT THE OFFICER NAME:"; cin>>sName; cout<<"PLEASE INPUT THE PASSWORD:"; int i=0; while((ch=getch())!='\r') { sPass[i++]=ch; putchar('*'); } sPass[i]='\0'; fflush(stdin); cout<<endl; if(strcmp(sName,sNameInFile)==0&&strcmp(sPass,sPassInFile)==0) { right=1; break; } else { itry--; if(itry>0) { cout<<"连续3次输入错误将会退出,剩余次数:"<<itry<<"次!"<<endl; } else { cout<<"对不起,无法进入系统!"<<endl; } } } while(itry); return right; }
/********************************************************* * 功能描述:最初界面显示 * 返回值:0-成功 其他-失败 ************************************************************/ int main() { system("cls"); cout<<"+-------------------------------------------+"<<endl; cout<<"+ +"<<endl; cout<<"+ WELCOME TO THE INTERNATIONAL BANK +"<<endl; cout<<"+ +"<<endl; cout<<"+-------------------------------------------+"<<endl; Sleep(500); cout<<"THE SYSTEM IS CHANGING THE LANGUAGE , PLEASE WAIT!"<<endl; Sleep(1000); cout<<"转换成功,已将您的语言切换为汉语!"<<endl; if(pass()) { Bank b; b.work(); } return 0; }
运行结果:
相关文章推荐
- C/C++程序设计06(面向对象)
- c++Builder 2009 2010 出现Cannot convert 'wchar_t *' to 'const char *
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- C语言简单实现计算字符个数的方法
- C++内存管理
- C/C++中volatile的用法
- C/C++中volatile的用法
- C语言基础4
- B树、B-树、B+树、B*树
- [c++学习笔记]反汇编角度看变量名和引用作为函数参数
- 算法导论 第十八章;B 树
- 《C++ Primer》 ---- 关于变量 与 基本类型
- C语言中如何将二维数组作为函数的参数传递
- c++课程设计——————银行系统
- Cpp的Virtual函数不能只声明不定义
- google_cpp编程规范要点整理
- 入门刚开始学C,就发现scanf()是不安全的
- C++学习笔记32 断言函数
- 算法导论 第十六章:贪心算法之单任务调度问题
- HDU 1159 && POJ 1458