【C++ | PTA]】汽车收费

文章目录

题目要求

现在要开发一个系统,管理对多种汽车的收费工作。
给出下面的一个基类框架

class Vehicle
{
protected:
string NO;//编号

public:
virtual void display()=0;//输出应收费用
}

以Vehicle为基类,构建出Car、Truck和Bus三个类。

Car的收费公式为: 载客数8+重量2

Truck的收费公式为:重量*5

Bus的收费公式为: 载客数*3

生成上述类并编写主函数,要求主函数中有一个基类Vehicle指针数组,数组元素不超过10个。

Vehicle *pv[10];

主函数根据输入的信息,相应建立Car,Truck或Bus类对象,对于Car给出载客数和重量,Truck给出重量,Bus给出载客数。假设载客数和重量均为整数

输入格式:每个测试用例占一行,每行给出汽车的基本信息,每一个为当前汽车的类型1为car,2为Truck,3为Bus。接下来为它的编号,接下来Car是载客数和重量,Truck给出重量,Bus给出载客数。最后一行为0,表示输入的结束。
要求输出各车的编号和收费。

提示:应用虚函数实现多态

输入样例
1 002 20 5
3 009 30
2 003 50
1 010 17 6
0

输出样例
002 170
009 90
003 250
010 148

代码

#include <iostream>
#include <string>
using namespace std;

typedef long long ll;  // 定义 long long 类型别名

// 定义 Vehicle 父类
class Vehicle {
protected:
    string NO;  // 车牌号
public:
    // 构造函数
    Vehicle(string str) {
        NO = str;
    }
    // 抽象虚函数,子类必须实现
    virtual void display() = 0;  // 显示应收费用
    // 虚析构函数,确保子类析构时能够调用到自己的析构函数
    virtual ~Vehicle() {};
};

// 定义 Car 子类
class Car : public Vehicle {
    int n;  // 车位数
    double k;  // 额外重量(吨)
public:
    // 构造函数
    Car(string str, int num, double kg) : Vehicle(str) {
        n = num;
        k = kg;
    }
    // 实现父类抽象虚函数,显示应收费用
    virtual void display() {
        cout << NO << " " << n * 8 + k * 2 << endl; // 输出车辆的编号、应缴费用
    }
};

// 定义 Truck 子类
class Truck : public Vehicle {
    double k;  // 货车货物重量(吨)
public:
    // 构造函数
    Truck(string str, double kg) : Vehicle(str) {
        k = kg;
    }
    // 实现父类抽象虚函数,显示应收费用
    virtual void display() {
        cout << NO << " " << k * 5 << endl; // 输出车辆的编号、应缴费用
    }
};

// 定义 Bus 子类
class Bus : public Vehicle {
    int n;  // 车位数
public:
    // 构造函数
    Bus(string str, int num) : Vehicle(str) {
        n = num;
    }
    // 实现父类抽象虚函数,显示应收费用
    virtual void display() {
        cout << NO << " " << n * 3 << endl; // 输出车辆的编号、应缴费用
    }
};

// 主函数
int main() {
    Vehicle *pd[10];  // 定义存放类指针的数组
    string str;  // 定义字符串变量
    int t, num, i = 0;  // 定义整数变量和计数器
    double kg;  // 定义浮点数变量
    cin >> t;  // 输入车辆数量
    while (t) {  // 循环读取车辆信息
        cin >> str;  // 输入车牌号
        if (t == 1) {  // 如果是小汽车
            cin >> num >> kg;  // 输入车位数和额外重量
            pd[i] = new Car(str, num, kg);  // 创建 Car 类型对象,并保存指针地址到数组中
        }
        else if (t == 2) {  // 如果是货车
            cin >> kg;  // 输入货物重量
            pd[i] = new Truck(str, kg);  // 创建 Truck 类型对象,并保存指针地址到数组中
        }
        else if (t == 3) {  // 如果是公交车
            cin >> num;  // 输入车位数
            pd[i] = new Bus(str, num);  // 创建 Bus 类型对象,并保存指针地址到数组中
        }
        pd[i]->display();  // 调用虚函数,显示应收费用
        i++;  // 计数器增加 1
        cin >> t;  // 继续输入下一个车辆的类型
    }
    delete *pd;  // 释放内存
    return 0;  // 返回 0,程序结束
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋说

感谢打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值