Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для aleksskay4
71 / 68 / 46
Регистрация: 02.12.2015
Сообщений: 891
Записей в блоге: 1

Функция сложения двух дробей

13.01.2022, 11:05. Показов 1570. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можете помочь с задачей.
Напишите функцию сложения двух простых дробей a/b и c/d. В результате должна получаться правильная несократимая дробь или смешанное число.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2022, 11:05
Ответы с готовыми решениями:

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

Функция, вычисляющая сумму двух дробей
Возвращаемая дробь должна быть несократимой Мне нужно составить программу для нахождения суммы 1-1/2+1/3-...+((-1)^(n+1))/n Одним из...

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

7
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38160 / 21095 / 4306
Регистрация: 12.02.2012
Сообщений: 34,677
Записей в блоге: 14
13.01.2022, 11:43
aleksskay4, а как представлены дроби? Использовать ООП?

Добавлено через 4 минуты
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
#include <iostream>
#include <cassert>
 
using namespace std;
 
int gcd(int a, int b) {
    while (b > 0) {
        int c = a % b;
        a = b;
        b = c;
    }
    return a;
}
 
int lcm(int a, int b) {
    return (gcd(a, b) * a * b);
}
 
class Fraction
{
private:
    int m_numerator;
    int m_denominator;
    void reduce();
public:
    Fraction(): m_numerator(0), m_denominator(1)
    {    }
    Fraction(int numerator, int denominator=1) 
    {
        m_numerator=numerator;
        m_denominator=denominator;
        reduce();
    }
    Fraction operator=(Fraction a);
    Fraction operator+(Fraction fraction);
    Fraction operator*(Fraction fraction);
    Fraction operator/(Fraction fraction);
    friend ostream& operator<< (ostream &out, const Fraction &fr);
};
 
ostream& operator<< (ostream &out, const Fraction &fr)
{
    out << fr.m_numerator << "/" << fr.m_denominator;
    return out;
}
 
void Fraction::reduce() {
    int gcd_res = gcd(abs(m_numerator), m_denominator);
    if (gcd_res != 1) {
        m_numerator = m_numerator / gcd_res;
        m_denominator = m_denominator / gcd_res;
    }
}
 
Fraction Fraction::operator=(Fraction a)
{
    m_numerator = a.m_numerator;
    m_denominator = a.m_denominator;
    return *this;
}
 
Fraction Fraction::operator*(const Fraction fraction) {
    int n = m_numerator * fraction.m_numerator;
    int d = m_denominator * fraction.m_denominator;
    return Fraction(n,d);
}
 
Fraction Fraction::operator/(Fraction fraction) {
    int n = m_numerator * fraction.m_denominator;
    int d = m_denominator * fraction.m_numerator;
    return Fraction(n,d);
}
 
Fraction Fraction::operator+(Fraction fraction) {
    int unionDenominator = lcm(m_denominator, fraction.m_denominator);
    int relNumerator = m_numerator * fraction.m_denominator;
    int mulNumerator = fraction.m_numerator * m_denominator;
    m_numerator = relNumerator + mulNumerator;
    m_denominator = unionDenominator;
    reduce();
    return *this;
}
 
int main()
{
    Fraction a(2, 3), b(5, 6), c(3, 7), d(3, 5), res, res1, res2, res3;
    res1 = a / b; // должно быть 4 / 5
    res2 = c * d; // должно быть 9 / 35
    res3 = b / a; // должно быть 5 / 4, а выводит 25 24, если закомментировать res1, то правильно будет считать
    cout << res1 << " -- " << res2 << " -- " << res3 << endl;
    cout << res1 + res2 + res3 << endl;
    cout << (a / b) + (c * d) + (b / a);
    return 0;
}
1
 Аватар для ram876
759 / 456 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
13.01.2022, 13:14
Кликните здесь для просмотра всего текста
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
#include <iostream>
struct drob;
void shortDrob(drob & d);
struct drob
{
    int chis, del;
    drob()
    {
        chis = 0;
        del = 0;
    };
    drob(const int a, const int b): chis(a), del(b)
    {
        shortDrob(*this);
    }
};
void shortDrob(drob & d)
{
    while(d.chis % 2 == 0 && d.del % 2 == 0)
    {
        d.chis /= 2;
        d.del /= 2;
    }
    if(d.chis > d.del && d.chis % d.del == 0 && d.del != 1)
    {
        d.chis /= d.del;
        d.del = 1;
    }
    if(d.chis < d.del && d.del % d.chis == 0 && d.chis != 1)
    {
        d.del /= d.chis;
        d.chis = 1;
    }
}
drob sum(const drob & s1, const drob & s2)
{
    drob temp;
    if(s1.del == s2.del)
    {
        temp.chis = s1.chis + s2.chis;
        temp.del = s1.del;
    }
    else
    {
        temp.chis = s1.chis * s2.del + s2.chis * s1.del;
        temp.del = s1.del * s2.del;
    }
    shortDrob(temp);
    return temp;
}
int main() 
{ 
    int a, b, c, d;
    std::cin >> a >> b >> c >> d;
    drob d1(a, b);
    drob d2(c, d);
    drob d3 = sum(d1, d2);
    std::cout << d3.chis << "/" << d3.del; 
    
    return 0; 
}
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38160 / 21095 / 4306
Регистрация: 12.02.2012
Сообщений: 34,677
Записей в блоге: 14
13.01.2022, 21:40
ram876, конструктор по умолчанию - просто класс! Неплохо и сокращение дробей (shortDrob)... Что ты за фигню выложил?
0
13.01.2022, 23:14

