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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Spiderman5
31 / 31 / 14
Регистрация: 07.04.2014
Сообщений: 219
#1

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

25.04.2014, 23:10. Просмотров 559. Ответов 2
Метки нет (Все метки)

Ребята, написал задачу, есть небольшая проблема.
После сложения и вычитания дробь сокращается.
После умножения и деления не всегда сокращается. Например, после деления 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++
Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P:Q (Р − целое, Q —...

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

Структуры, работа с дробями. - C++
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Имеется такая задача: Создайте структуру, описывающую простую дробь....

Действия над матрицами - C++
Помогите выполнить действия над матрицами в С++ 2(А+В)(2В-А), где 3 4 5 А= 5 6 2 -1 3 1 -1 0 5 В = 0 1 3 ...

Действия над матрицами - C++
Привет программистам ! помогите плз вот в таком задании: ***** с клавиатуры задать матрицы А(n x n) и В(n x n). вычислит матрицу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fishec
119 / 119 / 30
Регистрация: 07.09.2013
Сообщений: 338
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
Сообщений: 219
26.04.2014, 00:02  [ТС] #3
Спасибо тебе большое !!! Я затупил, нужно ж было всего-то while использовать, а не if
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2014, 00:02
Привет! Вот еще темы с ответами:

Действия над арифметическим рядом - C++
Написать программу, позволяющую в зависимости от введенного параметра Pr (например, 1, 2, 3) выполнить одно из следующих действий: 1....

Марицы и действия над ними - C++
Помогите пожалуйста, я в С++ полный чайник, а очень надо решить задачку. Задачка такого типа: Определить сумму четных элементов...

Арифметические действия над числами - C++
Арифметические действия над числами пронумерованы следующим образом: 1 – сложение, 2 – вычитание, 3 – умножение, 4 – деление. Дан номер...

Указатели и действия над указателями - C++
char *ptr, result, s1; ptr = strtok(s1, &quot; &quot;); if (strstr(result, strcpy(&quot; &quot;, strcpy(ptr, &quot; &quot;))) == NULL) strcat_s(result,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru