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

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

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

Нахождение среднего значения дробей - C++

25.07.2014, 01:57. Просмотров 491. Ответов 2
Метки нет (Все метки)

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

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

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

Задача на масив.Ввод дробей и вычисление среднего значения дроби! - 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++
В общем, смысл таков, есть два цикла: j и i, в цикле j я хочу найти минимальное из десяти генерируемых а. А в цикле i сложить 1000 раз эти...

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

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

2
alexey_rage
586 / 386 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.07.2014, 09:25 #2
Цитата Сообщение от Pari Посмотреть сообщение
где ошибка?
Полагаю, что ошибка может быть здесь:
C++ (Qt)
1
2
3
            gcd = tden;                  // делим числитель и знаменатель на
            numerator = numerator / gcd;             // полученный наибольший общий делитель
            denominator = denominator / gcd;
Так как numerator и denominator имеют тип int, то при делении дробная часть отбрасывается.

Вопрос на засыпку - а при чем здесь Qt ???
0
Ev_Hyper
Заблокирован
25.07.2014, 09:59 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Pari, вот тут у вас ошибка:

C++ (Qt)
1
        frtemp.add_fr(fraction[j], fraction[j++]);
j++ - постфиксная форма, а значит вы складываете дробь саму с собой.
Перепишите этот цикл вот так:
C++ (Qt)
1
2
3
4
5
    for (int j = 0; j<n; j+=2) //сложение дробей
    {
        frtemp.add_fr(fraction[j], fraction[j+1]);
        frsum.add_fr(frtemp, frsum);
    }
Далее ошибка тут-же, но уже алгоритмическая.
C++ (Qt)
1
2
3
4
5
        void add_fr(Fraction f1, Fraction f2) //метод сложения двух дробей
        {
            numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator; 
            denominator = f1.denominator * f2.denominator;
        }
Так как переменная "сумма" по умолчанию у вас равна 0, то во всех случаях результат будет 0/0.
Как один из вариантов решения проблемы, добавьте проверку:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
 void add_fr(Fraction f1, Fraction f2) //метод сложения двух дробей
        {
            if(f1.denominator !=0 && f2.denominator!=0){
            numerator = f1.numerator * f2.denominator + f1.denominator * f2.numerator; 
            denominator = f1.denominator * f2.denominator;
            }
            else 
            {
                numerator = f1.numerator;
                denominator = f1.denominator;
            }
        }
Но все-же проверку на то, что знаменатель !=0 нужно сделать при вводе значений.
После такого исправления решение тестового примера дало 163/300. Где-то ошибка - идем дальше.
В строке 69, нужно изменить с (n+1) на n. Так как у вас при считывании идет (n++), значит при вводе 4 дроби n = 4, т.е. количеству элементов.
C++ (Qt)
1
frsum.mul_fr(frsum, n); //деление на их кол-во
Запускаем, увы...результат не тот который нужен. Смотрим:
Кликните здесь для просмотра всего текста

Код
enter fraction
1/2
continue typing? (y/n)
y
enter fraction
2/3
continue typing? (y/n)
y
enter fraction
3/4
continue typing? (y/n)
y
enter fraction
4/5
continue typing? (y/n)
n

the average is 326/120
 4

the average is 326/480

the average is 163/240
Для продолжения нажмите любую клавишу . . .

В чем же ошибка?
Проверяем:
суммирует правильно:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{1}{2}+\frac{2}{3}+\frac{3}{4}+\frac{4}{5}=<br />
\frac{7}{6}+\frac{3}{4}+\frac{4}{5}=<br />
\frac{28+18}{24}+\frac{4}{5}=<br />
\frac{230+96}{120}=\frac{326}{120}
деление на кол-во то-же.
от сокращения результат не измениться, но
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{326}{120}=0.67916... т.е. грубо говоря в районе 2/3.
Сравнивам с
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{419}{720}=0.58194... т.е. примерно 14/24.
чисто логически первый вариант более правильный, чем тот, который привел вы.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 09:59
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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