Не по теме:

Я учусь:)

0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
14.01.2022, 03:18
Цитата Сообщение от Catstail Посмотреть сообщение
int m_numerator;
    int m_denominator;
Уже начал забывать, как выглядит венгерская нотация.

Я таки извиняюсь, уважаемый Catstail, но откуда у вас такая кривая копипаста?

Все параметры в методах передаются по значению, оператор присваивания для тривиального объекта во-первых, явно написан, во-вторых принимает и возвращает(!) по значению...

"Не верю!", короче.

Цитата Сообщение от ram876 Посмотреть сообщение
Я учусь
Отличная попытка. Лайк, но кот надо доработать.

Добавлено через 39 минут
Разусложнил и исправил очевидные недочёты.
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
#include <iostream>
 
// Euclidean GCD algorithm
int gcd(int a, int b) {
    while (b > 0) {
        int c = a % b;
        a = b;
        b = c;
    }
    return a;
}
 
struct Fraction {
public:
    Fraction(): numerator{0}, denominator{1} {}
    Fraction(int numerator, int denominator): numerator{numerator}, denominator{denominator} {
        reduce();
    }
    Fraction(int number): numerator{number}, denominator{1} {}
    int getNumerator() const {
        return numerator;
    }
    int getDenominator() const {
        return denominator;
    }
private:
    void reduce() {
        int divisor = gcd(abs(numerator), denominator);
        if (divisor != 1) {
            numerator = numerator / divisor;
            denominator = denominator / divisor;
        }
        if (denominator < 0) {
            denominator = -denominator;
            numerator = -numerator;
        }
    }
    int numerator;
    int denominator;
};
 
Fraction operator+(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator() + b.getNumerator() * a.getDenominator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator-(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator() - b.getNumerator() * a.getDenominator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator*(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getNumerator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator/(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator(), a.getDenominator() * b.getNumerator()};
}
 
std::ostream &operator<<(std::ostream &out, const Fraction &f) {
    return out << f.getNumerator() << "/" << f.getDenominator();
}
 
int main() {
    std::cout << Fraction{1, -2} + Fraction{1, -3} << std::endl;
    std::cout << Fraction{1} / Fraction{3, 2} << std::endl;
 
    return 0;
}
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
14.01.2022, 03:18
Лучший ответ Сообщение было отмечено aleksskay4 как решение

Решение

Разусложнил и исправил очевидные недочёты.
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
#include <iostream>
 
// Euclidean GCD algorithm
int gcd(int a, int b) {
    while (b > 0) {
        int c = a % b;
        a = b;
        b = c;
    }
    return a;
}
 
struct Fraction {
public:
    Fraction(): numerator{0}, denominator{1} {}
    Fraction(int numerator, int denominator): numerator{numerator}, denominator{denominator} {
        reduce();
    }
    Fraction(int number): numerator{number}, denominator{1} {}
    int getNumerator() const {
        return numerator;
    }
    int getDenominator() const {
        return denominator;
    }
private:
    void reduce() {
        int divisor = gcd(abs(numerator), denominator);
        if (divisor != 1) {
            numerator = numerator / divisor;
            denominator = denominator / divisor;
        }
        if (denominator < 0) {
            denominator = -denominator;
            numerator = -numerator;
        }
    }
    int numerator;
    int denominator;
};
 
Fraction operator+(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator() + b.getNumerator() * a.getDenominator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator-(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator() - b.getNumerator() * a.getDenominator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator*(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getNumerator(), a.getDenominator() * b.getDenominator()};
}
 
Fraction operator/(const Fraction &a, const Fraction &b) {
    return {a.getNumerator() * b.getDenominator(), a.getDenominator() * b.getNumerator()};
}
 
std::ostream &operator<<(std::ostream &out, const Fraction &f) {
    return out << f.getNumerator() << "/" << f.getDenominator();
}
 
int main() {
    std::cout << Fraction{1, -2} + Fraction{1, -3} << std::endl;
    std::cout << Fraction{1} / Fraction{3, 2} << std::endl;
 
    return 0;
}
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38160 / 21095 / 4306
Регистрация: 12.02.2012
Сообщений: 34,677
Записей в блоге: 14
14.01.2022, 06:21
Цитата Сообщение от lemegeton Посмотреть сообщение
Я таки извиняюсь, уважаемый Catstail, но откуда у вас такая кривая копипаста?
- это действительно не вполне мой код (я откуда-то с Форума взял неработающий вариант и запустил). Но поскольку выложил я, то считайте его моим. За замечания - спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2022, 06:21
Помогаю со студенческими работами здесь

Функция сложения элементов двух массивов
Доброго времени суток. Нужна помощь. Задание :Написать функцию, сложения элементов двух массивов. Массивы задаются динамически и...

Функция сложения двух переменных типа float
Недавно начал изучать с++ и тут проблема появилась #include &lt;iostream&gt; #include &quot;Header.h&quot; int main() { float a =...

Функция для сложения факториалов двух чисел
Даны числа N&lt;M. Вычислить N! + !M. Сложность для меня заключается в чем? в том что преподаватель за простое сложение факториалов дает...

Функция сложения двух чисел, используя только добавление единицы
Написать функцию сложения двух чисел, используя только прибавление единицы.

Рекурсия: функция умножения двух чисел, используя только операцию сложения
Напишите функцию умножения двух чисел, используя только операцию сложения(через рекурсию)


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru