Лабораторная работа № 12. Геометрические задачи
Теоретические сведения
Описание собственного типа данных
Создание собственного класса рассмотрим на примере описания собственного типа Circle, который будет хранить информацию об окружности. Любой объект хранит в себе набор членов класса. К ним относятся поля - состояние объекта и методы - функции, которые меняют состояние класса.
Описание класса начинается со служебного слова class и его имени:
Python позволяет поместить функцию инициализации полей класса внутрь описания класса. Для этого в класс добавляется метод __init__(). Первый параметр метода будет ссылкой на объект, который нужно инициализировать. Этот параметр может иметь произвольное имя, но принято называть его self:
Создание объектов класса
Чтобы создать экземпляр класса или объект этого типа, необходимо записать имя класса с круглыми скобками. В примере показано создание двух объектов класса Circle:
Методы класса
Помимо конструктора, описание класса может содержать другие методы, предназначенные для работы с объектом данного типа. Например для класса Circle мы можем добавить метод расчёта длины окружности. Назовём метод L(). Все методы класса должны иметь минимум один параметра, который принято называть self - ссылку на обрабатываемый объект:
class Circle:
def __init__(self, x, y, r):
self.x = x
self.y = y
self.r = r
def L(self):
# self.r позволяет получить значение поля для обрабатываемого объекта
return 2 * 3.14 * self.r Чтобы вызвать метод, нужно записать имя объекта, а затем через точку имя метода. Важно: при вызове метода параметр self не учитывается. В нашем случае скобки при вызове метода L() будут пустыми:
Задания для самостоятельной работы
Задание 1. Класс Point
Создайте класс Point для описания точки на плоскости.
Поля класса:
x- координата x точки - типfloat;y- координата y точки - типfloat.
Методы класса:
__init__(self, x, y)- конструктор класса в который передаются координаты создаваемой точки;dist(self, p)- расстояние до точкиp- возвращает значение типаfloat;__str__(self)- возвращает строковое представление объекта в форматеx: <координата x>, y: < координата y>- возвращает значение типаstr.
Откройте редактор IDLE и создайте новый скрипт. Сохраните файл на рабочем диске под именем point.py.
Запишите в файл следующий шаблон класса Point:
point.py
from math import sqrt
class Point:
"""Описание точки на плоскости"""
def __init__(self, x, y):
"""Конструктор класса"""
self.x = x # абсцисса
self.y = y # ордината
if __name__ == "__main__":
p1 = Point(0, 5) # создание первого объекта класса
print(p1.x, p1.y)
p2 = Point(-2, 3) # создание второго объекта класса
print(p2.x, p2.y)Запустите скрипт и проверьте его работоспособность. Результат работы:
0 5
-2 3
Добавьте в класс Point метод __str__(self), который будет вызываться каждый раз, когда объект класса нужно преобразовать в строковый тип:
point.py
from math import sqrt
class Point:
"""Описание точки на плоскости"""
def __init__(self, x, y):
"""Конструктор класса"""
self.x = x # абсцисса
self.y = y # ордината
def __str__(self):
return f"x: {self.x}, y: {self.y}"
if __name__ == "__main__":
p1 = Point(0, 5) # создание первого объекта класса
print(p1)
p2 = Point(-2, 3) # создание второго объекта класса
print(p2)Запустите скрипт. Результат его работы показан ниже:
x: 0, y: 5
x: -2, y: 3
Добавьте в класс Point метод для расчёта расстояния dist(self, p) между текущей точкой и точкой p. Для расчётов используем следующую формулу: \[
d = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
\] Дополните код скрипта:
point.py
from math import sqrt
class Point:
"""Описание точки на плоскости"""
def __init__(self, x, y):
"""Конструктор класса"""
self.x = x # абсцисса
self.y = y # ордината
def __str__(self):
return f"x: {self.x}, y: {self.y}"
def dist(self, p):
delta_x = self.x - p.x
delta_y = self.y - p.y
return sqrt(delta_x ** 2 + delta_y ** 2)
if __name__ == "__main__":
p1 = Point(0, 5) # создание первого объекта класса
print(p1)
p2 = Point(-2, 3) # создание второго объекта класса
print(p2)
print(p1.dist(p2))Запустите скрипт. Результат его работы показан ниже:
x: 0, y: 5
x: -2, y: 3
2.8284271247461903
Класс готов.
Задание 2. Класс Triangle
Создайте класс Triangle для описания треугольника, заданного через координаты трёх точек на плоскости - вершин треугольника.
Поля класса:
p1- координата первой вершины треугольника - типPoint;p2- координата второй вершины треугольника - типPoint;p3- координата третьей вершины треугольника - типPoint.
Методы класса:
__init__(self, p1, p2, p3)- конструктор класса в который передаются координаты вершин треугольника;sq(self)- площадь треугольника - возвращает значение типаfloat.
Создайте новый скрипт triangle.py. Используйте следующий шаблон. Замените многоточие ( ... ) на необходимые инструкции Python:
triangle.py
Запустите скрипт. Результат его работы показан ниже:
x: 0, y: 0 | x: 0, y: 3 | x: 4, y: 0
Добавьте в класс Triangle метод sq(self) для вычисления площади треугольника. Замените многоточие ( ... ) на необходимые инструкции Python:
triangle.py
from math import sqrt
from point import Point
class Triangle:
def __init__(self, p1, p2, p3):
self.p1 = p1
self.p2 = p2
self.p3 = p3
def sq(self):
a = self.p1.dist(self.p2) # вычисление длины первой стороны треугольника
b = self.p2.dist(...) # в качестве аргумента передайте правильное поле
c = ... # вычислите длину третьей стороны по аналогии с двумя другими
p = ... # вычисление пулупериметра
s = ... # вычисление площади по формуле Герона
return s
if __name__ == "__main__":
a = Point(0, 0)
b = Point(0, 3)
tr = Triangle(a, b, Point(4, 0))
print(tr.sq())Запустите скрипт. Результат его работы показан ниже:
6.0
Задача решена
Задание 3. Класс Polygon
Опишем класс Polygon для представления многоугольника на плоскости. Вершины многоугольника представим в качестве объектов класса Point и будем хранить их в поле класса с типом список (list).
Создайте новый скрипт polygon.py. Используйте следующий шаблон:
polygon.py
from point import Point
class Polygon:
def __init__(self, points):
self.points = points
# в качестве аргумента передаём в конструктор
# массив значений типа Point
poly = Polygon([Point(2, 1),Point(6, 1),Point(6, 4),Point(2,4)])
# вывод информации о каждой вершине многоугольника
for p in poly.points:
print(p)Запустите скрипт. Результат его работы показан ниже:
x: 2, y: 1
x: 6, y: 1
x: 6, y: 4
x: 2, y: 4
Добавим к классу Polygon метод sq() для нахождения площади многоугольника. Для этого будем находить площади треугольников, образующихся первой вершиной многоугольника и последующими парами вершин:
Дополните код класса:
polygon.py
from point import Point
from triangle import Triangle
class Polygon:
def __init__(self, points):
self.points = points
def sq(self):
total = 0
p0 = self.points[0]
for i in range(1, len(self.points) - 1):
p1 = self.points[i]
p2 = self.points[i+1]
tr = Triangle(p0, p1, p2)
total += tr.sq()
return total
poly = Polygon([Point(2, 1),Point(6, 1),Point(6, 4),Point(2,4)])
print(poly.sq())Запустите скрипт. Результат его работы показан ниже:
12.0
Задание 4 (sam04.py)
Опишите класс, представляющий объёмную фигуру указанную в вашем варианте. Создайте минимум два объекта созданного класса. Минимум один раз вызовите каждый метод, описанный в классе.
Константу \(\pi\) импортируйте из модуля math:
Класс Cone для описания конуса.
(1 балл) Поля: r - радиус основания, h - высота. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(2 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Cuboid для описания прямоугольного параллелепипеда.
(1 балл) Поля: a - длина, b - ширина, c - высота. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Spheroid для описания Эллипсоида.
(1 балл) Поля: a - полуось a, b - полуось b, c - полуось c. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс TCone для описания усечённого конуса.
(1 балл) Поля: R - радиус нижнего основания, r - радиус верхнего основания, h - высота конуса. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс NPyramid для описания пирамиды с многоугольником в основании.
(1 балл) Поля: a - сторона основания, n - число сторон основания, h - высота пирамиды. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Cylinder для описания цилиндра.
(1 балл) Поля: r - радиус основания, h - высота цилиндра. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс TPyramid для описания усечённой пирамиды.
(1 балл) Поля: s1 - площадь верхнего основания, s2 - площадь нижнего основания, h - высота пирамиды. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Cone для описания конуса.
(1 балл) Поля: r - радиус основания, h - высота. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(2 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Cuboid для описания прямоугольного параллелепипеда.
(1 балл) Поля: a - длина, b - ширина, c - высота. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Spheroid для описания Эллипсоида.
(1 балл) Поля: a - полуось a, b - полуось b, c - полуось c. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс TCone для описания усечённого конуса.
(1 балл) Поля: R - радиус нижнего основания, r - радиус верхнего основания, h - высота конуса. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс NPyramid для описания пирамиды с многоугольником в основании.
(1 балл) Поля: a - сторона основания, n - число сторон основания, h - высота пирамиды. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс Cylinder для описания цилиндра.
(1 балл) Поля: r - радиус основания, h - высота цилиндра. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.
Класс TPyramid для описания усечённой пирамиды.
(1 балл) Поля: s1 - площадь верхнего основания, s2 - площадь нижнего основания, h - высота пирамиды. Создано минимум два объекта класса.
(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.
(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.







