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

Создать класс – рациональную дробь

28.04.2022, 21:00. Показов 3795. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать класс – рациональную дробь (число, являющееся отношением двух целых чисел), описать поля: числитель и знаменатель. Определить конструктор, функции сложения, вычитания, умножения и деления дробей, сравнение значений двух рациональных дробей. Перегрузить операции <(сравнение значений двух рациональных дробей), + (сложение двух дробей). Отсортировать массив экземпляров класса дробей по убыванию значений, вычислить среднее значение для всех дробей в массиве (как рациональная дробь).

Реализовать перегруженную операцию __str__() для представления объекта в виде символьной строки и продемонстрировать ее работу при выводе данных объекта на экран
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2022, 21:00
Ответы с готовыми решениями:

Рациональную дробь перевести в цепную дробь
procedure Express; var a,b,t: integer; q: char; begin repeat writeln ('введите числитель='); readln (a); writeln ('введите...

Разложить рациональную дробь
Разложить рациональную дробь \frac{1}{{x}^{3}-1}на простейшие дроби над полем R. Спасибо

Разложить рациональную дробь
Разложить рациональную дробь \frac{{x}^{2}}{({x}^{2}+x-2)(x+3)} на простейшие дроби над полем С. ...

8
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
29.04.2022, 00:30
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from random import randint
from math import gcd
#==============================================================================
class My_fraction:
    #==========================================================================
    def __init__(self, numerator, denominator=1):
        self._num = numerator
        self._den = denominator
        if not self._den:
            self._den = 1
        g = gcd( self._num, self._den )
        self._num //= g
        self._den //= g
        is_neg = self._num * self._den < 0
        self._den = abs( self._den )
        self._num = abs( self._num )
        if is_neg:
            self._num *= -1
    # ==========================================================================
    def __add__(self, other):
        if type( other ) == My_fraction:
            a = self._num
            b = self._den
            c = other._num
            d = other._den
            return My_fraction(a*d + b*c, b*d)
        elif type( other ) == int:
            return self + My_fraction( other )
    # ==========================================================================
    def __radd__(self, other):
        return self + other
    # ==========================================================================
    def __sub__(self, other):
        a = self._num
        b = self._den
        c = other._num
        d = other._den
        return My_fraction(a * d - b * c, b * d)
    # ==========================================================================
    def __mul__(self, other):
        a = self._num
        b = self._den
        c = other._num
        d = other._den
        return My_fraction(a * c, b * d)
    # ==========================================================================
    def __floordiv__(self, other):
        if type( other ) == My_fraction:
            a = self._num
            b = self._den
            c = other._num
            d = other._den
            return My_fraction(a * d, b * c)
        elif type( other ) == int:
            return self // My_fraction( other )
    # ==========================================================================
    def __lt__(self, other):
        a = self._num
        b = self._den
        c = other._num
        d = other._den
        return a*d < b*c
    # ==========================================================================
    def __str__(self):
        return str(self._num) + '/' + str(self._den)
# =============================================================================
a = My_fraction(2, -3)
b = My_fraction(4, 5)
print(f'a = {a}')
print(f'b = {b}')
print()
print(f'a + b = {a+b}')
print(f'a - b = {a-b}')
print(f'a * b = {a*b}')
print()
print(f'a // b = {a//b}')
print(f'a < b = {a < b}')
n = 3
arr = []
for i in range(n):
    arr.append( My_fraction( randint(-10,10), randint(-10,10) ) )
print(f'Массив:', *arr)
arr.sort(reverse=True)
print(f'Массив, отсортированный по убыванию: ', *arr)
print( f'Среднее арифметическое массива: { sum(arr)//len(arr) }' )
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
29.04.2022, 11:31
idealist, хороший класс... Но неплохо бы добавить две вещи:
- не печатать знаменатель, равный 1
- при попытке создать дробь с нулевым знаменателем бросать исключение
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
29.04.2022, 12:30
Цитата Сообщение от Catstail Посмотреть сообщение
не печатать знаменатель, равный 1
Ну, это уже дело вкуса, мне кажется. Мне, например, кажется, что так единообразнее.


Цитата Сообщение от Catstail Посмотреть сообщение
при попытке создать дробь с нулевым знаменателем бросать исключение
Вообще-то многие специалисты по ООП не рекомендуют возбуждать исключения в конструкторах классов.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
29.04.2022, 12:35
Цитата Сообщение от idealist Посмотреть сообщение
Вообще-то многие специалисты по ООП не рекомендуют возбуждать исключения в конструкторах классов.
- причина? Ну, не нравится - не возбуждайте. Но проверить-то знаменатель нужно.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
29.04.2022, 13:03
Цитата Сообщение от Catstail Посмотреть сообщение
- причина?
Ну, тут нарушение сразу нескольких принципов ООП. Получается, что объект еще не создан, а уже выбрасывает исключение, хотя его фактически еще нет.
Также нарушение инкапсуляции, согласно которой пользователь не обязан знать внутреннее устройство класса, а только его интерфейс. А тут класс перекладывает свои проблемы на того, кто их знать не обязан.

Цитата Сообщение от Catstail Посмотреть сообщение
Но проверить-то знаменатель нужно.
Дак у меня есть:

Цитата Сообщение от idealist Посмотреть сообщение
Python
1
2
if not self._den:
 self._den = 1
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
29.04.2022, 13:28
Цитата Сообщение от idealist Посмотреть сообщение
Получается, что объект еще не создан, а уже выбрасывает исключение, хотя его фактически еще нет.
- и что? Чем это страшно?

Мне кажется, инкапсуляция вообще здесь не при чем. Пользователь просто не должен создавать дроби с нулевым знаменателем. А как устроена дробь внутри - неважно.

Цитата Сообщение от idealist Посмотреть сообщение
Дак у меня есть:
- а это никак не могу одобрить: некорректные данные не должны превращаться в корректные.

Предлагаю компромисс - добавить в класс "бесконечность" со знаком (нулевой знаменатель и ненулевой числитель). И "неопределенность" 0/0. Примерно так:

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
class Rational:
    
    # Наибольший общий делитель
    
    @staticmethod
    def gcd(a,b):
        while (b != 0):
            (a, b) = (b, a%b)
        return a     
 
    # Получить знак числа
    
    @staticmethod
    def sgn(x):
        if x>0:
            return 1
        elif x<0:
            return -1
        else:
            return 0
 
    def __init__(self,n,d=1):
        if n==0 and d !=0: # нулевой числитель дает (0,1)
            self.__num=0
            self.__den=1
        elif d==0:
            self.__num=Rational.sgn(n)
            self.__den=0
        else:
            z=Rational.sgn(n)*Rational.sgn(d)
            n=abs(n)
            d=abs(d)
            k=Rational.gcd(n,d) 
            self.__num=z*n//k
            self.__den=d//k
            
    def getnum(self):
        return self.__num
        
    def setnum(self):
        raise AttributeError
            
    def delnum(self):
        raise AttributeError
        
    num=property(getnum,setnum,delnum,"Числитель (read-only)")
    
    def getden(self):
        return self.__den
        
    def setden(self):
        raise AttributeError
            
    def delden(self):
        raise AttributeError
        
    den=property(getden,setden,delden,"Знаменатель (read-only)")
    
    def __str__(self):
        if self.__den==0:
            if self.__num>0:
                return "<+INF>"
            elif self.__num==0:
                return "<UND>"
            else:
                return "<-INF>"
        elif self.__num==0:
            return "0"
        elif self.__den==1:
            return str(self.__num)
        else:    
            return str(self.__num)+"/"+str(self.__den)
 
    # Сложение
    def __add__(self,o):
        if self.__den==0 or o.__den==0:
            if self.__num>0 and o.__num>0:
                return Rational(1,0) 
            elif self.__num<0 and o.__num<0:
                return Rational(-1,0)
            elif self.__num*o.__num<0:
                return Rational(0,0)
            elif self.__den==0 and o.__den != 0:
                return self
            else:
                return o
        else:
            n1=self.num
            d1=self.den
            n2=o.num
            d2=o.den
            n=n1*d2+n2*d1
            d=d1*d2
            k=Rational.gcd(n,d)        
            return Rational(n//k,d//k)
 
    # Вычитание
    def __sub__(self,o):
        tmp=Rational(-o.__num,o.__den)
        return self+tmp
 
    # Умножение __mul__
    
    def __mul__(self,o):
        if self.__den==0 and o.__den==0:
            if self.__num==0 or self.__den==0:
                return Rational(0,0)
            else:
                return Rational(self.__num*o.__num,0) # произвведение бесконечностей со знаком
        else:
            n1=self.num
            d1=self.den
            n2=o.num
            d2=o.den
            n=n1*n2
            d=d1*d2
            k=Rational.gcd(n,d)
            return Rational(n//k,d//k)
            
    # Деление __floordiv__
    
    def __floordiv__(self,o):
        tmp=Rational(o.__den,o.__num)
        return self*tmp
 
r1=Rational(3,2)
r2=Rational(5,6)
r5=Rational(0,0)
print(r1.num)
print(r2.den)
r3=r1+r2
r6=r1//r2
print(r3)
print(r5)
print(r5.num)
print(r5.den)
print(r6)
z1=Rational(1,2)
z2=Rational(1,3)
z3=(z1+z2)//(z1-z2)
print(z3)
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
29.04.2022, 14:27
Цитата Сообщение от Catstail Посмотреть сообщение
- и что? Чем это страшно?
Ну, некоторые почему-то побаиваются!)))

Цитата Сообщение от Catstail Посмотреть сообщение
Пользователь просто не должен создавать дроби с нулевым знаменателем.
Ну, раз он об этом знает, то, мне кажется, сам должен защищать класс от своих неправильных действий.

Цитата Сообщение от Catstail Посмотреть сообщение
Предлагаю компромисс - добавить в класс "бесконечность" со знаком (нулевой знаменатель и ненулевой числитель). И "неопределенность" 0/0.
Да, идея неплохая. Но автору, я думаю, пока такие сложности рановато.
0
0 / 0 / 0
Регистрация: 28.04.2022
Сообщений: 2
29.04.2022, 18:28  [ТС]
Спасибо большое,задача решена прекрасно))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2022, 18:28
Помогаю со студенческими работами здесь

Перевести десятичную дробь в рациональную
Проблема в условии. Как быть,если например дробь 0,75? Racional:: Racional( double &amp; num ) { int kolvo=0;//кол-во знаков после запятой...

Перевести цепную дробь в рациональную
procedure AntiExp; var s: array of integer; a,b, i,n,t: integer; q: char; begin repeat writeln ('введите кол-во эл-ов цепной...

Преобразовать рациональную дробь в десятичную
Составить программу, которая бы по данному рациональному числу, записанному в виде обыкновенной дроби с натуральными числителем и...

Преобразовать правильную рациональную дробь
Дана правильная рациональная дробь. Требуется преобразовать эту дробь в другую правильную рациональную. Знаменатель новой дроби должен...

Асимптотическое приближение котангенса при Х-> 0 через рациональную дробь
Задача: Найти такие числа a и b, что ctg(x) = (1+a*x^2) /(1+b*x^2) + O(x^5) при x-&gt; 0. Как решить?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru