C++第14周项目6——银行系统,真正多用户

课程首页地址: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;
	}
}
时间: 2024-12-22 18:49:58

C++第14周项目6——银行系统,真正多用户的相关文章

C++第14周项目6——银行系统,用文件永久存储

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目6 - 银行系统]我们可以实现真正的多用户银行系统了.在具体业务上,不作多的改变,主要改变在用户管理上: (1)存储用户信息用三个全局数组,并用一个整型全局变量表示当前登录的帐户 const int NUM=5; //暂时支持5个用户,其实,可以很多 int account[NUM]={37001,37002, 37020, 37245,37888}; //帐户 i

C++第13周项目5——银行系统支持多用户(v0.3)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 说明:此项目是为未学习数组的同学拟出的,目的是让他们对"工程"有所体验.一些实现并不是最佳的,请参考后续的题目 [项目5任务3]补充功能,使银行更职业一些 1.支持多个用户 用变量account1以及pwd1分别表示客户和他的密码,balance1表示这两个用户的余额(开始靠近真的银行了,得为多个用户服务,此任务完成后,将来改造成多个用户的.学习了数组,我们会有

C++第14周项目5——字符串统计

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目5-字符串统计]阅读下面的程序,完成类似的功能 #include<iostream> #include<cstdio> using namespace std; int main() { char str[50]; int i=0,n=0; cout<<"输入字符串:"; gets(str); while(str[i]!

C++第14周项目5——涨工资了

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目5 - 涨工资了 ]从文件salary.txt中读入500名工人的工资,全部增加100元后进行排序(好事,涨工资了:坏事,排序不要用冒泡,用选择法),将排序后的结果在屏幕上输出,并保存到文件ordered_salary.txt中.(salary.txt中内容可以从本文后面复制,自建文本文件.) 提示:做第11周项目5,学习对文件的操作. #include <fstr

2013-C++第14周项目参考解答链接集

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1 - 数组大折腾] 将所有元素值加倍后保存在数组中,最后由前往后输出数组中所有元素的值,再由后往前输出数组中所有元素的值,再输出数组中的所有大于100的数,以及下标为3的倍数的元素值. (1)创建一个长度为20的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行.

2014秋C++第14周项目5参考-体会棋盘游戏

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目5-体会棋盘游戏中的数据存储]定义一个8行8列的二维数组a[8][8].(1)为二维数组中的数据赋50以内的随机数(程序模板中setdata()函数已经完成,利用产生随机数的系统函数实现),可能的取值如图所示:(2)设计函数out()按行输出二维数组中的数据:(3)设计函数outDia

C++第13周项目5——银行系统用函数组织(v0.2)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 说明:此项目是为未学习数组的同学拟出的,目的是让他们对"工程"有所体验.一些实现并不是最佳的,请参考后续的题目 [项目5任务2]引入函数改善程序结构 1.在输入密码环节,实现有限次密码输入的限制,如果三次都没有输入正确,程序将直接退出,不允许用户继续操作. 查验密码功能做成一个函数.例如: bool pass() { bool 密码不正确=true; //先假设

2013级C++第14周项目——一维数组、字符数组

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 [项目1 - 数组大折腾] 将所有元素值加倍后保存在数组中,最后由前往后输出数组中所有元素的值,再由后往前输出数组中所有元素的值,再输出数组中的所有大于100的数,以及下标为3的倍数的元素值. (1)创建一个长度为20的整型数组,通过初始化,为数组中的前10个元素赋初值,然后通过键盘输入后10个元素的值,从前往后(从第0个到第19个)输出数组中元素的值,每5个元素换一行.

2014秋C++ 第14周项目 二维数组

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目1-折腾二维数组]创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后: 通过键盘输入,使后两列的10个元素获得值: 按行序优先输出数组元素: 将所有元素值乘以3后保存在数组中: 按列序优先输出(输出的第一行是数组中的第一列--,其实输出的就是"