PTA 7-1 饮料的价格 (10分) (多态)(c++) (编程题)

一个茶吧提供三类饮料:茶、咖啡和牛奶。其中本地茶要另加50%的服务费,其它茶要加20%的服务费;现磨咖啡要加100%的服务费,其它咖啡加20%的服务费;牛奶不加服务费,服务费精确到小数点一位。
给出下面的基类框架:

Class Drink { protected:
int NO; //编号
int amount; //数量
float price; //单价
public:
virtual void display()=0;//输出费用
}

以Drink为基类,构建出Tea, Coffee和Milk三个类。
生成上述类,并编写主函数,要求主函数中有一个基类Drink指针数组,数组元素不超过10个。
Drink *pd[10];
主函数根据输入的信息,相应建立Tea, Coffee或Milk类对象,并给出收费。
输入格式:每个测试用例占一行,每行给出饮料的基本信息,第一个为饮料的类型,茶为1,咖啡为2,牛奶为3。接下来是申请的编号(100-999),然后是数量和单价。对于茶叶来说,接下来输入一个地区代码,其中1代表本地。对于咖啡来说,接下来要输入一个加工代码,其中1代表现磨。最后一行为0。 要求输出编号和收费(小数点后保留1位小数)。
提示:应用虚函数实现多态
输入样例:

1 106 3 33 1
1 103 2 20 2
3 109 1 15
2 107 2 15.8 1
2 232 3 21 29
0

输出样例:

106 148.5
103 48.0
109 15.0
107 63.2
232 75.6

AC代码

#include<bits/stdc++.h>
//万能头文件哈哈哈
using namespace std;
typedef long long ll;
class Drink
{
protected:
    int NO; //编号
    int amount; //数量
    float price; //单价
public:
    Drink (int n,int a,float p)
    {
        NO=n;
        amount =a;
        price =p;
    }
    virtual void display()=0;//输出费用
    virtual ~Drink(){}
};

class Tea:public Drink
{
    int dq;//地区
public:
    Tea(int n,int a,float p,int d):Drink(n,a,p)
    {
        dq=d;
    }
    virtual void display()
    {
        cout<<NO;
        float sum=amount*price;
        if(dq==1){
            sum*=1.5;
        }else{
            sum*=1.2;
        }
        printf(" %.1f\n",sum);
    }
};

class Coffee:public Drink
{
    int dq;//现磨啥的
public:
    Coffee(int n,int a,float p,int d):Drink(n,a,p)
    {
        dq=d;
    }
    virtual void display()
    {
        cout<<NO;
        float sum=amount*price;
        if(dq==1){
            sum*=2;
        }else{
            sum*=1.2;
        }
        printf(" %.1f\n",sum);
    }
};
class Milk:public Drink
{

public:
    Milk(int n,int a,float p):Drink(n,a,p){}
    virtual void display()
    {
        cout<<NO;
        float sum=amount*price;
        printf(" %.1f\n",sum);
    }
};
int main()
{
    Drink *pd[10];
    int t,n,a,d,i=0;
    float p;
    cin>>t;
    while(t){
        cin>>n>>a>>p;
        if(t= =1){
            cin>>d;
            pd[i]=new Tea(n,a,p,d);
        }else if(t= =2){
            cin>>d;
            pd[i]=new Coffee(n,a,p,d);
        }else if(t==3){
            pd[i]=new Milk(n,a,p);
        }
        pd[i]->display();
        i++;
        cin>>t;
    }
    delete *pd;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值