【C++OJ多重继承与虚拟继承】计算宝宝帐户收益(多重继承)

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

题目描述

定义一个类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>
using namespace std;

class CPeople //类CPeople
{
protected:
    char id[20];   //身份号码
    char name[10]; //姓名

public:
    CPeople() {}                    //无参构造
    CPeople(char i[20], char n[10]) //构造函数,初始化参数列表
    {
        strcpy(id, i);
        strcpy(name, n);
    }
    ~CPeople(){}; //析构函数
};

//从CPeople类中再派生出CInternetUser类和CBankCustomer类
class CInternetUser : virtual public CPeople //需要使用虚拟继承,只产生一次拷贝
{
protected:
    char password[20]; //登录密码

public:
    void registerUser(char i[20], char n[10], char p[20]) //注册register(设置id, name和password)
    {
        strcpy(id, i);
        strcpy(name, n);
        strcpy(password, p);
    }
    bool login(char i[20], char p[20]) //登录login(判断输入的id与password是否与对象注册的相同)
    {
        return ((!strcmp(i, id)) && (!strcmp(p, password)));
    }
};

class CBankCustomer : virtual public CPeople //需要使用虚拟继承,只产生一次拷贝
{
protected:
    double balance; //余额
public:
    CBankCustomer() {}                       //缺省的构造函数
    void openAccount(char n[10], char i[20]) //开户openAccount(设置客户姓名和id)
    {
        strcpy(name, n);
        strcpy(id, i);
        balance = 0;
    }
    void deposit(double b) //存款deposit
    {
        balance += b;
    }
    bool withdraw(double b) //取款withdraw
    {
        if (balance - b >= 0)
        {
            balance -= b;
            return 1;
        }
        else
            return 0;
    }
};

//再从CInternetUser和CBankCustomer多重继承派生出CInternetBankCustomer类。
class CInternetBankCustomer : public CBankCustomer, public CInternetUser
{
protected:
    double t_balance;  //余额
    double y_balance;  //前一日余额
    double t_earnings; //当日收益
    double t_interest; //今日万元收益率
    double y_interest; //上一日万元收益率
public:
    CInternetBankCustomer() //缺省构造函数
    {
        t_balance = 0.00;
        y_balance = 0.00;
        t_earnings = 0.00;
        t_interest = 0.00;
        y_interest = 0.00;
    }
    bool deposit(double b) //存款
    {
        if (balance - b >= 0)
        {
            balance -= b;
            t_balance += b;
            return 1;
        }
        else
            return 0;
    }
    bool withdraw(double b) //取款
    {
        if (t_balance - b >= 0)
        {
            t_balance -= b;
            balance += b;
            return 1;
        }
        else
            return 0;
    }
    void setInterest(double i) //设置万元收益,当日和上一日的收益率
    {
        y_interest = t_interest; //今天的收益率变成昨天的收益率
        t_interest = i;          //输入的新收益率变成今天的收益率
    }
    void calculateProfit()                            //计算当日收益
    {                                                 //当日存款不计算收益,第2天开始才能计算收益,当日取款部分无收益。
        t_earnings = y_balance * 0.0001 * y_interest; //今天的收益=昨天的存款*昨天的收益率
        t_balance += t_earnings;                      //今日新的存款=今日的存款+今天的收益
        y_balance = t_balance;                        //把今天的收益赋值给昨天的收益,进入下一天
    }
    void print() //输出函数
    {            //输出用户名,id;输出银行余额;输出互联网金融账户余额
        cout << "Name: " << CBankCustomer::name << " ID: " << CBankCustomer::id << endl;
        cout << "Bank balance: " << balance << endl;
        cout << "Internet bank balance: " << t_balance << endl;
    }
    bool login(char i[20], char p[20]) //登陆login
    {                                  //判断输入的id和密码是否与互联网用户的相同,同时从CBankCustomer继承的用户姓名和id要与从CInternetUser继承的相同
        return ((!strcmp(i, CInternetUser::id)) && (!strcmp(p, CInternetUser::password))) && (!strcmp(CInternetUser::id, CBankCustomer::id) && !strcmp(CInternetUser::name, CBankCustomer::name));
    }
};
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();
            ib_user.print();
            cout << endl;
        }
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ferry_xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值