4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
1

Перегрузка операций в классе "рациональная дробь"

03.09.2016, 17:48. Показов 3186. Ответов 16
Метки нет (Все метки)

Есть класс "рациональная дробь" с двумя закрытыми полями - числитель и знаменатель.
Нужно перегрузить оператор сложения,таким образом чтобы работало int+T,где T-это тип,причем сделать ее глобальной
Именно переменная "d" и не работает. Подскажите,что делать.к сожалению совсем нет идей.
C++
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
 void main()
{
    Rational a=Rational(5,6);
    Rational b(3);
    Rational c = a + 2;
    Rational d = 2 + b;
    a.print();
    b.print();
    c.print();
    system("pause");
}
}
class Rational
{
private:
    int numerator;
    int denomiator;
public:
    Rational();
    Rational(int);
    Rational(int,int);
    int get_numerator();
    int get_denominator();
    void reduction();
    Rational operator+(int);
    void print();
 
 
};
int gcd(int a, int b)
{
    while (b)
    {
        a %= b;
        swap(a, b);
    }
    return a;
}
int Rational::get_numerator()
{
    return numerator;
}
int Rational::get_denominator()
{
    return denomiator;
}
Rational operator+(int a, Rational b)
{
    
}
Rational::Rational()
{
    numerator = 1;
    denomiator = 1;
}
 
Rational::Rational(int a)
{
    numerator = a;
    denomiator = 1;
}
 
Rational::Rational(int a, int b)
{
    numerator = a;
    denomiator = b;
}
 
void Rational::print()
{
    denomiator == 1 ? cout << numerator << endl : cout << numerator << '/' << denomiator << endl;
}
 
void Rational::reduction()
{
    int a=gcd(numerator, denomiator);
    if (a != 1)
    {
        numerator /= a;
        denomiator /= a;
    }
}
 
Rational Rational::operator+ (int a)
{
    Rational res;
    res.numerator = a*this->denomiator;
    res.denomiator = this->denomiator;
    res.reduction();
    return res;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2016, 17:48
Ответы с готовыми решениями:

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

Ввести класс для работы с объектом "рациональная дробь"
Ввести класс для работы с объектом &quot;рациональная дробь&quot;.Реализовать: а)сложение(вычитание) двух...

Класс для работы с объектом "рациональная дробь"
Надо ввести класс для работы с объектом &quot;рац.дробь&quot; и реализовать 1)умножение(деление) двух дробей...

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

16
Крюгер
03.09.2016, 17:53
  #2

Не по теме:

какие такие рациональные дроби? я слышал про десятичные и обыкновенные. так то бывают числа рациональные и иррациональные. Ваш вопрос надо бы правильно задать

0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
03.09.2016, 17:54  [ТС] 3
обычна дробь грубо говоря,весь вопрос в реализации
0
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 459
Записей в блоге: 7
03.09.2016, 17:56 4
Kristina_S, ну посмотрите каким образом складывают обычные дроби и реализуйте этот же алгоритм.
не забывайте что дроби с разными знаменателями нужно привести к общему
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
03.09.2016, 17:58  [ТС] 5
я знаю как это делается!
я уже реализовала эту функцию выше но там она функция-член класса.а мне нужно глобально
0
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 459
Записей в блоге: 7
03.09.2016, 18:07 6
Kristina_S, в смысле глобально? вы хотите складывать 2 дроби? у значит вам надо бинарный плюс перегружать. вот и всё.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class className
{
 friend const className operator+(const Integer& left, const Integer& right);
...
};
 
 
//-------------------------
#include "className.h"
const className operator+(const Integer& left, const Integer& right) {
    return className(left.value + right.value);
}
куда глобальнее? можно описать тип данных структурой и работать с обычными функциями/процедурами - это вообще глобально.
в общем задача не ясна
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
03.09.2016, 18:07 7
Kristina_S,
C++
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
#include <iostream>
using namespace std;
class Rational {
    private:
        int numerator;
        int denomiator;
    public:
        Rational();
        Rational(int);
        Rational(int,int);
        int get_numerator();
        int get_denominator();
        void reduction();
        friend Rational operator+(int x, const Rational &y);
        friend Rational operator+( const Rational &y, int x);
        void print();
 
 
};
int gcd(int a, int b) {
    while (b) {
        a %= b;
        swap(a, b);
    }
    return a;
}
int Rational::get_numerator() {
    return numerator;
}
int Rational::get_denominator() {
    return denomiator;
}
 
Rational::Rational() {
    numerator = 1;
    denomiator = 1;
}
 
Rational::Rational(int a) {
    numerator = a;
    denomiator = 1;
}
 
Rational::Rational(int a, int b) {
    numerator = a;
    denomiator = b;
}
 
void Rational::print() {
    denomiator == 1 ? cout << numerator << endl : cout << numerator << '/' << denomiator << endl;
}
 
void Rational::reduction() {
    int a=gcd(numerator, denomiator);
    if (a != 1) {
        numerator /= a;
        denomiator /= a;
    }
}
 
Rational operator+ (int x, const Rational& y) {
 
    int num= x*y.denomiator;
    int den = y.denomiator;
    Rational res(num,den);
    res.reduction();
    return res;
}
Rational operator+ (const Rational& y, int x) {
 
    int num= y.denomiator*x;
    int den = y.denomiator;
    Rational res(num,den);
    res.reduction();
    return res;
}
int  main() {
    Rational a=Rational(5,6);
    Rational b(3);
    Rational c = a + 2;
    Rational d = 2 + b;
    a.print();
    b.print();
    c.print();
    d.print();
    system("pause");
}
Через дружественные функции
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
03.09.2016, 18:09  [ТС] 8
Еще раз.
У меня есть выражение: Rational d = 2 + b ,где b-также объект класса Rational.
Нужно перегрузить + так чтобы эта строка работала.но эта функция должна быть глобальной.не членом класса
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
03.09.2016, 18:10 9
Kristina_S, Дружественные функции не являются членами класса
0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
03.09.2016, 18:11  [ТС] 10
спасибо.а можно ли это как-нибудь сделать без использования дружественных функций.или это единственный выход?
0
Крюгер
03.09.2016, 18:13
  #11

Не по теме:

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

C++
1
что то типа того -> static className add (className l_arg, className r_arg);

0
4 / 1 / 0
Регистрация: 09.10.2015
Сообщений: 204
03.09.2016, 18:15  [ТС] 12
не думаю,ибо мы ключевое слово static не проходили еще,так что препод бы нам с их использованием задачу б не дал)
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
03.09.2016, 18:15 13
Kristina_S, тогда только дружественные
0
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 459
Записей в блоге: 7
03.09.2016, 18:16 14
Kristina_S, нафига вам вообще использовать класс (и ООП) в таком случае? вы несете глупости. нельзя перегрузить оператор отдельно от класса
0
1386 / 1016 / 323
Регистрация: 28.07.2012
Сообщений: 2,804
03.09.2016, 18:23 15
Kristina_S,
C++
1
2
3
Rational operator+(int x, const Rational &y) {
    return y + x;
}
Ток у своего метода в классе везде припиши const после заголовка:
Цитата Сообщение от Kristina_S Посмотреть сообщение
Rational operator+(int) const;
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
03.09.2016, 18:27 16
Kristina_S, И у вас там считаем не правильно немного
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Rational operator+ (int x, const Rational& y) {
 
 Rational res;
    res.numerator =y.numerator+x*y.denomiator;
    res.denomiator =y.denomiator;
    res.reduction();
    return res;
}
Rational operator+ (const Rational& y, int x) {
 
 Rational res;
    res.numerator =y.numerator+x*y.denomiator;
    res.denomiator =y.denomiator;
    res.reduction();
    return res;
}
0
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
04.09.2016, 04:26 17
Бог знает, чего понаписали! Вот так нужно:
C++
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
#include <algorithm>
#include <iostream>
///////////////////////////////////////////////////////////////////////////////
int gcd(int a, int b)
{
   while(b)
   {
       a %= b;
       std::swap(a, b);
   }
   return a;
}
///////////////////////////////////////////////////////////////////////////////
class Rational
{
    //-------------------------------------------------------------------------
    int     numerator_;
    int     denominator_;
   //-------------------------------------------------------------------------
public:
    //-------------------------------------------------------------------------
    Rational
        (
            int     numerator   =   0,
            int     denomiator  =   1
        )
        :
        numerator_      ( numerator     ),
        denominator_    ( denomiator    )
    {
        reduction();
    }
    //-------------------------------------------------------------------------
    int     get_numerator()                                                 const
    {
        return numerator_;
    }
    //-------------------------------------------------------------------------
    int     get_denominator()                                               const
    {
        return denominator_;
    }
    //-------------------------------------------------------------------------
    Rational    &   operator+=  ( Rational   const   &   r )
    {
        numerator_      *=  r.denominator_;
        numerator_      +=  r.numerator_    *   denominator_;
        denominator_    *=  r.denominator_;
        reduction();
        return  *this;
    }
    //-------------------------------------------------------------------------
    void    print()                                                         const
    {
        std::cout    <<  numerator_;
 
        if( denominator_    !=  1 )
        {
            std::cout   << '/' << denominator_;
        }
 
        std::cout   <<  std::endl;
    }
    //-------------------------------------------------------------------------
private:
    //-------------------------------------------------------------------------
    void    reduction()
    {
        int     a   =   gcd(numerator_, denominator_);
        numerator_      /=  a;
        denominator_    /=  a;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
Rational operator+
    (
        Rational    a,
        Rational    b
    )
{
    return  a   +=  b;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
   Rational     a   =   Rational(50, 60);
   Rational     b(3);
   Rational     c   =   a   +   2;
   Rational     d   =   2   +   b;
   a.print();
   b.print();
   c.print();
   d.print();
   system("pause");
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2016, 04:26
Помогаю со студенческими работами здесь

Создать класс "Рациональная дробь"
Данные класса: числитель и знаменатель дроби. Функции класса: сложение, вычитание, умножение,...

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

Класс "Рациональная дробь"
Реализовать класс Rational, используя два массива из 100 элементов типа unsigned char для...

Класс "Рациональная дробь"
Здраствуйте, вот мой код. #include &lt;iostream&gt; using namespace std; class TCost {...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru