考试说明
- 考试时间:合计150分钟。选择题部分30分钟交卷,允许提前交卷。
- 考试过程中,不能连接未经指定的网站或服务器。
- 闭卷考试部分,不能查阅任何类型的参考资料;开卷考试部分,仅可以查阅纸质文档。
- 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
- 违反上述2-4条者,视为考试作弊。
选择题答题方式(25分共25题,闭卷,严禁使用编程环境进行尝试)
- 打开IE或Chrome浏览器,在地址栏中输入http://192.168.125.3,单击“点击进入>>选择题答题页面”链接进入登录页面。
- 按要求输入两遍学号和考场号。点击“登录”按钮即可进入答题页面。
- 如考试尚未开始,系统会进入倒计时页面。考试开始时间到,系统会自动进入答题页面。
- 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
- 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
- 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
- 考试结束时间到,系统会自动收卷。
编程题提交方式(75分,开卷)
- 提交前务必关闭vs2005、vs2008或vs2010编程环境。
- 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
- 在浏览器的地址栏中输入http://192.168.125.3,单击“点击进入>>程序题上传页面”链接进入提交页面。
- 按要求输入两遍学号和考场号。
- 点击“浏览”按钮,选择源程序文件(CPP文件)。点击“提交”按钮提交。
- 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤15-17。
- 提交成功后,可点击“查看内容”按钮检查提交的内容是否正确和完整。
- 如多次提交不成功,请联系监考人员。
按以下要求编写程序
闪存是一般电子产品都需要用到的存储器件,闪存的容量、工作频率决定着闪存的基本性能。在路由器的硬件构成中闪存是不可缺少的核心部件之一。
请根据要求完成如下编程工作:
- 现有一个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类完成上述所要求的各函数定义。
- 路由器(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列,左对齐,右补空格
};
- 请根据要求完成上述函数的定义。
- 在上述2个类设计的基础上,请按照下列要求分别编写5个函数:
- 编写一个函数ReadRouter,从D盘根目录下的文本文件source1.dat中读取所有路由器数据,构成一个CRouter类型的向量A。该文本文件中每条信息中包含了闪存容量、闪存频率、路由器端口数和路由器带宽,各数据间以若干个空格进行间隔,每条数据占1行。各条数据按照容量和端口数量递增(即容量相等条件下按照端口数量递增)的顺序进行排列。
- 编写一个函数CombineRouter,从D盘根目录下的文本文件source2.dat中依次读取所有路由器数据,并将所读到的路由器数据插入到向量A中,要求插入后仍然保持A向量为按照容量和端口数量递增(即容量相等条件下按照端口数量递增)的顺序进行排列的状态。
- 编写一个函数DeleteRouter,删除上述A向量中工作频率小于等于x MHZ或带宽小于等于y M的路由器数据。如不指定,x为35,y为200。
- 编写一个函数ImproveRouter,对上述经过处理后的A向量中的每个路由器数据进行前自增处理,自增后结果仍然保存在A向量中。
- 编写一个函数SaveRouterFile,将经过上述处理后的A向量中所有路由器数据保存在D盘根目录下的文本文件res.txt中,文件保存格式与CRouter类中operator<<的定义规则相同。
- 通过指定的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;
}
如果有错请指正,感激!