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

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

Войти
Регистрация
Восстановить пароль
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
#1

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

25.07.2014, 01:38. Просмотров 478. Ответов 11
Метки нет (Все метки)

Напишите функцию 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
никогда не дружила с циклами
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 01:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массивы. Классы. Нахождение среднего значения дробей (C++):

Нахождение среднего значения дробей - C++
Напишите функцию main(), которая получает случайные дробные числа от пользователя, сохраняет их в массиве типа fraction, вычисляет среднее...

нахождение среднего значения суммы дробей - C++
Здравствуйте! Дело такое, нужно, имея класс fraction с 2мя полями int nominator, int denominator ( числитель / знаменатель) соответственно,...

Задача на масив.Ввод дробей и вычисление среднего значения дроби! - C++
#include &lt;iostream&gt; using namespace std; const int MAX=15; const int MAXI=13; int main() { int j,s,h,i,r; char...

Нахождение среднего значения - C++
Нужна помощь в написании функции-шаблона, которая считает среднее значение в массиве, самым простым методом Добавлено через 2 часа 32...

Нахождение среднего значения - C++
В общем, смысл таков, есть два цикла: j и i, в цикле j я хочу найти минимальное из десяти генерируемых а. А в цикле i сложить 1000 раз эти...

Структуры. Нахождение среднего значения. - C++
помгите найти мреднее значение ругается на ii=((matemat+rus)/2); #include&lt;math.h&gt; #include&lt;conio.h&gt; //#include&lt;iostream.h&gt; ...

11
Bend3r
149 / 136 / 18
Регистрация: 29.07.2012
Сообщений: 709
25.07.2014, 01:51 #2
Не тот раздел. Вот тут пишите http://www.cyberforum.ru/qt/
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:54  [ТС] #3
Цитата Сообщение от Bend3r Посмотреть сообщение
Не тот раздел. Вот тут пишите
буду считать как повышение статуса от новичка, не зря сижу мучаюсь спасибо.
0
Genn55
370 / 217 / 41
Регистрация: 26.12.2012
Сообщений: 713
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;
}
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:59  [ТС] #5
Цитата Сообщение от Genn55 Посмотреть сообщение
Посмотрите,возможно вам поможет.
ой-ой, много еще не знакомых слов(
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 03:07 #6
Цитата Сообщение от Bend3r Посмотреть сообщение
Не тот раздел. Вот тут пишите
Каким боком здесь Qt?
Цитата Сообщение от Pari Посмотреть сообщение
Код C++ (QT)
Pari, зачем код так оформляете? В qtcreator программируете?
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 03:11  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
зачем код так оформляете? В qtcreator программируете?
ой... я перепутала... извините, я в Visual studio пишу код
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 03:15 #8
Цитата Сообщение от Pari Посмотреть сообщение
ой... я перепутала... извините
Извиняться не за что, но из-за этого, если я правильно понял, вас в Qt-раздел отправили.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 03:17  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Извиняться не за что, но из-за этого, если я правильно понял, вас в Qt-раздел отправили.
ой какой я дибииил.... сейчас сквозь землю от стыда провалюсь.
я и там создала тему сдуру. а тут мне никто так и не помог(
0
alsav22
5425 / 4820 / 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(); //вывод на экран
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 04:46  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Количество введённых дробей должно быть чётным:
спасибо огромное! сколько я голову ломала!
только я не совсем понимаю условие
C++
1
2
 if (j == 0)
            frsum = frtemp;
наверное это уже потому что я примерно 12-тый час подряд пишу коды %)
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2014, 04:54 #12
Цитата Сообщение от Pari Посмотреть сообщение
только я не совсем понимаю условие
Первую сумму просто добавить в frsum (не через add_fr()), иначе, из-за того, что сначала в frsum numerator == 0 и denominator == 0, то через add_fr() получатся нули:
Цитата Сообщение от Pari Посмотреть сообщение
выводит ноли
1
25.07.2014, 04:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 04:54
Привет! Вот еще темы с ответами:

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

Массивы: исправить, доделать, добавить нахождение среднего рейтинга по каждому предмету для всех студентов - C++
Исправьте ошибки. И еще надо добавить нахождение среднего рейтинга по каждому предмету для всех студентов. #include &quot;stdafx.h&quot; ...

Двумерные массивы. Главная диагональ и произведение среднего арифметического значения элементов. - C++
Вот какая стоит передо мною задача: (программа на С++) &quot;Даны вещественные массивы D, S. Для каждого массива определить произведение...

Двухмерные массивы. Нахождение min значения в каждой строке. - C++
Помогите решить задачу. Дана матрица ахв, найти минимальное значение в каждой строке. не понять мне как присвоить найденное...


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

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

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