Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/75: Рейтинг темы: голосов - 75, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 01.03.2021
Сообщений: 13

Создание класса Point в Python

01.03.2021, 00:32. Показов 16993. Ответов 22

Студворк — интернет-сервис помощи студентам
Здравствуйте, только начал изучать Python. Задача на ООП. У меня есть класс Point. С координатами x и y. Затем идёт класс Figure с дочерним классом Triangle. Мне нужно чтобы там было 3 точки и соответственно затем вычислить расстояние между ними, которые будут катетами треугольника. Как в классе Triangle их описать ? И затем использовать для вычисления периметра и площади?
Я тут просто использовал a, b, c как расстояние, а они должны быть точками. Которым я дам координатами. Помогите.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Point:
    def __init__(self, coord_x, coord_y):
        self.coord_x = coord_x
        self.coord_y = coord_y
 
class Figure:
    pass
 
class Triangle(Figure):
    def __init__(self, a, b, c ):
        self.a = a
        self.b = b
        self.c = c
 
    def periment_of_triangle(self):
        result_2_1 = self.a + self.b + self.c
        return result_2_1
 
    def area_of_triangle(self):
        result_2_2 = 0.5 * (self.a + self.b)
        return result_2_2
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2021, 00:32
Ответы с готовыми решениями:

Создание класса в python
Допустим, сеть класс ReversedList, который будет при инициализации экземпляра принимать список и реализовывать доступ к элементам этого...

Создание класса в Python
Используя класс Реорlе в качестве базового, создайте класс Сотрудник (Worker), имеющий атрибуты: должность (post); зарплата (salary) и...

Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющ
Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющую, какая из точек...

22
0 / 0 / 0
Регистрация: 01.03.2021
Сообщений: 13
02.03.2021, 12:53  [ТС]
Студворк — интернет-сервис помощи студентам
Если я правильно всё учёл, то код будет выглядеть так?


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
 
 
class Figure:
    def __init__(self, area = None, square = None):
        self.area = area
        self.square = square
 
 
class Triangle(Figure):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        
    def sides(self):
        x1 = self.a.x
        y1 = self.a.y
        x2 = self.b.x
        y2 = self.b.y
        x3 = self.c.x
        y3 = self.c.y
 
        ab = sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
        bc = sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
        ac = sqrt((x3 - x1) ** 2 + (y3 - y1) ** 2)
        return ab , bc , ac
 
    def perimetr(self):
        ab, bc, ac = self.sides
        result_2_1 = ab + bc + ac
        return result_2_1
 
    def square(self):
        ab, bc, ac = self.sides()
        result_2_2 = 0.5 * (bc + ac)
        return result_2_2
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
02.03.2021, 16:21
Лучший ответ Сообщение было отмечено Candykiller16 как решение

Решение

Candykiller16, Кстати, я до сих пор не вникал, как Вы вычисляете длины сторон треугольника. У питона нет функции sqrt(). Это функция из модуля math . Тогда нужно импортировать этот модуль. Если не импортировать модуль, то извлечение корня можно реализовать возведением в степень 0.5

Добавлено через 3 минуты
Candykiller16, Если подытожить все то, что я написал выше, то можно написать такой код
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import math
 
class Figure:
    # класс любая замкнутая фигура на плоскости
    def __init__(self, area=None, perimeter=None):
        self.area = area         # площадь
        self.perimeter = perimeter    # периметр
 
class Point:
    # класс точка
    def __init__(self, x, y):
        self.x = x               # координата x
        self.y = y               # координата y
 
class Triangle(Figure):
    # класс прямоугольный треугольник
    def __init__(self, a, b, c ):
        self.a = a                     # точка a (вершина a) , экземпляр класса Point
        self.b = b                     # точка b (вершина b) , экземпляр класса Point
        self.c = c                     # точка c (вершина c) , экземпляр класса Point
        self.ab = self.sides()[0]           # катет ab треугольника (значением является длина)
        self.bc = self.sides()[1]           # катет bc треугольника (значением является длина)
        self.ac = self.sides()[2]           # гепотенуза ac треугольника (значением является длина)
        self.perimetr = self.ab + self.bc + self.ac          # периметр треугольника
        self.area = self.ab * self.bc / 2                    # площадь треугольника
 
    def sides(self):
        # вычисление длин сторон треугольника (для данного экземпляра класса)
        x1 = self.a.x
        y1 = self.a.y
        x2 = self.b.x
        y2 = self.b.y
        x3 = self.c.x
        y3 = self.c.y
 
        ab = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
        bc = math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
        ac = math.sqrt((x3 - x1) ** 2 + (y3 - y1) ** 2)
        return ab , bc , ac
 
 
# проведем тестирование нашего кода.
if __name__ == '__main__':
    a = Point(0, 0)
    b = Point(4, 0)
    c = Point(4, 3)
    t = Triangle(a, b, c)
 
    print(t.ab)
    print(t.bc)
    print(t.ac)
    print(t.perimetr)
    print(t.area)

