[C++/PTA] 汽车收费

[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

解题思路

定义一个名为 Vehicle的抽象类作为父类,包含虚函数display(),用于在子类中实现应缴费用的输出。

定义 CarTruckBus 三个子类,它们分别继承自 Vehicle 父类,并实现了各自的 display() 函数。

在主函数中

  1. 首先定义了一个指向 Vehicle 类指针的数组 pd,用于存放类的对象指针地址。

  2. 接着使用循环读取车辆信息,根据不同类型的车辆输入不同的参数,创建相应的对象并将指针地址保存到数组中。每次创建完对象就调用其 display() 函数输出应缴费用。

代码

#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,程序结束
}

总结

该题考察纯虚函数的声明和实现多态性的应用以及指针的操作等。同时也考察了基本的控制结构数据类型

我是秋说,我们下次见。

猜你喜欢

转载自blog.csdn.net/2301_77485708/article/details/131220206
今日推荐