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

Массив из дробей - C++

Восстановить пароль Регистрация
 
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 22:24     Массив из дробей #1
Добрый вечер! Необходимо ввести дробные числа, которые хранятся в массиве, сложить их и найти среднее.
Написал код:
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 "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////////
class fraction
{
private:
    int numenator;              // числитель
    int denominator;            // знаменатель
    char ch;                    // параметр для приема слэш при вводе дроби
    int x;
    int y;
public:
    fraction()                  // конструктор без аргументов
    { 
        numenator = 0; 
        denominator = 0;
    }
    fraction(int num, int den)
    {
        numenator = num;
        denominator = den;
    }
    void getData()                      // получает значения для дробей от пользователя
    {
        cout << "Введите дробь ";
        cin >> numenator >> ch >> denominator;
    }
    void showData()                             // выводит значение дроби на экран
    {
        cout << numenator << '/' << denominator << endl;
    }
    void averData(fraction f1, fraction f2)
    {
        numenator =f1. numenator * f2.denominator + f1.denominator * f2.numenator;
        denominator = f1.denominator * f2.denominator;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int MAX = 3;
    fraction f1 [MAX];
    fraction f2 (1, 1);
    for(int i = 0; i < MAX; i++)
    {
        f1[i].getData();
    }
    /*for(int j =0; j < MAX; j++)
    {
        f1[j].showData();
    }*/
    for(int j = 0; j < MAX; j++)
    {
        f2.averData(f2, f1[j]);
    }
    f2.showData();
    system("pause");
    return 0;
}
В программе знаменатель вычисляется верно, а вот к числителю прибавляется значение знаменателя. К сожалению знания, пока не такие хорошие, не понимаю, как обнулять знаменатель, чтобы он не участвовал в расчете числителя, но не терялся в расчете выражения знаменателя.

P.S. Среднее значение не рассчитывал еще.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dyosick
 Аватар для dyosick
61 / 61 / 6
Регистрация: 25.08.2008
Сообщений: 178
26.02.2011, 22:38     Массив из дробей #2
У тебя все считает правильно. В чем проблема?
Для удобства изменил:
C++
1
2
3
4
5
void getData()                                          // получает значения для дробей от пользователя
        {
                cout << "Enter fraction ";
                cin >> numenator>>'/'>> denominator;
        }
на
C++
1
cin >> numenator>> denominator;
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 22:50  [ТС]     Массив из дробей #3
Цитата Сообщение от dyosick Посмотреть сообщение
У тебя все считает правильно. В чем проблема?
Нет, в коде есть проблема, вот картинка:
Миниатюры
Массив из дробей  
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.02.2011, 22:52     Массив из дробей #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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int NSD (int a, int b)
{
   if (a%b == 0) return b;
   return NSD(b, a%b);
}
 
int NSK (int a, int b)
{
   return a*b/NSD(a, b);
}
 
class fraction
{
private:
        int numenator;                        
        int denominator;                   
        char ch;                                     
        int x;
        int y;
public:
        fraction()                                   
        { 
                numenator   = 1; 
                denominator = 1;
        }
        fraction(int num, int den)
        {
                numenator = num;
                denominator = den;
        }
        void getData()                                        
        {
                cout << "Введите дробь: ";
                cin >> numenator >> ch >> denominator;
        }
        void showData()                                                        
        {
                cout << numenator << '/' << denominator << endl;
        }
        fraction averData(fraction f2)
        {
                int nsk     = NSK(denominator, f2.denominator);
                numenator   = (denominator/nsk)*numenator + 
                              (f2.denominator/nsk)*f2.numenator;
                denominator = nsk;
                return *this;
        }
};
 
int main()
{
        setlocale(LC_ALL, "Russian");
        const int MAX = 3;
        fraction f1 [MAX];
        
        for(int i = 0; i < MAX; i++)
        {
                f1[i].getData();
        }
 
        for(int j = 1; j < MAX; j++)
                f1[0].averData(f1[j]);
        
        f1[0].showData();
        system("pause");
        return 0;
}


Добавлено через 1 минуту
zabuka, сделать полностью?
zabuka
 Аватар для zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
26.02.2011, 22:59  [ТС]     Массив из дробей #5
Цитата Сообщение от Mayonez Посмотреть сообщение
сделать полностью?
Нет, спасибо! Если возможно, лучше объясните смысл:
C++
1
2
3
4
5
6
7
8
9
10
int NSD (int a, int b)
{
   if (a%b == 0) return b;
   return NSD(b, a%b);
}
 
int NSK (int a, int b)
{
   return a*b/NSD(a, b);
}
и использование в расчете.
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
26.02.2011, 23:08     Массив из дробей #6
zabuka, первая функция ищет наибольший общий делитель (НОД)
вторая - НОК.
Чтобы сложить две дроби нужно иметь новый знаменатель - НОК двух предидущих;
это для того, чтобы знаменатели не так быстро росли (как у вас при их умножении)

Добавлено через 1 минуту
вот код полностью
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
int NSD (int a, int b)
{
   if (a%b == 0) return b;
   return NSD(b, a%b);
}
 
int NSK (int a, int b)
{
   return a*b/NSD(a, b);
}
 
class fraction
{
private:
        int numenator;                        
        int denominator;                   
        char ch;                                     
        int x;
        int y;
public:
        fraction()                                   
        { 
                numenator   = 1; 
                denominator = 1;
        }
        fraction(int num, int den)
        {
                numenator = num;
                denominator = den;
        }
        void getData()                                        
        {
                cout << "Введите дробь: ";
                cin >> numenator >> ch >> denominator;
        }
        void showData()                                                        
        {
                cout << numenator << '/' << denominator << endl;
        }
        fraction averData(fraction f2)
        {
                int nsk     = NSK(denominator, f2.denominator);
                numenator   = (denominator/nsk)*numenator + 
                              (f2.denominator/nsk)*f2.numenator;
                denominator = nsk;
                return *this;
        }
        
        fraction dil(int i)
        {
                denominator *= i;
        }
        
        void skorot()
        {
                int dil = NSD(numenator, denominator);
                numenator   /= dil;
                denominator /= dil;
        }
};
 
int main()
{
        setlocale(LC_ALL, "Russian");
        const int MAX = 3;
        fraction f1 [MAX];
        
        for(int i = 0; i < MAX; i++)
                f1[i].getData();
 
        for(int j = 1; j < MAX; j++)
                f1[0].averData(f1[j]);
                
        f1[0].dil(MAX);
        f1[0].skorot();
        cout << "Среднее арифметическое равно: ";
        f1[0].showData();
        system("pause");
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2012, 19:38     Массив из дробей
Еще ссылки по теме:

Сложение дробей C++
сложение дробей C++
Класс дробей C++

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

Или воспользуйтесь поиском по форуму:
alexminin007
 Аватар для alexminin007
7 / 7 / 1
Регистрация: 22.10.2012
Сообщений: 105
19.11.2012, 19:38     Массив из дробей #7
а как в массив записать дроби не подскажите?
Yandex
Объявления
19.11.2012, 19:38     Массив из дробей
Ответ Создать тему
Опции темы

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