2014年
有以下用于表示商场商品信息的CGoods类定义。
class CGoods
{
private:
int m_num; //商品编号
string m_name; //商品名称
float m_price; //商品价格
public:
CGoods (int, const string&, float);
friend ostream& operator<<(ostream&, const CGoods&);
//商品名称、商品编号和商品价格的显示格式都要求为占10列、右对齐
};
请按照如下要求完成相应程序:
- 实现CGoods类的所有成员函数;
- 以CGoods类为基类,定义CRouter子类,用于表示商场所销售的路由器商品信息。要求该类必须要具有如下成员变量和成员函数:
a) 用于表示路由器信号频率的变量,float类型
b) 用于表示路由器端口数量的变量,int类型
c) 有参构造函数,如不给定初值则各成员变量取初值如下:
商品编号:1
商品名称:"M8"
商品价格:100.0
信号频率:2.4
端口数量:8
d) 获取路由器端口数量的成员函数GetChannels;
e) 获取路由器信号频率的成员函数GetFrequency;
f) 前自增运算符重载函数,实现端口数量加1的操作;
g) 后自增运算符重载函数,实现端口数量加1的操作;
h) 流输出符“<<”重载函数,实现对路由器商品全部信息的显示,基类部分成员的显示格式要求与CGoods类部分相同,信号频率和端口数量的显示格式都要求为占10列、右对齐。 - 在上述CGoods类和CRouter类的基础上,请按照下列要求分别编写3个函数:
a) 编写一个函数,从文本文件中读取数量未知个路由器商品数据,构成一个向量。该文本文件中每条路由器商品信息中顺序包含了商品编号、商品名称、商品价格、信号频率、端口数量,每条数据占1行。
b) 编写一个函数,显示向量中所有路由器商品数据,每条数据占1行。
c) 编写一个函数,查找到向量中“端口数量和信号频率的乘积”最大的那个元素。 - 通过如下所示的主函数对CGoods类、CRouter类和上述3个函数的功能进行验证
void main()
{
vector<CRouter> s;
ReadData(s,"D:\\Data.txt");
cout<<"读取完成后的向量为"<<endl;
DisplayData(s);
CRouter t;
cout<<endl<<"路由器对象的初始值为"<<endl<<t<<endl;
t=FindMax(s);
cout<<endl<<"乘积最大的向量元素为"<<endl<<t<<endl;
cout<<endl<<"乘积最大的向量元素进行自增运算结果分别如下:"<<endl;
cout<<t++<<endl;
cout<<t<<endl;
cout<<++t<<endl;
cout<<t<<endl;
}
以下是答案代码,可能换行有点瑕疵,但我懒得改了。
//author CN.TTDragon
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <iterator>
#include <sstream>
#include <algorithm>
#include<string>
#include<cmath>
#include<cstdio>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e5+7;
const double pi=acos(-1);
using namespace std;
class CGoods
{
private:
int m_num; //商品编号
string m_name; //商品名称
float m_price; //商品价格
public:
CGoods (int num, const string& name, float price)
{
m_num=num;
m_name=name;
m_price=price;
}
friend ostream& operator<<(ostream& os, const CGoods& obj)
//商品名称、商品编号和商品价格的显示格式都要求为占10列、右对齐
{
os<<setw(10)<<right<<obj.m_name
<<setw(10)<<right<<obj.m_num
<<setw(10)<<right<<obj.m_price;
return os;
}
};
class CRouter : public CGoods
{
private:
float m_fre;//信号频率
int m_cha;//端口数量
public:
CRouter(int num=1, const string& name="M8", float price=100.0,float fre=2.4,int cha=8 ):CGoods(num,name,price)
{
m_fre=fre;
m_cha=cha;
}
int GetChannels()
{
return m_cha;
}
float GetFrequency()
{
return m_fre;
}
friend CRouter & operator ++(CRouter & obj)
{
obj.m_cha++;
return obj;
}
friend CRouter operator ++(CRouter & obj,int b)
{
CRouter temp(obj);
obj.m_cha++;
return temp;
}
friend ostream& operator<<(ostream& os, const CRouter& obj)
{
os<<static_cast<const CGoods&>(obj);
os<<setw(10)<<right<<obj.m_fre
<<setw(10)<<right<<obj.m_cha<<endl;
return os;
}
};
void ReadData(vector<CRouter> &s,string name)
{
ifstream in(name.c_str());
int num;
string mname;
float price;
float fre;
int cha;
while(in>>num>>mname>>price>>fre>>cha)
{
CRouter temp(num,mname,price,fre,cha);
s.push_back(temp);
}
}
void DisplayData(vector<CRouter> &s)
{
for (size_t i=0;i<s.size();i++)
{
cout<<s[i];
}
}
CRouter FindMax(vector<CRouter> &s)
{
float mx=s[0].GetChannels()*s[0].GetFrequency();
float place=0;
for (size_t i=0;i<s.size();i++)
{
if(mx<s[i].GetChannels()*s[i].GetFrequency())
{
mx=s[i].GetChannels()*s[i].GetFrequency();
place=i;
}
}
return s[place];
}
int main()
{
vector<CRouter> s;
ReadData(s,"f:\\C++\\homework\\2014-3\\Data.txt");
cout<<"读取完成后的向量为"<<endl;
DisplayData(s);
CRouter t;
cout<<endl<<"路由器对象的初始值为"<<endl<<t<<endl;
t=FindMax(s);
cout<<endl<<"乘积最大的向量元素为"<<endl<<t<<endl;
cout<<endl<<"乘积最大的向量元素进行自增运算结果分别如下:"<<endl;
cout<<t++<<endl;
cout<<t<<endl;
cout<<++t<<endl;
cout<<t<<endl;
return 0;
}
以下是Date.txt
114 S5 5280.0 2.4 4 26 S2 3090.0 5.0 16 325 S3 3560.0 2.4 32 42 S4 4130.0 5.0 8 163 S1 1800.5 2.4 8
2015年:
很多家用电器中都有电机(或称马达)。用于表示家用电器中电机的类Motor的定义如下所示
class Motor
{
private:
int m_Type; //电机类型 0-直流 1-交流
int m_Power; //电机功率(必须为正数)
public:
Motor(int Type, int Power);
int GetPower()const; //读取电机功率
int SetPower(int Power); //修改电机功率,返回值表示修改是否成功,0-失败 1-成功
friend ostream& operator<<(ostream &Out, const Motor &Obj);
};
在上述类定义的基础上,实现该类的所有成员函数和友元函数。其中,流输出符重载中显示电机信息的格式要求为:
(1) 电机类型:占4列,右对齐,0显示为DC,1显示为AC
(2) 电机功率:占6列,右对齐
用于表示家用电器的类
class Appliance
{
private:
string m_Name;
double m_Weight; //重量(必须为正数)
public:
Appliance(const string &Name, double Weight);
double GetWeight()const; //读取重量
int SetWeight(double Weight); //修改重量,返回值表示修改是否成功,0-失败 1-成功
friend ostream& operator<<(ostream &Out, const Appliance &Obj);
};
在上述类定义的基础上,实现该类的所有成员函数和友元函数。其中,流输出符重载中显示家用电器信息的格式要求为:
(1) 名称:占6列,右对齐
(2) 重量:占6列,小数点保留1位,右对齐
请按要求编写一个类WashMachine,用于描述洗衣机。WashMachine类的要求如下:
(1) Appliance类为WashMachine类的public基类;
(2) WashMachine类包含以下数据成员:
洗衣机的电机部件m_Motor,Motor类型
洗衣容积m_Volume,int类型,必须为正数。
注意:上述2个数据成员均为私有。
(3) 请设计提供1个带有5个参数的构造函数,各参数的顺序分别为:电器名称、电机类型、电机功率、电器重量和洗衣容积,各参数的数据类型请自己决定。如不给定初值则各成员变量取初值如下:
电器名称:”M9”
电机类型:0
电机功率:20
电器重量:20.0
洗衣容积:20
(4) 请设计用于获取洗衣机洗衣容积的常成员函数GetVolume。
(5) 请设计前自增运算符++重载函数。其含义为:电机功率增加10,电器重量增加10.0,洗衣容积增加10。
(6) 请设计后自增运算符++重载函数。自增规则同前。
(7) 请设计流输出运算符重载函数,用于显示洗衣机的所有信息,格式要求如下:
名称:与Appliance类中格式要求相同
重量:与Appliance类中格式要求相同
电机类型:与Motor类中格式要求相同
电机功率:与Motor类中格式要求相同
洗衣容积:占5列,右对齐
在上述类定义的基础上,请按照下列要求分别编写4个函数:
(1) 编写一个函数ReadFileData,从文本文件中读取数量未知个洗衣机的数据,构成一个洗衣机向量。该文本文件中每条洗衣机信息中顺序包含了名称、重量、电机类型、电机功率和洗衣容积,每条数据占1行。
(2) 编写一个函数DisplayData,显示洗衣机向量中所有商品数据,每条数据占1行。
(3) 编写一个函数FindData,查找到洗衣机向量中“洗衣容积大于X”的所有洗衣机数据,并将这些查找得到的结果数据通过一个新的向量来进行返回。其中X表示查找的最小洗衣容积值,int类型。
(4) 再编写一个函数FindData,查找到洗衣机向量中“重量大于Y”的所有洗衣机数据,并将这些查找得到的结果数据通过一个新的向量来进行返回。其中Y表示查找的最小重量值,double类型。
通过如下所示的主函数对上述3个类和4个函数的功能进行验证
void main()
{
vector<WashMachine> data,res;
if (ReadFileData("d:\\info.txt", data)==0)
return;
cout<<"文件读取完成后的洗衣机信息如下:"<<endl;
DisplayData(data);
res = FindData(data, 30);
cout<<endl<<"洗衣容积大于30的洗衣机信息如下所示:"<<endl;
DisplayData(res);
res = FindData(data, 20.0);
cout<<endl<<"重量大于20.0的洗衣机信息如下所示:"<<endl;
DisplayData(res);
WashMachine d;
cout<<endl<<"新增加洗衣机对象及其自增运算结果如下所示:"<<endl;
cout<<d<<endl;
cout<<d++<<endl;
cout<<d<<endl;
cout<<++d<<endl;
cout<<d<<endl;
}牛客犯病了,以下是答案
//author CN.TTDragon
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <iterator>
#include <sstream>
#include <algorithm>
#include<string>
#include<cmath>
using namespace std;
class Motor
{
private:
int m_Type; //电机类型 0-直流 1-交流
int m_Power; //电机功率(必须为正数)
public:
Motor(int Type, int Power)
{
m_Type=Type;
m_Power=Power;
}
int GetPower()const//读取电机功率
{
return m_Power;
}
int SetPower(int Power) //修改电机功率,返回值表示修改是否成功,0-失败 1-成功
{
if(Power>0)
{
m_Power =Power;
return 1;
}
else
{
return 0;
}
}
friend ostream& operator<<(ostream &Out, const Motor &Obj)
{
if(Obj.m_Type==0)
{
Out<<setw(4)<<right<<"DC";
}
else
{
Out<<setw(4)<<right<<"AC";
}
Out<<setw(6)<<right<<Obj.m_Power;
return Out;
}
};
class Appliance
{
private:
string m_Name;
double m_Weight; //重量(必须为正数)
public:
Appliance(const string &Name, double Weight)
{
m_Name=Name;
m_Weight=Weight;
}
double GetWeight()const //读取重量
{
return m_Weight;
}
int SetWeight(double Weight) //修改重量,返回值表示修改是否成功,0-失败 1-成功
{
if(Weight>0)
{
m_Weight=Weight;
return 1;
}
else
{
return 0;
}
}
friend ostream& operator<<(ostream &Out, const Appliance &Obj)
{
Out<<setw(6)<<right<<Obj.m_Name
<<setw(6)<<fixed<<setprecision(1)<<Obj.m_Weight;
return Out;
}
};
class WashMachine:public Appliance
{
private:
Motor m_Motor;
int m_Volume;
public:
WashMachine(const string &Name="M9",int Type=0,int Power=20,double Weight=20.0f,int Volume=20):m_Motor(Type,Power),Appliance(Name,Weight)
{
m_Volume=Volume;
}
int GetVolume() const
{
return m_Volume;
}
friend WashMachine & operator++ (WashMachine &a)
{
a.m_Volume=a.m_Volume+10;
a.SetWeight(a.GetWeight()+10);
a.m_Motor.SetPower(a.m_Motor.GetPower()+10);
return a ;
}
friend WashMachine operator++ (WashMachine &a,int b)
{
WashMachine temp(a);
a.m_Volume=a.m_Volume+10;
a.SetWeight(a.GetWeight()+10);
a.m_Motor.SetPower(a.m_Motor.GetPower()+10);
return temp ;
}
friend ostream& operator<<(ostream &Out, const WashMachine &Obj)
{
Out<<static_cast<const Appliance&>(Obj)
<<Obj.m_Motor
<<setw(5)<<right<< Obj.m_Volume<<endl;
return Out;
}
};
int ReadFileData(string filename,vector<WashMachine> &data)
{
ifstream in(filename.c_str());
if(!in)
{
return 0;
}
int cnt=0;
string mname;
double a;
int b,c,d;
while(in>>mname>>a>>b>>c>>d)
{
WashMachine qq(mname,b,c,a,d);
data.push_back(qq);
cnt++;
}
return cnt;
}
void DisplayData(vector<WashMachine> &data)
{
for(size_t i=0;i<data.size();i++)
{
cout<<data[i];
}
}
vector<WashMachine> FindData(vector<WashMachine> &data,int b)
{
vector<WashMachine> res;
for(size_t i=0;i<data.size();i++)
{
if(data[i].GetVolume()>b)
{
res.push_back(data[i]);
}
}
return res;
}
vector<WashMachine> FindData(vector<WashMachine> &data,double b)
{
vector<WashMachine> res;
for(size_t i=0;i<data.size();i++)
{
if(data[i].GetWeight()>b)
{
res.push_back(data[i]);
}
}
return res;
}
int main()
{
vector<WashMachine> data,res;
if (ReadFileData("f:\\C++\\homework\\2015-3\\info.txt", data)==0)
return 0;;
cout<<"文件读取完成后的洗衣机信息如下:"<<endl;
DisplayData(data);
res = FindData(data, 30);
cout<<endl<<"洗衣容积大于30的洗衣机信息如下所示:"<<endl;
DisplayData(res);
res = FindData(data, 20.0);
cout<<endl<<"重量大于20.0的洗衣机信息如下所示:"<<endl;
DisplayData(res);
WashMachine d;
cout<<endl<<"新增加洗衣机对象及其自增运算结果如下所示:"<<endl;
cout<<d<<endl;
cout<<d++<<endl;
cout<<d<<endl;
cout<<++d<<endl;
cout<<d<<endl;
return 0;
}
这里是info.txt
节水1 19.0 1 50 28
节水2 20.0 0 60 29
节水3 21.0 1 70 30
节水4 22.0 0 80 31
京公网安备 11010502036488号