计算宝宝帐户收益(多重继承)

题目描述

定义一个类CPeople,具有身份号码(id,char[20])和姓名(name,char[10])两个数据成员,从CPeople类中再派生出CInternetUser类和CBankCustomer类,然后再从CInternetUser和CBankCustomer多重继承派生出CInternetBankCustomer类。

CInternetUser类有登录密码(password,char[20])属性和注册register(设置id, name和password),登录login(判断输入的id与password是否与对象注册的相同)成员函数。

CBankCustomer类有余额(balance,double)属性和开户openAccount(设置客户姓名和id),存款deposit,取款withdraw以及缺省的构造函数。

CInternetBankCustomer类包括有余额, 前一日余额, 当日收益,今日万元收益和上一日万元收益等5个数据成员,成员函数有缺省构造函数,存款和取款,设置万元收益,计算当日收益,登陆login(判断输入的id和密码是否与互联网用户的相同,同时从CBankCustomer继承的用户姓名和id要与从CInternetUser继承的相同)。CInternetBankCustomer类对象当日存款不计算收益,第2天开始才能计算收益,当日取款部分无收益。

可参照如下所示的主函数来测试并设计输入数据:

void main()
{
int t, no_of_days, i;
char i_xm[20], i_id[20], i_mm[20], b_xm[20], b_id[20], ib_id[20], ib_mm[20];
double money, interest;
char op_code;

//输入测试案例数t
cin >> t;
while (t--)
{
//输入互联网用户注册时的用户名,id,登陆密码
cin >> i_xm >> i_id >> i_mm;

//输入银行开户用户名,id
cin >> b_xm >> b_id;

//输入互联网用户登陆时的id,登陆密码
cin >> ib_id >> ib_mm;

CInternetBankCustomer ib_user;

ib_user.registerUser(i_xm, i_id, i_mm);
ib_user.openAccount(b_xm, b_id);

if (ib_user.login(ib_id, ib_mm) == 0)  //互联网用户登陆,若id与密码不符;以及银行开户姓名和id与互联网开户姓名和id不同
{
cout << "Password or ID incorrect" << endl;
continue;
}

//输入天数
cin >> no_of_days;
for (i=0; i < no_of_days; i++)
{
//输入操作代码, 金额, 当日万元收益
cin >> op_code >> money >> interest;
switch (op_code)
{
case 'S':  //从银行向互联网金融帐户存入
case 's':
if (ib_user.deposit(money) == 0)
{
cout << "Bank balance not enough" << endl;
continue;
}
break;
case 'T':  //从互联网金融转入银行帐户
case 't':
if (ib_user.withdraw(money) == 0)
{
cout << "Internet bank balance not enough" << endl;
continue;
}
break;
case 'D':  //直接向银行帐户存款
case 'd':
ib_user.CBankCustomer::deposit(money);
break;
case 'W':  //直接从银行帐户取款
case 'w':
if (ib_user.CBankCustomer::withdraw(money) == 0)
{
cout << "Bank balance not enough" << endl;
continue;
}
break;
default:
cout << "Illegal input" << endl;
continue;
}
ib_user.setInterest(interest);
ib_user.calculateProfit();
//输出用户名,id
//输出银行余额
//输出互联网金融账户余额
ib_user.print();
}
}
}

输入

输入用户例数

输入第1个互联网用户注册时的用户名,id,登陆密码

输入第1个用户银行开户用户名,id

输入第1个互联网用户登陆时的id,登陆密码

输入第1个用户操作天数

循环输入操作代码(S,T,D,W)  金额  当日万元收益
......

输出

输出第1个用户名,id
输出第1个用户银行余额
输出第1个互联网金融账户余额
......

样例

输入:

2
zhangsan 1234567890 222222
zhangsan 1234567890
1234567890 222222
4
D 15000 0
s 8000 1.5
T 3000 1.55
w 2000 0
lisi 2014150000 abcdef
lisi 2014150000
2014150000 123456

输出:

Name: zhangsan ID: 1234567890
Bank balance: 15000
Internet bank balance: 0

Name: zhangsan ID: 1234567890
Bank balance: 7000
Internet bank balance: 8000

Name: zhangsan ID: 1234567890
Bank balance: 10000
Internet bank balance: 5001.2

Name: zhangsan ID: 1234567890
Bank balance: 8000
Internet bank balance: 5001.98

Password or ID incorrect

#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;

