【苏大C++第三次考试模拟3】

考试说明

  1. 考试时间:合计160分钟。选择题部分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. 如多次提交不成功,请联系监考人员。
    按以下要求编写程序

数据文件

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

书籍名称

价格

页数

C++程序设计教程

39.5

549

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

题目说明

  1. 现有商品类描述如下:

class CGoods

{

private:

string m_name; //商品名称

double m_price; //商品价格,必须为正数,单位:元

static int m_count; //所有商品总数

public:

CGoods(const string& name,double price); //构造函数

CGoods(const CGoods& obj);

string getName() const; //获取商品名称

double getPrice() const; //获取商品价格

CGoods& operator++(); //前增量运算符重载,商品价格提高1元

CGoods operator++(int); //后增量运算符重载,商品价格提高1元

static int GetCounts();

~CGoods();

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

//输出商品信息

//名称占10列,左对齐,不足右补空

//价格占10列,小数部分保留2位,左对齐,不足右补空

//商品总数不要求显示

};

请根据上述要求分别完成如上所示的CGoods类的成员(友元)函数的定义。

  1. 请以CGoods类为基类进行公有派生,产生新类CBook用于描述书籍,书籍类中添加一个私有成员用于描述书籍的页数。该类的定义代码如下:

class CBook: public CGoods

{

private:

int m_pages; //页数,必须为正数,单位:页

public:

CBook(const string& name="NONAME",double price=1.0, int pages=100); //构造函数。如不提供初值,名称为"NONAME",价格为1.0元,页数为100页。

int getPage() const; //获取书的页数

CBook& operator++(); //前增量运算符重载,商品价格提高1元,页数增加10页

CBook operator++(int); //后增量运算符重载,商品价格提高1元,页数增加10页

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

//输出书的信息

//名称和价格与的格式与CGood类operator<<相同

//页数占8列,左对齐,不足右补空

};

  1. 在上述2个类设计的基础上,请按照下列要求分别编写4个函数:
    1. 编写一个函数ReadBook,从D盘根目录下的文本文件books.txt中读取数量未知个书籍数据,构成一个CBook类型的向量A。
    2. 编写一个函数DisplayData,按照上面CBook类中operator<<的格式要求输出每个书籍数据,每行显示1个书籍数据。
    3. 编写一个函数IncreaseBook,对上述A向量中的每个书籍进行后自增操作。
    4. 编写一个函数CombineBook,将上述A向量中的书籍数据进行规整处理,规整的规则是每种书名相同的书籍仅保留性价比最高(价格/页数的比值最小)的那一条数据,规整结果仍然保存在A向量中。
    5. 编写一个函数OutputBookFile,将经过上述处理后的A向量中所有书籍数据保存在D盘根目录下的文本文件res.txt中,文件保存格式与CBook类中operator<<的定义规则相同,每行保存1个书籍数据。
  2. 通过指定的main函数来验证上述类和函数的功能。

程序的main函数

注意:

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

2. 使用全局变量扣10

int main()

{

vector<CBook> A;

ReadBook("d:\\books.txt", A); //读取文件中的书籍数据

cout<<"当前书籍总数为:"<<CBook::GetCounts()<<endl;

CombineBook(A); //书籍数据规整处理。选修的同学不要求做本函数,可以注释

DisplayBook(A);

IncreaseBook(A); //全部书籍数据进行后自增

OutputBookFile("D:\\res.txt",A); //保存书籍数据至文件

CBook d1;

cout<<d1<<endl;

cout<<++d1<<endl;

cout<<CBook(d1)<<endl;

cout<<"当前书籍总数为:"<<CBook::GetCounts()<<endl;

return 0;

}

程序运行结果参见下图


编程题评分标准

(非选修班级考生)

大项

子项

评分项

应得分

实得分

结果(80分)

CGoods类普通有参构造函数

3

CGoods类拷贝构造函数

3

CGoods类析构函数

2

CGoods类getName、getPrice函数

3

CGoods类静态GetCounts函数

3

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

6

CGoods类流输出<<运算符重载函数

4

CBook类构造函数

6

CBook类getPage函数

2

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

8

CBook类输出运算符重载函数

6

ReadBook函数

8

CombineBook函数

10

DisplayBook函数

5

IncreaseBook函数

5

OutputBookFile函数

6

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

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

-10

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

缩进对齐(2分)

缩进对齐规范

2

缩进对齐混乱或不缩进

0

变量命名规范

(2分)

命名规范

2

命名不规范

0

注释(1分)

有注释

1

无注释

0


编程题评分标准

(选修班级考生)

大项

子项

评分项

应得分

实得分

结果(80分)

CGoods类普通有参构造函数

3

CGoods类拷贝构造函数

3

CGoods类析构函数

2

CGoods类getName、getPrice函数

3

CGoods类静态GetCounts函数

5

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

6

CGoods类流输出<<运算符重载函数

4

CBook类构造函数

8

CBook类getPage函数

2

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

10

CBook类输出运算符重载函数

6

ReadBook函数

10

DisplayBook函数

5

IncreaseBook函数

5

OutputBookFile函数

8

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

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

-10

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

缩进对齐(2分)

缩进对齐规范

2

缩进对齐混乱或不缩进

0

变量命名规范

(2分)

命名规范

2

命名不规范

0

注释(1分)

有注释

1

无注释

