Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Массив дробей и вычисление среднего


Автор: NeuZeitgeist 19.4.2009, 13:50
Решаю задачу из учебника Лафоре "ООП в С++" (Глава 7. Массивы и строки, з. №5, с. 308). Задача формулируется следующим образом:
Напишите программу, которая получает случайные дробные числа от пользователя, сохраняет их в массив, вычисляет среднее значение, выводит результат. Дроби должны быть представлены как класс.

Моя программа работает, но в ней все время появляется одно "мусорное" значение, т.е. в цикле выходит за границу массива. На результат это влияет, прога считает верно, но не нравится, что этот "мусор" выползает. Как правильно определить цикл, чтобы этого не было? Заранее спасибо. 
Код

//вычисление среднего арифметического массива дробей
#include <iostream>

using namespace std;
const int M = 3;
class fraction
{
    private:
        int a, b; //поля класса
    public:
        fraction() : a(0), b(0) {}//конструктор без аргументов
        fraction(int aa, int bb) : a(aa), b(bb) {}//конструктор с двумя аргументами

        void input()//метод ввода данных
        {   char ch;    cin >> a >> ch >> b;    }

        void output()//метод вывода данных
        {   cout << a << '/' << b;  }

        fraction fadd(fraction, fraction, fraction&);//прототип сложения
        fraction fdiv(fraction, fraction, fraction&);//прототип деления
};

int main()
{
    fraction d[M];//массив дробей
    fraction znam(M, 1);//знаменатель для вычисления среднего значения
    fraction rez(0, 0);//результат, среднее значение массива
    cout << "Vvedite " << M << " drobei" << endl;
    for(int i = 0; i < M; i++)
        d[i].input();
    cout << "\nVi vveli: ";
    for(int i = 0; i < M; i++)
    {
        d[i].output();
        cout << " ";
    }
    cout << endl;
    for(int i = 0; i < M; i++)
        d[i].fadd(d[i], d[i+1], d[i+1]);
    d[M-1].fdiv(d[M-1], znam, rez);
    cout << "Srednee ravno "; rez.output();
    return 0;
}

fraction fraction::fadd(fraction frac1, fraction frac2, fraction& frac3) //сложение
{
    frac3.a = frac1.a*frac2.b+frac2.a*frac1.b;
    frac3.b = frac1.b*frac2.b;
    return frac3;
}

fraction fraction::fdiv(fraction frac1, fraction frac2, fraction& frac3)//деление
{
    frac3.a = frac1.a*frac2.b;
    frac3.b  = frac1.b*frac2.a;
    cout << "a/b/c/d = " << frac3.a << '/' << frac3.b << endl;
    return frac3;
}



Автор: susanin 19.4.2009, 16:52
хм...странно...у меня никакого мусора не появилось...ввел 1/2 1/2 1/2...вывел среднее 12/24...все правильно...мусора не увидел нигде

Автор: NeuZeitgeist 19.4.2009, 17:13
Цитата(susanin @ 19.4.2009,  16:52)
хм...странно...у меня никакого мусора не появилось...ввел 1/2 1/2 1/2...вывел среднее 12/24...все правильно...мусора не увидел нигде

Да, верно, все работает как надо. Что-то меня уже переклинивает...
Сначала была ошибка, видимо исправил и даже не заметил smile
Все равно спасибо за внимание и ответ.

Автор: sdukshis 19.4.2009, 18:02
Возможно проблема в том, что Вы инициализируете b нулевым значением, хотя дробей с нулевым знаменателем быть не может.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)