【苏大c++第二次考试第二次模拟】

文章描述了一次编程考试的详细规则,包括选择题和编程题两部分。编程题涉及到CFlash类和CRouter类的定义及成员函数实现,如构造函数、运算符重载等。此外,还有ReadRouter、CombineRouter、DeleteRouter、ImproveRouter和SaveRouterFile等函数的编写,要求从文本文件中读取路由器数据,按特定条件排序、删除、增加和保存数据。
摘要由CSDN通过智能技术生成

考试说明

  1. 考试时间:合计150分钟。选择题部分30分钟交卷,允许提前交卷。
  2. 考试过程中,不能连接未经指定的网站或服务器。
  3. 闭卷考试部分,不能查阅任何类型的参考资料;开卷考试部分,仅可以查阅纸质文档。
  4. 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
  5. 违反上述2-4条者,视为考试作弊。

选择题答题方式(25分共25题,闭卷,严禁使用编程环境进行尝试

  1. 打开IE或Chrome浏览器,在地址栏中输入http://192.168.125.3,单击“点击进入>>选择题答题页面”链接进入登录页面。
  2. 按要求输入两遍学号和考场号。点击“登录”按钮即可进入答题页面。
  3. 如考试尚未开始,系统会进入倒计时页面。考试开始时间到,系统会自动进入答题页面。
  4. 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
  5. 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
  6. 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
  7. 考试结束时间到,系统会自动收卷。

编程题提交方式(75分,开卷

  1. 提交前务必关闭vs2005vs2008或vs2010编程环境。
  2. 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
  3. 在浏览器的地址栏中输入http://192.168.125.3,单击“点击进入>>程序题上传页面”链接进入提交页面。
  4. 按要求输入两遍学号和考场号。
  5. 点击“浏览”按钮,选择源程序文件(CPP文件)。点击“提交”按钮提交。
  6. 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤15-17。
  7. 提交成功后,可点击“查看内容”按钮检查提交的内容是否正确和完整。
  8. 如多次提交不成功,请联系监考人员。
    按以下要求编写程序

闪存是一般电子产品都需要用到的存储器件,闪存的容量、工作频率决定着闪存的基本性能。在路由器的硬件构成中闪存是不可缺少的核心部件之一。

请根据要求完成如下编程工作:

  1. 现有一个CFlash类定义如下:

class CFlash

{

private:

int m_Memory; //闪存容量,单位KB

int m_Freq; //工作频率,单位MHZ

public:

CFlash (int Memory, int Freq); //容量和频率小于等于0为非法

int GetMemory(void)const; //获取容量

int GetFreq(void)const; //获取工作频率

friend CFlash operator+(const CFlash& Obj, int m); //闪存容量增大m KB

friend ostream& operator<<(ostream& Out, const CFlash& Obj); //输出闪存的参数,

//容量占5列,左对齐,右补空格

//频率占5列,左对齐,右补空格

};

请为CFlash类完成上述所要求的各函数定义。

  1. 路由器(CRouter)类的定义如下:

class CRouter

{

private:

CFlash m_Flash;

int m_Ports; //端口数量

int m_BandWidth; //带宽,单位M

public:

CRouter(int FlashMemory, int FlashFreq, double Ports, int BandWidth); //端口数量或带宽小于等于0为非法

CFlash GetFlash(void)const; //获取闪存数据

int GetPorts(void)const; //获取端口数量

int GetBandWidth(void)const; //获取带宽

CRouter& operator++(); //前自增,闪存容量增大10KB,端口数量扩大1倍,带宽提高100M

CRouter operator++(int); //后自增,规则同上

friend ostream& operator<<(ostream& Out, const CRouter & Obj);

//创建编号占5列,左对齐,右补空格

//CFlash部分数据的输出规则与Flash类中定义相同

//端口数量占5列,左对齐,右补空格

//带宽占8列,左对齐,右补空格

};

  1. 请根据要求完成上述函数的定义。

  1. 在上述2个类设计的基础上,请按照下列要求分别编写5个函数:
    1. 编写一个函数ReadRouter,从D盘根目录下的文本文件source1.dat中读取所有路由器数据,构成一个CRouter类型的向量A。该文本文件中每条信息中包含了闪存容量、闪存频率、路由器端口数和路由器带宽,各数据间以若干个空格进行间隔,每条数据占1行。各条数据按照容量和端口数量递增(即容量相等条件下按照端口数量递增)的顺序进行排列。
    2. 编写一个函数CombineRouter,从D盘根目录下的文本文件source2.dat中依次读取所有路由器数据,并将所读到的路由器数据插入到向量A中,要求插入后仍然保持A向量为按照容量和端口数量递增(即容量相等条件下按照端口数量递增)的顺序进行排列的状态。
    3. 编写一个函数DeleteRouter,删除上述A向量中工作频率小于等于x MHZ带宽小于等于y M的路由器数据。如不指定,x为35,y为200。
    4. 编写一个函数ImproveRouter,对上述经过处理后的A向量中的每个路由器数据进行前自增处理,自增后结果仍然保存在A向量中。
    5. 编写一个函数SaveRouterFile,将经过上述处理后的A向量中所有路由器数据保存在D盘根目录下的文本文件res.txt中,文件保存格式与CRouter类中operator<<的定义规则相同。

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

程序的main函数

注意:

1. 不得修改main函数以及2个类的定义!对main函数和类定义每修改一处,总分扣2分,最多扣10分。

2. 使用全局变量扣10

int main()

{

vector<CRouter> A;

ReadRouter("D:\\source1.dat", A);

CombineRouter("D:\\source2.dat", A);

DeleteRouter(A,35);

ImproveRouter(A);

SaveRouterFile("d:\\res.txt",A);

CRouter t(A[0]);

cout<<t++<<endl;

cout<<t<<endl;

return 0;

}

程序运行结果参见下图


编程题评分标准

大项

子项

评分项

应得分

实得分

结果(70分)

CFlash类构造函数

3

CFlash类GetMemory和GetFreq函数

2

CFlash类+运算符重载函数

5

CFlash类输出运算符重载函数

4

CRouter类有参构造函数

5

CRouter类拷贝构造函数

5

CRouter类3个Get函数

4

CRouter类前后++运算符重载函数

8

CRouter类输出运算符重载函数

4

ReadRouter函数

7

CombineRouter函数

7

DeleteRouter函数

6

ImproveRouter函数

3

SaveRouterFile函数

5

程序运行异常中断、死循环或无任何结果

(CAppWindow类构造函数引起的异常不扣分)

-10

main函数和类定义修改处(最多扣10分)

缩进对齐(2分)

缩进对齐规范

2

缩进对齐混乱或不缩进

0

变量命名规范

(2分)

命名规范

2

命名不规范

0

注释(1分)

有注释

1

无注释

0

#include<iostream>
#include<vector>
#include<iomanip>
#include<algorithm>
#include<fstream>
using namespace std;
class CFlash
{
private:
	int m_Memory;		//闪存容量,单位KB
	int m_Freq;		//工作频率,单位MHZ

public:
	CFlash (int Memory=1, int Freq=1);	//容量和频率小于等于0为非法
	int GetMemory(void)const;	//获取容量
	int GetFreq(void)const;	//获取工作频率
	friend CFlash operator+(const CFlash& Obj, int m);	//闪存容量增大m KB
	friend ostream& operator<<(ostream& Out, const CFlash& Obj);	//输出闪存的参数,
													//容量占5列,左对齐,右补空格
													//频率占5列,左对齐,右补空格
};

CFlash::CFlash (int Memory, int Freq){
	if(Memory<=0 or Freq<=0){
		exit(0);
	}
    this->m_Memory=Memory;
    this->m_Freq=Freq;
}
int CFlash::GetMemory(void)const{
    return m_Memory;
}
int CFlash::GetFreq(void)const{
    return m_Freq;
}
CFlash operator+(const CFlash& Obj, int m){
    CFlash C(Obj.GetMemory()+m,Obj.GetFreq());
    return C;
}
ostream& operator<<(ostream& Out, const CFlash& Obj){
    //容量占5列,左对齐,右补空格
	//频率占5列,左对齐,右补空格
    Out<<left<<setw(5)<<setfill(' ')<<Obj.GetMemory();
    Out<<left<<setw(5)<<setfill(' ')<<Obj.GetFreq();
    return Out;
}

class CRouter
{
private:
	CFlash m_Flash;
	int m_Ports;			//端口数量
	int m_BandWidth;		//带宽,单位M

public:
	CRouter(int FlashMemory, int FlashFreq, double Ports, int BandWidth);	//端口数量或带宽小于等于0为非法
	CFlash GetFlash(void)const;		//获取闪存数据
	int GetPorts(void)const;			//获取端口数量
	int GetBandWidth(void)const;		//获取带宽
	CRouter& operator++();		//前自增,闪存容量增大10KB,端口数量扩大1倍,带宽提高100M
	CRouter operator++(int);		//后自增,规则同上
	friend ostream& operator<<(ostream& Out, const CRouter & Obj);	
										//创建编号占5列,左对齐,右补空格
										//CFlash部分数据的输出规则与Flash类中定义相同
										//端口数量占5列,左对齐,右补空格
										//带宽占8列,左对齐,右补空格
};

CRouter::CRouter(int FlashMemory, int FlashFreq, double Ports, int BandWidth){
    if(Ports<=0 or BandWidth<=0){
		exit(0);
	}
	CFlash c(FlashMemory,FlashFreq);
	m_Flash=c;
    m_Ports=Ports;
    m_BandWidth=BandWidth;
}
CFlash CRouter::GetFlash(void)const{
    return this->m_Flash;
}
int CRouter::GetPorts(void)const{
    return this->m_Ports;
}
int CRouter::GetBandWidth(void)const{
    return this->m_BandWidth;
}
CRouter& CRouter::operator++(){
//前自增,闪存容量增大10KB,端口数量扩大1倍,带宽提高100M 
    this->m_Flash=m_Flash+10;
    this->m_Ports*=2;
    this->m_BandWidth+=100;
    return *this;
}
CRouter CRouter::operator++(int){
    CRouter C(GetFlash().GetMemory(),GetFlash().GetFreq(),m_Ports,m_BandWidth);
    this->m_Flash=m_Flash+10;
    this->m_Ports*=2;
    this->m_BandWidth+=100;
    return C;
}
ostream& operator<<(ostream& Out, const CRouter & Obj){
    //CFlash部分数据的输出规则与Flash类中定义相同
	//端口数量占5列,左对齐,右补空格
	//带宽占8列,左对齐,右补空格
    Out<<Obj.m_Flash;
	Out<<left<<setw(5)<<setfill(' ')<<Obj.m_Ports;
	Out<<left<<setw(8)<<setfill(' ')<<Obj.m_BandWidth;
	return Out;
}
/*
(1)编写一个函数ReadRouter,从D盘根目录下的文本文件source1.dat中读取所有路由器数据
构成一个CRouter类型的向量A。该文本文件中每条信息中包含了闪存容量、闪存频率、路由器端口数和路由器带宽
各数据间以若干个空格进行间隔,每条数据占1行。
各条数据按照容量和端口数量递增(即容量相等条件下按照端口数量递增)的顺序进行排列。
*/
bool cmp(CRouter a, CRouter b){
	CFlash Fa=a.GetFlash();
	CFlash Fb=b.GetFlash();
	if(Fa.GetMemory()==Fb.GetMemory()){
		return a.GetPorts()<b.GetPorts();
	}
	return Fa.GetFreq()<Fb.GetFreq();
}
void ReadRouter(const string&path, vector<CRouter>&a){
	ifstream ifile(path);
	if(!ifile){exit(0);}
	while(!ifile.eof()){
		int Memory;		//闪存容量,单位KB
		int Freq;		//工作频率,单位MHZ
		int Ports;			//端口数量
		int BandWidth;		//带宽,单位M
		ifile>>Memory>>Freq>>Ports>>BandWidth;
		//cout<<Memory<<" "<<Freq<<" "<<Ports<<" "<<BandWidth;
		a.push_back(CRouter(Memory,Freq,Ports,BandWidth));
		//cout<<1<<endl;
	}
	sort(a.begin(),a.end(),cmp);
	ifile.close();
	return ;
}
/*
(2)编写一个函数CombineRouter,从D盘根目录下的文本文件source2.dat中依次读取所有路由器数据,
并将所读到的路由器数据插入到向量A中,要求插入后仍然保持A向量为按照容量和端口数量递增(
即容量相等条件下按照端口数量递增)的顺序进行排列的状态。
*/
void CombineRouter(const string&path, vector<CRouter>&a){
	ifstream ifile1(path);
	if(!ifile1){exit(0);}
	while(!ifile1.eof()){
		int Memory;		//闪存容量,单位KB
		int Freq;		//工作频率,单位MHZ
		int Ports;			//端口数量
		int BandWidth;		//带宽,单位M
		ifile1>>Memory>>Freq>>Ports>>BandWidth;
		a.push_back(CRouter(Memory,Freq,Ports,BandWidth));
	}
	sort(a.begin(),a.end(),cmp);
	ifile1.close();
	return ;
}
/*
(3)编写一个函数DeleteRouter,
删除上述A向量中工作频率小于等于x MHZ或带宽小于等于y M的路由器数据。
如不指定,x为35,y为200。
*/
void DeleteRouter(vector<CRouter> &a, int x=35,int y=200){
	for(vector<CRouter> ::iterator it=a.begin();it!=a.end();){
		if(it->GetFlash().GetFreq()<=x or it->GetBandWidth()<=y){
			it=a.erase(it);
		}
		else{
			it++;
		}
	}
}
/*
(4)编写一个函数ImproveRouter,
对上述经过处理后的A向量中的每个路由器数据进行前自增处理,自增后结果仍然保存在A向量中。
*/
void ImproveRouter(vector<CRouter>&a){
	for(int i=0;i<a.size();i++){
		++a[i];
	}
}
/*
(5)编写一个函数SaveRouterFile,将经过上述处理后的A向量中所有路由器数据保存在D盘根目录下的文本文件res.txt中,
文件保存格式与CRouter类中operator<<的定义规则相同。
*/
void SaveRouterFile(const string&path, const vector<CRouter>&a){
	ofstream ofile(path);
	if(!ofile){exit(0);}
	for(int i=0;i<a.size();i++){
		ofile<<a[i]<<endl;
	}
	ofile.close();
	return ;
}
int main()
{
	vector<CRouter> A;

	ReadRouter("/Users/apple/Downloads/3/source1.dat", A);
	CombineRouter("/Users/apple/Downloads/3/source2.dat", A);
	DeleteRouter(A,35);
	ImproveRouter(A);
	SaveRouterFile("/Users/apple/Downloads/3/res.txt",A);

	CRouter t(A[0]);
	cout<<t++<<endl;
	cout<<t<<endl;

	return 0;
}

如果有错请指正,感激!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值