首页 > 编程语言 >[C++/PTA] 汽车收费

[C++/PTA] 汽车收费

时间:2023-06-14 21:57:22浏览次数:45  
标签:函数 Bus Vehicle C++ Truck PTA str Car 收费

题目要求

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

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

总结

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

我是秋说,我们下次见。

标签:函数,Bus,Vehicle,C++,Truck,PTA,str,Car,收费
From: https://www.cnblogs.com/qiushuo/p/17481449.html

相关文章

  • [C语言/PTA] 学生成绩链表处理
    题目要求本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。函数接口定义:structstud_node*createlist();structstud_node*deletelist(structstud_node*head,intmin_score);函数createlist利用scanf从输入......
  • [C语言/PTA] 单链表结点删除
    题目要求本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:structListNode{intdata;ListNode*next;};函数接口定义:structListNode*readlist();structListNode*deletem(structListNode*L,intm);......
  • [C++/PTA] 计算时间相减
    题目要求题目描述:定义一个时间类,小时和分钟是其两个私有成员数据。输入一个起始时间和一个结束时间(起始时间早于结束时间),通过运算符重载-(减号),计算这两个时间相隔多少分钟。说明:这两个时间在同一天之内,且采用24小时计时分式,即从00:00-23:59。输入格式:测试输入包含若干测......
  • [C语言/PTA] 建立学生信息链表
    题目要求本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。函数接口定义:voidinput();该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:structstud_node{intnum;/*学号*/charnam......
  • [C++/PTA] 括号匹配
    题目要求给定仅包含()[]{}六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。输入格式:第一行一个整数T(T<=10)其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)输出格式:对于每个字符串,匹配输出Yes,否则输出No......
  • c++的常量折叠
    一,前言有关C++语言的const常量的考察点:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域。所以说C++的const常量和常量字符串是不同的,常量字符......
  • [C++/PTA] 办事大厅排队
    题目要求在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1)inname表示名字为name的人员新来到办事大厅,排在......
  • 从C++mutex到futex
    从std::mutex到futex机制我原本出发点是C++std::mutex的实现原理,但是经过一番查阅,发现C++std::mutex是对glibc-nptl库pthread_mutex的封装;而nptl库在用户态完成了futex机制的一部分;最后在以linux为内核的操作系统中,又提供了futex系统调用给glibc-nptl给与底层支撑。因此本文先......
  • C++ 中 Concept-Model 概念模型
    此文档参考自:https://gracicot.github.io/conceptmodel/2017/09/13/concept-model-part1.html,觉得很有趣,就翻译过来了一、Concept-Model:多态的新视角面向对象编程大家都很熟悉,只需实现一个接口Interface。但这种使用经典OOP实现的多态性是侵入性的,即使在真正不需要的地方......
  • C/C++C语言课程设计[2023-06-14]
    C/C++C语言课程设计[2023-06-14]C语言课程设计要求1、每位同学按照指定的题目完成C语言课程设计,题目不能更换,每人1题,独立完成。上课时间同学们进入学习通课程(C语言课程设计)里签到,老师会有讲解检查。2、考核要求成绩组成考核/评价环节分值(或百分比)考核/评价细则平时成绩考勤、......