Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2012, 09:51   #1
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Вопрос Проблема с выводом в консоль (C++)

Здравствуйте. Возникла маленькая проблема с выводом в этой программе. Сама программа считает среднее и среднеарифметическое отклонение. Но меня интересует вывод на экран полученного значения.
Так если в предпоследней строке убрать sqrt() оставив только sum/n, то в консоли при выводе значения, посчитанного stDev(), будет просто inf. Если же включить строку cout<<"av="<<av; или что либо еще связанное с выводом в самой stDev(), то в консоли появится правильное численное значение (sum/n).

С чем связана такая неопределенность? Заранее спасибо!

Код:
#include <iostream>
#include <math.h>

using namespace std;

void madeMass(float*& m,int n);
float average(float* m,int n);
float stDev(float* m, int n);

int main()
{
    int n;
    cout << "Input amount of numbers(0 for exit): ";
    cin>>n;
    if(n!=0)
    {
        float* mass;
        madeMass(mass,n);
        cout<<average(mass,n)<<" - average\n";
        cout<<stDev(mass,n)<<" - standart devation\n";
    }
    return 0;
}
void madeMass(float*& m,int n)
{
    m=new float[n];
    cout<<"Input "<<n<<" numbers divide spaces, then press Enter: ";
    for(int i=0;i<n;i++)
        cin>>m[i];
    cout<<"\nYou inputed: ";
    for(int i=0;i<n;i++)
        cout<<m[i]<<" ";
    cout<<"\n";
}
float average(float* m,int n)
{
    float sum;
    for(int i=0;i<n;i++)
        sum+=m[i];
    return sum/n;
}
float stDev(float* m, int n)
{
    float sum;
    float av=average(m,n);
    //cout<<"av="<<av; //<----------При включении этой строки вывод работает нормально
    for(int i=0;i<n;i++)
    {
        sum+=pow((m[i]-av),2);
    }
    return sqrt(sum/n); // <-----------Интересующая строка
}

Последний раз редактировалось Hal9000; 24.01.2012 в 10:08.
Hal9000 вне форума Ответить с цитированием
Старый 24.01.2012, 11:52   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Код:
float stDev(float* m, int n)
{
    float sum;
    float av=average(m,n);
    //cout<<"av="<<av; //<----------При включении этой строки вывод работает нормально
    for(int i=0;i<n;i++)
    {
        sum+=pow((m[i]-av),2);
    }
    return sqrt(sum/n); // <-----------Интересующая строка
}
sum = 0; не?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 24.01.2012, 14:00   #3
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
sum = 0; не?
Если бы и ноль, то с чего ему выдавать inf ? Ноль бы и выдавало.
Может это только у меня такая ерунда с inf?
Hal9000 вне форума Ответить с цитированием
Старый 24.01.2012, 14:11   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Hal9000 Посмотреть сообщение
Если бы и ноль, то с чего ему выдавать inf ? Ноль бы и выдавало.
Может это только у меня такая ерунда с inf?
Ты не понял.
Переменную sum ты объявил, а инициализировать ее кто будет?
Вот тут, при первом проходе, чему равно значение переменной?
Код:
for(int i=0;i<n;i++)
    {
        sum+=pow((m[i]-av),2);
    }
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 24.01.2012, 15:03   #5
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Ты не понял.
Переменную sum ты объявил, а инициализировать ее кто будет?
А, да я пробовал её инициализировать, но это тоже безрезультатно. Да, про инициализацию в С++ нельзя забывать.

Возник второй вопрос, почему даже без инициализации sum у меня получается правильный результат?
Компилятор в каких-то случаях сам инициализирует переменные нулем?

Последний раз редактировалось Hal9000; 24.01.2012 в 15:18.
Hal9000 вне форума Ответить с цитированием
Старый 24.01.2012, 15:58   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Хм...
Попробуй перенести инициализацию динамического массива в main.
Вот так у меня работает без нареканий:
Код:
#include <iostream>
#include <cmath>

using namespace std;

void madeMass(float *m, int n);
float average(float *m, int n);
float stDev(float *m, int n);

int main()
{
    int n;
    cout << "Input amount of numbers(0 for exit): ";
    cin >> n;
    if(n != 0)
    {
        float *mass = new float[n];
        madeMass(mass, n);
        cout << average(mass,n) << " - average\n";
        cout << stDev(mass, n) << " - standart devation\n";
    }
    return 0;
}
void madeMass(float *m, int n)
{
    cout << "Input " << n << " numbers divide spaces, then press Enter: ";
    for(int i =0 ; i<n; i++)
        cin >> m[i];
    cout << "\nYou inputed: ";
    for(int i = 0; i < n; i++)
        cout << m[i] << " ";
    cout << "\n";
}

float average(float *m, int n)
{
    float sum = 0.0;
    for(int i = 0; i < n; i++)
        sum += m[i];
    return (sum / n);
}

float stDev(float *m, int n)
{
    float sum = 0.0;
    float av = average(m, n);
    for(int i = 0; i < n; i++)
    {
        sum += pow((m[i] - av), 2);
    }
    return sqrt(sum / n);
}
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 24.01.2012, 16:47   #7
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Хм...
Попробуй перенести инициализацию динамического массива в main.
Вот в том то и фишка если sqrt() в предпоследней строке убрать и оставить там sum/n, то опять inf выводиться будет. Хотя должно дисперсию выдавать.
Проблема вообще неожиданная для меня, просто боюсь с этой фигней опять где столкнуться.
Hal9000 вне форума Ответить с цитированием
Старый 24.01.2012, 17:44   #8
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Без sqrt() тоже все работает.
И у меня, и тут:
http://ideone.com/lWi1z
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 25.01.2012, 09:02   #9
Hal9000
Пользователь
 
Регистрация: 24.01.2012
Сообщений: 15
Радость

Видимо эта проблема связана со средой программирования(Code Blocks) и компилятором MinGW или еще с чем то. В общем тьфу на нее.

Спасибо за ресурс ideone.com, не знал о такой вещи.
Hal9000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с тегами и выводом NARKOM PHP 1 25.09.2011 10:29
проблема с выводом -=Andriushka=- Помощь студентам 0 13.04.2011 21:46
проблема с выводом в делфи shelest Помощь студентам 5 02.03.2010 20:12
Траблы с выводом в консоль NiggasLife Qt и кроссплатформенное программирование С/С++ 5 02.06.2009 23:58
Проблема с выводом текста limon PHP 6 30.11.2008 20:03