С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 02.06.2019
Сообщений: 21

Реализация вычислений с обыкновенными дробями

02.06.2019, 16:44. Показов 2248. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, что я делаю не так. Вроде рабочий код, но в консоли выводится мусор. Необходимо создать класс обыкновенных дробей, перегрузить логические, арифметические операции и операции ввода-вывода.
C++ (Qt)
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
#include <iostream>
#include <math.h>
#include <windows.h>
using namespace std;
int nod(int p, int q);
int nok(int p, int q);
class Rational
{int p;
int q;
public:
    Rational(int num=0, int den=1)  //делаем конструктор
    {num=p;
    if (den==0) cout<<"Знаменатель не может равняться нулю!";
    if (den<0) den=abs(den);
    den=q;
    int nd=nod(num, den);
if (nd!=1) {num=num/nd; den=den/nd;}  //сокращаем дробь по возможности
    }
friend Rational operator+(const Rational &c1, const Rational &c2);                 //перегружаем арифметические и логические операции
    
friend Rational operator-(const Rational &c1, const Rational &c2);  
    
friend Rational operator*(const Rational &c1, const Rational &c2);
 
friend Rational operator/(const Rational &c1, const Rational &c2);
    
friend bool operator==(const Rational &c1, const Rational &c2);
 
friend bool operator!=(const Rational &c1, const Rational &c2);
    
Rational operator= (const Rational &rational){   //оператор присваивания
    Rational tmp;
    tmp.p=rational.p;
    tmp.q=rational.q;
    return tmp;
 }
        
friend Rational operator-( Rational &c1);   //унарный минус
 
 
double toDouble() { return static_cast<double>(p/q); }        //приводим дробь к десятичной и получаем её числитель и знаменатель
int Numerator ()  { return p; }
 
 
int Denominator(){ return q;}
 
friend istream& operator>> (istream &in, Rational &rational);
 
friend ostream& operator<< (ostream &in, Rational &rational);
};
 
 
int nod(int p, int q){   //нахождение наибольшего общего делителя числителя и знаменателя для сокращения дроби
    while (q>0){
        int c=p%q;
        p=q;
        q=c;
    }
    return p;
}
 
int nok(int p, int q){    //нахождение наименшего общего кратного знаменателей для приведения к общему
    return p*q/nod(p, q);
}
 
Rational operator+(const Rational &c1, const Rational &c2){
    Rational tmp;
    int nk=nok(c1.q, c2.q);
    tmp.q=nk;
    tmp.p=c1.p*(nk/c1.q)+c2.p*(nk/c2.q);
    return tmp;
}
 
Rational operator*(const Rational &c1, const Rational &c2){
     Rational tmp;
     tmp.p=c1.p*c2.p;
     tmp.q=c1.q*c2.q;
     return tmp;
 }
Rational operator-(const Rational &c1, const Rational &c2){
    Rational tmp;
    int nk=nok(c1.q, c2.q);
    tmp.q=nk;
    tmp.p=c1.p*(nk/c1.q)-c2.p*(nk/c2.q);
    return tmp;
}
 
 
 
 Rational operator/(const Rational &c1, const Rational &c2){
     Rational tmp;
     tmp.p=c1.p*c2.q;
     tmp.q=c1.q*c2.p;
     return tmp;
 }
 
 bool operator ==(const Rational &c1, const Rational &c2){
     if (c1.p==c2.p && c1.q==c2.q) return true;
     return false;
}
 
 bool operator !=(const Rational &c1, const Rational &c2){
     if (c1.p!=c2.p || c1.q!=c2.q) return true;
     return false;
}
 
 
 Rational operator-( Rational &c1){
     c1.p*=-1;
     c1.q=c1.q;
     return c1;
 }
 
istream& operator>> (istream &in, Rational &rational){
    in>>rational.p;
    in>>rational.q;
 
    return in;
}
 
ostream& operator<< (ostream &out, Rational &rational){
    out<<"Rational("<<rational.p<<","<<rational.q<<")";
 
    return out;
}
 
