【C++第三次考试模拟】

考试说明

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

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

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

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

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

数据文件

请首先从服务器上下载数据文件eCars.txt到电脑的D盘根文件夹,该文本文件中存储了若干辆新能源汽车的基本信息,一行保存了一辆新能源汽车的信息,存储格式如下所示:(斜线文字是用于解释说明,在文件中并不存在)

轮毂直径

轴距

电池容量

19

2.8

70.0

每行中的各项之间是以制表符\t进行分隔。

题目说明

  1. 现有轮胎(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类的成员(友元)函数的定义。

  1. 现有汽车(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类的成员(友元)函数的定义。

  1. 请以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个不可缺少的成员函数。

  1. 在上述3个类设计的基础上,请按照下列要求分别编写4个函数:
    1. 编写一个函数ReadFile,从D盘根目录下的文本文件eCars.txt中读取数量未知个新能源汽车数据,构成一个CECar类型的向量a。
    2. 编写一个函数DisplayData,显示向量a中前X条新能源汽车数据。如不指定X的值则显示前5条数据;如向量a中数据不足X条则全部显示。每行显示1条新能源汽车数据,显示格式与CECar类中operator<<中定义规则相同。
    3. 编写一个函数DeleteData,仅保留上述a向量中各轮毂直径相同的新能源汽车数据中电池容量最大(不存在电池容量并列最大的情况)的那条新能源汽车数据,不符合上述要求的数据直接在a向量中全部删除。在进行上述操作的过程中,不允许借助于a以外的任何其它向量,否则本步不得分。
    4. 编写一个函数WriteFile,将经过上述处理后的a向量中所有新能源汽车数据保存在D盘根目录下的文本文件res.txt中。每行保存1条新能源汽车数据,文件保存格式与CECar类中operator<<的定义规则相同。
  2. 通过指定的main函数来验证上述类和函数的功能。

注意:

        1. 不允许修改main函数的定义!对main函数的定义每修改一处,总分扣2分,最多扣10分。
        2. 不允许修改CTyre和CAuto类的声明!对CTyre和CAuto类的声明每修改一处,总分扣2分,最多扣10分。
        3. 不允许修改CECar类已提供的声明!对CECar类已提供的声明每修改一处,总分扣2分,最多扣10分。
        4. 使用全局变量扣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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值