python3 程序设计 第7章课后题答案

目录

1.选择题:

2.简答题:

(1)什么是对象?什么是类?类与对象的关系是什么?

(2)面向对象语言有哪三个特性?

(3)什么是面向对象编程的继承性?有什么优点?

(4)类变量与成员变量的区别是什么?

(5)构造方法和析构方法名字都是什么?

(6)构造方法的作用是什么?它与成员方法有什么不同?

(7)请列举出五种重载的运算符及其对应的方法。

3.阅读程序

运行下面的程序,输出结果是什么?说明程序的执行过程。

4.编程题:

(1)设计一个Group类,该类包括:一个数据成员score(每个学生的分数)、两个类成员total(班级的总分)和 count (班级的人数)。成员方法setScore0用于设置分数,成员方法sum(用于累计总分,类方法averageO用于求平均值。交互式输人某组学生的成绩,显示该组的总分和平均分。

(2)为二次方程式ax^2+bx+c=0 设计一个名为Equation的类,这个类包括:

(3)设计一个描述自由落体运动的类,要求能获得任意时刻的速度及位移,并进行测试。已知重力加速度为9.8m/s^2。


1.选择题:

1.A 2.A 3.D 4.C 5.D 6.A 7.C 8.B 9.C 10.D

部分题的解析:

6.重写不是面向编程的基本特征之一,重写通常是子类可以重写父类的方法以改变其行为,是继承的一部分

8.类方法:@classmethod 静态方法:@staticmethod

10.这段代码有两个用test命名的函数,在python中,方法的重载并不像其他语言那样直接支持,因为python会覆盖先前定义的同名方法,所以只有最后一个定义的test方法会被保留,而前一个会被覆盖,在python中,self是用来指代当前对象实例的参数,它需要显式地传递给每个类的方法。所以在定义类的方法时,self参数时必须的,不能省略,在定义类方法是,self时第一个参数,它表示当前对象实例的引用。当你调用类的方法时,python会自动将当前对象实例作为第一个参数传递给该方法,因此你在方法内部可以通过self来访问该对象的属性和方法

2.简答题:

(1)什么是对象?什么是类?类与对象的关系是什么?

对象:对应客观世界的事物 :具有相同或相似性质的对象的抽象就是类

类与对象的关系:对象的抽象就是类,类的具体化就是对象。

(2)面向对象语言有哪三个特性?

1.封装性 2.继承性 3多态性

(3)什么是面向对象编程的继承性?有什么优点?

继承性:描述类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的数据和操作

优点:增强了代码的复用性,提高了开发效率而且为程序的修改补充提供了便利。

(4)类变量与成员变量的区别是什么?

类变量

  • 类变量是定义在类中,但在所有实例之外的变量。它们属于整个类,而不属于类的特定实例。

  • 类变量可以通过类名直接访问,也可以通过类的任何一个实例来访问。所有该类的实例都共享同一个类变量的值。

  • 类变量通常用于表示该类的特性或共享的状态,比如全局计算器、常量值等。

成员变量

  • 成员变量是定义在类中,但在方法中使用self关键字声明的变量。每个实例都有自己的一组成员变量,它们属于实例。

  • 成员变量在类的每个实例之间是独立的,每个实例可以有不同的成员变量。

  • 成员变量通常用于表示实例的特定状态或属性

区别:类变量是属于整个类的,成员变量是属于类的实例的,类变量在整个类中共享,而成员变量则是每个实例独有的。

(5)构造方法和析构方法名字都是什么?

构造方法的名字:
__init__()
析构方法的名字:
__del__()

(6)构造方法的作用是什么?它与成员方法有什么不同?

构造方法的作用:一般用于为对象数据成员设置初始值或进行其他必要的初始化工作,如果未定义构造方法,python将提供一个默认的构造方法。

不同:构造方法用于初始化对象的状态,在创建对象时自动调用;而成员方法则是定义类的行为或操作的普通方法,它们可以被对象调用来实现特定的功能。

(7)请列举出五种重载的运算符及其对应的方法。

x+y,x+=y :__add__
x-y,x-=y :__sub__
x/y,x/=y :__div__
x*y,x*=y :__mul__
x%y,x%=y :__mod__

3.阅读程序

运行下面的程序,输出结果是什么?说明程序的执行过程。

class MyClass:
    value=100
    def function1(self):
        print("self.value=",self.value)
        print("MyClass.value=",MyClass.value)
        
class UClass(MyClass):
    value=200
    def function1(self):
        super().function1()
        print("super().value=",super().value)
        print("self.value=",self.value)
        print("UClass.value=",UClass.value)
cc=UClass()
cc.function1()
print("用对象访问,cc.value=",cc.value)
print("用类访问,UClass.value=",UClass.value)
#输出结果:
self.value=100
MyClass.value=100
super().value=100
self.value=200
UClass.value=200
用对象访问,cc.value=200
用类访问,UClass.value=200
'''
cc=UClass()  #只是在内存中分配了一个UClass类的实例,并将其赋给变量cc.
cc.function1()  #这个是调用UClass类中的function1函数打印上面的值.
super().value   #访问父类MyClass中的value属性.由于super()返回的是代理对象,因此此时获取的是父类中的值。
我觉的要注意的就这些'''

4.编程题:

(1)设计一个Group类,该类包括:一个数据成员score(每个学生的分数)、两个类成员total(班级的总分)和 count (班级的人数)。成员方法setScore0用于设置分数,成员方法sum(用于累计总分,类方法averageO用于求平均值。交互式输人某组学生的成绩,显示该组的总分和平均分。

class Group:
    total=0  #类成员变量,记录班级的总分
    count=0  #类成员变量,记录班级人数
    
    def __init__(self):
        self.score=0   #每个学生的分数
    
    def setScore(self,score):
        self.score=score
        Group.total+=score  #累加班级总分
        Group.count+=1    #累加班级人数
    
    @classmethod
    def sum(cls):
        return cls.total #返回班级总分
    
    @classmethod
    def average(cls): 
        if cls.count==0:
            return 0
        else:
            return cls.total/cls.count #返回平均分
    
    @staticmethod
    def input_scores(group):
        while True:
            try:
                score=float(input("请输入学生成绩(输入负数结束输入):")) 
                if score < 0:
                    break
                group.setScore(score)
            except ValueError:
                print("请输入有效的成绩(数字)!")  
#主程序
group=Group()   #创建Group类的实例
group.input_scores(group)   #调用函数输入成绩
#显示该组的总分和平均分
print("该组的总分为:",Group.sum())
print("该组的平均分:",Group.average())

(2)为二次方程式ax^2+bx+c=0 设计一个名为Equation的类,这个类包括:

  • 代表3个系数的成员变量a、b、c;

  • 一个参数为a、b、c的构造方法;

  • 一个名为getDiscrimimant()的方法返回判别式的值;

  • 一个名为getRoot1()和getRoot2()的方法返回等式的两个根,如果判别式为负,这些方法返回0。

import math
​
class Equation:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
    
    def getDiscriminant(self):
        return self.b**2 - 4 * self.a * self.c
    
    def getRoot1(self):
        discriminant = self.getDiscriminant()
        if discriminant < 0:
            return 0
        else:
            return (-self.b + math.sqrt(discriminant)) / (2 * self.a)
    
    def getRoot2(self):
        discriminant = self.getDiscriminant()
        if discriminant < 0:
            return 0
        else:
            return (-self.b - math.sqrt(discriminant)) / (2 * self.a)
​
# 示例用法
a=int(input("a="))
b=int(input("b="))
c=int(input("c="))
equation = Equation(a, b, c)
print("判别式:", equation.getDiscriminant())
print("第一个根:", equation.getRoot1())
print("第二个根:", equation.getRoot2())

(3)设计一个描述自由落体运动的类,要求能获得任意时刻的速度及位移,并进行测试。已知重力加速度为9.8m/s^2。

class FreeFall:
    def __init__(self,gravity=9.8):
        self.gravity=gravity
​
    def velocity(self,time):
        return self.gravity*time
​
    def displacement(self,time):
        return (1/2)*self.gravity*time**2
#主程序
time=float(input("(t为整数)t:"))
free=FreeFall(time)
print(f"{time}时刻的速度是",free.velocity(time))
print(f"{time}时刻的位移是",free.displacement(time))
  • 32
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值