class CPeople {
protected:
	char id[20];
	char name[10];
public:
	CPeople(){}
	CPeople(char* i, char* n) {
		strcpy(id, i);
		strcpy(name, n);
	}
	void sett(char* i, char* n)
	{
		strcpy(id, i);
		strcpy(name, n);
	}
	~CPeople() {
	}
};
class CInternetUser :virtual public CPeople {
protected:
	char password[20];
public:
	CInternetUser(){}
	CInternetUser(char* i, char* n, char* p) :CPeople(i, n) {
		strcpy(password, p);
	}
	void registerUser(char* i, char* n, char* p) {
		strcpy(id, i);
		strcpy(name, n);
		strcpy(password, p);
	}
	int login(char* i, char* p)
	{
		if (strcmp(id, i)==0 && strcmp(password, p) == 0)return 1;
		else return 0;
	}
};
class CBankCustomer :virtual public CPeople {
protected:
	double balance;
public:
	CBankCustomer(){}
	CBankCustomer(char *i,char *n,double b):balance(b),CPeople(i,n){}
	void openAccount(char* n, char* i)
	{
		strcpy(name, n);
		strcpy(id, i);
		balance = 0;
	}
	void deposit(double m) {
		balance += m;
	}
	int withdraw(double m) {
		if (balance >= m) { balance -= m; return 1; }
		else return 0;
	}

};
class CInternetBankCustomer :public CInternetUser, public CBankCustomer {
	double cbalance;
	double ybalance;
	double money;
	double tw;
	double yw;
public:

	CInternetBankCustomer(double b=0,double yb=0,double m=0,double t=0,double y=0):cbalance(b),ybalance(yb),money(m),tw(t),yw(y){}
	int deposit(double m) {
		
		if (balance - m >= 0) {
			balance -= m;
			cbalance += m;
			return 1;
		}
		else return 0;
	}
	int withdraw(double m)
	{
		
		if (cbalance - m >= 0) {
			cbalance -= m;
			balance += m;
			return 1;
		}
		else return 0;
	}
	void setInterest(double i)
	{
		yw = tw;
		tw = i;
	}
	void calculateProfit()
	{
		cbalance += yw *0.0001* ybalance;ybalance = cbalance;
	}
	int login(char* i, char* p)
	{
		int tag1 = 0,tag2=0;
		if (CInternetUser::login(i,p))tag1 = 1;
		if (strcmp(CInternetUser::id, CBankCustomer::id)==0 && strcmp(CInternetUser::name, CBankCustomer::name) == 0)tag2 = 1;
		if (tag1==1 && tag2==1)return 1;
		else return 0;
	}
	void print()
	{
		cout << "Name: " << CInternetUser::name << " ID: " << CInternetUser::id << endl;
		cout << "Bank balance: " << CBankCustomer::balance<<endl;
		cout << "Internet bank balance: " << cbalance << endl;
		cout << endl;
	}
};
int main()
{
	int t, no_of_days, i;
	char i_xm[20], i_id[20], i_mm[20], b_xm[20], b_id[20], ib_id[20], ib_mm[20];
	double money, interest;
	char op_code;

	//输入测试案例数t
	cin >> t;
	while (t--)
	{
		//输入互联网用户注册时的用户名,id,登陆密码
		cin >> i_xm >> i_id >> i_mm;

		//输入银行开户用户名,id
		cin >> b_xm >> b_id;

		//输入互联网用户登陆时的id,登陆密码
		cin >> ib_id >> ib_mm;

		CInternetBankCustomer ib_user;

		ib_user.registerUser(i_xm, i_id, i_mm);
		ib_user.openAccount(b_xm, b_id);

		if (ib_user.login(ib_id, ib_mm) == 0)  //互联网用户登陆,若id与密码不符;以及银行开户姓名和id与互联网开户姓名和id不同
		{
			cout << "Password or ID incorrect" << endl;
			continue;
		}

		//输入天数
		cin >> no_of_days;
		for (i = 0; i < no_of_days; i++)
		{
			//输入操作代码, 金额, 当日万元收益
			cin >> op_code >> money >> interest;
			switch (op_code)
			{
			case 'S':  //从银行向互联网金融帐户存入
			case 's':
				if (ib_user.deposit(money) == 0)
				{
					cout << "Bank balance not enough" << endl;
					continue;
				}
				break;
			case 'T':  //从互联网金融转入银行帐户
			case 't':
				if (ib_user.withdraw(money) == 0)
				{
					cout << "Internet bank balance not enough" << endl;
					continue;
				}
				break;
			case 'D':  //直接向银行帐户存款
			case 'd':
				ib_user.CBankCustomer::deposit(money);
				break;
			case 'W':  //直接从银行帐户取款
			case 'w':
				if (ib_user.CBankCustomer::withdraw(money) == 0)
				{
					cout << "Bank balance not enough" << endl;
					continue;
				}
				break;
			default:
				cout << "Illegal input" << endl;
				continue;
			}
			ib_user.setInterest(interest);
			ib_user.calculateProfit();
			//输出用户名,id
			//输出银行余额
			//输出互联网金融账户余额
			ib_user.print();
		}
	}
}

 ps:本题难点在于“当日收益”的计算,题中指出“CInternetBankCustomer类对象当日存款不计算收益,第2天开始才能计算收益,当日取款部分无收益”,故用前一天余额(转换为万)与前一天利益相乘。

本题应注意主函数已给出,需依照给出的主函数进行编写。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值