设计一个虚基类 Staff(员工),包含编号,姓名和年保护数据成员以及相关的成员函数;由 Staff 派生出销售员类 Salesman,含销售额保护数据成员以及相关的成员函数;再由 Staff 派生出经理类 Manager; 然后由 Salesman 和 Manager 类派生出销售经理类SalesManager.设计一个利用文件处理方式实现对公司人员(包括销售员、经理和销售经理)进行管理,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能。将公司人员信息存储在数据文件 staff. dat 中,为存储方便
时间: 2023-06-02 13:05:07 浏览: 127
,员工编号应该按照一定规律排列。请问如何设计这个程序?
对于这个问题,我可以进行回答。首先,虚基类 Staff 应该包含编号、姓名和年保护数据成员,以及相关的成员函数。然后,由 Staff 派生出销售员类 Salesman,其中包含销售额保护数据成员和相关的成员函数。接着,由 Staff 派生出经理类 Manager。最后,由 Salesman 和 Manager 类派生出销售经理类 SalesManager。
针对文件处理方式实现对公司人员进行管理,可以采用以下方式:
1. 增加数据:从键盘输入员工信息并写入 staff.dat 文件中。
2. 更新数据:先从文件中查找员工信息,再进行修改并写回文件中。
3. 查询数据:从文件中查找员工信息。
4. 删除数据:从文件中删除员工信息。
5. 重组文件:将员工信息排序后写入一个新文件中,再删除原文件并将新文件命名为原文件名。
员工编号应按照一定规律排列,可以使用员工类型首字母加编号的方式,例如 S001 表示销售员1号。在程序中可以设置一个自增变量用于生成新的员工编号。
以上就是我的回答,希望能对您有所帮助。
相关问题
设计一个虚基类Staff(员工),包含编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出销售员类Salesman,包含销售额保护数据成员以及相关的成员函数;再由Staff派生出经理类Manager;然后由Salesman和Manager类派生出销售经理类SalesManager。现要求设计一个利用文件处理方式实现对公司人员进行管理,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能。
好的,我明白了你的问题。以下是我对你的问题的回答:
首先,我们需要设计一个虚基类Staff,包含编号、姓名和年龄保护数据成员以及相关的成员函数。这个类的定义如下:
```cpp
class Staff {
protected:
int id; // 员工编号
string name; // 员工姓名
int age; // 员工年龄
public:
virtual void add() = 0; // 增加数据
virtual void update() = 0; // 更新数据
virtual void query() = 0; // 查询数据
virtual void remove() = 0; // 删除数据
virtual void reorganize() = 0; // 重组文件
};
```
接下来,我们由Staff派生出销售员类Salesman,包含销售额保护数据成员以及相关的成员函数。这个类的定义如下:
```cpp
class Salesman : public Staff {
protected:
double sales; // 销售额
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
然后,我们再由Staff派生出经理类Manager。这个类的定义如下:
```cpp
class Manager : public Staff {
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
最后,我们由Salesman和Manager类派生出销售经理类SalesManager。这个类的定义如下:
```cpp
class SalesManager : public Salesman, public Manager {
public:
void add(); // 增加数据
void update(); // 更新数据
void query(); // 查询数据
void remove(); // 删除数据
void reorganize(); // 重组文件
};
```
现在,我们需要利用文件处理方式实现对公司人员进行管理。我们可以使用文件流和操作符重载来实现这个功能。具体实现可以参考以下代码:
```cpp
class Staff {
// ...
public:
friend ostream& operator<<(ostream& os, const Staff& s) {
os << s.id << " " << s.name << " " << s.age << " ";
return os;
}
friend istream& operator>>(istream& is, Staff& s) {
is >> s.id >> s.name >> s.age;
return is;
}
};
void Salesman::add() {
ofstream ofs("salesman.txt", ios::app);
ofs << *this << sales << endl;
ofs.close();
}
void Salesman::update() {
fstream fs("salesman.txt");
Salesman s;
while (fs >> s) {
if (s.id == id) {
fs.seekp(fs.tellg());
fs << *this << sales << endl;
break;
}
}
fs.close();
}
void Salesman::query() {
ifstream ifs("salesman.txt");
Salesman s;
while (ifs >> s) {
if (s.id == id) {
cout << s.id << " " << s.name << " " << s.age << " " << s.sales << endl;
break;
}
}
ifs.close();
}
void Salesman::remove() {
ifstream ifs("salesman.txt");
ofstream ofs("temp.txt");
Salesman s;
while (ifs >> s) {
if (s.id != id) {
ofs << s << endl;
}
}
ifs.close();
ofs.close();
remove("salesman.txt");
rename("temp.txt", "salesman.txt");
}
void Salesman::reorganize() {
ifstream ifs("salesman.txt");
vector<Salesman> vec;
Salesman s;
while (ifs >> s) {
vec.push_back(s);
}
ifs.close();
sort(vec.begin(), vec.end(), [](const Salesman& a, const Salesman& b) {
return a.sales > b.sales;
});
ofstream ofs("salesman.txt");
for (const auto& s : vec) {
ofs << s << s.sales << endl;
}
ofs.close();
}
```
上面的代码中,我们使用了五个成员函数,分别是增加数据、更新数据、查询数据、删除数据以及重组文件。我们还使用了文件流和操作符重载来读写文件和输出员工信息。其中,增加数据和更新数据函数使用了ofstream和fstream流进行写操作,查询数据、删除数据和重组文件函数使用了ifstream和ofstream流进行读写操作。
以上就是对公司人员进行管理的实现方法。我们可以根据这个框架,对Manager和SalesManager类进行相应的实现。同时,我们还需要在main函数中调用这些成员函数,来实现对员工信息的管理。
人员类的继承实训: (设计基类人 员类,数据成员为姓名和身份号,成员函数有输入数据和显示数据派生学生类,数据成员包括电话号码和C++成绩,成员函数有输入数据和显示数据设计学生地址类,数据成员包括地址和年龄,成员函数输入数据和显示数据由学生类和地址类派生学生成绩类,数据成员数学成绩和英语成绩,成员函数输入数据和显示数据职员类继承人员类,没有任何成员。) 要求如下: (1)设计人员类; (2)设计地址类; (3)由人员类派生学生类; (4)由人员类派生职员类; (5)由学生类和地址类派生出学生成绩类; (6)
设计如下:
```C++
#include <iostream>
#include <string>
using namespace std;
// 基类:人员类
class Person {
protected:
string name; // 姓名
string idNumber; // 身份号
public:
void input(); // 输入数据
void display(); // 显示数据
};
void Person::input() {
cout << "请输入姓名:";
cin >> name;
cout << "请输入身份号:";
cin >> idNumber;
}
void Person::display() {
cout << "姓名:" << name << endl;
cout << "身份号:" << idNumber << endl;
}
// 学生类
class Student : public Person {
private:
string phoneNumber; // 电话号码
int cppScore; // C++成绩
public:
void input(); // 输入数据
void display(); // 显示数据
};
void Student::input() {
Person::input();
cout << "请输入电话号码:";
cin >> phoneNumber;
cout << "请输入C++成绩:";
cin >> cppScore;
}
void Student::display() {
Person::display();
cout << "电话号码:" << phoneNumber << endl;
cout << "C++成绩:" << cppScore << endl;
}
// 地址类
class Address {
protected:
string address; // 地址
int age; // 年龄
public:
void input(); // 输入数据
void display(); // 显示数据
};
void Address::input() {
cout << "请输入地址:";
cin >> address;
cout << "请输入年龄:";
cin >> age;
}
void Address::display() {
cout << "地址:" << address << endl;
cout << "年龄:" << age << endl;
}
// 学生成绩类
class Score : public Student, public Address {
private:
int mathScore; // 数学成绩
int engScore; // 英语成绩
public:
void input(); // 输入数据
void display(); // 显示数据
};
void Score::input() {
Student::input();
Address::input();
cout << "请输入数学成绩:";
cin >> mathScore;
cout << "请输入英语成绩:";
cin >> engScore;
}
void Score::display() {
Student::display();
Address::display();
cout << "数学成绩:" << mathScore << endl;
cout << "英语成绩:" << engScore << endl;
}
// 职员类
class Staff : public Person {
};
int main() {
Score s;
s.input();
s.display();
return 0;
}
```
注意:在派生类中,需要调用基类的成员函数,可以使用“基类名::成员函数名”来调用。同时,派生类可以继承多个基类,语法为“class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, …”
阅读全文