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


Автор: En_t_end 9.3.2005, 10:00
Код

........................................
double midle_ar(ifstream& in_f, int& kolvo)
{
    double num, res;
    res = NULL;
    int i = 0;
    while(in_f >> num)
    {
        res += num;
        i++;
    }
    kolvo = i;
    return(res/i);
}

void midle_kv_sw_m(ifstream& in_f, double ar, int kolvo)
{
    double num;
    int i = 1;
    if(ar != 0)
    {
        cout << "Srednekvadraticheskoe otklonenie chisel." << endl;
        while(in_f >> num)
        {
            cout << i << " - " 
                << sqrt(pow((num - ar), 2.0)/static_cast<double>(kolvo)) 
                << endl;
            i++;
        }
    }
}
..............................

Нутром чую, что где-то напортачил, но вот где ?
Эти функции в составе работющей 100% программы. in_f открыт и связан с файлом.

Автор: maxim1000 9.3.2005, 10:49
так все-таки
Цитата
напортачил

или
Цитата
в составе работющей 100% программы

smile
вообще, конечно же, такой подход не очень хорош, т.к. требует двух проходов по файлу (а если тебе понадобится вводить числа с клавиатуры, то вообще ужас получится)
поэтому перед тем, как садиться за комп и писать программу, надо сесть за бумажку и пописать немного формул smile
M(x-M(x))^2=M(x^2 - 2*x*M(x) + M(x)^2)=M(x^2) - 2*M(x)^2 + M(x)^2=M(x^2)-M(x)^2
M - среднее
поэтому для вычисления ср.кв.отклонения достаточно вычислить среднее величины и среднее ее квадрата (а их можно вычислять независимо и параллельно)
вот и получается:
Код

{
  int n;
  double m,m2,num;
  n=0;
  m=0;
  m2=0;
  while(in_f>>num)
  {
    m+=num;
    m2+=num*num;
    n++;
  }
  m/=n;
  m2/=n;
  return m2-m*m;
}

Добавлено @ 10:51
и еще:
Цитата
res = NULL

NULL - константа, специально предназначенная для указателей, не стоит ее использовать для double
Добавлено @ 10:54
ну и еще smile
Цитата
if(ar != 0)

в этой строке сразу две ошибки smile
1. не стоит применять к double операторы ==, !=, кроме того если у тебя было несколько ненулевых чисел с нулевым средним, их среднее из-за округления очень редко будет 0
2. эта проверка вообще не нужна: ср.кв.отклонение успешно определяется и в случае нулевого среднего smile

Автор: En_t_end 9.3.2005, 15:54
Просто я сейчас решаю задачи, направленные на проверку знаний синтаксиса.
В данном случае было поставленно условие - двойной проход по файлу.
Код

в этой строке сразу две ошибки 
1. не стоит применять к double операторы ==, !=, кроме того если у тебя было несколько ненулевых чисел с нулевым средним, их среднее из-за округления очень редко будет 0
2. эта проверка вообще не нужна: ср.кв.отклонение успешно определяется и в случае нулевого среднего 

О... а вот за это спасибо.
Цитата

поэтому перед тем, как садиться за комп и писать программу, надо сесть за бумажку и пописать немного формул

Написано было за 14 минут до школы, поэтому ни о какой бумажке, я подумать не успел ))))

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