【C++OJ多重继承与虚拟继承】商旅信用卡(多重继承)

E. 商旅信用卡(多重继承)

题目描述

某旅游网站(假设旅程网)和某银行推出旅游综合服务联名卡—旅程信用卡,兼具旅程会员卡和银行信用卡功能。
旅程会员卡,有会员卡号(int)、旅程积分(int),通过会员卡下订单,按订单金额累计旅程积分。
信用卡,有卡号(int)、姓名(string)、额度(int)、账单金额(float)、信用卡积分(int)。------请注意数据类型。
信用卡消费金额m,若加已有账单金额超额度,则不做操作;否则,账单金额+m,信用卡积分按消费金额累加。
信用卡退款m,账单金额-m,信用卡积分减去退款金额。
通过旅程信用卡在旅程网下单,旅程积分和信用卡积分双重积分(即旅程积分和信用卡积分同时增加)。
旅程信用卡可以按旅程积分:信用卡积分= 1:2 的比例将信用卡积分兑换为旅程积分。
初始假设信用卡积分、旅程积分、账单金额为0。
根据上述内容,定义旅程会员卡类、信用卡类,从两者派生出旅程信用卡类并定义三个类的构造函数和其它所需函数。
生成旅程信用卡对象,输入卡信息,调用对象成员函数完成旅程网下单、信用卡刷卡、信用卡退款、信用卡积分兑换为旅程积分等操作。

输入

第一行:输入旅程会员卡号 信用卡号 姓名 额度
第二行:测试次数n
第三行到第n+2行,每行:操作 金额或积分
o m(旅程网下订单,订单金额m)
c m(信用卡消费,消费金额m)
q m (信用卡退款,退款金额m)
t m(积分兑换,m信用卡积分兑换为旅程积分)

输出

输出所有操作后旅程信用卡的信息:
旅程号 旅程积分
信用卡号 姓名 账单金额 信用卡积分

输入样例

1000 2002 lili 3000
4
o 212.5
c 300
q 117.4
t 200

输出样例

1000 312
2002 lili 395.1 195

参考代码

#include <iostream>
#include <string>

using namespace std;

//旅程会员卡,通过会员卡下订单,按订单金额累计旅程积分。
class CVIP
{
protected: //会员卡号(int)、旅程积分(int)
    int id, points;

public:
    //初始假设信用卡积分、旅程积分、账单金额为0。
    CVIP(int idval, int pointsval = 0) : id(idval), points(pointsval) {} // 构造函数,初始化参数列表
    void consume(float m)                                                // 进行消费
    {
        points += (int)m;
    }
    void print() // 输出
    {
        cout << id << ' ' << points << endl;
    }
};

// 信用卡
class CCredit
{
protected: //有卡号(int)、姓名(string)、额度(int)、账单金额(float)、信用卡积分(int)
    int id;
    string name;
    int credits;
    float bill;
    int points;

public:
    //初始假设信用卡积分、旅程积分、账单金额为0。
    CCredit(int idval, string nameval, int creditsval, float billval = 0, int pointsval = 0) : id(idval), name(nameval), credits(creditsval), bill(billval), points(pointsval) {} // 构造函数,初始化参数列表
    void consume(float m)                                                                                                                                                         // 信用卡消费金额m
    {
        if (bill + m <= credits) //若加已有账单金额超额度,则不做操作;否则,账单金额+m
        {
            bill += m;
            points += int(m); //信用卡积分按消费金额累加。
        }
    }
    void refund(float m) //信用卡退款m
    {
        if (bill - m >= 0) // 退款需在合理范围内
        {
            bill -= m;        //账单金额-m
            points -= int(m); //信用卡积分减去退款金额。
        }
    }
    void print() // 输出
    {
        cout << id << ' ' << name << ' ' << bill << ' ' << points << endl;
    }
};

class VIPCredit : public CVIP, public CCredit //旅程信用卡,兼具旅程会员卡和银行信用卡功能。
{
public:
    VIPCredit(int VIPid, int Creditid, string nval, int cval) : CVIP(VIPid), CCredit(Creditid, nval, cval) {} // 构造函数
    void order(float num)                                                                                     //通过旅程信用卡在旅程网下单
    {
        if (bill + num <= credits) // 如果消费金额在可用余额范围内
        {                          //通过旅程信用卡在旅程网下单,旅程积分和信用卡积分同时增加
            CCredit::consume(num); //所以分别调用两个基类进行消费
            CVIP::consume(num);
        }
    }
    void consume(float num) // 下单后,完成消费
    {
        CCredit::consume(num); // 默认调用信用卡的消费函数
    }
    // 积分转换函数
    void Credit2VIP(int num) //旅程积分:信用卡积分= 1:2
    {
        if (num < CCredit::points)
        {
            CCredit::points -= num;
            CVIP::points += (int)(num / 2);
        }
    }

    void print() // 输出函数
    {
        CVIP::print();
        CCredit::print();
    }
};

int main()
{
    int VIPid, Creditid;
    string name;
    int credits;
    int n;
    cin >> VIPid >> Creditid >> name >> credits; //输入旅程会员卡号 信用卡号 姓名 额度
    VIPCredit p(VIPid, Creditid, name, credits);
    cin >> n;
    while (n--)
    {
        char type;
        float num;
        cin >> type >> num; //每行:操作 金额或积分
        switch (type)
        {
        case 'o': //旅程网下订单,订单金额m
            p.order(num);
            break;
        case 'c': //信用卡消费,消费金额m
            p.consume(num);
            break;
        case 'q': //信用卡退款,退款金额m
            p.refund(num);
            break;
        case 't': //积分兑换,m信用卡积分兑换为旅程积分
            p.Credit2VIP((int)num);
        }
    }
    p.print();
    return 0;
}
  • 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、付费专栏及课程。

余额充值