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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, только начал изучать 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2021, 00:32
Ответы с готовыми решениями:

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

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

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

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

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


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
1728 / 968 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
02.03.2021, 16:21 22
Лучший ответ Сообщение было отмечено 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  [ТС] 23
Спасибо вам большое)
0
02.03.2021, 18:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2021, 18:15
Помогаю со студенческими работами здесь

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

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

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

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

Создать шаблон класса Point
1.Создайте шаблон класса Point для хранения координат любого типа (int, float, double)....

Два класса Point и Vector
Создать класс «Point» - точка на плоскости (x, y). Реализовать набор соответствующих конструкторов,...

Разработка абстрактного класса Point<T>
Добрый день уважаемые!) Помогите с реализацией такой задачи: -разработать абстрактный базовый...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru