考试说明
- 考试时间:合计180分钟。选择题部分40分钟交卷,允许提前交卷。
- 考试过程中,不能连接未经指定的网站或服务器。
- 闭卷考试部分,不能查阅任何类型的参考资料;开卷考试部分,仅可以查阅纸质文档。
- 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
- 违反上述2-4条者,视为考试作弊。
选择题答题方式(15分共30题,闭卷,严禁使用编程环境进行尝试)
- 打开IE或Chrome浏览器,在地址栏中输入http://192.168.125.3,单击“点击进入>>选择题答题页面”链接进入登录页面。
- 按要求输入两遍学号和考场号。点击“登录”按钮即可进入答题页面。
- 如考试尚未开始,系统会进入倒计时页面。考试开始时间到,系统会自动进入答题页面。
- 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
- 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
- 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
- 考试结束时间到,系统会自动收卷。
编程题提交方式(85分,开卷)
- 提交前务必关闭vs2005、vs2008或vs2010编程环境。
- 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
- 在浏览器的地址栏中输入http://192.168.125.3,单击“点击进入>>程序题上传页面”链接进入提交页面。
- 按要求输入两遍学号和考场号。
- 点击“浏览”按钮,选择源程序文件(CPP文件)。点击“提交”按钮提交。
- 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤15-17。
- 提交成功后,可点击“查看内容”按钮检查提交的内容是否正确和完整。
- 如多次提交不成功,请联系监考人员。
按以下要求编写程序
数据文件
请首先从服务器上下载数据文件eCars.txt到电脑的D盘根文件夹,该文本文件中存储了若干辆新能源汽车的基本信息,一行保存了一辆新能源汽车的信息,存储格式如下所示:(斜线文字是用于解释说明,在文件中并不存在)
轮毂直径 | 轴距 | 电池容量 |
19 | 2.8 | 70.0 |
每行中的各项之间是以制表符\t进行分隔。
题目说明
- 现有轮胎(CTyre)类描述如下:
class CTyre
{
private:
int m_dia; //轮毂直径,必须为正数,单位:寸
public:
CTyre(int dia); //构造函数
int getDia() const; //获取轮毂直径
CTyre& operator++(); //前增量运算符重载,轮毂直径提高1寸
CTyre operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CTyre& Obj);
//输出轮胎信息
//轮毂直径占6列,右对齐,不足左补空
};
请根据上述要求分别完成如上所示的CTyre类的成员(友元)函数的定义。
- 现有汽车(CAuto)类描述如下:
class CAuto
{
private:
CTyre m_tyre; //汽车轮胎
double m_Dis; //汽车轴距,必须为正数,单位:米
public:
CAuto(int dia, double dis); //构造函数
CTyre getTyre() const; //获取轮胎信息
CAuto& operator++(); //前增量运算符重载,轮胎++,轴距增加0.01米
CAuto operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CAuto& Obj);
//输出汽车信息
//轮胎信息输出格式同CTyre类
//轴距占8列,小数部分保留2位,右对齐,不足左补空
};
请根据上述要求分别完成如上所示的CAuto类的成员(友元)函数的定义。
- 请以CAuto类为基类进行公有派生,产生新类CECar用于描述新能源汽车。该类的定义代码如下:
class CECar : public CAuto
{
private:
double m_Battery; //电池容量,必须是正数,单位:kWh
static int m_Counts; //新能源汽车总数
public:
CECar(int dia, double dis, double battery); //构造函数。当不提供初始值时,轮毂直径等于18寸,轴距等于2.7米,电池容量等于65kWh
static int getCounts(); //获取新能源汽车总数
double getBattery()const; //获取电池容量
CECar& operator++(); //前增量运算符重载,汽车(基类部分)++,电池容量增加1.0kWh
CECar operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CECar& Obj);
//输出新能源汽车信息
//汽车(基类)部分数据的输出格式同CAuto类
//电池容量占8列,小数部分保留2位,右对齐,不足左补空
//.......???自己设计增加另外2个不可缺少的成员函数
};
请根据上述要求分别完成如上所示的CECar类的成员(友元)函数的定义。并请注意自己设计增加另外2个不可缺少的成员函数。
- 在上述3个类设计的基础上,请按照下列要求分别编写4个函数:
- 编写一个函数ReadFile,从D盘根目录下的文本文件eCars.txt中读取数量未知个新能源汽车数据,构成一个CECar类型的向量a。
- 编写一个函数DisplayData,显示向量a中前X条新能源汽车数据。如不指定X的值则显示前5条数据;如向量a中数据不足X条则全部显示。每行显示1条新能源汽车数据,显示格式与CECar类中operator<<中定义规则相同。
- 编写一个函数DeleteData,仅保留上述a向量中各轮毂直径相同的新能源汽车数据中电池容量最大(不存在电池容量并列最大的情况)的那条新能源汽车数据,不符合上述要求的数据直接在a向量中全部删除。在进行上述操作的过程中,不允许借助于a以外的任何其它向量,否则本步不得分。
- 编写一个函数WriteFile,将经过上述处理后的a向量中所有新能源汽车数据保存在D盘根目录下的文本文件res.txt中。每行保存1条新能源汽车数据,文件保存格式与CECar类中operator<<的定义规则相同。
- 通过指定的main函数来验证上述类和函数的功能。
注意:
-
-
-
- 不允许修改main函数的定义!对main函数的定义每修改一处,总分扣2分,最多扣10分。
- 不允许修改CTyre和CAuto类的声明!对CTyre和CAuto类的声明每修改一处,总分扣2分,最多扣10分。
- 不允许修改CECar类已提供的声明!对CECar类已提供的声明每修改一处,总分扣2分,最多扣10分。
- 使用全局变量扣10分。
-
-
程序的main函数
int main()
{
vector<CECar> a;
int c;
a = ReadFile("d:\\eCars.txt");
DisplayData(a); //显示向量中新能源汽车数据
cout << "一共有" << CECar::getCounts() << "辆新能源汽车" << endl;
c=DeleteData(a); //删除向量中新能源汽车数据
cout << "一共删除了" << c << "辆新能源汽车数据" << endl<<endl;
WriteFile("d:\\res.txt", a);
CECar t1;
cout << t1++<< endl;
cout << ++t1 << endl;
CECar t2(t1);
cout << t2 << endl;
cout << "一共有" << CECar::getCounts() << "辆新能源汽车" << endl;
return 0;
}
程序运行显示结果如下图所示:
程序运行文件保存结果如下图所示:
编程题评分标准
大项 | 子项 | 评分项 | 应得分 | 实得分 |
正 确 性 | 结果(80分) | Ctyre类 构造函数 | 2 | |
Ctyre类 getDia函数 | 1 | |||
Ctyre类 前++运算符重载函数 | 3 | |||
Ctyre类 后++运算符重载函数 | 3 | |||
Ctyre类 <<运算符重载函数 | 2 | |||
CAuto类 构造函数 | 4 | |||
CAuto类 getTyre函数 | 1 | |||
CAuto类 前++运算符重载函数 | 5 | |||
CAuto类 后++运算符重载函数 | 5 | |||
CAuto类 <<运算符重载函数 | 4 | |||
CECar类 构造函数 | 5 | |||
CECar类 getCounts静态成员函数 | 2 | |||
CECar类 getBattery成员函数 | 1 | |||
CECar类 前++运算符重载函数 | 6 | |||
CECar类 后++运算符重载函数 | 6 | |||
CECar类 <<运算符重载函数 | 5 | |||
CECar类 必须补充的函数1 | 3 | |||
CECar类 必须补充的函数2 | 2 | |||
ReadFile函数 | 4 | |||
DisplayData函数 | 3 | |||
DeleteData函数 | 10 | |||
WriteFile函数 | 3 | |||
程序运行异常中断、死循环或无任何结果 | -10 | |||
main函数修改处(最多扣10分) | ||||
CTyre和CAuto类定义修改处(最多扣10分) | ||||
CECar类定义已完成部分修改处(最多扣10分) | ||||
可 读 性 | 缩进对齐(2分) | 缩进对齐规范 | 2 | |
缩进对齐混乱或不缩进 | 0 | |||
变量命名规范 (2分) | 命名规范 | 2 | ||
命名不规范 | 0 | |||
注释(1分) | 有注释 | 1 | ||
无注释 | 0 | |||
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>
#include<iomanip>
using namespace std;
class CTyre
{
private:
int m_dia; //轮毂直径,必须为正数,单位:寸
public:
CTyre(int dia); //构造函数
int getDia() const; //获取轮毂直径
CTyre& operator++(); //前增量运算符重载,轮毂直径提高1寸
CTyre operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CTyre& Obj);
//输出轮胎信息
//轮毂直径占6列,右对齐,不足左补空
};
CTyre::CTyre(int dia){
if(dia<=0){exit(0);}
else{
this->m_dia=dia;
}
}
int CTyre::getDia() const{
return this->m_dia;
}
CTyre& CTyre::operator++(){
this->m_dia++;
return *this;
}
CTyre CTyre::operator++(int){
CTyre C(this->m_dia);
this->m_dia++;
return C;
}
ostream& operator<<(ostream& Out, const CTyre& Obj){
Out<<right<<setw(6)<<Obj.m_dia;
return Out;
}
class CAuto
{
private:
CTyre m_tyre; //汽车轮胎
double m_Dis; //汽车轴距,必须为正数,单位:米
public:
CAuto(int dia, double dis); //构造函数
CTyre getTyre() const; //获取轮胎信息
CAuto& operator++(); //前增量运算符重载,轮胎++,轴距增加0.01米
CAuto operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CAuto& Obj);
//输出汽车信息
//轮胎信息输出格式同CTyre类
//轴距占8列,小数部分保留2位,右对齐,不足左补空
};
CAuto::CAuto(int dia, double dis):m_tyre(dia){
if(dis<0){exit(0);}
else{
this->m_Dis=dis;
}
}
CTyre CAuto::getTyre() const{
return this->m_tyre;
}
CAuto& CAuto::operator++(){
this->m_tyre++;
this->m_Dis+=0.01;
return *this;
}
CAuto CAuto::operator++(int){
CAuto C(*this);
this->m_tyre++;
this->m_Dis+=0.01;
return C;
}
ostream& operator<<(ostream& Out, const CAuto& Obj){
Out<<Obj.m_tyre;
Out<<fixed<<right<<setw(8)<<setprecision(2)<<Obj.m_Dis;
return Out;
}
class CECar : public CAuto
{
private:
double m_Battery; //电池容量,必须是正数,单位:kWh
static int m_Counts; //新能源汽车总数
public:
CECar(int dia=18, double dis=2.7, double battery=65.0); //构造函数。当不提供初始值时,轮毂直径等于18寸,轴距等于2.7米,电池容量等于65kWh
CECar(const CECar& C);
static int getCounts(); //获取新能源汽车总数
double getBattery()const; //获取电池容量
CECar& operator++(); //前增量运算符重载,汽车(基类部分)++,电池容量增加1.0kWh
CECar operator++(int); //后增量运算符重载,规则同上
friend ostream& operator<<(ostream& Out, const CECar& Obj);
//输出新能源汽车信息
//汽车(基类)部分数据的输出格式同CAuto类
//电池容量占8列,小数部分保留2位,右对齐,不足左补空
~CECar();
//.......???自己设计增加另外2个不可缺少的成员函数
};
int CECar::m_Counts=0;
CECar::CECar(int dia, double dis, double battery):CAuto(dia,dis){
if(battery<=0){exit(0);}
else{
m_Battery=battery;
m_Counts++;
}
}
CECar::CECar(const CECar&C):CAuto(C){
m_Battery=C.m_Battery;
m_Counts++;
}
int CECar::getCounts(){
return m_Counts;
}
double CECar::getBattery()const{
return m_Battery;
}
CECar& CECar::operator++(){
//++(static_cast<CAuto>(*this));错误的
++(*(static_cast<CAuto*>(this)));
//this->CAuto::operator++(); 正确的
this->m_Battery+=1.0;
return *this;
}
CECar CECar::operator++(int){
CECar C(*this);
++(*this);
//this->CAuto::operator++(); 正确的
this->m_Battery+=1.0;
return C;
}
ostream& operator<<(ostream& Out, const CECar& Obj){
Out<<*(static_cast<const CAuto*>(&Obj));
Out<<right<<setw(8)<<fixed<<setprecision(2)<<Obj.m_Battery;
return Out;
}
CECar::~CECar(){
m_Counts--;
}
vector<CECar> ReadFile(string path){
vector<CECar> a;
ifstream iofile(path);
while(!iofile.eof()){
int dia;
double dis;
double battery;
if(iofile>>dia>>dis>>battery){
a.push_back(CECar(dia,dis,battery));
}
}
iofile.close();
return a;
}
void DisplayData(const vector<CECar>&a ,int x=5){
for(int i=0;i<a.size();i++){
cout<<a[i]<<endl;
if(i+1==x){return ;}
}
}
int DeleteData(vector<CECar>&a){
int cont=0;
for(vector<CECar>::iterator it=a.begin();it!=a.end();){
int flag=1;
for(vector<CECar>::iterator it1=it+1;it1!=a.end();){
if(it->getTyre().getDia()==it1->getTyre().getDia()){
if(it->getBattery()<it1->getBattery()){
it=a.erase(it);
flag=0;
cont++;
break;
}
else{
cont++;
it1=a.erase(it1);
}
}
else{
it1++;
}
}
if(flag==1){
it++;
}
}
return cont;
}
void WriteFile(string path, const vector<CECar>&a){
ofstream ofile(path);
for(int i=0;i<a.size();i++){
ofile<<a[i];
}
ofile.close();
}
int main()
{
vector<CECar> a;
int c;
a = ReadFile("/Users/apple/Downloads/20221217/temp/eCars.txt");
DisplayData(a); //显示向量中新能源汽车数据
cout << "一共有" << CECar::getCounts() << "辆新能源汽车" << endl;
c=DeleteData(a); //删除向量中新能源汽车数据
cout << "一共删除了" << c << "辆新能源汽车数据" << endl<<endl;
WriteFile("/Users/apple/Downloads/20221217/temp/res.txt", a);
CECar t1;
cout << t1++<< endl;
cout << ++t1 << endl;
CECar t2(t1);
cout << t2 << endl;
cout << "一共有" << CECar::getCounts() << "辆新能源汽车" << endl;
return 0;
}
写的时候急哭了,因为一直报错也不说为啥,结果查一查,呀,漏了个类成员函数没写。
学一点:*(static_cast<CAuto*>(this))