C++实验---驾驶员与汽车

驾驶员与汽车

Description

我们知道,目前我国的驾照大致可分为A、B、C三种,其中C证只能开小型客车(货车),B证可开中、小型客车(货车),A证没有限制。现在请定义如下几个类:

Automobile:抽象类,具有数据成员double speed,纯虚函数virtual void run() const = 0。

六种车型,即小型车Benz、Buick;中型车Zhongba、Beiqi;以及大型车Dayu、Jianghuai。它们都是Automobile的子类。

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类重复定义了。

题目给定代码

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;
}

code:

#include<iostream>
#include<typeinfo>
#include<iomanip>
using namespace std;

class Automobile{
    
    
protected:
	double speed;
public:
	Automobile(double s):speed(s){
    
    }
	
	virtual void run()=0;
		
	virtual ~Automobile(){
    
    
		cout<<"An automobile is erased!"<<endl;
	}
};

class Benz:virtual public Automobile{
    
    
public:
	Benz(double s):Automobile(s){
    
    }
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Benz at speed of "<<speed<<"km/h."<<endl;
	}
	~Benz(){
    
    
		cout<<"A Benz is erased!"<<endl;
	}
};

class Buick:virtual public Automobile{
    
    
public:
	Buick(double s):Automobile(s){
    
    
	}
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Benz at speed of "<<speed<<"km/h."<<endl;
	}
	~Buick(){
    
    
		cout<<"A Buick is erased!"<<endl;
	}
};

class Zhongba:virtual public Automobile{
    
    
public:
	Zhongba(double s):Automobile(s){
    
    }
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Zhongba at speed of "<<speed<<"km/h."<<endl;
	}
	~Zhongba(){
    
    
		cout<<"A Zhongba is erased!"<<endl;
	}
};

class Beiqi:virtual public Automobile{
    
    
public:
	Beiqi(double s):Automobile(s){
    
    }
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Beiqi at speed of "<<speed<<"km/h."<<endl;
	}
	~Beiqi(){
    
    
		cout<<"A Beiqi is erased!"<<endl;
	}
};

class Dayu:virtual public Automobile{
    
    
public:
	Dayu(double s):Automobile(s){
    
    }
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Dayu at speed of "<<speed<<"km/h."<<endl;
	}
	~Dayu(){
    
    
		cout<<"A Dayu is erased!"<<endl;
	}
};

class Jianghuai:virtual public Automobile{
    
    
public:
	Jianghuai(double s):Automobile(s){
    
    }
	void run(){
    
    
		cout<<fixed<<setprecision(2)<<"Jianghuai at speed of "<<speed<<"km/h."<<endl;
	}
	
	~Jianghuai(){
    
    
		cout<<"A Jianghuai is erased!"<<endl;
	}
};

class Driver{
    
    
	string name;
	char type;
public:
	Driver(string N,char C){
    
    
		name=N;
		type=C;
	}
	
	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;
}

思路:
1)注意fixed与setprecision的用法,在头文件:
里面;
用法:

cout<<fixed<<setprecision(2)<<....

2)注意关键字typeid()关键字的用法:
用来判断一个对象是不是一个类的实例化!

typeid(*对象名)==typeid(子类名)

注意声明头文件:
3)抽象类的析构函数要执行必须将父类的析构函数声明未virtual
4)注意一般抽象函数定义方法

virtual 返回类型 函数名(参数列表)=0

5)子类的构造函数执行前先执行父类的构造函数!!!

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/115144828
今日推荐