<pre name="code" class="html">(一)main.cpp
<pre name="code" class="cpp">/***************************************************** *版权全部(C) * *文件名称:main.cpp *文件标识: *内容摘要:该文件包括了主函数 *其它说明: *当前版本号: *作 者:陈丹妮 *完毕日期:2015.7.18 * *改动记录:3 *改动日期:2015.7.18 *版本号号: *改动人:陈丹妮 改动内容: **********************************************************/ #include <iostream> #include <iomanip> #include <windows.h> #include <cstring> #include <fstream> #include "bank.h" #include <cstdlib> #include <conio.h> #include <ctype.h> using namespace std; int main() { int q; for(q=0; q<8; q++) { Sleep(100); cout<<"◆"; } system("cls"); system("color 14"); cout<<endl; cout<<" +-------------------------------------------+ "<<endl; cout<<" + 欢迎使用陈氏银行。竭诚为你服务!+ "<<endl; cout<<" +-------------------------------------------+ "<<endl; if(pass()) { Bank b; b.work(); } return 0; }
</pre><pre name="code" class="html">(二)bank.h
<pre name="code" class="cpp">/***************************************************** *版权全部(C) * *文件名称:bank.h *文件标识: *内容摘要:在该文件里。包括了两个类的定义以及对全部函数的声明,用来对总的程序做一个说明。 *其它说明: *当前版本号: *作 者:陈丹妮 *完毕日期:2015.7.18 * *改动记录:3 *改动日期:2015.7.18 *版本号号: *改动人:陈丹妮 改动内容: **********************************************************/ #ifndef BANK_H_INCLUDED #define BANK_H_INCLUDED #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 psaaWordISRight();//推断password是否正确 bool ISNormalUser();//存款。取款,转账等功能须要账户处于正常状态,推断账户是否处于正常状态 friend class Bank;//将Bank设为User的友元类 private: int account;//账号 int password;//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();//改动password int getUser();//输入账号查询用户,返回用户在对象数组的下表 private: int N;//实际用户数目 static double rate;//利率 User users [upnum];//User数组 }; int pass();//业务员登录 int chooseInMenu();//显示菜单并由业务员选择 int intputPassword();//返回键盘输入的password #endif // BANK_H_INCLUDED
(三)user.cpp
<pre name="code" class="cpp">/***************************************************** *版权全部(C) * *文件名称:bank.h *文件标识: *内容摘要:在该文件里。包括了管与user类中的全部函数的定义 *其它说明: *当前版本号: *作 者:陈丹妮 *完毕日期:2015.7.18 * *改动记录:3 *改动日期:2015.7.18 *版本号号: *改动人:陈丹妮 改动内容: **********************************************************/ #include <iostream> #include "bank.h" #include <cstring> using namespace std; /***************************************************** *功能描写叙述:定义一个函数来获取用户的信息 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ 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; } /***************************************************** *功能描写叙述:定义一个函数来显示姓名 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void User::showName() { cout<<"户主姓名:"<<name<<endl; } /***************************************************** *功能描写叙述:定义一个函数来显示剩余金额 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void User::showBalance(string prompt) //prompt是一个要显示的一段字符,能够是英文能够是中文的 { cout<<prompt<<" "<<balance<<"元"<<endl; } /***************************************************** *功能描写叙述:定义一个函数来输入password及推断 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ bool User::psaaWordISRight() //输入password及推断 { int iPass; bool right=true; cout<<"请输入password:"<<endl; iPass=intputPassword(); if(iPass!=password) { right=false; cout<<"password输入错误。操作失败!"<<endl; } return right; } /***************************************************** *功能描写叙述:定义一个函数来推断该用户处于哪一种状态 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ bool User::ISNormalUser() //推断该用户处于哪一种状态 { bool normal=true; if(status!=0) { normal=false; cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能进行操作。"<<endl; } return normal; }
(四)bank.cpp
<pre name="code" class="cpp">/***************************************************** *版权全部(C) * *文件名称:bank.h *文件标识: *内容摘要:在该文件里,包括了关于bank类中的全部函数的定义。用来实现各业务的功能 *其它说明: *当前版本号: *作 者:陈丹妮 *完毕日期:2015.7.18 * *改动记录:3 *改动日期:2015.7.18 *版本号号: *改动人:陈丹妮 改动内容: **********************************************************/ #include "bank.h" #include <iostream> #include <iomanip> #include <windows.h> #include <cstring> #include <fstream> #include <cstdlib> #include <conio.h> #include <ctype.h> using namespace std; double Bank::rate=0.0225; /***************************************************** *功能描写叙述:定义一个函数来从磁盘文件的输入,已输入的方式打开文件 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ 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); //在传递给user对象的私有成员 i++; } N=i; //记录实际用户的数量 infile.close(); //关闭文件 } /***************************************************** *功能描写叙述:定义一个函数来输出文件流outfile,以输出方式打开磁盘文件 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ Bank::~Bank() { ofstream outfile("account.txt",ios::out); //定义输出文件流outfile,以输出方式打开磁盘文件 if(!outfile) { cerr<<"open error!"<<endl; exit(1); } int i; for(i=0; i<N; i++) //最后析构时,终于user的信息 { 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(); } /***************************************************** *功能描写叙述:定义一个函数来选择办理的业务。 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::work() { int ichoice; int q; for(q=0; q<8; q++) { Sleep(100); //延迟时间显示◆ cout<<"◆"; } system("cls"); system("color 15"); //显示窗体颜色的 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(); //改动password break; case 0: cout<<"+++++欢迎再次您使用。陈氏竭诚为你服务!+++++"<<endl; } } while(ichoice); } /***************************************************** *功能描写叙述:定义一个函数来开新用户 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ 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; cout<<"正在开户......"<<endl; cout<<"账号:"<<acc<<endl; cout<<"请输入户主的名字:"; cin>>na; cout<<"请输入身份证号:"; cin>>id; cout<<"请输入password:"; ipw1=intputPassword(); cout<<"确认password:"; ipw2=intputPassword(); if(ipw1==ipw2) //推断两次的password是否一致。同样,开户成功 { pw=ipw1; sta=0; cout<<"存入金额:"; cin>>bal; ofstream outfile1("expence_record.txt",ios::app); //定义输出文件流outfile,以输出方式打开磁盘文件,写入的数据将会加入到文件的末尾 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); //定义输出文件流outfile2,以输出方式打开磁盘文件。写入的数据将会加入到文件的末尾, 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[N].setUser(acc,na,pw,mon,sum,id,sta); //用对象数组保存住用户的信息 N++; //记录一个用户 cout<<"成功开启!"<<endl; } else { cout<<"两次password不一致,开启账户失败!"<<endl; } } /***************************************************** *功能描写叙述:定义一个函数来销户 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::cancelAccount() //销户 { int who; who=getUser(); //获取销户的账号 if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) //password正确时 { 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); //清理键盘缓存区已有的输入 } } } /***************************************************** *功能描写叙述:定义一个函数来进行存储业务,在保存到文件里去 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::save() //存储 { int who,year; double money; who=getUser(); //获取有效的账户 if(who>=0) { if(users[who].status==0) //账号处于正常状态时 { users[who].showName(); if(users[who].psaaWordISRight()) { 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; //计算利息,总共=本金+所获得利息 users[who].balance+=sum;// 将此次存入的钱,加入到原来的剩余金额中,在结束操作时,文件account将会显示改用该用户的总额 } } else if(users[who].status==1) { cout<<"该用户的账户处于挂失状态,存款失败!"<<endl; } else { cout<<"该用户的账户已经销户,存款失败!
"<<endl; } } return; } /***************************************************** *功能描写叙述:定义一个函数来查询已实用户的信息及办理业务的记录 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::showAccount() { int who; string sta[3]= {"正常","挂失","已经销户"}; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { 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 ; } /***************************************************** *功能描写叙述:定义一个函数来办理取钱业务 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::withdraw() //取钱 { int who; double money; who=getUser(); if(who>=0) { if(users[who].ISNormalUser()) { users[who].showName(); if(users[who].psaaWordISRight()) { cout<<"输入取款额"; cin>>money; if(money>users[who].balance) //推断是否超额取钱 { cout<<"对不起。您的剩余金额不足!
"<<endl; } else { users[who].balance-=money; //将会记录取钱之后。还剩多少钱。会在account文件里显示终于的剩余金额 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 ; } /***************************************************** *功能描写叙述:定义一个函数来办理一个转账的业务 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::transferAccount() //转账 { int whoout,whoin; double money; whoout=getUser(); cout<<"转出自"; if(whoout>=0) { if(users[whoout].ISNormalUser()) { users[whoout].showName(); if(users[whoout].psaaWordISRight()) { cout<<"请输入转入的金额:"; cin>>money; if(money>users[whoout].balance) cout<<"金额不足,转账失败!"<<endl; else { cout<<"转出到:"; 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 ; } /***************************************************** *功能描写叙述:定义一个函数来办理挂失的业务 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::reportLoss() //挂失 { int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { if(users[who].status==0) { users[who].status=1; //记录该用户如今的挂失状态 cout<<"挂失成功。"<<endl; } else if(users[who].status==1) cout<<"该账户已经挂失!
"<<endl; else cout<<"该账户已经销户,操作失败。"<<endl;//否则为销户状态 } } return; } /***************************************************** *功能描写叙述:定义一个函数来输出办理解挂的业务 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::canlelLoss() //解挂 { int who; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) { if(users[who].status==0) { cout<<"该用户处于正常状态。不须要解除挂失!
"<<endl; } else if(users[who].status==1) { users[who].status=0; //记录该用户的恢复为正常的正常的状态 cout<<"解除挂失成功! "<<endl; } else { cout<<"该用户已销户,操作失败。"<<endl; } } } return ; } /***************************************************** *功能描写叙述:定义一个函数来办理改动password的业务 *输入參数:无 *输出參数:无 *返回值:无 *其它说明: **********************************************************/ void Bank::updatePassword() //改动password { int who; int iPass1,iPass2; who=getUser(); if(who>=0) { users[who].showName(); if(users[who].psaaWordISRight()) //先推断原password是否输入正确 { cout<<"新password:"<<endl; iPass1=intputPassword(); cout<<"确认password:"<<endl; iPass2=intputPassword(); if(iPass1==iPass2) //假设两次的password输入是一样的那么,改password成功 { users[who].password=iPass1; cout<<"password改动成功!
"<<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; }
</pre>(五)work.cpp<pre>
<pre name="code" class="cpp">/***************************************************** *版权全部(C) * *文件名称:bank.h *文件标识: *内容摘要:在该文件里。包括了password输入,业务选择。password是否正确三个函数 *其它说明: *当前版本号: *作 者:陈丹妮 *完毕日期:2015.7.18 * *改动记录:3 *改动日期:2015.7.18 *版本号号: *改动人:陈丹妮 改动内容: **********************************************************/ #include <iostream> #include <iomanip> #include "bank.h" #include <windows.h> #include <cstring> #include <fstream> #include <cstdlib> #include <conio.h> #include <ctype.h> using namespace std; /***************************************************** *功能描写叙述:定义一个函数来对password的处理 *输入參数:无 *输出參数:无 *返回值:一个整型值 *其它说明: **********************************************************/ int intputPassword() //password的处理 { char ch; int iPass=0;//转换为数字 int i; while(1) { for(i=0; i<6; ++i) { ch=getch(); putchar('*'); //输入的password不显示数字,而是用*来取代,且,输入不能返回输入 if(isdigit(ch)) { iPass=iPass*10+(ch-48); } else { iPass=0; break; } } fflush(stdin);//清理键盘缓存区已有的输入 cout<<endl; if(iPass==0) { cout<<"password要求全为数字且不能都是0!"<<endl; cout<<"请又一次输入!"; } else break; } return iPass; } /***************************************************** *功能描写叙述:定义一个函数来让用户进行选择办理的业务 *输入參数:无 *输出參数:无 *返回值:一个整型值 *其它说明: **********************************************************/ int chooseInMenu() { int i; while (1) { cout<<endl; cout<<" + 请您选择办理的业务选项: + "<<endl; cout<<" +----------------------------+ "<<endl; cout<<" + 1.开户 2.销户 3.存款 + "; cout<<" + 4.取款 5.查询 6.转账 + "; cout<<" + 7.挂失 8.解挂 9.改密 + "; cout<<" + 0.退出 + "<<endl; cout<<" +----------------------------+ "<<endl<<endl; cout<<"请选择您所须要办理的业务序号:"; cin>>i; if(i>=0&&i<=9) break; else cout<<"输入有误。请您又一次选择功能。"<<endl; } return i; } /***************************************************** *功能描写叙述:定义一个函数来让用户进行选择办理的业务 *输入參数:无 *输出參数:无 *返回值:一个整型值 *其它说明: **********************************************************/ int pass()//验证password是否正确 { char sNameInFile[20]; char sPassInFile[20]; ifstream infile("password.txt",ios::out); //定义一个输入流文件,读取提前保存业务人员的姓名及登录password 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); cout<<"◆"; } system("cls"); system("color 17"); do { cout<<"请输入业务员username:"<<endl; cin>>sName; cout<<"请输入password"<<endl; int i=0; while((ch=getch())!=' ') { sPass[i++]=ch; putchar('*'); } sPass[i]='