Формула стандартного отклонения - PullRequest
0 голосов
/ 09 февраля 2020

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

Напишите программу, которая считывает данные набора результатов теста от пользователя. (Результаты теста должны быть введены в десятичной форме, чтобы представить оценку в процентах). Как только пользователь завершит ввод результатов теста (ввод -1 будет означать конец ввода), распечатайте количество введенных тестов, среднее значение тестов и стандартное отклонение. Используйте следующую формулу (метод Уэлфорда) для расчета стандартного отклонения: (Стандартная формула Девиатона)

Вы можете вычислить это количество, отслеживая количество (количество тестов), сумму и сумма квадратов при обработке входных значений. Примечание. Хотя существуют и другие способы расчета стандартного отклонения, используйте этот метод. Этот метод используется, поскольку он требует только один проход данных. Не используйте массивы или векторы.

Теперь приведенный ниже код - это то, что я имею до сих пор. В терминале я получаю неправильные цифры для среднего и стандартного. Выходы отклонения (Клеммный выход) . Что-то не так с моей математикой? Любая помощь приветствуется.

 #include <iostream>
    #include <cmath>
    using namespace std;
    int main()

    double sum = 0;
    double sumSq = 0;
    double grade = 0;
    int numtests = 0;

    cout << "Enter the test scores. Once finished, enter -1 to end input.\n";
    cin >> grade;

    while(grade != -1)
    {
            cin >>grade;
            sum = sum + grade;
            sumSq = sumSq + pow(grade,2);
            numtests++;
    }

    double average =(sum/numtests);
    double std = (sumSq - numtests*pow(average,2)/(numtests - 1));

    cout << "The number of scores: "<<numtests<<"\n";
    cout << "Average: "<<average<<"\n";
    cout << "Std. Deviation: "<<std<<"\n";




    return 0;

}

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Я считаю, что хороший способ отладки программы - часто притворяться, что я компьютер, и пытаться пройти программу по одной строке за раз, чтобы увидеть, что я делаю.

Если я следую вашей программе Через несколько строк я получаю оператор

cin >> grade;

Итак, я читаю число с входа и устанавливаю grade на это число.

Затем я ввожу while л oop. Обратите внимание, что я никогда не возвращаюсь go к какой-либо строке ранее while l oop. И нет другой строки программы, которая принимает какие-либо данные от cin. Поэтому я никогда больше ничего не читаю с cin.

Вы можете набрать все цифры, которые хотите, после первого. Программа не читает ни одного из них. Он занят выполнением того, что вы ему сказали, то есть продолжением цикла, пока grade не равно -1. Он будет продолжаться до тех пор, пока что-то еще не остановит запуск программы, потому что grade никогда не изменяется в l oop. Каждый раз, когда вы достигаете вершины l oop, grade по-прежнему равен первому введенному вами номеру.

Кстати, if с break в конце l oop полностью избыточен. Если у вас не было этого if, программа затем вернулась бы go к вершине l oop, а затем, если grade было равно -1, она бы завершилась. Так что в любом случае вы выходите в конце l oop, если grade становится -1 в течение l oop.

1 голос
/ 09 февраля 2020

Примечание: С while(grade != -1), if (grade != -1) break; является избыточным / избыточным.

Но, когда вы пытаетесь заключить число в квадрат, вы используете pow(2,x), который «2 возведено в степень х» - не то, что вы хотите.

Чтобы возвести в квадрат число x, вам нужно: pow(x,2)

...