3 / 3 / 0
Регистрация: 07.11.2018
Сообщений: 119
1

Калькулятор дробей - Перегрузка операторов

25.11.2019, 14:18. Показов 2299. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне дали ошибки на мою программу хочу спросить как правильно их исправить?

Не нужно дублировать код.
Не нужно перемножать знаменатели.
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
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include "Fraction.h"
 
Fraction::~Fraction()
{
}
 
Fraction::Fraction(int x, int y)
{
    Fraction::x = x;
    Fraction::y = y;
}
 
void Fraction::setX(int x)
{
    Fraction::x = x;
}
 
int Fraction::getX() const
{
    return x;
}
 
void Fraction::setY(int y)
{
    Fraction::y = y;
}
 
int Fraction::getY() const
{
    return y;
}
 
void Fraction::show() const
{
    cout << "X = " << x << endl;
    cout << "Y = " << y << endl;
}
 
void Fraction::sd(Fraction &obj)
{  
    int min = obj.x < obj.y ? obj.x : obj.y;
        if (min < 2)return;
    for (int i = 2; i <= min; i++)
    {
        if (obj.x % i == 0 && obj.y % i == 0)
        {
            obj.x /= i;
            obj.y /= i;
            min = obj.x < obj.y ? obj.x : obj.y;
            i--;
        }
    }
}
 
Fraction Fraction::operator+(Fraction obj)
{
    sd(*this);
    sd(obj);
    if (y == obj.y)
    {
        Fraction res(x + obj.x, y);
        sd(res);
        return res;
    }
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        Fraction res(y < obj.y ? x * obj.y + obj.x : obj.x * y + 1, y * obj.y);
        sd(res);
        return res;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            Fraction res(x * (i / y) + obj.x * (i / obj.y), i);
            sd(res);
            return res;
        }
    }
    cout << "ERROR" << endl;
    return Fraction();
}
Fraction Fraction::operator-(Fraction obj)
{
    sd(*this);
    sd(obj);
    if (y == obj.y)
    {
        Fraction res(x - obj.x, y);
        sd(res);
        return res;
    }
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        Fraction res(y < obj.y ? x * obj.y - obj.x : obj.x * y - 1, y * obj.y);
        sd(res);
        return res;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            Fraction res(x * (i / y) - obj.x * (i / obj.y), i);
            sd(res);
            return res;
        }
    }
    cout << "ERROR" << endl;
    return Fraction();
}
Fraction Fraction::operator*(Fraction obj)
{
    sd(*this);
    sd(obj);
    Fraction res(x * obj.x, y * obj.y);
    sd(res);
    return res;
}
Fraction Fraction::operator/(Fraction obj)
{
    sd(*this);
    sd(obj);
    Fraction res(x * obj.y, y * obj.x);
    sd(res);
    return res;
}
 
bool Fraction::operator<(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y < obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) < obj.x * (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
bool Fraction::operator>(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y > obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) > obj.x* (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
bool Fraction::operator<=(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y <= obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) <= obj.x * (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
bool Fraction::operator>=(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y >= obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) >= obj.x * (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
bool Fraction::operator==(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y == obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) == obj.x * (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
bool Fraction::operator!=(const Fraction& obj) const
{
    int min = y < obj.y ? y : obj.y;
    if (min == 1)
    {
        return y < obj.y ? x * obj.y == obj.x : obj.x * y > x;
    }
    for (int i = 2; i <= y * obj.y; i++)
    {
        if (i % y == 0 && i % obj.y == 0)
        {
            return x * (i / y) != obj.x * (i / obj.y);
        }
    }
    cout << "ERROR" << endl;
    return false;
}
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
#pragma once
#include<iostream>
using namespace std;
class Fraction
{
private:
    int x = 0;
    int y = 0;
public:
    Fraction() = default;
    ~Fraction();
    Fraction(int x, int y);
    void setX(int x);
    int getX()const; 
    void setY(int y);
    int getY()const;
    void show()const;
    void sd(Fraction &obj);
    Fraction operator+(Fraction obj);
 
    Fraction operator-(Fraction obj);
 
    Fraction operator*(Fraction obj);
 
    Fraction operator/(Fraction obj);
 
    bool operator<(const Fraction& obj) const;
    bool operator>(const Fraction& obj) const;
    bool operator<=(const Fraction& obj) const;
    bool operator>=(const Fraction& obj) const;
    bool operator==(const Fraction& obj) const;
    bool operator!=(const Fraction& obj) const;
    
 
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2019, 14:18
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Калькулятор дробей
Здравствуйте! Изучаю С++ по книге Лафоре, там нужно было создать калькулятор дробей в одном из...

Калькулятор дробей
Учусь программировать на C++, в данное время на мобильном компиляторе &quot;Cxx IDE for android&quot;. С утра...

Калькулятор для дробей
Задача: Создать класс Fraction, который будет описывать дробь (числитель и знаменатель). Методы...

5
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
25.11.2019, 14:28 2
что мешало в операторах сравнения посчитать значение и сравнить, было бы в 10 раз меньше кода
на счет дублирования кода не знаю, можно например использовать оператор == в != с инверсией, или >= в <= с инверсией тоже
1
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
25.11.2019, 15:11 3
Ну, для начала:
C++
1
2
3
Fraction operator+(Fraction obj)const{return add(obj.x,obj.y);}
Fraction operator-(Fraction obj)const{return add(-obj.x,obj.y);}
//А в add общую реализацию плюса и минуса
2
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
25.11.2019, 16:37 4
Сама недавно писала реализацию класса обыкновенных дробей (правда делала по-другому) и
у меня возникло несколько вопросов по вашему коду:
1) Вы нигде не используете наибольший общий делитель? (или я не заметила?) Вам не надо сокращать дроби? Чтоб 2/4 превращалось сразу в 1/2?
2) у вас знаменатель по default равен 0. Как-то это не правильно. Аналогично не вижу у вас проверки деления на 0 в перегрузке оператора деления
3) оператор < (и подобные) я не поняла зачем так сложно (возможно чего-то не знаю?)
У меня было что-то типа:
сравниваем дроби a1/b1 и a2/b2:
C++
1
2
if(b1==b2) return (a1<a2);
else return (a1*b2<a2*b1);
Аналогично можно и для остальных операторов сравнения.
4)Операторы>> и << не перегружаете?
1
3 / 3 / 0
Регистрация: 07.11.2018
Сообщений: 119
26.11.2019, 06:38  [ТС] 5
Цитата Сообщение от Крашеная Посмотреть сообщение
1)
1) Мне нужно было сделать без перемножения знаменателей вот и не использовал наибольший общий делитель вот только я не понял как задать правильное число до которого программа будет проверять делители без перемножения. Сокращения лишние.
2) и 3) Ошибки
4)Ещё не учил
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
26.11.2019, 11:11 6
Лучший ответ Сообщение было отмечено Nuril как решение

Решение

Цитата Сообщение от Nuril Посмотреть сообщение
Мне нужно было сделать без перемножения знаменателей вот и не использовал наибольший общий делитель вот только я не понял как задать правильное число до которого программа будет проверять делители без перемножения.
Вот здесь почитайте:
https://code-live.ru/post/grea... lgorithms/
Я испольовала 4-й - рекурсивный алгоритм Евклида
0
26.11.2019, 11:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2019, 11:11
Помогаю со студенческими работами здесь

Калькулятор для дробей
Создать калькулятор, который выполняет 4 арифметичуские действия над дробями. Пользователь должен...

Калькулятор рациональных дробей
Первая программа принимает от пользователя три строки, (первая и третья строки – это правильные...

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

Калькулятор дробей с помощью классов
Добрый день, мне кажется я тут уже видел программку калькулятор дробей, где нужно создать class...


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

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

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