请设计3个类,分别是学生类Student,本科生类Undergraduate,研究生类Postgraduate,其中Student类是一个抽象类,它包含一些基本的学生信息如姓名、所学课程、课程成绩等,而Undergraduate类和Postgraduate都是Student类的子类,它们之间的主要差别是计算课程成绩等级的方法有所不同,研究生的标准要比本科生的标准高一些,如下表所示。 假设某班级里既有本科生也有研究生,请编写程序统计出全班同学的成绩等级并显示出来。此题关键是设计一个学生数组,既能存放本科生对象,又能存放研究生对象。程序的运行效果如下图所示。
时间: 2023-11-30 18:02:50 浏览: 183
下面是题目所要求的三个类:
```python
# 定义抽象类Student
from abc import ABCMeta, abstractmethod
class Student(metaclass=ABCMeta):
def __init__(self, name, course, score):
self.name = name
self.course = course
self.score = score
@abstractmethod
def calc_grade(self):
pass
# 定义本科生类Undergraduate
class Undergraduate(Student):
def calc_grade(self):
if self.score >= 90:
return "优秀"
elif self.score >= 80:
return "良好"
elif self.score >= 70:
return "中等"
elif self.score >= 60:
return "及格"
else:
return "不及格"
# 定义研究生类Postgraduate
class Postgraduate(Student):
def calc_grade(self):
if self.score >= 95:
return "优秀"
elif self.score >= 85:
return "良好"
elif self.score >= 75:
return "中等"
elif self.score >= 65:
return "及格"
else:
return "不及格"
```
接下来,我们可以定义一个类似于班级的数组,可以存放本科生和研究生对象,并且可以统计全班的成绩等级。
```python
# 定义一个班级类Class
class Class:
def __init__(self, students):
self.students = students
def calc_class_grade(self):
for student in self.students:
grade = student.calc_grade()
print("{}的{}成绩为{},等级为{}".format(student.name, student.course, student.score, grade))
# 测试代码
if __name__ == '__main__':
# 定义本科生和研究生对象
u1 = Undergraduate("小明", "数学", 80)
u2 = Undergraduate("小红", "英语", 70)
p1 = Postgraduate("小李", "高等数学", 90)
p2 = Postgraduate("小王", "计算机科学", 85)
# 定义班级对象
c1 = Class([u1, u2, p1, p2])
# 统计全班的成绩等级
c1.calc_class_grade()
```
上述程序的运行结果应该为:
```
小明的数学成绩为80,等级为良好
小红的英语成绩为70,等级为中等
小李的高等数学成绩为90,等级为良好
小王的计算机科学成绩为85,等级为良好
```
阅读全文