int main ()
{setlocale (LC_ALL, "russian");
Rational Fract1, Fract2; int a1, b1, a2, b2;
cout<<"Введите числители и знаменатели"<<endl;
cin>>a1>>b1>>a2>>b2;
Fract1=Rational(a1, b1);
Fract2=Rational(a2, b2);
cout<<Fract1+Fract2;
cout<<Fract1-Fract2;
cout<<Fract1*Fract2;
cout<<Fract1/Fract2;
system ("pause");
return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2019, 16:44
Ответы с готовыми решениями:

Операции над обыкновенными дробями
Нужно написать программу для того чтобы полноценно показать возможные операции над обыкновенными дробями посредством C++, желательно с...

Калькулятор. Работа с обыкновенными дробями
подскажите с чего начать...

Пример арифметических действий с обыкновенными дробями
арифметическое действие над обыкновенными дробями . кто-нибудь подскажет одно действие, дальше я сам. с применением класса

2
 Аватар для vlisp
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,336
02.06.2019, 17:58
Цитата Сообщение от monopolist Посмотреть сообщение
Вроде рабочий код,
код нерабочий с большим количеством ошибок
1
Модератор
Эксперт С++
 Аватар для zss
13770 / 10963 / 6491
Регистрация: 18.12.2011
Сообщений: 29,240
02.06.2019, 18:33
Лучший ответ Сообщение было отмечено monopolist как решение

Решение

Да, до рабочего кода тут было - начать и кончить!
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
#include <iostream>
#include <math.h>
#include <windows.h>
using namespace std;
int nod(int p, int q);
int nok(int p, int q);
class Rational
{
    int p;
    int q;
public:
    Rational(int num = 0, int den = 1)  //делаем конструктор
    {
        p=num;
        if (den == 0) den=1;
        den = abs(den);
        q=den;
        int nd = nod(num, den);
        if (nd != 1) { p /= nd; q /= nd; }  //сокращаем дробь по возможности
    }
    Rational(const Rational& x)
    {
        p = x.p;
        q = x.q;
 
    }
    Rational operator+(const Rational &c2);                 //перегружаем арифметические и логические операции
 
    Rational operator-(const Rational &c2);
 
    Rational operator*(const Rational &c2);
 
    Rational operator/(const Rational &c2);
 
    friend bool operator==(const Rational &c1, const Rational &c2);
 
    friend bool operator!=(const Rational &c1, const Rational &c2);
 
    Rational& operator= (const Rational &rational) {   //оператор присваивания
        p = rational.p;
        q = rational.q;
        return *this;
    }
 
    Rational& operator--();   //унарный минус
 
 
    double toDouble() { return static_cast<double>(p) / q; }        //приводим дробь к десятичной и получаем её числитель и знаменатель
    int Numerator() { return p; }
 
 
    int Denominator() { return q; }
 
    friend istream& operator>> (istream &in, Rational &rational);
 
    friend ostream& operator<< (ostream &in, Rational rational);
};
 
 
int nod(int p, int q) {   //нахождение наибольшего общего делителя числителя и знаменателя для сокращения дроби
    while (q>0) {
        int c = p % q;
        p = q;
        q = c;
    }
    return p;
}
 
int nok(int p, int q) {    //нахождение наименшего общего кратного знаменателей для приведения к общему
    return p * q / nod(p, q);
}
 
Rational Rational::operator+(const Rational &c2) {
    Rational tmp;
    int nk = nok(q, c2.q);
    tmp.q = nk;
    tmp.p = p*(nk / q) + c2.p*(nk / c2.q);
    return tmp;
}
 
Rational Rational::operator*(const Rational &c2) {
    Rational tmp;
    tmp.p = p*c2.p;
    tmp.q = q*c2.q;
    return tmp;
}
Rational Rational::operator-(const Rational &c2) {
    Rational tmp;
    int nk = nok(q, c2.q);
    tmp.q = nk;
    tmp.p = p*(nk / q) - c2.p*(nk / c2.q);
    return tmp;
}
 
 
 
Rational Rational::operator/(const Rational &c2) {
    Rational tmp;
    tmp.p = p*c2.q;
    tmp.q = q*c2.p;
    return tmp;
}
 
bool operator ==(const Rational &c1, const Rational &c2) {
    if (c1.p == c2.p && c1.q == c2.q) return true;
    return false;
}
 
bool operator !=(const Rational &c1, const Rational &c2) {
    if (c1.p != c2.p || c1.q != c2.q) return true;
    return false;
}
 
 
Rational& Rational::operator--() {
    p -=q;
    return *this;
}
 
istream& operator>> (istream &in, Rational &rational) {
    in >> rational.p;
    in >> rational.q;
 
    return in;
}
 
ostream& operator<< (ostream &out, Rational rational) {
    out << rational.p << "/" << rational.q <<endl;
    return out;
}
 
int main()
{
    setlocale(LC_ALL, "russian");
    Rational Fract1, Fract2; int a1, b1, a2, b2;
    cout << "Введите числители и знаменатели" << endl;
    cin >> a1 >> b1 >> a2 >> b2;
    Fract1 = Rational(a1, b1);
    Fract2 = Rational(a2, b2);
    cout << (Fract1 + Fract2);
    cout << (Fract1 - Fract2);
    cout << (Fract1 * Fract2);
    cout << (Fract1 / Fract2);
    system("pause");
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2019, 18:33
Помогаю со студенческими работами здесь

Создать класс для работы с обыкновенными дробями
ЗАДАНИЕ : Создать класс для работы с обыкновенными дробями. Все операции, которые должны выполняться с дробями Код написала, но куча...

Разработать модуль для работы с обыкновенными дробями
Разработать модуль для работы с обыкновенными дробями, числителем и знаменателем которых являются длинные числа. 104 При описании...

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

Реализовать в виде модуля набор подпрограмм для выполнения операций над обыкновенными дробями вида P/Q
Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P/Q (Р − целое, Q —...

калькулятор.работа с обыкновенными дробями
подскажите с чего начать...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru