Experimento C ++ --- conductor y coche

Conductor y coche

Descripción

Sabemos que la licencia de conducir actual de mi país se puede dividir aproximadamente en tres categorías: A, B y C. El certificado C solo se puede usar para automóviles de pasajeros pequeños (camiones), el certificado B se puede usar para automóviles de pasajeros medianos y pequeños (camión) y el certificado A no tiene restricciones. Ahora defina las siguientes clases:

Automóvil: Clase abstracta, con miembro de datos de doble velocidad, función virtual pura virtual void run () const = 0.

Hay seis modelos, a saber, automóviles pequeños Benz y Buick; automóviles medianos Zhongba y Beiqi; y automóviles grandes Dayu y Jianghuai. Son todas subclases de automóvil.

La clase Driver tiene dos miembros de datos: nombre de cadena y tipo char. El primero es el nombre del conductor y el segundo es el tipo de licencia de conducir (A, B o C) que posee el conductor. Proporciona el método Conducir (automóvil *) para determinar si el conductor puede conducir el automóvil especificado de acuerdo con el tipo de licencia de conducir.

Aporte

Ingrese varias líneas. La primera línea es un número entero M> 0, lo que indica que hay M casos de prueba.

Cada caso de prueba incluye cuatro partes: nombre del conductor (sin caracteres en blanco), tipo de licencia de conducir (A, B o C), tipo de vehículo (las letras a ~ f se utilizan para indicar seis tipos de vehículos, y los tipos de vehículos correspondientes se pueden ver desde main () Out) y la velocidad de conducción del automóvil (un número positivo en el rango del tipo doble).

Producción

Hay un total de M líneas de salida y cada caso de prueba corresponde a una línea de entrada. Consulte la muestra para conocer el formato específico.

Entrada de muestra

4
zhangsan C a 100.33
lisi C d 100.33
wangwu B f 100.33
Tom A e 300.00

Salida de muestra

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!

PISTA

1. Utilice typeid para determinar el tipo de objeto al que apunta un puntero de clase base.
2. Nota: Ya se proporciona un método de la clase Driver en append.cc, no repita la definición en la clase Driver.

Título dado código

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

código:

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

Ideas:
1) Preste atención al uso de fixed y setprecision, en el archivo de encabezado:
inside;
use:

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

2) Preste atención al uso de la palabra clave typeid (): ¡se
usa para determinar si un objeto es una instanciación de una clase!

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

Preste atención al archivo de encabezado de declaración:
3) Para ejecutar el destructor de la clase abstracta, el destructor de la clase padre no debe declararse virtual
4) Preste atención al método de definición de función abstracta general

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

5) ¡Ejecute el constructor de la clase padre antes de ejecutar el constructor de la subclase! ! !

Supongo que te gusta

Origin blog.csdn.net/timelessx_x/article/details/115144828
Recomendado
Clasificación