在本次实验中,你要利用简单的类组合成复杂的类。按以下要求编写两个类,分别用于表示汽车发动机、变速箱,并利用这两个类的对象作为成员设计一个表示汽车的类。要求如下:
1)发动机类Engine:
1.1)用私有成员变量表示以下三项信息(括号中是变量类型):发动机排量capacity (float)、发动机排量maxPower (float)、燃料类型feulType。其中燃料类型有四种,请定义一个枚举类型表示燃料类型,枚举常量分别用于表示:汽油(PETROL),柴油(DIESEL),丙烷(PROPANE)以及天然气(NATRUAL_GAS)四种燃料类型。
1.2)编写私有成员函数,用于返回发动机燃料的名称,返回类型为string,类型名称为:PETROL: "汽油",DIESEL: "柴油", PROPANE: "丙烷",NATRUAL_GAS: "天然气"。
1.3)为上述三个成员变量分别编写公有成员函数,返回成员变量的值。
1.4)为上述三个成员变量分别编写公有成员函数,修改成员变量的值,函数参数为成员变量的新值。
1.5)编写公有成员函数show(),输出发动机的上述三个信息,其中燃料用1.2)中的燃料名称输出。
1.6)编写公有构造函数,用于初始化三个成员变量。该函数的默认参数值分别是:排量2,最大功率120,燃料类型PETROL。
2)变速箱类GearBox。要求:
2.1) 用一个私有成员numGears表示变速档数。
2.2)用一个私有成员变量type表示变速箱类型。定义一个枚举类型GearType,用于表示变速箱类型,GearType中定义以下5个枚举常量:MT,AT,AMT,CVT,DCT。
2.3)编写一个私有成员函数,用于返回变速箱类型名称。变速箱类型与名称的对应关系为:MT: "手动",AT:"自动",AMT:"机械式自动",CVT:"无级变速",DCT:"双离合变速"。函数的返回类型为string。
2.4)编写一个公有成员函数返回档位数。
2.5)编写一个公有成员函数修改档位数。
2.6)编写一个公有成员show(),输出变速箱类型名称以及档位数,注意便须向类型按照2.3)中的对应关系输出。
2.7)编写公有构造函数,用于初始化两个成员变量,构造函数的参数默认值为:变速箱类型:MT,档位数:4。
3)汽车类Car。要求:
3.1)包含四个私有成员变量,分别是:make(string)表示汽车厂商, numSeats(int)表示座位数, engine(Engine)表示汽车的发动机, gearbox(GearBox)表示汽车的变速箱。
3.2)编写公有成员函数changeEngine,更换汽车的发动机,函数参数是一个Engine对象。
3.3)编写公有成员函数changeGearBox,更换汽车的变速箱,函数参数是一个GearBox对象。
3.4) 编写公有成员函数show(),用于在控制台上输出输出汽车的所有信息,包括厂商,座位数以及发动机和变速箱信息。下面是一个输出示例:
厂商:奔驰,座位数:5
发动机参数:排量(L):2,最大功率(kW):150,燃料:汽油
变速箱参数:类型:自动,档位数:6
3.5)编写构造函数函数,初始化上述四个成员变量,构造函数的参数分别表示厂商、座位数、排量、最大功率、燃料类型、变速箱类型以及档位数。
4) 在main函数中定义一个Car对象,表示以下车辆信息:华晨宝马生产的5座车,发动机排量2.0L,最大功率115kW,燃料为汽油,变速箱为8档自动挡,输出车辆信息,然后将该车辆的发动机更换为最大功率195kW,变速箱更换为9档,并输出新的车辆信息。
#include<iostream>
using namespace std;
enum FType {PETROL,DIESEL,PROPANE,NATRUAL_GAS};//0 1 2 3
class Engine{
public:
Engine(int c=2,int p=120,FType f=PETROL){
capacity=c;
maxPower=p;
FeulType=f;
}
float getcapcity(){
return capacity;
}
float getmaxPower(){
return maxPower;
}
int GetFeulType(){
return FeulType;
}
void NewValue(float x,float y,FType z){
capacity=x;
maxPower=y;
FeulType=z;//强制类型转换
}
void show(){
cout<<"排量(L):"<<capacity;
cout<<",最大功率(kW):"<<maxPower;
cout<<",燃料:"<<FeulName(FeulType)<<endl;
}
private:
float capacity,maxPower;//发动机排量,最大功率
enum FType FeulType;//燃料类型
string FeulName(FType FeulType){
if(FeulType==PETROL) return "PETROL-汽油";
if(FeulType==DIESEL) return "DIESEL-柴油";
if(FeulType==PROPANE) return "PROPANE-丙烷";
if(FeulType==NATRUAL_GAS) return "NATRUAL_GAS-天然气";
}//私有成员函数,用于返回发动机燃料的名称
};
enum GType{MT,AT,AMT,CVT,DCT};
class GearBox{
public:
GearBox(int x=0,GType z = MT){
numGears=x;
GearType=z;
}
int GetnumGears(){
return numGears;//返回档数
}
void NewnumGears(int x){
numGears=x;//修改档数
}
void show(){
cout<<"变速箱类型:"<<GearName(GearType);
cout<<",档位数:"<<numGears<<endl;
}
private:
int numGears;//变速档数
enum GType GearType;
string GearName(GType GearType){
if(GearType==MT) return "MT-手动";
if(GearType==AT) return "AT-自动";
if(GearType==AMT) return "AMT-机械式自动";
if(GearType==DCT) return "DCT-双离合变速";
}//私有成员函数,用于返回发动机燃料的名称
};
class car{
public:
car(string M,int N,Engine E,GearBox G):engine(E),gearbox(G){
make=M;
numSeats=N;
engine=E;
gearbox=G;
}
void ChangeEngine(Engine E){//更改发动机
engine=E;
}
void ChangeGearBox(GearBox G){//更改变速箱
gearbox=G;
}
void show(){
cout<<"-----------------------------------------------------"<<endl;
cout<<"厂商:"<<make<<","<<"座位数:"<<numSeats<<endl;
cout<<"发动机参数:";
engine.show();
cout<<"变速箱参数:";
gearbox.show();
cout<<"-----------------------------------------------------"<<endl;
}
private:
string make;//汽车厂商
int numSeats;//座位数
Engine engine;//汽车发动机
GearBox gearbox;//汽车变速箱
};
int main()
{
/*Engine E1(2,120,PETROL);
cout<<E1.getcapcity()<<endl;
cout<<E1.getmaxPower()<<endl;
cout<<E1.GetFeulType()<<endl;
E1.show();
float x,y;
enum FType z;
cin>>x>>y;
cin>>(int&)z;//使用(int&)进行类型转换
E1.NewValue(x,y,z);
E1.show();*/
/*GearBox G1(4,MT);
int x;
cin>>x;
G1.NewnumGears(x);
cout<<"变速档位:"<<G1.GetnumGears()<<endl;
G1.show();
int y;
enum GType z;
cin>>y;
cin>>(int&)z;
GearBox G2(y,z);
cout<<"变速档位:"<<G2.GetnumGears()<<endl;
G2.show();*/
string Making="华晨宝马";
int NumSeats=5;
//-------------
float capac=2.0;
float maxpow=115;
enum FType F=PETROL;
Engine engine(capac,maxpow,F);
//-------------
int NumGear=8;
enum GType G=AT;
GearBox gearbox(NumGear,G);
//-------------
car Car(Making,NumSeats,engine,gearbox);
Car.show();
cout<<"-----------------------------------------------------"<<endl;
cout<<"请输入修改后的变速档数:";
cin>>NumGear;//变速档数
gearbox.NewnumGears(NumGear);
cout<<"请输入修改后的发动机最大功率:";
cin>>maxpow;//最大功率
engine.NewValue(capac,maxpow,F);
Car.ChangeEngine(engine);
Car.ChangeGearBox(gearbox);
cout<<"-----------------------------------------------------"<<endl;
Car.show();
cout<<"ending"<<endl;
return 0;
}