考试说明
- 考试时间:合计130分钟。选择题部分40分钟交卷,允许提前交卷。
- 考试过程中,不能连接未经指定网站或服务器。
- 闭卷考试部分,不能查阅任何类型的参考资料。
- 开卷考试部分,可以查阅纸质文档,不能查阅任何类型的电子文档。
- 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
- 违反上述2-5条者,视为考试作弊。
选择题答题方式(30分,闭卷,严禁使用vs编程环境进行尝试)
- 打开浏览器,在地址栏中输入http://192.168.125.3,点击相应链接进入登录页面。
- 按要求输入两遍自己的学号。
- 点击“登录”按钮即可进入答题页面。如考试尚未开始,系统会进入等待页面并倒计时。考试开始时间到,系统会自动进入答题页面。
- 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
- 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失之前已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
- 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
- 考试结束时间到,系统会自动收卷。
编程题提交方式(70分,开卷)
- 提交前务必关闭vs2005、vs2008或vs2010编程环境。
- 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
- 在浏览器的地址栏中输入http://192.168.125.3,点击相应链接进入提交页面。
- 按要求输入两遍自己的学号。
- 点击“选择文件”按钮,选择自己的源程序文件。点击“提交”按钮提交。
- 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤16-18。
- 提交成功后,可点击“查看内容”按钮检查提交的内容。
按以下要求编写程序
- 串口是计算机中常见的用于和外部设备进行连接和通信的一种端口。请各位考生从课程信息发布网站下载数据文件input.txt,然后将数据文件手动保存在D盘根目录下。该文件以行为单位保存了若干计算机的配置数据。每行数据中各个字段的信息如下:
- 第1列表示计算机的CPU主频,double类型;
- 第2列表示计算机的内存容量,int类型;
- 第3列表示计算机的串口编号,int类型;
- 第4列表示计算机的串口通讯速率,int类型;
- 定义串口(CComPort)类
串口类CComPort定义如下。请分别实现该类所有的成员函数和友元函数。
class CComPort
{
private:
int m_ID; //串口编号,必须为正整数
int m_Baud;//串口通讯速率,必须为正整数
public:
CComPort(int ID, int Baud); //有参构造函数。如ID不为正整数则m_ID初始化为1;如Baud不为正整数则m_Baud初始化为1200
int GetBaud(void)const; //获取串口通讯速率
friend CComPort& operator++(CComPort& Data); //前++,表示串口通讯速率增加100
/*
流输出符重载
串口编号占5列,右对齐左补空
串口通讯速率占8列,右对齐左补空
*/
friend ostream& operator<<(ostream& Out, const CComPort& Data);
};
- 定义计算机(CComputer)类
计算机类CComputer类定义如下。请分别实现该类所有的成员函数和友元函数。
class CComputer
{
private:
double m_CPU; //CPU主频,必须为正数
int m_Memory; //内存容量,必须为正数
CComPort m_Port; //计算机的串口
public:
CComputer(double CPU, int Memory, int ID, int Baud); //有参构造函数。如输入的CPU不为正数则m_CPU初始化为3.0; 如输入的Memory不为正数则m_Memory初始化为4
CComPort GetComPort(void)const; //获取计算机串口数据的常成员函数
CComputer& operator++(); //前++。串口部分增量规则与CComPort类的前++相同,CPU主频m_CPU增大1.0,内存容量m_Memory增大2
CComputer operator++(int); //后++。自增规则与前++相同
/*
流输出符重载
串口部分输出格式与CComPort类相同
CPU主频占8列,小数部分保留2位,右对齐左补空
内存容量占5列,右对齐左补空
*/
friend ostream& operator<<(ostream& Out, const CComputer& Data);
};
上述CComputer类构造函数中如不指定各参数的值,则默认取值为:CPU=3.5,Memory=4,ID=1,Baud=115200。
- 在上述两个类定义的基础上,依次定义如下函数:
- 编写函数ReadFile,从前面所述文本文件中完成数据的读入,结果存放在向量A中。
- 编写函数DeleteData,用于把向量A中串口通讯速率小于等于X的计算机数据删除,如不指定X的值,则X默认等于9600。
- 编写函数WriteFile。用于将把向量A中所有计算机数据保存到d:\res.txt文本文件中。
- main函数的具体内容如下:
int main()
{
vector<CComputer> A;
A = ReadFile("d:\\input.txt"); //读取文件,构成向量A
DeleteData(A); //删除向量A中串口通讯速率小于等于9600的计算机数据
WriteFile("d:\\res.txt", A); //将向量A中的计算机数据写入指定文件
CComputer c1;
cout << c1 << endl;
cout << c1++ << endl;
cout << ++c1 << endl;
return 0;
}
注意:不得修改上述两个类的定义以及主程序!每修改一处,则总分扣2分。
编程题评分标准(说明:编程题成绩满分为70分)
大项 | 子项 | 评分项 | 应得分 | 实得分 |
正 确 性 | 结果(60分) | CComPort类构造函数 | 4 | |
CComPort类GetBaud函数 | 2 | |||
CComPort类前++重载 | 5 | |||
CComPort类流输出运算符重载 | 5 | |||
CComputer类构造函数 | 7 | |||
CComputer类前++重载 | 6 | |||
CComputer类后++重载 | 6 | |||
CComputer类流输出运算符重载函数正确 | 6 | |||
ReadFile函数 | 6 | |||
DeleteData函数 | 8 | |||
WriteFile函数 | 5 | |||
程序运行异常中断、死循环或无任何结果 | -10 | |||
类和main函数修改扣分 (每修改一处扣2分,总计不超过10分) | -10 | |||
可 读 性 | 缩进对齐(4分) | 正确运用缩进对齐规则 | 4 | |
有缩进对齐但不完全符合要求 | 2 | |||
没有使用缩进对齐规则 | 0 | |||
函数说明(4分) | 有较完整的函数说明 | 4 | ||
有函数说明,但不够完整 | 2 | |||
没有函数说明 | 0 | |||
注释(2分) | 有注释 | 2 | ||
没有注释 | 0 | |||
总分(70分) |
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class CComPort
{
private:
int m_ID; //���ڱ�ţ�����Ϊ������
int m_Baud;//����ͨѶ���ʣ�����Ϊ������
public:
CComPort(int ID, int Baud); //�вι��캯������ID��Ϊ��������m_ID��ʼ��Ϊ1����Baud��Ϊ��������m_Baud��ʼ��Ϊ1200
int GetBaud(void)const; //��ȡ����ͨѶ����
friend CComPort& operator++(CComPort& Data); //ǰ++����ʾ����ͨѶ��������100
/*
�����������
���ڱ��ռ5�У��Ҷ�����
����ͨѶ����ռ8�У��Ҷ�����
*/
friend ostream& operator<<(ostream& Out, const CComPort& Data);
};
CComPort::CComPort(int ID, int Baud){
if(ID<=0){ID=1;}
if(Baud<=0){Baud=1200;}
this->m_ID=ID;
this->m_Baud=Baud;
}
int CComPort::GetBaud(void)const{
return this->m_Baud;
}
CComPort& operator++(CComPort& Data){
Data.m_Baud+=100;
return Data;
}
ostream& operator<<(ostream& Out, const CComPort& Data){
/*
�����������
���ڱ��ռ5�У��Ҷ�����
����ͨѶ����ռ8�У��Ҷ�����
*/
Out<<setw(5)<<right<<setfill(' ')<<Data.m_ID;
Out<<setw(8)<<right<<setfill(' ')<<Data.m_Baud;
return Out;
}
class CComputer
{
private:
double m_CPU; //CPU��Ƶ������Ϊ����
int m_Memory; //�ڴ�����������Ϊ����
CComPort m_Port; //������Ĵ���
public:
CComputer(double CPU, int Memory, int ID, int Baud); //�вι��캯�����������CPU��Ϊ������m_CPU��ʼ��Ϊ3.0; �������Memory��Ϊ������m_Memory��ʼ��Ϊ4
CComPort GetComPort(void)const; //��ȡ������������ݵij���Ա����
CComputer& operator++(); //ǰ++�����ڲ�������������CComPort���ǰ++��ͬ��CPU��Ƶm_CPU����1.0���ڴ�����m_Memory����2
CComputer operator++(int); //��++������������ǰ++��ͬ
/*
�����������
���ڲ��������ʽ��CComPort����ͬ
CPU��Ƶռ8�У�С�����ֱ���2λ���Ҷ�����
�ڴ�����ռ5�У��Ҷ�����
*/
friend ostream& operator<<(ostream& Out, const CComputer& Data);
};
CComputer::CComputer(double CPU=3.5, int Memory=4, int ID=1, int Baud=115200):m_Port(ID,Baud){
//�вι��캯�����������CPU��Ϊ������m_CPU��ʼ��Ϊ3.0; �������Memory��Ϊ������m_Memory��ʼ��Ϊ4
//����CComputer��캯�����粻ָ����������ֵ����Ĭ��ȡֵΪ��CPU=3.5��Memory=4��ID=1��Baud=115200��
if(CPU<=0){CPU=3.0;}
if(Memory<=0){Memory=4;}
this->m_CPU=CPU;
this->m_Memory=Memory;
}
CComPort CComputer::GetComPort(void)const{
return m_Port;
}
CComputer& CComputer::operator++(){
//ǰ++�����ڲ�������������CComPort���ǰ++��ͬ��CPU��Ƶm_CPU����1.0���ڴ�����m_Memory����2
++(this->m_Port);
this->m_CPU+=1.0;
this->m_Memory+=2;
return *this;
}
CComputer CComputer::operator++(int){
CComputer c(*this);
++(this->m_Port);
this->m_CPU+=1.0;
this->m_Memory+=2;
return c;
}
ostream& operator<<(ostream& Out, const CComputer& Data){
/*
�����������
���ڲ��������ʽ��CComPort����ͬ
CPU��Ƶռ8�У�С�����ֱ���2λ���Ҷ�����
�ڴ�����ռ5�У��Ҷ�����
*/
Out<<Data.m_Port;
Out<<setw(8)<<fixed<<setprecision(2)<<right<<setfill(' ')<<Data.m_CPU;
Out<<setw(5)<<right<<setfill(' ')<<Data.m_Memory;
return Out;
}
/*1) ��д����ReadFile����ǰ�������ı��ļ���������ݵĶ��룬������������A�С�
*/
vector<CComputer> ReadFile(string path){
/*
1) ��1�б�ʾ�������CPU��Ƶ��double����;
2) ��2�б�ʾ��������ڴ�������int���ͣ�
3) ��3�б�ʾ������Ĵ��ڱ�ţ�int����;
4) ��4�б�ʾ������Ĵ���ͨѶ���ʣ�int����;
*/
ifstream ifile(path);
if(!ifile){
cout<<"dakaishibai"<<endl;
exit(0);
}
vector<CComputer> A;
while(!ifile.eof()){
double CPU;
int Memory;
int ID;
int Baud;
ifile>>CPU>>Memory>>ID>>Baud;
A.push_back(CComputer(CPU,Memory,ID,Baud));
}
ifile.close();
return A;
}
/*
2) ��д����DeleteData�����ڰ�����A�д���ͨѶ����С�ڵ���X�ļ��������ɾ�����粻ָ��X��ֵ����XĬ�ϵ���9600��
*/
void DeleteData(vector<CComputer> &a,int X=9600){
for(vector<CComputer>::iterator it=a.begin();it!=a.end();){
if(it->GetComPort().GetBaud()<=9600){
it=a.erase(it);
}
else{
it++;
}
}
}
/*
3) ��д����WriteFile�����ڽ�������A�����м�������ݱ��浽d:\res.txt�ı��ļ��С�
*/
void WriteFile(string path, const vector<CComputer> &a){
ofstream ofile(path);
if(!ofile){
cout<<"dakaishibai"<<endl;
exit(0);
}
for(int i=0;i<a.size();i++){
ofile<<a[i]<<endl;
}
ofile.close();
}
int main()
{
vector<CComputer> A;
A = ReadFile("d:\\input.txt"); //��ȡ�ļ�����������A
DeleteData(A); //ɾ������A�д���ͨѶ����С�ڵ���9600�ļ��������
WriteFile("d:\\res.txt", A); //������A�еļ��������д��ָ���ļ�
CComputer c1;
cout << c1 << endl;
cout << c1++ << endl;
cout << ++c1 << endl;
return 0;
}
考试被扣了6分,因为CComputer构造函数定义有问题——我没有直接冒号定义m_port!这意味着我给CComPort的构造函数设置了默认值进行补救。实际上这只是对CComputer的约束,不应该涉及到CComPort。