一个教学系统至少有学生和教师两种类型的人员,假设教师的数据有教师编号、姓名、年龄、性别、职称和系别,学生的数据有学号、姓名、年龄、性别、班级和语文、数学、英语三门课程的成绩。编程完成学生和教师档案数据的输入和显示。要求如下: 设计三个类Person、Teacher、Student,Person是Teacher和Student的基类,具有此二类共有的数据成员姓名、年龄、性别,并具有输入和显示这些数据的成员函数;Teacher类继承了Person类的功能,并增加对教师编号、职称和系别等数据成员进行输入和显示的成员函数。按同样的方法完善Student类的设计。 对本题目进行以下扩展: (1)在Person的派生类中增加学生(Student)类人员,教师分为普通教师(Teacher)、院长(Chancellor)和系主任(Dean)三类。所有教师都有基本工资(salary),普通教师的总收入income由基本工资和课时费构成。一个教师要管理若干学生,而一个学生只有一位教师作导师; (2)院长和系主任都从普通教师中产生,院长的总收入由年薪和基本工资构成,系主任的总收入由基本工资和每有绩效构成。他们每年须完成指定课时的教学任务,但不计课时报酬。
时间: 2024-03-10 12:44:03 浏览: 76
好的,根据题目的要求,我们需要对之前的代码进行一些修改和扩展。下面是一个可能的实现:
```python
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def input_info(self):
self.name = input("请输入姓名:")
self.age = input("请输入年龄:")
self.gender = input("请输入性别:")
def print_info(self):
print("姓名:", self.name)
print("年龄:", self.age)
print("性别:", self.gender)
class Teacher(Person):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.teacher_id = None
self.title = None
self.department = None
self.salary = None
self.total_income = None
self.students = []
def input_info(self):
super().input_info()
self.teacher_id = input("请输入教师编号:")
self.title = input("请输入职称:")
self.department = input("请输入系别:")
self.salary = float(input("请输入基本工资:"))
self.total_income = self.salary # 初始总收入等于基本工资
def print_info(self):
super().print_info()
print("教师编号:", self.teacher_id)
print("职称:", self.title)
print("系别:", self.department)
print("基本工资:", self.salary)
print("总收入:", self.total_income)
def add_student(self, student):
self.students.append(student)
def remove_student(self, student):
self.students.remove(student)
def teach(self):
for student in self.students:
print("{} 正在教授 {} 学生 {}".format(self.name, student.cls, student.name))
student.learn()
def get_income(self):
pass # 在子类中实现
class OrdinaryTeacher(Teacher):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.hourly_wage = None
def input_info(self):
super().input_info()
self.hourly_wage = float(input("请输入课时费:"))
def print_info(self):
super().print_info()
print("课时费:", self.hourly_wage)
def get_income(self):
self.total_income = self.salary + self.hourly_wage * len(self.students)
class Chancellor(Teacher):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.annual_salary = None
def input_info(self):
super().input_info()
self.annual_salary = float(input("请输入年薪:"))
def print_info(self):
super().print_info()
print("年薪:", self.annual_salary)
def get_income(self):
self.total_income = self.annual_salary + self.salary
class Dean(Teacher):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.performance = None
def input_info(self):
super().input_info()
self.performance = float(input("请输入绩效:"))
def print_info(self):
super().print_info()
print("绩效:", self.performance)
def get_income(self):
self.total_income = self.salary + self.performance
class Student(Person):
def __init__(self, name, age, gender):
super().__init__(name, age, gender)
self.student_id = None
self.cls = None
self.chinese = None
self.math = None
self.english = None
self.teacher = None
def input_info(self):
super().input_info()
self.student_id = input("请输入学号:")
self.cls = input("请输入班级:")
self.chinese = float(input("请输入语文成绩:"))
self.math = float(input("请输入数学成绩:"))
self.english = float(input("请输入英语成绩:"))
def print_info(self):
super().print_info()
print("学号:", self.student_id)
print("班级:", self.cls)
print("语文成绩:", self.chinese)
print("数学成绩:", self.math)
print("英语成绩:", self.english)
def set_teacher(self, teacher):
self.teacher = teacher
def learn(self):
print("{} 学生正在学习...".format(self.name))
def get_score(self):
return (self.chinese + self.math + self.english) / 3
```
在上面的代码中,我们对之前的 `Person`、`Teacher` 和 `Student` 类进行了修改和扩展。现在 `Teacher` 有了 `salary`、`total_income` 和 `students` 属性,分别表示基本工资、总收入和管理的学生。同时,我们在 `Teacher` 中定义了 `add_student`、`remove_student` 和 `teach` 函数,分别用来添加学生、删除学生和教授学生。在 `add_student` 函数中,我们将学生对象添加到 `students` 列表中;在 `remove_student` 函数中,我们从 `students` 列表中删除学生对象;在 `teach` 函数中,我们循环遍历 `students` 列表,对每个学生进行教学。这里需要注意的是,`Teacher` 类中的 `get_income` 函数是一个抽象方法,需要在子类中进行实现。
我们在 `Teacher` 的子类中实现了 `OrdinaryTeacher`、`Chancellor` 和 `Dean` 三个类,分别对应普通教师、院长和系主任。在 `OrdinaryTeacher` 中,我们添加了 `hourly_wage` 属性表示课时费,并在 `get_income` 函数中计算总收入;在 `Chancellor` 中,我们添加了 `annual_salary` 属性表示年薪,并在 `get_income` 函数中计算总收入;在 `Dean` 中,我们添加了 `performance` 属性表示绩效,并在 `get_income` 函数中计算总收入。这里需要注意的是,我们在子类中重写了 `input_info` 和 `print_info` 函数,以便添加新的属性。
在 `Student` 类中,我们添加了 `teacher` 属性表示导师,并在 `set_teacher` 函数中设置导师对象。同时,我们添加了 `learn` 函数表示学习,这个函数只是一个占位符,没有实际作用。我们还添加了 `get_score` 函数,用来计算学生的平均成绩。
下面是一个简单的示例程序,演示如何使用上面的类:
```python
t = OrdinaryTeacher("张三", 35, "男")
t.input_info()
t.print_info()
s1 = Student("李四", 18, "女")
s1.input_info()
s1.set_teacher(t)
t.add_student(s1)
s2 = Student("王五", 19, "男")
s2.input_info()
s2.set_teacher(t)
t.add_student(s2)
t.teach()
t.get_income()
t.print_info()
t.remove_student(s1)
t.get_income()
t.print_info()
c = Chancellor("赵六", 50, "男")
c.input_info()
c.add_student(s1)
d = Dean("钱七", 45, "女")
d.input_info()
d.add_student(s2)
print("李四的导师是:", s1.teacher.name)
print("李四的平均成绩是:", s1.get_score())
print("王五的导师是:", s2.teacher.name)
print("王五的平均成绩是:", s2.get_score())
```
运行上面的程序,你可以输入教师和学生的信息,并将学生分配给教师。然后,教师可以教授学生、添加/删除学生、计算总收入等。同时,我们还创建了 `Chancellor` 和 `Dean` 两个类,并将学生分配给他们。最后,我们计算学生的平均成绩,并打印出来。
阅读全文