第7章 类与面向对象
6-1 二维平面上的点操作(Python3)
题目描述
设计一个表示二维平面上点的类 Point
。该类应该包含以下功能:
-
两个私有属性
_x
和_y
,分别表示点的横坐标和纵坐标。 -
一个构造函数
__init__
,用于初始化点的坐标。 -
一个方法
distance_to_origin
,返回该点到原点 (0, 0) 的欧几几何距离。 -
一个方法
move_by
,接受两个参数dx
和dy
,将点的横坐标和纵坐标分别增加dx
和dy
。 -
一个特殊方法
__str__
,返回点的信息字符串,格式为"Point(x, y)"
。
函数接口定义(你实现)
class Point:
def __init__(self, x, y):
# 初始化点的坐标
pass
def distance_to_origin(self):
# 返回点到原点的距离
pass
def move_by(self, dx, dy):
# 移动点的位置
pass
def __str__(self):
# 返回点的信息字符串
pass
裁判测试程序样例
def main():
# 用户输入点的初始坐标 (x, y)
# 使用 input() 读取一行输入,并用 split() 将其分割成两个字符串
# 使用 map(float, ...) 将这两个字符串转换为浮点数
x, y = map(float, input("请输入点的初始坐标 (x y): ").split())
# 创建 Point 类的实例,传入初始坐标 (x, y)
point = Point(x, y)
# 调用 point 的 distance_to_origin 方法计算点到原点 (0, 0) 的距离
# 使用 f-string 格式化输出,保留两位小数
print(f"Distance to origin: {point.distance_to_origin():.2f}")
# 用户输入移动量 (dx, dy)
# 使用 input() 读取一行输入,并用 split() 将其分割成两个字符串
# 使用 map(float, ...) 将这两个字符串转换为浮点数
dx, dy = map(float, input("请输入移动量 (dx dy): ").split())
# 调用 point 的 move_by 方法,将点的位置按 (dx, dy) 移动
point.move_by(dx, dy)
# 打印移动后的点的信息
# 调用 point 的 __str__ 方法,返回点的字符串表示
print(point)
#执行 main 函数
if __name__ == "__main__":
main()
输入样例
3 4
1 2
输出样例
Distance to origin: 5.00
Point(4.0, 6.0)
实现提示
-
使用
math.sqrt
来计算欧几里得距离(开根号)。 -
确保
__str__
方法返回正确的字符串格式。
代码
import math
class Point:
def __init__(self, x, y):
# 初始化点的坐标
self._x = x
self._y = y
def distance_to_origin(self):
# 返回点到原点的距离
return math.sqrt(self._x**2 + self._y**2)
def move_by(self, dx, dy):
# 移动点的位置
self._x += dx
self._y += dy
def __str__(self):
# 返回点的信息字符串
return f"Point({self._x}, {self._y})"
6-2 图形面积计算(Python3)
图形编辑器
题目描述
设计一个简单的图形编辑器系统,该系统包括以下类:
-
Shape
:所有图形的基类。 -
Circle
:表示圆形,继承自Shape
。 -
Rectangle
:表示矩形,继承自Shape
。 -
Triangle
:表示三角形,继承自Shape
。
每个图形类都需要实现以下方法:
-
area()
:返回图形的面积。 -
perimeter()
:返回图形的周长。
此外,**题目已经编写好了主程序和测试函数,学生只需实现上述这些方法即可。
函数接口定义(你实现的部分)
class Shape:
def area(self):
raise NotImplementedError("This method should be overridden by subclasses")
def perimeter(self):
raise NotImplementedError("This method should be overridden by subclasses")
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
# 计算并返回圆的面积
pass
def perimeter(self):
# 计算并返回圆的周长
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
# 计算并返回矩形的面积
pass
def perimeter(self):
# 计算并返回矩形的周长
pass
class Triangle(Shape):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def area(self):
# 计算并返回三角形的面积
pass
def perimeter(self):
# 计算并返回三角形的周长
pass
裁判测试程序样例(判卷逻辑)
def print_shape_info(shape):
# 打印给定形状的面积和周长
print(f"Area: {shape.area():.2f}")
print(f"Perimeter: {shape.perimeter():.2f}")
def main():
# 用户输入图形类型和相应的参数
shape_type = input("")
if shape_type == 'circle':
radius = float(input(""))
shape = Circle(radius)
elif shape_type == 'rectangle':
width, height = map(float, input("").split())
shape = Rectangle(width, height)
elif shape_type == 'triangle':
a, b, c = map(float, input("").split())
shape = Triangle(a, b, c)
else:
print("未知的图形类型")
return
# 打印图形的面积和周长
print_shape_info(shape)
if __name__ == "__main__":
main()
输入样例 1
circle
5
输出样例 1
Area: 78.54
Perimeter: 31.42
输入样例 2
rectangle
4 6
输出样例 2
Area: 24.00
Perimeter: 20.00
输入样例 3
triangle
3 4 5
输出样例 3
Area: 6.00
Perimeter: 12.00
代码
import math
class Shape:
def area(self):
raise NotImplementedError("This method should be overridden by subclasses")
def perimeter(self):
raise NotImplementedError("This method should be overridden by subclasses")
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
# 计算并返回圆的面积
return math.pi * (self.radius**2)
def perimeter(self):
# 计算并返回圆的周长
return 2 * math.pi * self.radius
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
# 计算并返回矩形的面积
return self.width * self.height
def perimeter(self):
# 计算并返回矩形的周长
return 2 * (self.width + self.height)
class Triangle(Shape):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def area(self):
# 计算并返回三角形的面积(海伦公式)
s = (self.a + self.b + self.c) / 2
return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))
def perimeter(self):
# 计算并返回三角形的周长
return self.a + self.b + self.c