Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 12.12.2023
Сообщений: 7

Числа

21.03.2024, 10:20. Показов 2715. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Давайте проследим, как менялись числа, необходимые человеку для развития цивилизации.

Сначала было достаточно натуральных чисел (NaturalNumber) – то есть чисел, необходимых для счета предметов, целых положительных чисел и никакого нуля!

Затем оказалось, что если ты кому-то должен две овцы, то это то же самое, что иметь минус две овцы. А если овец у тебя нет, то ты имеешь ноль овец. Появились целые числа (Integer), включающие отрицательные и ноль.

Ну хорошо, овцу поделить нельзя, а вот отару овец можно. Отдав половину отары овец, ты будешь иметь ½ отары. Нужны вещественные числа (RealNumber). Не будем углубляться в разновидности вещественных чисел. Идем дальше.

Научившись решать сначала линейные уравнения, люди приступили к решению квадратных уравнений. И тут появился корень из отрицательного числа, а с ним и комплексные числа (ComplexNumber). (Если точнее, то комплексные числа появились при решении кубических уравнений, но не суть.)

Развитие чисел продолжается, но мы пока на этом остановимся.

Напишите иерархию классов для демонстрации наследования характеристик чисел разных видов.

В соответствии с рассказанной историей, базовым классом будет натуральное число. При инициализации принимает один аргумент – само число.
Умеет возвращать информацию о себе в виде:
<Имя класса>(<число>)

Умеет складывать и вычитать числа (экземпляры класса): возвращается новый экземпляр класса с (соответственно) суммой или разностью исходных экземпляров. Причем разность не может быть не положительной – в этом случае результатом считается None.

От базового класса наследуется целое число. Единственное отличие (кроме названия класса при печати) – это правильность расчета разности.

От целого числа наследуется вещественное. При вычислении результата арифметических операций, если одним из чисел является вещественное, должен получаться вещественный результат.

От вещественного наследуется комплексное число. Умеет возвращать информацию о себе в виде:
<Имя класса>((<число>))
При вычислении суммы и разности, если одним из операндов является комплексное число, то результат должен быть комплексным.

Важно реализовать такой принцип, при котором результатом любых операций с числами из разных классов будет класс, который в иерархии стоит ниже. Например, при сложении вещественного числа и натурального должно получиться вещественное число.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Пример: Ввод
# Команды выполняются сразу после создания классов
nn = NaturalNumber(8)
nn1 = NaturalNumber(10)
print(nn + nn1, nn - nn1)
print(nn1 + nn, nn1 - nn)
it = Integer(7)
it1 = Integer(-5)
print(it - it1, it + it1)
print(it - nn, nn - it)
print(it + nn1, nn1 + it)
rn = RealNumber(9.0)
rn1 = RealNumber(-5.6)
print(rn - rn1, rn1 + rn)
print(nn - rn, rn1 + nn1)
cn = ComplexNumber((5+3j))
cn1 = ComplexNumber((-1-1.3j))
print(cn - cn1, cn + cn1)
print(nn + cn, cn1 - it)
Python
1
2
3
4
5
6
7
8
9
10
# Пример: Вывод
NaturalNumber(18) NaturalNumber(None)
NaturalNumber(18) NaturalNumber(2)
Integer(12) Integer(2)
Integer(-1) Integer(1)
Integer(17) Integer(17)
RealNumber(14.6) RealNumber(3.4000000000000004)
RealNumber(-1.0) RealNumber(4.4)
ComplexNumber((6+4.3j)) ComplexNumber((4+1.7j))
ComplexNumber((13+3j)) ComplexNumber((-8-1.3j))
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
# Мое решение выдает неверный результат
class NaturalNumber:
    def __init__(self, number):
        self.value = number
 
    def __add__(self, other):
        return NaturalNumber(self.value + other.value)
 
    def __sub__(self, other):
        if self.value - other.value > 0:
            return NaturalNumber(self.value - other.value)
        else:
            return NaturalNumber(None)
 
    def __call__(self, value):
        return self
 
    def __str__(self):
        return f"{self.__class__.__name__}({self.value})"
 
 
