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