0

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iomanip>
#include<algorithm>
using namespace std;
class CGoods
{
private:
	string		m_name;				//商品名称
	double		m_price;				//商品价格,必须为正数,单位:元
	static int m_count;				//所有商品总数

public:
	CGoods(const string& name,double price);		//构造函数
	CGoods(const CGoods& obj);
	string getName() const;				//获取商品名称
	double getPrice() const;				//获取商品价格
	CGoods& operator++();		//前增量运算符重载,商品价格提高1元
	CGoods operator++(int);	//后增量运算符重载,商品价格提高1元
	static int GetCounts();
	~CGoods();
	friend ostream& operator<<(ostream& Out, const CGoods& Obj);
		//输出商品信息
		//名称占10列,左对齐,不足右补空
		//价格占10列,小数部分保留2位,左对齐,不足右补空
		//商品总数不要求显示
};
int CGoods::m_count=0;
CGoods::CGoods(const string& name,double price):m_name(name){
    if(price<=0){exit(0);}
    m_price=price;
    m_count++;
}
CGoods::CGoods(const CGoods& obj):m_name(obj.m_name),m_price(obj.m_price){
    m_count++;
}
string CGoods::getName() const{
    return m_name;
}
double CGoods::getPrice() const{
    return m_price;
}
CGoods& CGoods::operator++(){
    m_price++;
    return (*this);
}
CGoods CGoods::operator++(int){
    CGoods C(*this);
    ++(*this);
    return C;
}
int CGoods::GetCounts(){
    return m_count;
}
CGoods::~CGoods(){
    m_count--;
}
ostream& operator<<(ostream& Out, const CGoods& Obj){
    //输出商品信息
		//名称占10列,左对齐,不足右补空
		//价格占10列,小数部分保留2位,左对齐,不足右补空
		//商品总数不要求显示
    Out<<left<<setw(10)<<Obj.m_name;
    Out<<left<<setw(10)<<fixed<<setprecision(2)<<Obj.m_price;
    return Out;
}

class CBook: public CGoods
{
private:
	int	m_pages;	//页数,必须为正数,单位:页

public:
	CBook(const string& name="NONAME",double price=1.0, int pages=100);		//构造函数。如不提供初值,名称为"NONAME",价格为1.0元,页数为100页。
	int getPage() const;				//获取书的页数
	CBook& operator++();		//前增量运算符重载,商品价格提高1元,页数增加10页
	CBook operator++(int);	//后增量运算符重载,商品价格提高1元,页数增加10页
	friend ostream& operator<<(ostream& Out, const CBook & Obj);
		//输出书的信息
		//名称和价格与的格式与CGood类operator<<相同
		//页数占8列,左对齐,不足右补空
};
CBook::CBook(const string& name,double price,int pages):CGoods(name,price){
    if(pages<=0){exit(0);}
    m_pages=pages;
}
int CBook::getPage() const{
    return m_pages;
}
CBook& CBook::operator++(){
    ++(*(static_cast<CGoods*>(this)));
    m_pages+=10;
    return (*this);
}
CBook CBook::operator++(int){
    CBook C(this->getName(),this->getPrice(),this->getPage());
    ++(*this);
    return C;
}
ostream& operator<<(ostream& Out, const CBook & Obj){
    //输出书的信息
		//名称和价格与的格式与CGood类operator<<相同
		//页数占8列,左对齐,不足右补空
    Out<<*(static_cast<const CGoods*>(&Obj));
    Out<<left<<setw(8)<<Obj.m_pages;
    return Out;
}
void ReadBook(string path,vector<CBook>& A){
    ifstream ifile(path);
    if(ifile.is_open()==false){
        exit(0);
    }
    while(!ifile.eof()){
        string name;
        double price;
        int pages;
        ifile>>name>>price>>pages;
        A.push_back(CBook(name,price,pages));
    }
    ifile.close();
}
bool cmp(CBook a,CBook b){
    //每种书名相同的书籍仅保留性价比最高(价格/页数的比值最小
    if(a.getName()==b.getName()){
        return (a.getPrice()/a.getPage())<(b.getPrice()/b.getPage());
    }
    return a.getName()<b.getName();
}
void CombineBook(vector<CBook> &A){
    sort(A.begin(),A.end(),cmp);
    vector<CBook>::iterator it=A.begin();
    string tmp_name=it->getName();
    it++;
    for(;it!=A.end();){
        if(it->getName()!=tmp_name){
            tmp_name=it->getName();
            it++;
        }
        else{
            it=A.erase(it);
        }
    }
}
void DisplayBook(const vector<CBook> &A){
    for(int i=0;i<A.size();i++){
        cout<<A[i]<<endl;
    }
}
void IncreaseBook(vector<CBook> &A){
    for(int i=0;i<A.size();i++){
        A[i]++;
    }
}
void OutputBookFile(string path,const vector<CBook> &A){
    ofstream ofile(path);
    if(ofile.is_open()==false){exit(0);}
    for(int i=0;i<A.size();i++){
        ofile<<A[i]<<endl;
    }
    ofile.close();
}
int main()
{
	vector<CBook> A;
	
	ReadBook("/Users/apple/Downloads/20210109/books.txt", A);	//读取文件中的书籍数据
	cout<<"当前书籍总数为:"<<CBook::GetCounts()<<endl;
	CombineBook(A);				//书籍数据规整处理。选修的同学不要求做本函数,可以注释
	DisplayBook(A);
	IncreaseBook(A);				//全部书籍数据进行后自增
	OutputBookFile("/Users/apple/Downloads/20210109/res.txt",A);	//保存书籍数据至文件
	
	CBook d1;
	cout<<d1<<endl;
	cout<<++d1<<endl;
	cout<<CBook(d1)<<endl;
	cout<<"当前书籍总数为:"<<CBook::GetCounts()<<endl;

	return 0;
}

听说期末会变难,综合看来估计是在stringstream上做文章,无非就是怎么string转int,int转string。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值