class Integer(NaturalNumber):
    def __add__(self, other):
        return Integer(self.value + other.value)
 
    def __sub__(self, other):
        return Integer(self.value - other.value)
 
 
class RealNumber(Integer):
    def __add__(self, other):
        return RealNumber(self.value + other.value)
 
    def __sub__(self, other):
        return RealNumber(self.value - other.value)
 
 
class ComplexNumber(RealNumber):
    def __add__(self, other):
        return ComplexNumber(self.value + other.value)
 
    def __sub__(self, other):
        return ComplexNumber(self.value - other.value)
Python
1
2
3
4
5
6
7
8
9
10
# Результат моего решения
NaturalNumber(18) NaturalNumber(None)
NaturalNumber(18) NaturalNumber(2)
Integer(12) Integer(2)
Integer(-1) NaturalNumber(1)
Integer(17) NaturalNumber(17)
RealNumber(14.6) RealNumber(3.4000000000000004)
NaturalNumber(None) RealNumber(4.4)
ComplexNumber((6+4.3j)) ComplexNumber((4+1.7j))
NaturalNumber((13+3j)) ComplexNumber((-8-1.3j))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.03.2024, 10:20
Ответы с готовыми решениями:

Выбрать из списка все числа меньше заданного числа k и упорядочить их по возрастанию
Выбрать из списка все числа меньше заданного числа k и упорядочить их по возрастанию. В задании прежде, чем приступить...

Составить программу для деления числа а на число Ь, если а, b — многозначные числа
Составить программу для деления числа а на число b, если а, b — многозначные числа. на Python

Выделить из множества все четные числа и числа, делящиеся без остатка на 19
Даны множества Х1 и Х2, содержащие целые числа из диапазона . Сформировать новое множество Y= Х1 Х 2 и выделить из него все четные числа...

12
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
21.03.2024, 11:00
Лучший ответ Сообщение было отмечено vanya_the_great как решение

Решение

Если не лезть в дебри, можно проверки прикостылить
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class NaturalNumber:
    def __init__(self, number):
        self.value = number
 
    def __add__(self, other):
        if type(other).__name__ == 'RealNumber':
            return RealNumber(self.value + other.value)
        if type(other).__name__ == 'Integer':
            return Integer(self.value + other.value)
        return NaturalNumber(self.value + other.value)
 
    def __sub__(self, other):
        if type(other).__name__ == 'RealNumber':
            return RealNumber(self.value - other.value)
        if type(other).__name__ == 'Integer':
            return Integer(self.value - other.value)
        if self.value - other.value > 0:
            return NaturalNumber(self.value - other.value)
        return NaturalNumber(None)
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
21.03.2024, 12:06
Лучший ответ Сообщение было отмечено vanya_the_great как решение

Решение

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 NaturalNumber:
    """1, 2, 3…"""
    def __init__(self, number: int):
        is_valid = isinstance(number, int) and number > 0
        self.value = number if is_valid else None
 
    def __add__(self, other):
        return self.__to(self.value + other.value, other)
 
    def __sub__(self, other):
        return self.__to(self.value - other.value, other)
 
    def __str__(self):
        return f"{self.__class__.__name__}({self.value})"
 
    def __to(self, value, other):
        if isinstance(self, ComplexNumber) or isinstance(other, ComplexNumber):
            return ComplexNumber(value)
        if isinstance(other, RealNumber):
            return RealNumber(value)
        if isinstance(other, Integer):
            return Integer(value)
        return self.__class__(value)
 
 
class Integer(NaturalNumber):
    def __init__(self, number: int):
        is_valid = isinstance(number, int)
        self.value = number if is_valid else None
 
 
class RealNumber(Integer):
    def __init__(self, number: float):
        is_valid = isinstance(number, float)
        self.value = number if is_valid else None
 
 
class ComplexNumber(RealNumber):
    def __init__(self, number: complex):
        is_valid = isinstance(number, complex)
        self.value = number if is_valid else None
Добавлено через 2 минуты
Python
1
2
3
4
5
    def __to(self, value, other):
        for t in ComplexNumber, RealNumber, Integer:
            if isinstance(self, t) or isinstance(other, t):
                return t(value)
        return self.__class__(value)
3
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
21.03.2024, 12:17
Лучший ответ Сообщение было отмечено vanya_the_great как решение

Решение

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
class NaturalNumber:
    def __init__(self, n):
        self.n = n
 
    def __str__(self):
        return f'{self.__class__.__name__}({self.n})'
 
    def __add__(self, other):
        return NaturalNumber(self.n + other.n)
 
    def __sub__(self, other):
        res = self.n - other.n
        if res > 0:
            return NaturalNumber(res)
        return NaturalNumber(None)
 
class Integer(NaturalNumber):
    def __add__(self, other):
        return Integer(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return Integer(self.n - other.n)
 
    def __rsub__(self, other):
        return Integer(other.n - self.n)
 
class RealNumber(Integer):
    def __add__(self, other):
        return RealNumber(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return RealNumber(self.n - other.n)
 
    def __rsub__(self, other):
        return RealNumber(other.n - self.n)
 
class ComplexNumber(RealNumber):
    def __add__(self, other):
        return ComplexNumber(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return ComplexNumber(self.n - other.n)
 
    def __rsub__(self, other):
        return ComplexNumber(other.n - self.n)
3
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
21.03.2024, 12:30
idealist, тесты вы конечно же не запускали?
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
21.03.2024, 12:32
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
тесты вы конечно же не запускали?
Да вроде бы все совпало. А что там не так?
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
21.03.2024, 12:35
А-ха-ха, и правда совпало.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
21.03.2024, 18:22
Вообще-то можно и покороче:
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
class NaturalNumber:
    def __init__(self, n):
        self.n = n if n > 0 else None
 
    def __str__(self):
        return f'{self.__class__.__name__}({self.n})'
 
    def __add__(self, other):
        return self.__class__(self.n + other.n)
 
    def __sub__(self, other):
        return self.__class__(self.n - other.n)
 
class Integer(NaturalNumber):
    def __init__(self, n):
        self.n = n
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __rsub__(self, other):
        return self.__class__(other.n - self.n)
 
class RealNumber(Integer):
    pass
 
class ComplexNumber(RealNumber):
    pass

vanya_the_great, ваша ошибка состояла в том, что вы не определили правое сложение и правое вычитание. Как это сделать показано в моих сообщениях 4 и 8. Остальные решения - это, к сожалению, не ООП, так как класс ничего не должен знать о своих потомках. А чем вам это мое решение не понравилось? Мне кажется, оно предпочтительнее, так как короче.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
21.03.2024, 18:44
Привык, что в питоне нет приватных полей, вот и обжёгся.

Теперь так достаточно ООПешно?
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
class NaturalNumber:
    """1, 2, 3…"""
    def __init__(self, value: int):
        self.value = value if self._is_valid(value) else None
 
    def __add__(self, other):
        return self._to(other, self.value + other.value)
 
    def __sub__(self, other):
        return self._to(other, self.value - other.value)
 
    def __str__(self):
        return f"{self.__class__.__name__}({self.value})"
 
    @staticmethod
    def _is_valid(value) -> bool:
        return isinstance(value, int) and value > 0
 
    def _to(self, other, value):
        return other.__class__(value)
 
 
class Integer(NaturalNumber):
    @staticmethod
    def _is_valid(value) -> bool:
        return isinstance(value, int)
 
    def _to(self, other, value):
        if isinstance(self, self.__class__):
            return self.__class__(value)
        return super()._to(other, value)
 
 
class RealNumber(Integer):
    @staticmethod
    def _is_valid(value) -> bool:
        return isinstance(value, float)
 
 
class ComplexNumber(RealNumber):
    @staticmethod
    def _is_valid(value) -> bool:
        return isinstance(value, complex)
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
21.03.2024, 19:08
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Теперь так достаточно ООПешно?
А к чему все эти танцы с бубнами? По условию задачи достаточно определить правые и левые сложение и вычитание.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
20.05.2024, 13:32
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Привык, что в питоне нет приватных полей
- a self.__v ?
0
1 / 1 / 0
Регистрация: 04.07.2024
Сообщений: 17
05.07.2024, 14:36
Код выдает ошибку в яндекс лицее
1
0 / 0 / 0
Регистрация: 06.06.2019
Сообщений: 20
07.07.2025, 22:38
Пример 21
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nn = NaturalNumber(8)
nn1 = nn + NaturalNumber(10)
nn2 = nn1 - NaturalNumber(1)
print(nn.__class__.__name__, nn1.__class__.__name__, nn2.__class__.__name__)
it = Integer(7)
it1 = it - Integer(-5)
it2 = nn + it1
print(it.__class__.__name__, it1.__class__.__name__, it2.__class__.__name__)
print(issubclass(Integer, (NaturalNumber, Integer)), issubclass(Integer, (RealNumber, ComplexNumber)))
rn = RealNumber(9.0)
rn1 = nn + RealNumber(-5.6)
rn2 = it - RealNumber(3)
print(rn.__class__.__name__, rn1.__class__.__name__, rn2.__class__.__name__)
print(issubclass(RealNumber, NaturalNumber), issubclass(RealNumber, ComplexNumber), issubclass(RealNumber, Integer))
cn = ComplexNumber(5 + 3j)
cn1 = cn - ComplexNumber(-1 - 1.3j)
cn2 = nn + cn
cn3 = cn1 - rn
cn4 = it + cn
print(cn.__class__.__name__, cn1.__class__.__name__, cn2.__class__.__name__,
      cn3.__class__.__name__, cn4.__class__.__name__)
print(issubclass(ComplexNumber, RealNumber), issubclass(ComplexNumber, Integer))
Ожидаемый результат
NaturalNumber NaturalNumber NaturalNumber
Integer Integer Integer
True False
RealNumber RealNumber RealNumber
True False True
ComplexNumber ComplexNumber ComplexNumber ComplexNumber ComplexNumber
True True
Добавлено через 6 минут
этот код прошел все тесты!

Добавлено через 1 минуту
Цитата Сообщение от idealist Посмотреть сообщение
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
class NaturalNumber:
    def __init__(self, n):
        self.n = n
 
    def __str__(self):
        return f'{self.__class__.__name__}({self.n})'
 
    def __add__(self, other):
        return NaturalNumber(self.n + other.n)
 
    def __sub__(self, other):
        res = self.n - other.n
        if res > 0:
            return NaturalNumber(res)
        return NaturalNumber(None)
 
class Integer(NaturalNumber):
    def __add__(self, other):
        return Integer(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return Integer(self.n - other.n)
 
    def __rsub__(self, other):
        return Integer(other.n - self.n)
 
class RealNumber(Integer):
    def __add__(self, other):
        return RealNumber(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return RealNumber(self.n - other.n)
 
    def __rsub__(self, other):
        return RealNumber(other.n - self.n)
 
class ComplexNumber(RealNumber):
    def __add__(self, other):
        return ComplexNumber(self.n + other.n)
 
    def __radd__(self, other):
        return self.__add__(other)
 
    def __sub__(self, other):
        return ComplexNumber(self.n - other.n)
 
    def __rsub__(self, other):
        return ComplexNumber(other.n - self.n)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2025, 22:38
Помогаю со студенческими работами здесь

Создать 4 случайных числа в диапазоне от 0 до числа, заданного во входном файле
Файл input.txt содержит 4 числа, записанных в строку. Программа должна создать 4 случайных числа в диапазоне от 0 до числа, заданного во...

Как напечатать слова с разделением табами в ряде от числа до числа
Требуется написать квадрат таблицы умножения и у меня не получается сделать первую строку (в которой значения станут столбцами) в диапазоне...

Из трехзначного числа составить минимально и максимально возможные двухзначные числа
из трехзначного числа нужно составить минимально и максимально возможные двухзначные числа. Пример 1 Ввод 103 Вывод 10 31 ...

вывести все простые числа, меньшие данного натурального числа
нужно вывести все простые числа меньше введенного мой код: a = int(input()) k = False for i in range(1, a): for j in...

Переписать числа так что бы в начале были положительные числа, а в конце отрицательные
Есть одномерный массив, его нужно заполнить рандомными числами от -10 до 10, и в другой одномерный массив записать числа так что бы в...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru