【c++】2020大一下期末考试

    技术2026-04-18  1

    解析: 注意要对输入数据不合格的情况进行处理

    考试题目

    基类说明: 现有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<<函数的要求相

    考试代码

    /******************************************* 学号:1927405148 姓名:凌珑 手机号码:18261902240 *******************************************/ #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; //性别 0代表女性 1代表男性 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; //钳工级别 1-5,最大为5级 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; } }; /* =========================================================================== * name: ReadData * function: read data from file * Parater: string name, vector<CBenchWorker>& a * return: 0(fail to open the file) or 1(success) * =========================================================================== */ int ReadData(string name,vector<CBenchWorker>& a){ ifstream data("d:\\workers.txt",ios::in); if(!data){ cout<<"error"<<endl; // fail to open the file 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; } /* =========================================================================== * name: DisplayData * function: show the data * Parater: vector<CBenchWorker>& a * return: null * =========================================================================== */ void DisplayData(vector<CBenchWorker>& a){ for(vector<CBenchWorker>::iterator it=a.begin();it!=a.end();it++){ cout<<*it<<endl; } } /* =========================================================================== * name: InecData * function: let all the data ++ * Parater: vector<CBenchWorker>& a * return: null * =========================================================================== */ void InecData(vector<CBenchWorker>& a){ for(vector<CBenchWorker>::iterator it=a.begin();it!=a.end();it++){ ++(*it); } } /* =========================================================================== * name: DelData * function: delete the data whose age>=x and grade<=y * Parater: vector<CBenchWorker>& a,int x, int y * return: count * =========================================================================== */ 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); //delete the data if (count != 0) { it--; } count++; } }; return count; } /* =========================================================================== * name: DelData * function: delete the data whose name including str * Parater: vector<CBenchWorker>& a,string name * return: count * =========================================================================== */ string makelower(string s) { //lower every charator 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) { //判断字符串中是否含有字串str it = a.erase(it); //delete the data it--; count++; } }; return count; } /* =========================================================================== * name: SortData * function: sort the data by the rules * Parater: vector<CBenchWorker>& a * return: null * =========================================================================== */ bool cmp(CBenchWorker a,CBenchWorker b){ //make the cmp rules 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); } /* =========================================================================== * name: ReadData * function: write data into file * Parater: string name, vector<CBenchWorker>& a * return: 0(fail to open the file) or 1(success) * =========================================================================== */ 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); //第2个参数为年龄,第3个参数为等级 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; }
    Processed: 0.012, SQL: 9