一个教学系统至少有学生和教师两种类型的人员,假设教师的数据有教师编号、姓名、年龄、性别、职称和系别,学生的数据有学号、姓名、年龄、性别、班级和语文、数学、英语三门课程的成绩。编程完成学生和教师档案数据的输入和显示。要求如下: 设计三个类Person、Teacher、Student,Person是Teacher和Student的基类,具有此二类共有的数据成员姓名、年龄、性别,并具有输入和显示这些数据的成员函数;Teacher类继承了Person类的功能,并增加对教师编号、职称和系别等数据成员进行输入和显示的成员函数。按同样的方法完善Student类的设计。 对本题目进行以下扩展: (1)在Person的派生类中增加学生(Student)类人员,教师分为普通教师(Teacher)、院长(Chancellor)和系主任(Dean)三类。所有教师都有基本工资(salary),普通教师的总收入income由基本工资和课时费构成。一个教师要管理若干学生,而一个学生只有一位教师作导师;
时间: 2023-07-10 12:33:36 浏览: 406
好的,根据您的需求,我可以提供以下代码:
```
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Person {
protected:
string name;
int age;
char gender;
public:
void input() {
cout << "Name: ";
cin >> name;
cout << "Age: ";
cin >> age;
cout << "Gender (M/F): ";
cin >> gender;
}
void display() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Gender: " << gender << endl;
}
};
class Teacher : public Person {
private:
int id;
string title;
string department;
public:
void input() {
Person::input();
cout << "Teacher ID: ";
cin >> id;
cout << "Title: ";
cin >> title;
cout << "Department: ";
cin >> department;
}
void display() {
Person::display();
cout << "Teacher ID: " << id << endl;
cout << "Title: " << title << endl;
cout << "Department: " << department << endl;
}
};
class Student : public Person {
private:
int id;
string className;
float chineseGrade;
float mathGrade;
float englishGrade;
public:
void input() {
Person::input();
cout << "Student ID: ";
cin >> id;
cout << "Class Name: ";
cin >> className;
cout << "Chinese Grade: ";
cin >> chineseGrade;
cout << "Math Grade: ";
cin >> mathGrade;
cout << "English Grade: ";
cin >> englishGrade;
}
void display() {
Person::display();
cout << "Student ID: " << id << endl;
cout << "Class Name: " << className << endl;
cout << "Chinese Grade: " << chineseGrade << endl;
cout << "Math Grade: " << mathGrade << endl;
cout << "English Grade: " << englishGrade << endl;
}
};
class Chancellor : public Teacher {
public:
float salary;
void input() {
Teacher::input();
cout << "Salary: ";
cin >> salary;
}
float totalIncome() {
return salary;
}
};
class Dean : public Teacher {
public:
float salary;
void input() {
Teacher::input();
cout << "Salary: ";
cin >> salary;
}
float totalIncome() {
return salary;
}
};
class OrdinaryTeacher : public Teacher {
public:
float hourFee;
vector<Student*> students;
void input() {
Teacher::input();
cout << "Hourly Fee: ";
cin >> hourFee;
}
void addStudent(Student* student) {
students.push_back(student);
}
float totalIncome() {
float total = Teacher::totalIncome();
for (int i = 0; i < students.size(); i++) {
total += hourFee;
}
return total;
}
};
int main() {
Teacher t;
t.input();
t.display();
Student s;
s.input();
s.display();
Chancellor c;
c.input();
c.display();
Dean d;
d.input();
d.display();
OrdinaryTeacher ot;
ot.input();
ot.addStudent(&s);
ot.display();
cout << "Total Income: " << ot.totalIncome() << endl;
return 0;
}
```
这是一个基于面向对象思想的程序,其中有四个类:Person、Teacher、Student和派生自Teacher的Chancellor、Dean和OrdinaryTeacher。
在Person类中定义了一些共有的数据成员和成员函数,包括姓名、年龄、性别等,以及一个基本的输入和显示函数。Teacher和Student类继承了Person类的功能,并增加了对教师和学生的数据成员进行输入和显示的成员函数。
在Chancellor、Dean和OrdinaryTeacher类中,我们根据题目的要求增加了一些数据成员和成员函数。其中,Chancellor和Dean继承自Teacher类,因此也具有教师的基本信息,但是在输入和显示函数中增加了薪资的数据成员,并实现了计算总收入的函数。OrdinaryTeacher类是一个普通教师,除了继承自Teacher类的基本信息外,还有一个课时费的数据成员和一个管理学生的容器。我们在输入和显示函数中增加了课时费的数据成员,并实现了添加学生和计算总收入的函数。
在主函数中,我们创建了一个Teacher对象、一个Student对象、一个Chancellor对象、一个Dean对象和一个OrdinaryTeacher对象,并分别调用它们的输入和显示函数,以及Chancellor、Dean和OrdinaryTeacher的计算总收入的函数。
需要注意的是,为了方便演示,在OrdinaryTeacher类中我们使用了一个vector容器来存储学生对象的指针,而没有使用一个学生对象的容器。这样做的好处是可以方便地添加或删除学生,但是需要手动管理内存,避免出现内存泄漏的问题。
阅读全文