Выводит:
Python
1
2
3
4
5
4.0
3.0
5.0
12.0
6.0
Добавлено через 34 минуты
Candykiller16, Использование избыточных (с точки зрения математики) атрибутов, улучшает читабельность кода и на самом деле соответствует реальному мышлению человека, в котором присутствуют такие дополнительные свойства при определении треугольника, что облегчает процесс мышления.
Формально атрибуты экземпляра при создании класса можно сравнить с глобальными переменными модуля.
Глобальные переменные модуля, при правильном их использовании делают код более читабельным и повышают его производительность, так как при каждом обращении к переменной не нужно по новой вызывать функцию, которая забирает время на свою работу. При наличие глобальной переменной, функция отрабатывает и заносит результат в глобальную переменную только в том случае, когда изменяются ее аргументы, а не каждый раз, когда в каком то месте нужно получить ее значение.
Хотя я понимаю, в каких случаях с глобальными переменными могут возникнуть проблемы. Когда для разных мест нужна одна и та же функция, но с разными аргументами при вызове.
В таких случаях нельзя результат работы функции помещать в одну и ту же глобальную переменную.
В этом случае нужно осуществлять привязку к функции аргументов, которые используются при вызове функции.
Проще всего это делать используя класс глобальных переменных. Где глобальная переменная будет экземпляром класса, у которого в качестве атрибутов будет сама функция и конкретные аргументы для ее вызова.
Таким образом глобальные переменные для хранения результата вычисления функции будут разными, с учетом используемых атрибутов.
Но такое усложнение имеет смысл только в крупных проектах, где зрительно тяжело отслеживать логику работы глобальных переменных и требуется формализовать защиту от возможных ошибок. Но такое усложнение, в свою очередь облегчит понимание логики работы кода и как я говорил, повысит производительность программы, где результаты работы функции используются многократно, вместо того, что бы многократно вызывать эту функцию, тратя на ее работу время.

Добавлено через 59 минут
Candykiller16, Вообще то имеет смысл делать проверку, является ли треугольник образуемый заданными точками, прямоугольным. Тогда код будет выглядеть так:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import math
 
class Figure:
    # класс любая замкнутая фигура на плоскости
    def __init__(self, area=None, perimeter=None):
        self.area = area         # площадь
        self.perimeter = perimeter    # периметр
 
class Point:
    # класс точка
    def __init__(self, x, y):
        self.x = x               # координата x
        self.y = y               # координата y
 
class Triangle(Figure):
    # класс прямоугольный треугольник
    def __init__(self, a, b, c ):
        self.a = a                     # точка a (вершина a) , экземпляр класса Point
        self.b = b                     # точка b (вершина b) , экземпляр класса Point
        self.c = c                     # точка c (вершина c) , экземпляр класса Point
        self.ab = self.sides()[0]           # катет ab треугольника (значением является длина)
        self.bc = self.sides()[1]           # катет bc треугольника (значением является длина)
        self.ac = self.sides()[2]           # гепотенуза ac треугольника (значением является длина)
        self.perimetr = self.ab + self.bc + self.ac          # периметр треугольника
        if self.ac**2 == self.ab**2 + self.bc**2:
            print('Треугольник прямоугольный')
            self.area = self.ab * self.bc / 2                    # площадь треугольника
        else:
            print('Треугольник не является прямоугольным')
            self.area = None
 
 
    def sides(self):
        # вычисление длин сторон треугольника (для данного экземпляра класса)
        x1 = self.a.x
        y1 = self.a.y
        x2 = self.b.x
        y2 = self.b.y
        x3 = self.c.x
        y3 = self.c.y
 
        ab = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
        bc = math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2)
        ac = math.sqrt((x3 - x1) ** 2 + (y3 - y1) ** 2)
        return ab , bc , ac
 
 
# проведем тестирование нашего кода.
if __name__ == '__main__':
    a = Point(0, 0)
    b = Point(4, 0)
    c = Point(4, 3)
    t = Triangle(a, b, c)
 
    print(t.ab)
    print(t.bc)
    print(t.ac)
    print(t.perimetr)
    print(t.area)
 
    a = Point(0, 0)
    b = Point(6, 0)
    c = Point(3, 3)
    t2 = Triangle(a, b, c)
 
    print(t2.ab)
    print(t2.bc)
    print(t2.ac)
    print(t2.perimetr)
    print(t2.area)

Выводит:
Python
1
2
3
4
5
6
7
8
9
10
11
12
Треугольник прямоугольный
4.0
3.0
5.0
12.0
6.0
Треугольник не является прямоугольным
6.0
4.242640687119285
4.242640687119285
14.485281374238568
None
Добавлено через 12 минут
Я проверку сделал не совсем правильную. Нужно искать наибольшую сторону и проверять, является ли ее квадрат равен сумме квадратов двух других сторон. То есть нужно сначала определить, какая сторона гипотенуза, а какие катеты. и только тогда вычислять площадь по предложенной формуле.
Если хотите доработайте код, что бы была правильная проверка и правильно вычислялась площадь. Я на сегодня все.

Добавлено через 14 минут
Так как код по умолчанию предполагает, что точки ac принадлежат гипотенузе, то нужно или жестко задавать в синтаксисе создания экземпляра класса, что точки a и c задают гипотенузу, или в методе __init__ в классе искать какая из сторон является гипотенузой.
1
0 / 0 / 0
Регистрация: 01.03.2021
Сообщений: 13
02.03.2021, 18:15  [ТС]
Спасибо вам большое)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2021, 18:15

Описать в программе три объекта класса point и два объекта класса cpoint
#include <iostream> #include <cmath> #include "point.h" #include "cpoint.h" using namespace std; int main() { point...

Описать базовый класс Point. Описать класс Прямоугольник от класса Point
Описать базовый класс Point - точка. Описать класс "прямоугольник". Обязательные поля класса "Прямоугольник": - имя...

Написать класс POINT 3D на Python
Напишите класс Point3D для хранения координат в трехмерном пространстве (x, y, z). Реализуйте перегрузку операторов сложения, вычитания, ...

Шаблон класса Point
Создайте шаблонный класс Point (Точка), у которого есть две координаты. Каждая из координат должна быть одного из следующих типов: int,...

Объявление класса Point
Объявил класс Point в заголовочном класса для хранения значений координат x,y а далее класс Rectanagle и вот в классе Rectanagle каждая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru