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

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

Восстановить пароль Регистрация
 
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 01:57     Нахождение среднего значения дробей #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;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 01:57     Нахождение среднего значения дробей
Посмотрите здесь:

C++ Задача на масив.Ввод дробей и вычисление среднего значения дроби!
C++ Нахождение среднего балла
Нахождение среднего значения C++
нахождение среднего значения суммы дробей C++
C++ Нахождение среднего значения
Структуры. Нахождение среднего значения. C++
ООП. нахождение суммы обыкновенных дробей с выделенной целой частью C++
C++ Массивы. Классы. Нахождение среднего значения дробей

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alexey_rage
 Аватар для alexey_rage
584 / 384 / 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 ???
Ev_Hyper
 Аватар для Ev_Hyper
1807 / 1628 / 435
Регистрация: 15.12.2013
Сообщений: 5,790
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.
чисто логически первый вариант более правильный, чем тот, который привел вы.
Yandex
Объявления
25.07.2014, 09:59     Нахождение среднего значения дробей
Ответ Создать тему
Опции темы

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