考试说明
- 考试时间:合计160分钟。选择题部分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。
- 提交成功后,可点击“查看内容”按钮检查提交的内容是否正确和完整。
- 如多次提交不成功,请联系监考人员。
按以下要求编写程序
数据文件
请首先从服务器上下载数据文件books.txt到电脑的D盘根文件夹,该文本文件中存储了若干本书籍的基本信息,一行存储了一本书籍的信息,存储格式如下所示:(斜线文字是用于解释说明,在文件中并不存在)
书籍名称 | 价格 | 页数 |
C++程序设计教程 | 39.5 | 549 |
每行中的各项之间是以制表符\t进行分隔。
题目说明
- 现有商品类描述如下:
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类的成员(友元)函数的定义。
- 请以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列,左对齐,不足右补空
};
- 在上述2个类设计的基础上,请按照下列要求分别编写4个函数:
- 编写一个函数ReadBook,从D盘根目录下的文本文件books.txt中读取数量未知个书籍数据,构成一个CBook类型的向量A。
- 编写一个函数DisplayData,按照上面CBook类中operator<<的格式要求输出每个书籍数据,每行显示1个书籍数据。
- 编写一个函数IncreaseBook,对上述A向量中的每个书籍进行后自增操作。
- 编写一个函数CombineBook,将上述A向量中的书籍数据进行规整处理,规整的规则是每种书名相同的书籍仅保留性价比最高(价格/页数的比值最小)的那一条数据,规整结果仍然保存在A向量中。
- 编写一个函数OutputBookFile,将经过上述处理后的A向量中所有书籍数据保存在D盘根目录下的文本文件res.txt中,文件保存格式与CBook类中operator<<的定义规则相同,每行保存1个书籍数据。
- 通过指定的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。