贵州大学oj C++ 第五次 11.自助餐计费

记录学习日常 代码可能有错 大家多多包涵 有好的建议提出的话 我会开心接纳 初学阶段

​某自助餐厅提供A、B、C三种套餐服务,原价分别为100元,120元和150元。对于不同顾客有不同的优惠规则如下:

(A)成年男顾客,所有套餐均不打折,此外收取套餐原价15%的服务费;

(B)成年女顾客,所有套餐打9折,此外收取套餐原价15%的服务费;

(C)老年人顾客,所有套餐打8.5折,此外收取套餐原价10%的服务费;

(D)未成年人顾客,所有套餐打7折,不收取服务费。

   根据以上需求,定义一个抽象的顾客类Customer,该类有一个数据成员:gender(string类型),用于描述顾客的性别。该类还有一个纯虚函数calculateCost(计算用餐费用函数),用于根据顾客选择的套餐,计算其应该支付的用餐费用并返回。

请根据以上描述完成下面的任务:

(1)请完成Customer类的定义,定义你认为必要的任何成员函数;

(2)请为Customer类定义三个公有派生类:AdultCustomer(成年顾客)、ElderlyCustomer(老年人顾客)和UnderAgeCustomer(未成年人顾客),在这三个类中根据上述规则分别实现纯虚函数calculateCost;

(3)在主函数中定义Customer类的指针并分别指向不同的派生类对象,调用calculateCost函数计算用餐费用并输出。

提示:

(1)calculateCost函数的原型可以定义为 double calculateCost(char set);根据参数set判断用户选择的套餐。

(2)Customer类的gender成员可定义为protected权限也可以定义为private权限。

(3)gender成员的初始化可以由基类的构造函数来完成,也可由派生类的构造函数来完成。如果由基类构造函数完成,派生类构造函数要为基类构造函数传递参数。

main函数已经完成,请根据main函数完成类的设计:

int main(){ 

AdultCustomer c1("male");            

AdultCustomer c2("female");  

ElderlyCustomer c3("male");

UnderAgeCustomer c4("female");

Customer *p;

char set1,set2,set3,set4;

cin>>set1>>set2>>set3>>set4;

p=&c1;

cout<<p->calculateCost(set1)<<endl;

p=&c2;

cout<<p->calculateCost(set2)<<endl;

p=&c3;

cout<<p->calculateCost(set3)<<endl;

p=&c4;

cout<<p->calculateCost(set4)<<endl;

return 0;

}

输入描述main函数直接创建了四个对象,因此只需要输入四个顾客选择的套餐即可

输出描述输出四个顾客的餐费,一行一个

样例输入输出:

A B A C
 

115
126
95
105

#include<iostream>

using namespace std;

class Customer {
public:
    virtual double calculateCost(char set) const = 0;//纯虚函数
};

class AdultCustomer : public Customer {
    string gender;
public:
    AdultCustomer()=default;
    AdultCustomer(string g):gender(g) {}

    double calculateCost(char set) const {
        double expense = 0;//用于存储费用
        if (gender == "male") {
            if (set == 'A') {
                expense = 100 + 100 * 0.15;
            } else if (set == 'B') {
                expense = 120 + 120 * 0.15;
            } else {
                expense = 150 + 150 * 0.15;
            }
        } else if (gender == "female") {
            if (set == 'A') {
                expense = 100 * 0.9 + 100 * 0.15;
            } else if (set == 'B') {
                expense = 120 * 0.9 + 120 * 0.15;
            } else {
                expense = 150 * 0.9 + 150 * 0.15;
            }
        }
        return expense;
    }
};

class ElderlyCustomer : public Customer {
    string gender;
public:
    ElderlyCustomer()=default;
    ElderlyCustomer(string g):gender(g) {}

    double calculateCost(char set) const {
        double expense = 0;
        if (set == 'A') {
            expense = 100 * 0.85 + 100 * 0.1;
        } else if (set == 'B') {
            expense = 120 * 0.85 + 120 * 0.1;
        } else {
            expense = 150 * 0.85 + 150 * 0.1;
        }
        return expense;
    }
};

class UnderAgeCustomer : public Customer {
    string gender;
public:
    UnderAgeCustomer()=default;
    UnderAgeCustomer(string g):gender(g) {}

    double calculateCost(char set) const {
        double expense = 0;
        if (set == 'A') {
            expense = 100 * 0.7;
        } else if (set == 'B') {
            expense = 120 * 0.7;
        } else {
            expense = 150 * 0.7;
        }
        return expense;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值