课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565
【项目6 - 银行系统】我们可以实现真正的多用户银行系统了。在具体业务上,不作多的改变,主要改变在用户管理上:
(1)存储用户信息用三个全局数组,并用一个整型全局变量表示当前登录的帐户
const int NUM=5; //暂时支持5个用户,其实,可以很多 int account[NUM]={37001,37002, 37020, 37245,37888}; //帐户 int pwd[NUM]={123456,654321, 456789, 987654, 234432}; //密码 double balance[NUM]={1000., 300, 23.67, 42.30, 56789}; //余额 int accountIndex; //用全局变量保存当前登录的帐户对应的下标提示:输入帐户后,在account数组中查找,找不到提示,登录失败;找到后,用accountIndex记住其下标,之后的各种业务中,pwd[accountIndex], balance[accountIndex]是该帐户的相关的信息。
(2)转帐可以真正实现在两个帐户间的转账了。
参考解答:
#include<iostream> using namespace std; //用全局变量存储各个帐户的相关信息,便于各函数间共享数据(是一种解决办法) //直接用变量并不是好方案,后面将引入数组解决 //直接在程序中存储并不是好方案,这些信息要存入文件 const int NUM=5; //暂时支持5个用户,其实,可以很多 int account[NUM]={37001,37002, 37020, 37245,37888}; //帐户 int pwd[NUM]={123456,654321, 456789, 987654, 234432}; //密码 double balance[NUM]={1000., 300, 23.67, 42.30, 56789}; //余额 int accountIndex; //用全局变量保存当前登录的帐户对应的下标 int currentAccount; //用全局变量保存当前登录的帐户 //声明自定义函数 int checkStatus(); int seekUser(int); void work(); void showbalance(); void drawmoney(); void deposit(); void transferAccounts(); void updatePassword(); int main() { int status; char ch; cout<<"贺家银行欢迎您光临……(本系统目前只有一个用户,帐号123,初始密码123456)"<<endl; while(1) //支持用户多次登录办理业务 { status=checkStatus(); if(1==status) work(); else if(2==status) cout<<"欢迎下次光临……"<<endl; else if(3==status) cout<<"请确认帐号后再来……"<<endl; else cout<<"吞卡,请联系就近网点解决……"<<endl; cout<<"=====要退出系统,请按键Q,其他键继续下一位用户登录======"<<endl; fflush( stdin ); //清空输入缓冲区,否则getchar()自动获得 ch=getchar(); if(ch=='q'||ch=='Q')break; } return 0; } /*检验密码 *返回值约定: 1 - 用户名、密码正确,可以进一步工作 2 - 用户名放弃登录正常退出 3 - 用户名不对退出 4 - 三次登录失败吞卡后退出 */ int checkStatus() { int iStatus=4; //默认吞卡的结局 int iPass; int num=1; char goOn; cout<<"请输入帐户"; cin>>currentAccount; //currentAccount是全局变量 accountIndex=seekUser(currentAccount); if(accountIndex < 0) //根据seekUser的定义,这表示找不到这个客户 iStatus=3; else { do { if(num==1) cout<<"请输入密码"; else { cout<<"温情提示:这是您第"<<num<<"次输入密码,三次不对将吞卡。"<<endl; cout<<"还要继续尝试吗(继续输入Y,退出输入N,之后回车):"; cin>>goOn; if('Y'==goOn||'y'==goOn) cout<<"请再次输入密码"; else { iStatus=2; //用户放弃登录 break; } } cin>>iPass; num++; if(iPass==pwd[accountIndex]) //帐户 { iStatus=1; //密码对了 break; } }while(num<4); //密码不正确且次数在允许范围内循环 //如果在循环因为num==4为真而退出,iStatus的值还保持初始3,代表吞卡 } return iStatus; //返回状态 } //查找是否存在这个客户, //如果存在,返回其对应的下标 //如果不存在,返回-1(查找败) int seekUser(int iAccount) { int i; for(i=0;i<NUM;++i)//用了顺序查找,实际系统中确保account[]有序,进行二分查找 { if(iAccount==account[i]) break; } if(i>=NUM) i=-1; //代表找不到这样的用户 return i; } //处理业务 void work() { char cChoice; bool bExit = false; do { cout<<endl<<"* 您可以办理下面的业务:"<<endl; cout<<"* 1.查询"<<endl; cout<<"* 2.取款"<<endl; cout<<"* 3.存款"<<endl; cout<<"* 4.转账"<<endl; cout<<"* 5.修改密码"<<endl; cout<<"* 0.退出"<<endl; cout<<"* 请输入(0-4):"; cin>>cChoice; switch(cChoice) { case '1': showbalance(); break; case '2': drawmoney(); break; case '3': deposit(); break; case '4': transferAccounts(); break; case '5': updatePassword(); break; case '0': cout<<"欢迎您下次来存款. "<<endl; bExit=true; } }while(!bExit); return; } //查询余额 void showbalance() { cout<<"您的当前余额是:"<<balance[accountIndex]<<"元"<<endl; } //取款 void drawmoney() { double money; cout << "请输入取款金额:"; cin >> money; //下面不计利息了,从现在起,我们的银行只提供银行卡业务,是定期统一计息的 if(money<=balance[accountIndex]) { balance[accountIndex]-=money; //取款成功 cout<<"取款后,您的余额是:"<<balance[accountIndex]<<"元。"<<endl; } else { cout<<"您的余额不足,取款失败。"<<endl; } } //存款 void deposit() { double money; cout << "请输入存款金额:"; cin >> money; //下面不计利息了,从现在起,我们的银行只提供银行卡业务,是定期统一计息的 balance[accountIndex]+=money; //取款成功 cout<<"存款后,您的余额是:"<<balance[accountIndex]<<"元。"<<endl; } //转帐 void transferAccounts() { double money; int iAccount2,iAccount2Index; cout << "请输入转帐金额:"; cin >> money; if(money>balance[accountIndex]) //本行不透支,不能转账 { cout<<"您的余额不足,转账失败。"<<endl; } else { cout << "请输入对方帐户:"; cin >> iAccount2; //应该判断对方帐户的有效性再转账,暂时不做,待以后改进 iAccount2Index=seekUser(iAccount2); if(iAccount2Index==-1) cout<<"对方帐号输入错误,转账失败。"<<endl; else { balance[accountIndex]-=money; //从己方转出 balance[iAccount2Index]+=money; //转给对方 //此处应该为对方帐户增加余额,暂时略 cout<<"转账后,您的余额是:"<<balance[accountIndex]<<"元,对方余额为"<<balance[iAccount2Index]<<"元。"<<endl; //实际系统中不似上行那样提示,暴露信息太多了。 } } } void updatePassword() { int p1,p2; cout << "请输入新密码:"; cin >> p1; cout << "请确认新密码:"; cin >> p2; if(p1==p2)//两次输入相符 { pwd[accountIndex]=p1; cout<<"密码修改成功!"<<endl; } else { cout<<"两次输入不一致,密码修改失败。"<<endl; } }