考试题目
CPU是计算机的中央处理单元,是计算机的重要组成部分。计算机有很多具体的结构形式,其中有一种有多种防护等级的计算机被称为工业控制计算机(Industrial Personal Computer,IPC),该特殊形式的计算机经常被用于工业生产现场。
请根据要求完成如下编程工作: 1、 现有一个CPU类定义如下:
class CPU
{
private:
double m_MainFreq
;
int m_CoreNum
;
double m_Power
;
public:
CPU(double MainFreq
, int CoreNum
, double Power
);
double GetMainFreq(void)const;
CPU
& operator++();
CPU
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const CPU
& Obj
);
};
请根据要求完成如下函数定义: (1) 请完善CPU类的构造函数定义,构造函数参数从左向右的含义:主频、核心数、功率 (2) 请完善CPU类的GetMainFreq ()成员函数的定义。 (3) 请完善CPU类的前++和后++运算符重载成员函数的定义。 (4) 请为CPU类提供输出运算符重载函数,输出格式如上所示
2、 计算机(Computer)基类定义如下:
class Computer
{
private:
CPU m_CPU
;
int m_Memory
;
int m_HD
;
public:
Computer(double CPU_MainFreq
, int CPU_CoreNum
, double CPU_Power
, int Memory
, int HD
);
CPU
GetCPU(void)const;
double GetMemory(void)const;
Computer
& operator++();
Computer
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const Computer
& Obj
);
};
请根据要求完善如下函数定义: (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++();
IPC
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const IPC
& Obj
);
~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
;
int m_CoreNum
;
double m_Power
;
public:
CPU(double MainFreq
, int CoreNum
, double Power
);
double GetMainFreq(void)const;
CPU
& operator++();
CPU
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const CPU
& Obj
);
};
CPU
::CPU(double MainFreq
, int CoreNum
, double Power
){
m_MainFreq
=MainFreq
;
m_CoreNum
=CoreNum
;
m_Power
=Power
;
}
double CPU
::GetMainFreq(void)const{
return m_MainFreq
;
}
CPU
& CPU
::operator++(){
m_MainFreq
+=0.1;
m_CoreNum
+=2;
m_Power
+=1.0;
return *this;
}
CPU CPU
::operator++(int){
CPU
temp(*this);
++(*this);
return temp
;
}
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
;
int m_HD
;
public:
Computer(double CPU_MainFreq
, int CPU_CoreNum
, double CPU_Power
, int Memory
, int HD
);
CPU
GetCPU(void)const;
double GetMemory(void)const;
Computer
& operator++();
Computer
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const Computer
& Obj
);
};
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
;
}
CPU Computer
::GetCPU(void)const{
return m_CPU
;
}
double Computer
::GetMemory(void)const{
return m_Memory
;
}
Computer
& Computer
::operator++(){
++m_CPU
;
m_Memory
+=4;
m_HD
+=128;
}
Computer Computer
::operator++(int){
Computer
temp(*this);
++(*this);
return temp
;
}
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++();
IPC
operator++(int);
friend ostream
& operator<<(ostream
& Out
, const IPC
& Obj
);
~IPC(){
m_Counts
--;
}
};
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(const IPC
& Obj
):Computer(Obj
){
m_ProtectGrade
=Obj
.m_ProtectGrade
;
m_Counts
++;
}
double IPC
::GetProtectGrade(void)const{
return m_ProtectGrade
;
}
int IPC
::GetCounts(void){
return m_Counts
;
}
IPC
& IPC
::operator++(){
Computer
::operator++();
m_ProtectGrade
++;
return(*this);
}
IPC IPC
::operator++(int){
IPC
temp(*this);
++(*this);
return temp
;
}
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;
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;
}
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
);
}
void IncreaseIPC(vector
<IPC
>& A
){
for(vector
<IPC
>::iterator it
=A
.begin();it
!=A
.end();it
++){
if((*it
).GetMemory()<=4){
++(*it
);
}
}
}
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
;
}