Step 14
Create a method create_coordinates_table, then at the end of the code print graph.create_coordinates_table()).
The method should use the __coordinates property and return a string containing all the coordinates, where x and y have always the same position, the values for x are always integers, and the values for y are always rounded to two decimal places:
示例代码
x y
0 3.00
1 3.90
2 4.61
3 5.12
4 5.43
5 5.55
6 5.47
7 5.19
8 4.72
9 4.05
10 3.19
11 2.13
12 0.87
The table should start with a newline character and end with a newline character.
def create_coordinates_table(self):
"""Create a string table of coordinates."""
table = " x y\n" # Header for the table
for x, y in self.__coordinates:
# Format Y to two decimal places and create the string entry
table += f"{x:>3}{y:>7.2f}\n"
return table
ball = Projectile(10, 3, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
graph = Graph(coordinates)
print(graph.create_coordinates_table())
Error Information: The method should return the correct output.
到目前为止你的代码
import math
GRAVITATIONAL_ACCELERATION = 9.81
PROJECTILE = "∙"
x_axis_tick = "T"
y_axis_tick = "⊣"
class Projectile:
__slots__ = ('__speed', '__height', '__angle')
def __init__(self, speed, height, angle):
self.__speed = speed
self.__height = height
self.__angle = math.radians(angle)
def __str__(self):
return f'''
Projectile details:
speed: {self.speed} m/s
height: {self.height} m
angle: {self.angle}°
displacement: {round(self.__calculate_displacement(), 1)} m
'''
def __calculate_displacement(self):
horizontal_component = self.__speed * math.cos(self.__angle)
vertical_component = self.__speed * math.sin(self.__angle)
squared_component = vertical_component**2
gh_component = 2 * GRAVITATIONAL_ACCELERATION * self.__height
sqrt_component = math.sqrt(squared_component + gh_component)
return horizontal_component * (vertical_component + sqrt_component) / GRAVITATIONAL_ACCELERATION
def __calculate_y_coordinate(self, x):
height_component = self.__height
angle_component = math.tan(self.__angle) * x
acceleration_component = GRAVITATIONAL_ACCELERATION * x ** 2 / (
2 * self.__speed ** 2 * math.cos(self.__angle) ** 2)
y_coordinate = height_component + angle_component - acceleration_component
return y_coordinate
def calculate_all_coordinates(self):
return [
(x, self.__calculate_y_coordinate(x))
for x in range(math.ceil(self.__calculate_displacement()))
]
@property
def height(self):
return self.__height
@property
def angle(self):
return round(math.degrees(self.__angle))
@property
def speed(self):
return self.__speed
@height.setter
def height(self, n):
self.__height = n
@angle.setter
def angle(self, n):
self.__angle = math.radians(n)
@speed.setter
def speed(self, s):
self.__speed = s
def __repr__(self):
return f'{self.__class__}({self.speed}, {self.height}, {self.angle})'
class Graph:
__slots__ = ('__coordinates')
def __init__(self, coord):
self.__coordinates = coord
def __repr__(self):
return f'Graph({self.__coordinates})'
# User Editable Region
def create_coordinates_table(self):
"""Create a string table of coordinates."""
table = " x y\n" # Header for the table
for x, y in self.__coordinates:
# Format Y to two decimal places and create the string entry
table += f"{x:>3}{y:>7.2f}\n"
return table
ball = Projectile(10, 3, 45)
print(ball)
coordinates = ball.calculate_all_coordinates()
graph = Graph(coordinates)
print(graph.create_coordinates_table())
# User Editable Region
挑战信息:
Learn Encapsulation by Building a Projectile Trajectory Calculator - Step 14