汽车信息处理程序

#include<iostream>
#include<string>
using namespace std;
class Auto
{
protected :
string stypename;
int npassengers;
string smanufacturer;
public :
Auto()
{
stypename="Auto";
npassengers=0;
smanufacturer="no manufacturer";
}
virtual ~Auto()
{
}
static void TrimLine(char *sbuf)
{
while(sbuf!='\0')
{
if(*sbuf=='\r'||*sbuf=='\n')
{
*sbuf='\0';
break;
}
sbuf++;
}
}
virtual bool Input(FILE *fp)=0;
virtual void Show()=0;
};
class Car:public Auto
{
public:
Car()
{
stypename="Car";
}
bool Input(FILE *fp)
{
char sbuf[100];
fgets(sbuf,100,fp);//读入一行字符串(包括换行符)
TrimLine(sbuf);//去掉换行符
smanufacturer=sbuf;
fgets(sbuf,100,fp);
npassengers=atoi(sbuf);//atoi()函数实现把字符串内容转换为整数
return true;
}
void Show()
{
cout<<"Style: "<<stypename<<endl;
cout<<"Manufacturer: "<<smanufacturer<<endl;
cout<<"Passenger: "<<npassengers<<endl;
}
};
class Truck:public Car
{
protected:
float fload; //载重量
public:
Truck() //卡车类构造函数

stypename="Truck"; //车型名称
fload=0;
}
//重写虚函数Input()
bool Input(FILE *fp)
{
char sbuf[100];
Car::Input(fp); //调用基类的Input()函数
fgets(sbuf,100,fp); //读入一行数据,载重值
fload=atof(sbuf);    //atof()函数实现把字符串内容转换为浮点数
return true;
}
void Show()
{
Car::Show(); //调用基类的输出函数Show()
cout<<"Load: "<<fload<<endl; //输出卡车的载重值
}
};
//吊车Crane类,从Car类派生
class Crane:public Truck
{
protected:
float fheight; //吊车的举物高度
public:
Crane()

stypename="Crane"; 
fheight=0;
}
//重写虚函数Input()
bool Input(FILE *fp)
{
char sbuf[100];
Truck::Input(fp);
fgets(sbuf,100,fp);
fheight=atof(sbuf);
return true;
}
//重写显示吊车信息的虚函数Show()
void Show()
{
Truck::Show();
cout<<"Height: "<<fheight<<endl;
}
};


int main()
{
FILE *stream; //定义文件指针
stream=fopen("autos.txt","r");//以只读方式打开数据文件autos.txt
if(stream==NULL)//打开文件失败
{
cout<<"Can't open the file."<<endl;
return 0;
}
Auto *autos[3];//定义对象指针数组,包含三个指针变量元素
char sbuf[100]; //字符缓冲区
int  index=0; //序号
//循环处理每一组车型信息
while(fgets(sbuf,100,stream)!=NULL && index<3)//读入一行字符串
{
if(strncmp(sbuf,"Car",3)==0) //检查是否为Car类型
autos[index]=new Car(); //是,动态生成Car对象
else if(strncmp(sbuf,"Truck",5)==0) //检查是否为Truck类型
autos[index]=new Truck(); //是,动态生成Truck对象
else if(strncmp(sbuf,"Crane",5)==0) //检查是否为Crane类型
autos[index]=new Crane(); //是,动态生成Crane对象
else break; //其他非法信息
autos[index]->Input(stream); //用基类指针调用Input()虚函数
index++; //序号递增
}
fclose(stream); //关闭文件
for(int i=0;i<index;i++)
{
autos[i]->Show(); //用基类指针调用Show()虚函数
cout<<endl;
delete autos[i]; //删除对象
}
return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值