驾驶员与汽车

6 篇文章 0 订阅

Problem B: 驾驶员与汽车Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 5493 Solved: 2473
[Submit][Status]Description我们知道,目前我国的驾照大致可分为A、B、C三种,其中C证只能开小型客车(货车),B证可开中、小型客车(货车),A证没有限制。现在请定义如下几个类:

  1. Automobile:抽象类,具有数据成员double speed,纯虚函数virtual void run() const = 0。
  2. 六种车型,即小型车Benz、Buick;中型车Zhongba、Beiqi;以及大型车Dayu、Jianghuai。它们都是Automobile的子类。
  3. Driver类,具有string name和char type两个数据成员,前者是司机的名字,后者是司机持有的驾照类型(A、B或C)。提供Drive(Automobile *)方法,根据驾照类型判定该司机是否可以驾驶指定的汽车。
    Input输入分多行。第一行是一个整数M>0,表示之后有M个测试用例。
    每个测试用例包括四部分:司机姓名(不含空白符)、驾照类型(A、B或C)、车型(分别用字母a~f表示六种车型,对应的车型可以从main()中看出)以及该车的行驶速度(double类型范围内的正数)。
    Output输出共M行,每个测试用例对应一行输入,具体格式参见样例。
    Sample Input
    4
    zhangsan C a 100.33
    lisi C d 100.33
    wangwu B f 100.33
    Tom A e 300.00
    Sample Output
    Driver zhangsan can drive Benz at speed of 100.33km/h.
    A Benz is erased!
    An automobile is erased!
    Driver lisi cannot drive bus.
    A Beiqi is erased!
    An automobile is erased!
    Driver wangwu cannot drive large bus.
    A Jianghuai is erased!
    An automobile is erased!
    Driver Tom can drive Dayu at speed of 300.00km/h.
    A Dayu is erased!
    An automobile is erased!
    HINT1.使用typeid来判定一个基类指针实际指向的对象的类型。

2.注意:append.cc中已经给出了Driver类的一个方法,不要在Driver类重复定义了。

Append Codeappend.cc,

#include<iostream>
#include<string>
#include<vector>
#include <bits/stdc++.h>
using namespace std;
class  Automobile{
public:
    double speed;
    Automobile(){}
    Automobile(double s):speed(s){}
    virtual void run() const = 0;
    virtual ~Automobile(){cout<<"An automobile is erased!"<<endl;}
};
class Benz:public Automobile{
public:
//    double speed;
    Benz(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Benz at speed of "<<speed<<"km/h."<<endl;}
    ~Benz(){cout<<"A Benz is erased!"<<endl;}
};
class Buick:public Automobile{
public:
    Buick(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Buick at speed of "<<speed<<"km/h."<<endl;}
    ~Buick(){cout<<"A Buick is erased!"<<endl;}
 
};
class Zhongba:public Automobile{
public:
    Zhongba(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Zhongba at speed of "<<speed<<"km/h."<<endl;}
    ~Zhongba(){cout<<"A Zhongba is erased!"<<endl;}
 
};
class Beiqi:public Automobile{
public:
    Beiqi(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Beiqi at speed of "<<speed<<"km/h."<<endl;}
    ~Beiqi(){cout<<"A Beiqi is erased!"<<endl;}
 
};
class Dayu:public Automobile{
public:
    Dayu(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Dayu at speed of "<<speed<<"km/h."<<endl;}
    ~Dayu(){cout<<"A Dayu is erased!"<<endl;}
 
};
class Jianghuai:public Automobile{
public:
    Jianghuai(double s):Automobile(s){}
    void run()const{cout<< setprecision(2) << setiosflags(ios::fixed)<<"Jianghuai at speed of "<<speed<<"km/h."<<endl;}
    ~Jianghuai(){cout<<"A Jianghuai is erased!"<<endl;}
 
};
class Driver{
public:
    string name;
    char type;
    Driver(){}
    Driver(string n,char t):name(n),type(t){}
    void Drive(Automobile *automobile);
};
void Driver::Drive(Automobile *automobile)
{
    switch (type)
    {
    case 'A':
        cout<<"Driver "<<name<<" can drive ";
        automobile->run();
        break;
    case 'B':
        if (typeid(*automobile) == typeid(Dayu) || typeid(*automobile) == typeid(Jianghuai))
            cout<<"Driver "<<name<<" cannot drive large bus."<<endl;
        else
        {
            cout<<"Driver "<<name<<" can drive ";
            automobile->run();
        }
        break;
    case 'C':
        if (typeid(*automobile) != typeid(Benz) && typeid(*automobile) != typeid(Buick))
            cout<<"Driver "<<name<<" cannot drive bus."<<endl;
        else
        {
            cout<<"Driver "<<name<<" can drive ";
            automobile->run();
        }
        break;
    }
}
int main()
{
    string name;
    char type;
    double speed;
    char automobileType;
    int cases;
    Automobile *automobile;
 
 
    cin>>cases;
    for (int i = 0; i < cases; i++)
    {
        cin>>name>>type>>automobileType>>speed;
        Driver driver(name, type);
        switch (automobileType)
        {
        case 'a':
            automobile = new Benz(speed);
            break;
        case 'b':
            automobile = new Buick(speed);
            break;
        case 'c':
            automobile = new Zhongba(speed);
            break;
        case 'd':
            automobile = new Beiqi(speed);
            break;
        case 'e':
            automobile = new Dayu(speed);
            break;
        case 'f':
            automobile = new Jianghuai(speed);
            break;
        }
        driver.Drive(automobile);
        delete automobile;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值