课程首页地址: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;
}
}