• 实验8:Problem E: 驾驶员与汽车


    这个题我多次wrong answer 50%,后来同学提醒是精度控制的问题(虽然题目没说,但OJ却是有检测~~~)

    Home Web Board ProblemSet Standing Status Statistics
     
    Problem E: 驾驶员与汽车

    Problem E: 驾驶员与汽车

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 819  Solved: 369
    [Submit][Status][Web Board]

    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!

    HINT

    1.使用typeid来判定一个基类指针实际指向的对象的类型。

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

    Append Code

    [Submit][Status][Web Board]
    #include<iostream>
    #include <typeinfo>
    #include<iomanip>
    using namespace std;
    class Automobile{
    protected:
        double speed;
        Automobile *next;
    public:
        virtual void run()const =0;
        Automobile(double s=0):speed(s){}
        virtual ~Automobile(){cout<<"An automobile is erased!"<<endl;}
    };
    class Benz:public Automobile{
    protected:
        double speed;
    public:
        Benz(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Benz at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Benz(){cout<<"A Benz is erased!"<<endl;}
    };
    class Buick:public Automobile{
        protected:
        double speed;
    public:
        Buick(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Buick at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Buick(){cout<<"A Buick is erased!"<<endl;}
    };
    class Zhongba:public Automobile{
        protected:
        double speed;
    public:
        Zhongba(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Zhongba at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Zhongba(){cout<<"A Zhongba is erased!"<<endl;}
    };
    class Beiqi:public Automobile{
        protected:
        double speed;
    public:
        Beiqi(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Beiqi at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Beiqi(){cout<<"A Beiqi is erased!"<<endl;}
    };
    class Dayu:public Automobile{
        protected:
        double speed;
    public:
        Dayu(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Dayu at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Dayu(){cout<<"A Dayu is erased!"<<endl;}
    };
    class Jianghuai:public Automobile{
        protected:
        double speed;
    public:
        Jianghuai(double s):speed(s){}
        void run()const{cout<<setiosflags(ios::fixed)<<"Jianghuai at speed of "<<setprecision(2)<<speed<<"km/h."<<endl;}
        ~Jianghuai(){cout<<"A Jianghuai is erased!"<<endl;}
    };
    class Driver{
    protected:
        string name;
        char type;
    public:
        void Drive(Automobile *);
        Driver(string n,char t):name(n),type(t){}
        ~Driver(){}
    };
    
    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;
    }
    向代码最深处出发~!
  • 相关阅读:
    树链剖分总结
    主席树总结
    BZOJ1053:反素数(数学)
    CH3101 阶乘分解
    2018-2019 ACM-ICPC ECfinal I. Misunderstood … Missing
    洛谷P3201 [HNOI2009]梦幻布丁(链表 + 启发式合并)
    Codeforces Round #552 (Div. 3) 题解
    线段树合并 总结
    生成器
    Python中input()和raw_input()的区别
  • 原文地址:https://www.cnblogs.com/auto1945837845/p/5425597.html
Copyright © 2020-2023  润新知