Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
5 / 5 / 1
Регистрация: 06.10.2020
Сообщений: 176

Класс многоугольников с наследниками

27.12.2020, 16:05. Показов 3952. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникли сложности с примитивной задачей: создать класс многоугольников с двумя наследниками - класс треугольников и прямоугольников. В классах-наследниках проверить, является ли фигура прямоугольником/треугольником и посчитать ее площадь. В классе многоугольников определить метод для нахождения периметра. На ввод подается неопределенное количество сторон для многоугольника, 4 стороны для прямоугольника и 3 стороны для треугольника. Нужно только описать классы.

Исходная заготовка:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Polygon:
    def __init__(self, *args):
        pass
 
    def perimetr(self) -> int:
        pass
 
 
class Triangle(Polygon):
    def square(self) -> float:
        pass
 
    def exist(self) -> bool:
        pass
 
 
class Rectangle(Polygon):
    
    def isRect(self) -> bool:
        pass
    
    def square(self) -> int:
        pass
Формат ввода:
tr = Triangle(2, 3, 8)
print(tr.exist())

Мои попытки:
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
class Polygon:
 
    def __init__(self, n):
        self.number_of_sides = n
 
class Rectangle(Polygon):
 
    def __init__(self, lenghts_of_sides):
        Polygon.__init__(self, 4)
        self.lengths_of_sides = lengths_of_sides
 
    def square(self):
        x, y = self.lenghts_of_sides
        return x * y
 
class Triangle(Polygon):
 
    def __init__(self, lengths_of_sides):
        Polygon.__init__(self, 3)
        self.lengths_of_sides = lengths_of_sides
 
    def square(self):
        a, b, c = self.lengths_of_sides
        s = (a + b + c) / 2
        return (s*(s-a)*(s-b)*(s-c)) ** 0.5
У меня идет инициализация в классах-наследниках, а не в самом классе многоугольников. За счет этого формат ввода не подходит, приходится брать аргументы в квадратные скобки: tri = Triangle([3, 4, 5]). Но по условию задания так нельзя. Не понимаю, как считать неопределенное количество сторон и передать полученные значения в методы проверки на наличие треугольника/прямоугольника.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.12.2020, 16:05
Ответы с готовыми решениями:

класс уравнение с наследниками
Описать класс,представляющий квадратное уравнение вида ax^2*bx+c=0.Описать метод,вычисляющий решение этого уравнения и выбрасывающий...

Класс «чайник» с наследниками
Реализовать физически достоверный класс «чайник» с наследниками «самовар», «электрический чайник», «обычный чайник», «кипятильник» Слаб в...

Описать Класс Animal с полями, методами и с наследниками
Описать класс Animal с полями Food, Name, Color и в нем 3 метода: MakeNoize(), Eat(), Sleep. Описать классы наследники:коза, собака, мышь,...

5
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.12.2020, 19:46
Лучший ответ Сообщение было отмечено mangomang как решение

Решение

Цитата Сообщение от mangomang Посмотреть сообщение
В классе многоугольников определить метод для нахождения периметра. На ввод подается неопределенное количество сторон для многоугольника, 4 стороны для прямоугольника и 3 стороны для треугольника.
Это стандартное описание абстрактного суперкласса. В классе многоугольника должен быть метод вычисления периметра, но само вычисление должно делегироваться в подклассы. Для этого в классе многоугольника в методе вычисления периметра, должен просто указываться метод вычисление периметра , но с другим именем. И методы с этим другим именем должны быть в подклассах, с вычислением периметра, у каждого свое. Это называется делегированием. Многоугольник делегирует вычисление периметра своим подклассам.
Вот пример абстрактного суперкласса, но здесь делегируется вычисление площади а не периметра.
Кликните здесь для просмотра всего текста
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
import math
 
class FlatShape:
    def __init__(self, S=None):
        self.S = S                 # площадь фигуры
    def calc_area(self):           # вычисление площади
        return self.calc_S()      # делегирование, для вычисления площади
                                   # конкретной фигуры
class Square(FlatShape):
    # стороны параллельны осям координат
    def __init__(self, x, y, ln):
        self.x = x                 # координата x нижнего левого угла
        self.y = y                 # координата y нижнего левого угла
        self.ln = ln               # длина стороны
    def calc_S(self):             # вычисление площади квадрата
        are = self.ln**2
        return self.ln**2
 
class Rectangle(FlatShape):
    # стороны параллельны осям координат
    def __init__(self, x, y, w, h):
        self.x = x                 # координата x нижнего левого угла
        self.y = y                 # координата y нижнего левого угла
        self.w = w                 # ширина
        self.h = h                 # высота
    def calc_S(self):
        return self.w * self.h
 
class Circle(FlatShape):
    def __init__(self, x, y, r):
        self.x = x                 # координата x центра круга
        self.y = y                 # координата y центра круга
        self.r = r                 # радиус круга
    def calc_S(self):
        return int(math.pi * self.r**2)
 
if __name__ == '__main__':
    sq = Square(1, 1, 5)
    rec = Rectangle(2, 2, 7, 3)
    cir = Circle(10, 10, 5)
    print('Площади фигур:')
    print('Квадрат', sq.calc_area())
    print('Прямоугольник', rec.calc_area())
    print('Круг', cir.calc_area())


Добавлено через 52 минуты
mangomang, Куда Вы из заготовки дели метод
Python
1
def perimetr(self) -> int
Нужно его добавить в класс многоугольников.

Добавлено через 43 минуты
Цитата Сообщение от mangomang Посмотреть сообщение
Возникли сложности с примитивной задачей
Задача не примитивная. У нее не корректное условие. не понятен формат ввода. Ввод с клавиатуры? Тогда в каком виде?
Вы что, с клавиатуры вводите строку "tr = Triangle(2, 3, 8)" ?
Дайте четко формат ввода. Видимо вводится с клавиатуры три или четыре числа, которые являются сторонами многоугольника. Кстати, для прямоугольника должны вводится не 4 стороны а 2. Или 4, но по две одинаковые. Например
(5, 3, 5, 3).
Разберитесь с форматом ввода.
Кстати, если фигура подкласса для заданного количества сторон не существует, то инициируется исключение.
В общем в Вашем коде полный сумбур.
Начните с того, что разберитесь с вводом.
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.12.2020, 11:05
Цитата Сообщение от Viktorrus Посмотреть сообщение
В классе многоугольника должен быть метод вычисления периметра, но само вычисление должно делегироваться в подклассы.
С чего бы?
Цитата Сообщение от Viktorrus Посмотреть сообщение
Для этого в классе многоугольника в методе вычисления периметра, должен просто указываться метод вычисление периметра , но с другим именем. И методы с этим другим именем должны быть в подклассах, с вычислением периметра, у каждого свое. Это называется делегированием. Многоугольник делегирует вычисление периметра своим подклассам.
Зачем такие сложности?

Это было бы нужно, если бы у подклассов вычисление периметра как-то отличалось от такового для многоугольника вообще. Но оно не отличается.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.12.2020, 12:02
Цитата Сообщение от dondublon Посмотреть сообщение
Это было бы нужно, если бы у подклассов вычисление периметра как-то отличалось от такового для многоугольника вообще. Но оно не отличается
С одной стороны Вы правы, но все дело в том, что в условии не определен формат ввода. Если ввод будет в виде списка, то можно предварительно разбираться что это треугольник или прямоугольник, и затем суммировать 3 или 4 стороны. А другой вариант, который предлагаю я делегировать список сторон подклассу, и уже в подклассе суммируются 3 или 4 стороны. Но это на уровне интуиции, может я и ошибаюсь.
1
5 / 5 / 1
Регистрация: 06.10.2020
Сообщений: 176
28.12.2020, 14:08  [ТС]
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
import math
 
class Polygon:
    def __init__(self, S = None):
        self.S = S 
    def perimetr(self):         
        return perimetr()     
                                  
class Triangle(Polygon):
    def __init__(self, x, y, ln):
        self.x = x  
        self.y = y               
        self.ln = ln  
    def exist(self):
        return (self.x < self.y + self.ln) and (self.y < self.x + self.ln) and (self.ln < self.x + self.y)
    def square(self):
        if ((self.x < self.y + self.ln) and (self.y < self.x + self.ln) and (self.ln < self.x + self.y)):
            s = float((self.x + self.y + self.ln) / 2)
            return (s*(s-self.x)*(s-self.y)*(s-self.ln)) ** 0.5
        else:
            return "Not a triangle"
 
class Rectangle(Polygon):
    def __init__(self, x, y, w, h):
        self.x = x                
        self.y = y 
        self.w = w  
        self.h = h
    def isRect(self):
        return ((self.x == self.y) and (self.w == self.h)) or ((self.x == self.w) and (self.h == self.y)) or ((self.x == self.h) and (self.y == self.w))
    def square(self):
        if (((self.x == self.y) and (self.w == self.h)) or ((self.x == self.w) and (self.h == self.y)) or ((self.x == self.h) and (self.y == self.w))):
            return int((self.w * self.h * self.y * self.x)**0.5)
        else:
            return "Not a rectangle"
Результат, которого я добился на данных момент. Осталось разобраться с периметрами многоугольников.

Добавлено через 10 минут
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
import math
 
class Polygon:
    def __init__(self, *nums):
        self.nums = nums
    def perimetr(self):
        summ = 0
        for self.n in self.nums:
            summ += self.n
        return summ    
                                  
class Triangle(Polygon):
    def __init__(self, x, y, ln):
        self.x = x  
        self.y = y               
        self.ln = ln  
    def exist(self):
        return (self.x < self.y + self.ln) and (self.y < self.x + self.ln) and (self.ln < self.x + self.y)
    def square(self):
        if ((self.x < self.y + self.ln) and (self.y < self.x + self.ln) and (self.ln < self.x + self.y)):
            s = float((self.x + self.y + self.ln) / 2)
            return (s*(s-self.x)*(s-self.y)*(s-self.ln)) ** 0.5
        else:
            return "Not a triangle"
 
class Rectangle(Polygon):
    def __init__(self, x, y, w, h):
        self.x = x                
        self.y = y 
        self.w = w  
        self.h = h
    def isRect(self):
        return ((self.x == self.y) and (self.w == self.h)) or ((self.x == self.w) and (self.h == self.y)) or ((self.x == self.h) and (self.y == self.w))
    def square(self):
        if (((self.x == self.y) and (self.w == self.h)) or ((self.x == self.w) and (self.h == self.y)) or ((self.x == self.h) and (self.y == self.w))):
            return int((self.w * self.h * self.y * self.x)**0.5)
        else:
            return "Not a rectangle"
Задача решена. Всем спасибо большое за помощь)
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
28.12.2020, 15:02
Цитата Сообщение от Viktorrus Посмотреть сообщение
С одной стороны Вы правы, но все дело в том, что в условии не определен формат ввода.
Неа. Ввод вообще никак не должен влиять на вычисление периметра.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.12.2020, 15:02
Помогаю со студенческими работами здесь

Как управлять наследниками через базовый класс
Всем привет)Есть вот одна проблема. Хочу управлять объекты через другие объекты. Допустим есть базовый класс class base { ...

Создать базовый класс с двумя наследниками и для них:
Доброго времени суток! Значит у меня такая задача: Создать базовый класс с двумя наследниками и для них: 1)построить иерархию классов...

Класс для работы с денежными суммами с классами- наследниками
Трудности с данной задачей Определить абстрактный класс Сurrency для работы с денежными суммами. Определить в нем методы перевода в рубли...

Проверить лежит ли один из многоугольников строго внутри другого и определить площади многоугольников
Два выпуклых многоугольника заданы на плоскости перечислением координат вершин в порядке обхода границы. Проверить лежит ли один из них...

Исправить класс для рисования замкнутых многоугольников
люди помогите осилить класс для рисования замкнутых многоугольников abstract class PolyGon : pryamaya { // считаем...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru