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

Массивы. Классы. Нахождение среднего значения дробей - C++

Восстановить пароль Регистрация
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:38     Массивы. Классы. Нахождение среднего значения дробей #1
Напишите функцию main(), которая получает случайные дробные числа от пользователя, сохраняет их в массиве типа fraction, вычисляет среднее значение и выводит результат.

т.е. пользователь вводит к примеру 1/2, 2/3, 3/4, 4/5 а в ответ получает среднее значение 419/720
программа работает неправильно, выводит ноли. где ошибка?


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
#include "stdafx.h"
#include <iostream>     
#include <cmath>
using namespace std;
class Fraction
{
    private:
        int numerator, denominator;
    public:
        Fraction():numerator(0), denominator(0)
        {}
        void get_fr() //метод получания дроби
        {
            char ch;
            cout << "enter fraction" << endl;
            cin >> numerator >> ch >> denominator;
        }
        void add_fr(Fraction f1, Fraction f2) //метод сложения двух дробей
        {
            numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator; 
            denominator = f1.denominator * f2.denominator;
        }
        void mul_fr (Fraction f1, int n) //метод деления суммы дробей на количество их самих (умножение знаменателя на это число)
        {
            denominator = f1.denominator * n; 
        }
 
        void lowterms () //метод сокращения дроби
        {
            long tnum, tden, temp, gcd;
            tnum = labs(numerator);            // используем неотрицательные 
            tden = labs(denominator);            // значения (нужен cmath)
            if( tden == 0 )              // проверка знаменателя на 0
              { cout << "Недопустимый знаменатель!"; exit(1); }
            else if( tnum == 0 )         // проверка числителя на 0
              { numerator=0; denominator = 1; return; }
// нахождение наибольшего общего делителя
            while(tnum !=0)
            {
              if( tnum < tden )          // если числитель больше знаменателя,
                { temp=tnum; tnum=tden; tden=temp; } //меняем их местами
                 tnum = tnum - tden;        // вычитание
            }
            gcd = tden;                  // делим числитель и знаменатель на
            numerator = numerator / gcd;             // полученный наибольший общий делитель
            denominator = denominator / gcd;
        }
        void disp_fr()const
        { cout << "\nthe average is " << numerator << "/" << denominator << endl; }
};
int main()
{
    Fraction fraction [100];
    Fraction frtemp, frsum;
    char ans;
    int n=0;
    do //ввод дробей в массив
    {
        fraction[n++].get_fr();     
        cout << "continue typing? (y/n)" << endl; cin >> ans;
    }
    while (ans != 'n');
    for (int j = 0; j<n; j++) //сложение дробей
    {
        frtemp.add_fr(fraction[j], fraction[j++]);
        j++;
        frsum.add_fr(frtemp, frsum);
    }
    frsum.mul_fr(frsum, n+1); //деление на их кол-во
    frsum.lowterms(); //сокращение
    frsum.disp_fr(); //вывод на экран
    system("pause");
    return 0;
}
Добавлено через 40 минут
думаю там проблема в цикле сложения дробей в функции main
никогда не дружила с циклами
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
25.07.2014, 01:51     Массивы. Классы. Нахождение среднего значения дробей #2
Не тот раздел. Вот тут пишите http://www.cyberforum.ru/qt/
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:54  [ТС]     Массивы. Классы. Нахождение среднего значения дробей #3
Цитата Сообщение от Bend3r Посмотреть сообщение
Не тот раздел. Вот тут пишите
буду считать как повышение статуса от новичка, не зря сижу мучаюсь спасибо.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
25.07.2014, 01:56     Массивы. Классы. Нахождение среднего значения дробей #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
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
//класс рациональная дробь
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
 class rat
 {
   int ch; // числитель
   int zn;//знаменатель
   friend istream &operator>>(istream&, rat&);
   friend ostream &operator<<(ostream&, rat&);
   int nod(int, int);// nod() вычисляет наибольший общий делитель x и y
   int abs(int);// abs возвращает x для положительных и -x для отрицательных
 public:
  rat(int=0, int=1);//конструктор с параметрами
  void norm();
  rat operator*(const rat&) const;
  rat operator+(const rat&) const;
  rat operator-(const rat&) const;
  rat operator/(const rat&) const; // деление рациональных (дробных) чисел
};
int rat::abs(int x)
{
if(x<0) return (-1)*x;
 return x;
}
int rat::nod(int x, int y)
{
if(x==0 || y==0) return 1;
while(x!=y)
if(x>y)
 x=x-y;
else y=y-x;
return x;
}
rat::rat(int x, int y)// конструктор инициализирует рац. число // по умолчанию 0/1
{
if(!y || !x)
{
ch=0;zn=1;
}
ch=x;
zn=y;
this->norm();
}
void rat::norm()//norm() для сокращения дроби.
{
int sign=1;
if(ch*zn< 0)
 sign=(-1);
 ch=abs(ch);
zn=abs(zn);
int b=nod(ch, zn);
if(ch==0 || zn==0)
zn=1;
if(b==1) return;
ch=(ch/b)*sign;
zn=zn/b;
}
rat rat::operator*(const rat& rvalue) const
{
rat temp;
temp.ch=ch * rvalue.ch;
temp.zn=zn * rvalue.zn;
temp.norm();
 return temp;
}
rat rat::operator+(const rat& rvalue) const
{
rat temp;
temp.ch=rvalue.zn*ch + rvalue.ch*zn;
temp.zn=zn * rvalue.zn;
temp.norm();
 return temp;
}
rat rat::operator-(const rat& rvalue) const
{
rat temp;
temp.ch=rvalue.zn*ch - rvalue.ch*zn;
temp.zn=zn * rvalue.zn;  temp.norm(); return temp;
 }
rat rat::operator/(const rat& rvalue) const
{
rat temp;
temp.ch=ch* rvalue.zn;
temp.zn=zn * rvalue.ch;
temp.norm();
 return temp; }
 
istream &operator>>(istream &stream_in, rat &rvalue)
{
cout << "Введите числитель и знаменатель (a/b): ";
stream_in >> rvalue.ch; stream_in.ignore();
stream_in >> rvalue.zn;
 cout << endl;
 return stream_in;
}
ostream &operator<<(ostream &stream_out, rat &rvalue)
{
stream_out << "Рациональная дробь: " << rvalue.ch << "/" << rvalue.zn <<endl;
return stream_out;
}
int main()
{
system("chcp 1251 > nul");
rat a, b; //  объявление объектов типа rat
cin >>a;  // ввод первого рационального числа
cin >> b; // ввод второго рационального числа
rat c;
c = a/b;//деление перегруженным оператором /
cout << c << endl;
rat d;
d = a * b;//умножение перегруженным оператором *
cout << d << endl;
rat k;
k = a + b;//сложение перегруженным оператором +
cout << k << endl;
return 0;
}
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:59  [ТС]     Массивы. Классы. Нахождение среднего значения дробей #5
Цитата Сообщение от Genn55 Посмотреть сообщение
Посмотрите,возможно вам поможет.
ой-ой, много еще не знакомых слов(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 03:07     Массивы. Классы. Нахождение среднего значения дробей #6
Цитата Сообщение от Bend3r Посмотреть сообщение
Не тот раздел. Вот тут пишите
Каким боком здесь Qt?
Цитата Сообщение от Pari Посмотреть сообщение
Код C++ (QT)
Pari, зачем код так оформляете? В qtcreator программируете?
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 03:11  [ТС]     Массивы. Классы. Нахождение среднего значения дробей #7
Цитата Сообщение от alsav22 Посмотреть сообщение
зачем код так оформляете? В qtcreator программируете?
ой... я перепутала... извините, я в Visual studio пишу код
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 03:15     Массивы. Классы. Нахождение среднего значения дробей #8
Цитата Сообщение от Pari Посмотреть сообщение
ой... я перепутала... извините
Извиняться не за что, но из-за этого, если я правильно понял, вас в Qt-раздел отправили.
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 03:17  [ТС]     Массивы. Классы. Нахождение среднего значения дробей #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Извиняться не за что, но из-за этого, если я правильно понял, вас в Qt-раздел отправили.
ой какой я дибииил.... сейчас сквозь землю от стыда провалюсь.
я и там создала тему сдуру. а тут мне никто так и не помог(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 04:17     Массивы. Классы. Нахождение среднего значения дробей #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Количество введённых дробей должно быть чётным:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    for (int j = 0; j < n; ++j) //сложение дробей
    {
        frtemp.add_fr(fraction[j], fraction[j + 1]);
        if (j == 0)
            frsum = frtemp;
        else
            frsum.add_fr(frtemp, frsum);
        j++;
    }
    frsum.mul_fr(frsum, n); //деление на их кол-во
    frsum.lowterms(); //сокращение
    frsum.disp_fr(); //вывод на экран
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 04:46  [ТС]     Массивы. Классы. Нахождение среднего значения дробей #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Количество введённых дробей должно быть чётным:
спасибо огромное! сколько я голову ломала!
только я не совсем понимаю условие
C++
1
2
 if (j == 0)
            frsum = frtemp;
наверное это уже потому что я примерно 12-тый час подряд пишу коды %)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 04:54     Массивы. Классы. Нахождение среднего значения дробей
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 04:54     Массивы. Классы. Нахождение среднего значения дробей #12
Цитата Сообщение от Pari Посмотреть сообщение
только я не совсем понимаю условие
Первую сумму просто добавить в frsum (не через add_fr()), иначе, из-за того, что сначала в frsum numerator == 0 и denominator == 0, то через add_fr() получатся нули:
Цитата Сообщение от Pari Посмотреть сообщение
выводит ноли
Yandex
Объявления
25.07.2014, 04:54     Массивы. Классы. Нахождение среднего значения дробей
Ответ Создать тему
Опции темы

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