解析: 注意要对输入数据不合格的情况进行处理
考试题目
基类说明: 现有CWorker 类 派生类说明: 请以CWorker类为基类进行公有继承,派生出CBenchWorker类用于描述钳工。CBenchWorker 类在继承CWorker所有数据成员的基础上,还需要添加1个私有成员用于描述钳工级别,成员 定义代码如下: int m_Grade; //钳工级别 1-5,最大为5级
为CBenchWorker 类添加一个构造函数。构造函数通过6 个形式参数对钳工的6 个成员分别进行初始化。如果这6 个形式参数都没有提供初始值,则各成员的初始值如下所示:
工号:0姓名:”No Name”性别:’M’年龄:18级别:1
为CBenchWorker 类添加返回级别的成员函数GetGrade;为CBenchWorker 类添加前自增运算符++。++运算符用于将钳工的级别加1;为CBenchWorker 类重载流输出运算符<<。其中基类部分数据的输出格式与基类的 operator<<函数相同,CBenchWorker 类新增成员的输出格式要求如下:级别:右对齐,占5 列,不足部分补空格不允许在题目要求以外添加其它成员变量、成员函数或友元函数。
程序业务流程说明
编写一个函数readData 。从下载的数据文件workers.txt 中读取数据, 逐个生成CBenchWorker 类的对象,并将这些对象存储到vector 对象myVect 中。编写一个函数DisplayData。显示这些钳工信息。每个钳工数据占一行,每行中显示格式的要求与CBenchWorker 类operator<<函数的要求相同。编写一个函数InecData。对所有钳工依次执行前自增运算,结果仍然保存在myVect 中。编写一个函数DelData。删除所有年龄大于等于X 岁、级别小于等于Y 级的钳工,结果仍然保存在myVect 中,并返回删除人数。编写一个函数DelData。删除所有姓名中包含(大小写不敏感)字符串X 的钳工,结果仍然保存在myVect 中,并返回删除人数。例如,以目标字符串“Tom”为例,“TOMWANG”“WANGtOM” “WANGtOm” “toMWANG”“ToMWANG” “tomWANG”中都包含了“Tom”子串。编写一个函数SortData。对所有钳工按照性别(女士优先,女性在前、男性在后)进行排序,其中男性钳工中按照级别进行增序排列,女性钳工中按照级别进行降序排列。编写一个函数WriteData。将经过上述处理后的所有钳工信息保存到指定文件中。每个钳工数据占一行,每行中文件保存格式的要求CBenchWorker 类operator<<函数的要求相
考试代码
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
using namespace std
;
class CWorker
{
private:
int m_ID
;
string m_Name
;
int m_Sex
;
int m_Age
;
public:
CWorker(int ID
, string Name
, int Sex
, int Age
)
{
if (Sex
<0 || Sex
>1)
{
cout
<<"性别初始值"<<Sex
<<"不符合要求!"<<endl
;
exit(0);
}
if (Age
<=0 )
{
cout
<<"年龄初始值"<<Age
<<"不符合要求!"<<endl
;
exit(0);
}
m_ID
=ID
;
m_Name
=Name
;
m_Sex
=Sex
;
m_Age
=Age
;
}
string
GetName()const
{
return m_Name
;
}
int GetSex()const
{
return m_Sex
;
}
int GetAge()const
{
return m_Age
;
}
friend ostream
& operator<<(ostream
& Out
, const CWorker
& Obj
)
{
Out
<<right
<<setw(5)<<Obj
.m_ID
;
Out
<<right
<<setw(10)<<Obj
.m_Name
;
Out
<<right
<<setw(5)<<Obj
.m_Sex
;
Out
<<right
<<setw(6)<<Obj
.m_Age
;
return Out
;
}
};
class CBenchWorker: public CWorker
{
private:
int m_Grade
;
public:
CBenchWorker(int ID
=0, string Name
="No Name", int Sex
=1, int Age
=18,int Grade
=1):CWorker(ID
,Name
,Sex
,Age
){
m_Grade
=Grade
;
}
int GetGrade()const{
return m_Grade
;
}
CBenchWorker
& operator++(){
m_Grade
++;
return *this;
}
friend ostream
& operator<<(ostream
& Out
, const CBenchWorker
& Obj
){
CWorker temp
=(CWorker
)Obj
;
Out
<<temp
<<right
<<setw(5)<<Obj
.m_Grade
;
return Out
;
}
};
int ReadData(string name
,vector
<CBenchWorker
>& a
){
ifstream
data("d:\\workers.txt",ios
::in
);
if(!data
){
cout
<<"error"<<endl
;
return 0;
}
int ID
;
string Name
;
int Sex
;
int Age
;
int Grade
;
while(data
>>ID
>>Name
>>Sex
>>Age
>>Grade
){
CBenchWorker
temp(ID
,Name
,Sex
,Age
,Grade
);
a
.push_back(temp
);
}
data
.close();
return 1;
}
void DisplayData(vector
<CBenchWorker
>& a
){
for(vector
<CBenchWorker
>::iterator it
=a
.begin();it
!=a
.end();it
++){
cout
<<*it
<<endl
;
}
}
void InecData(vector
<CBenchWorker
>& a
){
for(vector
<CBenchWorker
>::iterator it
=a
.begin();it
!=a
.end();it
++){
++(*it
);
}
}
int DelData(vector
<CBenchWorker
>& a
,int x
, int y
){
int count
= 0;
for (vector
<CBenchWorker
>::iterator it
= a
.begin(); it
!= a
.end(); it
++) {
if ((*it
).GetAge()>=x
&& (*it
).GetGrade()<=y
) {
it
= a
.erase(it
);
if (count
!= 0) {
it
--;
}
count
++;
}
};
return count
;
}
string
makelower(string s
) {
string tempstr
= s
;
for (int i
= 0; i
< signed(tempstr
.length()); i
++) {
tempstr
[i
] = tolower(tempstr
[i
]);
}
return tempstr
;
}
int DelData(vector
<CBenchWorker
>& a
,string name
){
name
=makelower(name
);
int count
= 0;
for(vector
<CBenchWorker
>::iterator it
= a
.begin(); it
!= a
.end(); it
++) {
string tempstr
=makelower((*it
).GetName());
if (tempstr
.find(name
) != tempstr
.npos
) {
it
= a
.erase(it
);
it
--;
count
++;
}
};
return count
;
}
bool cmp(CBenchWorker a
,CBenchWorker b
){
if(a
.GetSex()<b
.GetSex()){
return true;
}
else if(a
.GetSex()==0&&b
.GetSex()==0){
if(a
.GetGrade()>b
.GetGrade() ) return true;
}
else if(a
.GetSex()==1&&b
.GetSex()==1){
if(a
.GetGrade()<b
.GetGrade() ) return true;
}
else return false;
}
void SortData(vector
<CBenchWorker
>& a
){
sort(a
.begin(),a
.end(),cmp
);
}
int WriteData(string name
,vector
<CBenchWorker
>& a
){
ofstream
file("d:\\res.txt",ios
::out
);
if(!file
){
cout
<<"error"<<endl
;
return 0;
}
for (vector
<CBenchWorker
>::iterator it
= a
.begin(); it
!= a
.end(); it
++){
file
<<*it
<<endl
;
}
file
.close();
return 1;
}
int main()
{
vector
<CBenchWorker
> a
;
int c
;
if (ReadData("d:\\workers.txt", a
)==0)
return -1;
cout
<<"文件读取后一共有 "<<a
.size()<<" 条钳工数据:"<<endl
;
DisplayData(a
);
InecData(a
);
c
=DelData(a
,55,2);
cout
<<endl
<<"第1次删除了"<<c
<<"个钳工数据"<<endl
;
c
=DelData(a
,"Tom");
cout
<<endl
<<"第2次删除了"<<c
<<"个钳工数据"<<endl
;
SortData(a
);
cout
<<endl
<<"上述流程结束后一共有 "<<a
.size()<<" 条钳工数据:"<<endl
;
DisplayData(a
);
if (WriteData("d:\\res.txt",a
)==0)
return -1;
cout
<<endl
<<"文件保存成功"<<endl
<<endl
;
}