Форум программистов, компьютерный форум CyberForum.ru

Действия над дробями с использованием структуры - C++

Восстановить пароль Регистрация
 
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
25.04.2014, 23:10     Действия над дробями с использованием структуры #1
Ребята, написал задачу, есть небольшая проблема.
После сложения и вычитания дробь сокращается.
После умножения и деления не всегда сокращается. Например, после деления 3/7 на 2/9 выдаёт результат 81/42 вместо 27/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
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
#include <iostream>
using namespace std;
 
struct Fraction
{
    int Numerator;
    int Denominator;
};
 
void Common_Denominator(Fraction &a, Fraction &b)
{
    int multiplier = 1;
    int multiplier1;
    int multiplier2;
    int common_denominator = 1;
 
    if (a.Denominator != b.Denominator)
    {
        common_denominator = a.Denominator * b.Denominator; // общий знаменатель
    }
    else
    {
        common_denominator = a.Denominator;
    }
 
    multiplier1 = common_denominator / a.Denominator;
    multiplier2 = common_denominator / b.Denominator;
 
    a.Numerator *= multiplier1;
    b.Numerator *= multiplier2;
 
    a.Denominator = common_denominator;
    b.Denominator = common_denominator;     
}
 
 
void Addition(Fraction &a, Fraction &b, Fraction &result) // сложение
{
    result.Denominator = a.Denominator;
    result.Numerator = a.Numerator + b.Numerator;
}
 
void Deduction(Fraction &a, Fraction &b, Fraction &result) // вычитание
{
    result.Denominator = a.Denominator;
    result.Numerator = a.Numerator - b.Numerator;
}
 
void Multiplication(Fraction &a, Fraction &b, Fraction &result) // умножение
{
    result.Numerator = a.Numerator * b.Numerator;
    result.Denominator = a.Denominator * b.Denominator;
}
 
void Division(Fraction &a, Fraction &b, Fraction &result) // деление
{
    result.Numerator = a.Numerator * b.Denominator;
    result.Denominator = a.Denominator * b.Numerator;
}
 
void Cancel(Fraction &a) // сокращение дроби
{
    int multiplier = 1;
        
        for (multiplier = 1; multiplier <= a.Numerator || multiplier <= a.Denominator; multiplier++)
        {
            if ((a.Numerator % multiplier == 0) && (a.Denominator % multiplier == 0))
            {
                a.Numerator /= multiplier;
                a.Denominator /= multiplier;
            }
        }       
}
 
void main()
{
    Fraction number1;
    Fraction number2;
    Fraction result;
 
    cout << "Enter first Numerator: ";
    cin >> number1.Numerator;
    cout << "Enter first Denominator: ";
    cin >> number1.Denominator;
 
    cout << "Enter second Numerator: ";
    cin >> number2.Numerator;
    cout << "Enter second Denominator: ";
    cin >> number2.Denominator;
    cout << endl;
 
    Common_Denominator(number1, number2);
 
    cout << number1.Numerator << " / " << number1.Denominator << endl;
    cout << number2.Numerator << " / " << number2.Denominator << endl;
    cout << endl;
 
    Addition(number1, number2, result);
    Cancel(result);
 
    cout << "Addition = ";
    cout << result.Numerator << " / " << result.Denominator << endl;
 
    Deduction(number1, number2, result);
    Cancel(result);
 
    cout << "Deduction = ";
    cout << result.Numerator << " / " << result.Denominator << endl;
 
    Multiplication(number1, number2, result);
    Cancel(result);
 
    cout << "Multiplication = ";
    cout << result.Numerator << " / " << result.Denominator << endl;
 
    Division(number1, number2, result);
    Cancel(result);
 
    cout << "Division = ";
    cout << result.Numerator << " / " << result.Denominator << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 23:10     Действия над дробями с использованием структуры
Посмотрите здесь:

C++ Действия над матрицами
действия над матрицами C++
C++ Действия над матрицами
Арифметические действия с дробями C++
Действия над массивами C++
Действия над арифметическим рядом C++
C++ Структуры, работа с дробями.
C++ Действия над строками char с использованием библиотечных функций и без них

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
25.04.2014, 23:33     Действия над дробями с использованием структуры #2
Замени функцию Cancel на такую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Cancel(Fraction &a) // сокращение дроби
{
    int multiplier = 1;
 
    for (multiplier = 2; multiplier <= a.Numerator || multiplier <= a.Denominator; multiplier++)
    {
        while ((a.Numerator % multiplier == 0) && (a.Denominator % multiplier == 0))
        {   
            a.Numerator /= multiplier;
            a.Denominator /= multiplier;
        }
    }
}
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 215
26.04.2014, 00:02  [ТС]     Действия над дробями с использованием структуры #3
Спасибо тебе большое !!! Я затупил, нужно ж было всего-то while использовать, а не if
Yandex
Объявления
26.04.2014, 00:02     Действия над дробями с использованием структуры
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru