请按照题目的要求编写程序并给出运行结果。 1、设计一个学生类Student和它的一个子类Undergraduate,要求如下: 1)Student类有私有属性name(姓名)和age(年龄),一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息 2)本科生类Undergraduate增加一个私有属性degree(学位)。有一个包含三个参数的构造方法,前两个参数用于给继承的name和age属性赋值,第三个参数给degree专业赋值,一个show()方法用于打印Undergraduate的属性信息 3)在测试类中分别创建Student对象和Undergraduate对象,调用它们的show()。
时间: 2023-05-15 12:07:08 浏览: 152
以下是代码和运行结果:
```python
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print("姓名:{},年龄:{}".format(self.name, self.age))
class Undergraduate(Student):
def __init__(self, name, age, degree):
super().__init__(name, age)
self.degree = degree
def show(self):
print("姓名:{},年龄:{},学位:{}".format(self.name, self.age, self.degree))
# 测试
s = Student("张三", 20)
s.show()
u = Undergraduate("李四", 22, "计算机科学与技术")
u.show()
```
运行结果:
```
姓名:张三,年龄:20
姓名:李四,年龄:22,学位:计算机科学与技术
```
相关问题
请设计3个类,分别是学生类Student,本科生类Undergraduate,研究生类Postgraduate,其中Student类是一个抽象类,它包含一些基本的学生信息如姓名、所学课程、课程成绩等,而Undergraduate类和Postgraduate都是Student类的子类,它们之间的主要差别是计算课程成绩等级的方法有所不同,研究生的标准要比本科生的标准高一些,如下表所示。 假设某班级里既有本科生也有研究生,请编写程序统计出全班同学的成绩等级并显示出来。此题关键是设计一个学生数组,既能存放本科生对象,又能存放研究生对象。程序的运行效果如下图所示。
下面是题目所要求的三个类:
```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,等级为良好
```
设计学生类Student。该类包含两个私有成员变量name和no(分别用于存放姓名和学号),以及两个public成员方法,分别为: void setData(String name,String no) 用于设置姓名和学号; void print() 用于输出姓名和学号。设计继承上述题目(1)的Student 类的子类Undergraduate。子类Undergraduate不仅具有父类的成员变量name(姓名)、no(学号),还定义新成员变量academy(学院)、department (系);并重载方法void setData(String name,String no, String academy, String department) 用于设置姓名、学号、学院和系;以及重写父类中void print()方法,实现输出姓名、学号、学院和系。在main()方法中创建一个该子类对象s,接着调用相应方法设置一个学生的姓名、学号、学院和系并输出。 (a)编写程序文件 Undergraduate.java,源代码如下: (b)编译运行程序,其结果如下: (c)使用父类Student声明一个对象变量stu,使用已创建的子类s对象进行赋值,然后使用父类对象stu调用print()方法,结果跟子类对象调用print()是否有区别?为什么? Student stu=s; stu.print();
(a) 子类Undergraduate的代码如下:
```
public class Undergraduate extends Student {
private String academy;
private String department;
public void setData(String name, String no, String academy, String department) {
this.setName(name);
this.setNo(no);
this.academy = academy;
this.department = department;
}
@Override
public void print() {
System.out.println("姓名:" + this.getName() + ",学号:" + this.getNo()
+ ",学院:" + this.academy + ",系:" + this.department);
}
}
```
(b) 编译运行程序,结果如下:
```
姓名:张三,学号:001,学院:计算机学院,系:计算机科学与技术
```
(c) 使用父类Student声明一个对象变量stu,使用已创建的子类s对象进行赋值,然后使用父类对象stu调用print()方法,结果跟子类对象调用print()是否有区别?为什么?
使用父类Student声明一个对象变量stu,使用已创建的子类s对象进行赋值,然后使用父类对象stu调用print()方法,输出结果为:
```
姓名:张三,学号:001
```
与子类对象调用print()方法的输出结果有区别,因为子类Undergraduate重写了父类Student的print()方法,输出了学院和系的信息。在使用父类对象调用print()方法时,调用的是父类Student的print()方法,没有输出学院和系的信息。因此,使用父类对象调用print()方法与使用子类对象调用print()方法的输出结果不同。
阅读全文