【c++】2020大一下期末考试小练习1

    技术2026-06-20  30

    考试题目

    CPU是计算机的中央处理单元,是计算机的重要组成部分。计算机有很多具体的结构形式,其中有一种有多种防护等级的计算机被称为工业控制计算机(Industrial Personal Computer,IPC),该特殊形式的计算机经常被用于工业生产现场。

    请根据要求完成如下编程工作: 1、 现有一个CPU类定义如下:

    class CPU { private: double m_MainFreq; //主频,单位GHz int m_CoreNum; //核心数 double m_Power; //功率,单位:W public: CPU(double MainFreq, int CoreNum, double Power); double GetMainFreq(void)const; //获取主频 CPU& operator++(); //前自增,主频加0.1,核心数加2,功率加1.0 CPU operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const CPU& Obj); //输出CPU的参数, //主频占6列,小数部分保留2位,左对齐 //核心数占3列,左对齐 //功率占6列,小数部分保留1位,左对齐 };

    请根据要求完成如下函数定义: (1) 请完善CPU类的构造函数定义,构造函数参数从左向右的含义:主频、核心数、功率 (2) 请完善CPU类的GetMainFreq ()成员函数的定义。 (3) 请完善CPU类的前++和后++运算符重载成员函数的定义。 (4) 请为CPU类提供输出运算符重载函数,输出格式如上所示

    2、 计算机(Computer)基类定义如下:

    class Computer { private: CPU m_CPU; int m_Memory; //内存容量,单位:G int m_HD; //硬盘容量,单位:G public: Computer(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD); CPU GetCPU(void)const; //获取CPU数据 double GetMemory(void)const; //获取内存容量 Computer& operator++(); //前自增,CPU部分自增规则同CPU类,内存扩大4G,硬盘扩大128G Computer operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const Computer& Obj); //CPU部分数据的输出规则与CPU类中定义相同 //内存容量占6列,左对齐 //硬盘容量占8列,左对齐 };

    请根据要求完善如下函数定义: (1) 请完善Computer类的构造函数定义,其中函数参数从左向右的含义:CPU主频、CPU核心数、CPU功率、内存大小、硬盘大小 (2) 请完善Computer类的GetCPU()成员函数的定义。 (3) 请完善Computer类的GetMemory()成员函数的定义。 (4) 请完善Computer类的前++和后++运算符重载成员函数的定义。 (5) 请为Computer类提供输出运算符重载函数,输出格式如上所示。

    3、 请设计一个用于表示工控机的IPC类。

    class IPC:public Computer { private: int m_ProtectGrade; //防护等级 static int m_Counts; //工控机数量 public: IPC(double CPU_MainFreq=3.7, int CPU_CoreNum=6, double CPU_Power=95.0, int Memory=16, int HD=512, int ProtectGrade=65); IPC(const IPC& Obj); double GetProtectGrade(void)const; //获取防护等级 static int GetCounts(void); //获取当前工控机数量 IPC& operator++(); //前自增,Computer数据自增规则同上,防护等级加1 IPC operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const IPC& Obj); //Computer部分数据的输出规则与Computer类中定义相同 //防护等级占5列,左对齐 ~IPC(); };

    请根据要求完善如下函数定义: (1) 请完善IPC类的有参构造函数定义,其中函数参数从左向右的含义:CPU主频、CPU核心数、CPU功率、内存大小、硬盘大小、防护等级 (2) 请完善IPC类的复制构造函数定义 (3) 请完善IPC类的GetProtectGrade ()成员函数的定义。 (4) 请完善IPC类的GetCounts ()成员函数的定义。 (5) 请完善IPC类的前++和后++运算符重载成员函数的定义。 (6) 请为IPC类提供输出运算符重载函数,输出格式如上所示。

    4、 在上述3个类设计的基础上,请按照下列要求分别编写4个函数: (1) 编写一个函数ReadIPCFile,从D盘根目录下的文本文件source.txt中读取数量未知个工控机数据,构成一个IPC类型的向量A。该文本文件中每条工控机信息中顺序包含了CPU主频、CPU核心数、CPU功率、内存容量、硬盘容量、防护等级,每条数据占1行。 (2) 编写一个函数SortIPC,对上述A向量进行增序排序,排序条件定义如下: a) CPU主频 b) 防护等级 注意:上述排序条件是有顺序的,必须按照“a条件-b条件”的顺序来进行处理 (3) 编写一个函数IncreaseIPC,对上述经过排序处理后的A向量中内存容量小于等于4G的工控机数据进行前自增处理,自增处理后的工控机数据必须要仍然保存在A向量中原数据位置处。 (4) 编写一个函数OutputIPCFile,将经过上述处理后的A向量中所有工控机数据保存在D盘根目录下的文本文件res.txt中,文件保存格式与IPC类中operator<<的定义规则相同。

    5、 通过指定的main函数来验证上述类和函数的功能。

    程序的main函数 注意:

    不得修改main函数以及3个类的定义!对main函数和类定义每修改一处,总分扣2分,最多扣10分。使用全局变量扣10分。 void main() { vector<IPC> A; ReadIPCFile("d:\\source.txt", A); cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl; SortIPC(A); IncreaseIPC(A); cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl; OutputIPCFile(A,"d:\\res.txt"); IPC t1; cout<<t1<<endl; cout<<t1++<<endl; cout<<t1<<endl; cout<<"当前工控机台数"<<IPC::GetCounts()<<endl; IPC t2(t1); cout<<t2<<endl; cout<<"当前工控机台数"<<IPC::GetCounts()<<endl; }

    练习代码

    #include<iostream> #include<vector> #include<iomanip> #include<fstream> #include<cmath> #include<algorithm> using namespace std; class CPU{ private: double m_MainFreq; //主频,单位GHz int m_CoreNum; //核心数 double m_Power; //功率,单位:W public: CPU(double MainFreq, int CoreNum, double Power); double GetMainFreq(void)const; //获取主频 CPU& operator++(); //前自增,主频加0.1,核心数加2,功率加1.0 CPU operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const CPU& Obj); //输出CPU的参数, //主频占6列,小数部分保留2位,左对齐 //核心数占3列,左对齐 //功率占6列,小数部分保留1位,左对齐 }; //CPU类的构造函数 CPU::CPU(double MainFreq, int CoreNum, double Power){ m_MainFreq=MainFreq; m_CoreNum=CoreNum; m_Power=Power; } //CPU类的GetMainFreq ()成员函数 double CPU::GetMainFreq(void)const{ return m_MainFreq; } //CPU类的前++运算符重载成员函数 CPU& CPU::operator++(){ m_MainFreq+=0.1; m_CoreNum+=2; m_Power+=1.0; return *this; } //CPU类的后++运算符重载成员函数 CPU CPU::operator++(int){ CPU temp(*this); ++(*this); return temp; } //CPU类的输出运算符重载函数 ostream& operator<<(ostream& Out, const CPU& Obj){ Out<<left<<setw(6)<<fixed<<setprecision(2)<<Obj.m_MainFreq<< left<<setw(3)<<Obj.m_CoreNum<< left<<setw(6)<<fixed<<setprecision(1)<<Obj.m_Power; return Out; } class Computer{ private: CPU m_CPU; int m_Memory; //内存容量,单位:G int m_HD; //硬盘容量,单位:G public: Computer(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD); CPU GetCPU(void)const; //获取CPU数据 double GetMemory(void)const; //获取内存容量 Computer& operator++(); //前自增,CPU部分自增规则同CPU类,内存扩大4G,硬盘扩大128G Computer operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const Computer& Obj); //CPU部分数据的输出规则与CPU类中定义相同 //内存容量占6列,左对齐 //硬盘容量占8列,左对齐 }; //Computer类的构造函数 Computer::Computer(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD):m_CPU(CPU_MainFreq,CPU_CoreNum,CPU_Power){ m_Memory=Memory; m_HD=HD; } //Computer类的GetCPU()成员函数 CPU Computer::GetCPU(void)const{ return m_CPU; } //Computer类的GetMemory()成员函数 double Computer::GetMemory(void)const{ return m_Memory; } //Computer类的前++运算符重载成员函数 Computer& Computer::operator++(){ ++m_CPU; m_Memory+=4; m_HD+=128; } //Computer类的后++运算符重载成员函数 Computer Computer::operator++(int){ Computer temp(*this); ++(*this); return temp; } //Computer类输出运算符重载函数 ostream& operator<<(ostream& Out, const Computer& Obj){ Out<<Obj.m_CPU<< left<<setw(6)<<Obj.m_Memory<< left<<setw(8)<<Obj.m_HD; return Out; } class IPC:public Computer{ private: int m_ProtectGrade; //防护等级 static int m_Counts; //工控机数量 public: IPC(double CPU_MainFreq=3.7, int CPU_CoreNum=6, double CPU_Power=95.0, int Memory=16, int HD=512, int ProtectGrade=65); IPC(const IPC& Obj); double GetProtectGrade(void)const; //获取防护等级 static int GetCounts(void); //获取当前工控机数量 IPC& operator++(); //前自增,Computer数据自增规则同上,防护等级加1 IPC operator++(int); //后自增,规则同上 friend ostream& operator<<(ostream& Out, const IPC& Obj); //Computer部分数据的输出规则与Computer类中定义相同 //防护等级占5列,左对齐 ~IPC(){ m_Counts--; } }; //IPC类的有参构造函数 IPC::IPC(double CPU_MainFreq, int CPU_CoreNum, double CPU_Power, int Memory, int HD, int ProtectGrade):Computer(CPU_MainFreq,CPU_CoreNum,CPU_Power,Memory,HD){ m_ProtectGrade=ProtectGrade; m_Counts++; } //IPC类的复制构造函数 IPC::IPC(const IPC& Obj):Computer(Obj){ m_ProtectGrade=Obj.m_ProtectGrade; m_Counts++; } //IPC类的GetProtectGrade()成员函数 double IPC::GetProtectGrade(void)const{ return m_ProtectGrade; } //IPC类的GetCounts()成员函数 int IPC::GetCounts(void){ return m_Counts; } //IPC类的前++运算符重载成员函数 IPC& IPC::operator++(){ Computer::operator++(); m_ProtectGrade++; return(*this); } //IPC类的后++运算符重载成员函数 IPC IPC::operator++(int){ IPC temp(*this); ++(*this); return temp; } //IPC类的输出运算符重载函数 ostream& operator<<(ostream& Out, const IPC& Obj){ Out<<static_cast<Computer>(Obj)<<left<<setw(6)<<Obj.m_ProtectGrade; return Out; } //初始化 int IPC::m_Counts=0; //函数ReadIPCFile,从D盘根目录下的文本文件source.txt中读取数量未知个工控机数据,构成一个IPC类型的向量A void ReadIPCFile(string filename, vector<IPC>& A){ ifstream data("d:\\source.txt",ios::in); if(!data){ cout<<"ERROR!"<<endl;//打开失败就退出 return; } double main,power; int core,memory,hd,protect; while(data>>main>>core>>power>>memory>>hd>>protect){ IPC temp(main,core,power,memory,hd,protect); A.push_back(temp); } data.close(); return; } //函数SortIPC,对上述A向量进行增序排序,排序条件定义如下: //a) CPU主频 //b) 防护等级 //注意:上述排序条件是有顺序的,必须按照"a条件-b条件"的顺序来进行处理 bool judge(IPC a,IPC b){ if((a.GetCPU()).GetMainFreq()<(b.GetCPU()).GetMainFreq())return true; else if(a.GetProtectGrade()<b.GetProtectGrade())return true; else return false; } void SortIPC(vector<IPC>& A){ sort(A.begin(),A.end(),judge); } //函数IncreaseIPC,对上述经过排序处理后的A向量中内存容量小于等于4G的工控机数据进行前自增处理, //自增处理后的工控机数据必须要仍然保存在A向量中原数据位置处 void IncreaseIPC(vector<IPC>& A){ for(vector<IPC>::iterator it=A.begin();it!=A.end();it++){ if((*it).GetMemory()<=4){ ++(*it); } } } //将经过上述处理后的A向量中所有工控机数据保存在D盘根目录下的文本文件res.txt中 void OutputIPCFile(vector<IPC>&A,string filename){ ofstream file("d:\\res.txt", ios::out); if(!file){ cout<<"ERROR!"; return; } for(vector<IPC>::iterator it = A.begin(); it != A.end(); it++) { file <<*it<< endl; } file.close(); } int main() { vector<IPC> A; ReadIPCFile("d:\\source.txt", A); cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl; SortIPC(A); IncreaseIPC(A); cout<<"当前工控机台数: "<<IPC::GetCounts()<<endl; OutputIPCFile(A,"d:\\res.txt"); IPC t1; cout<<t1<<endl; cout<<t1++<<endl; cout<<t1<<endl; cout<<"当前工控机台数"<<IPC::GetCounts()<<endl; IPC t2(t1); cout<<t2<<endl; cout<<"当前工控机台数"<<IPC::GetCounts()<<endl; }
    Processed: 0.009, SQL: 9