Привет всем! Мне необходимо создать программу, которая читает входной файл, содержащий цифры, а затем находит стандартное отклонение, используя следующий метод:
sqrt(( x1 - mu )^2 + ( x2 - mu )^2 + ( x3 - mu )^2 + ( x4 - mu )^2)/mu
Х равны прочитанным цифрам, а мю означает среднее. У меня проблемы с этим, потому что я не знаю, как установить различные переменные (x1, x2, x3, x4) для значений, которые считываются из входного файла в моем цикле while. Также важно отметить, что мы должны читать первую цифру, а затем каждую третью цифру после этого. Это то, что я до сих пор:
fin.open(FileName.c_str());
if (fin.fail())
{
cout <<"Bad file name or location.\n" ;
exit(0);
}
fin >> X;
first_score = X;
Counter = 0, Sum=0;
while (!fin.eof() )
{
Counter++;
if (Counter%3==0)
{
fin >> X;
Sum += X;
Counter++;
Counter2 ++ ;
Avg = (Sum+first_score)/(Counter2+1);
deviation = pow((X-Avg),2);
sum_of_deviations += deviation;
}
fin >> Score;
}
quotient_of_deviations = sum_of_deviations/Counter2;
standard_dev2 = sqrt(quotient_of_deviations);
fin.close();
Я знаю, что этот код является логически неправильным, потому что я вычитал различное среднее значение из каждого значения x. Кто-нибудь знает, как я мог назначить X в цикле while новой переменной каждый раз, когда запускается цикл while? Если я смогу это сделать, то смогу вычесть каждое значение x на одно и то же среднее значение за пределами цикла. Надеюсь, я объяснил это достаточно хорошо, чтобы вы, ребята, могли понять мою проблему. Если нет, я буду рад объяснить больше. Спасибо заранее за ваше время.
Если вы не хотите использовать массивы, возможно, вам придется читать файл несколько раз.
int counter = 0;
int sum1=0;
ifstream fin,fin2; //fin and fin2 to read the file each time.
fin.open("myfile.txt"); //opening a file to read it.while (!fin.eof() ) //reading a file
{
fin>>X;
sum1 = sum1+X; //adding all the numbers in the file
counter++; //counting number of items in the file
}
fin.close()
//Now first calculate mean
int mean=0;
mean = sum1/counter; //calculating the mean
//now calculate sum of squares of difference of each term and mean
int sum2=0;
fin2.open("myfile.txt"); //again opening the file with fin2
while (!fin2.eof() ) //again reading the file
{
fin2>>Y;
sum2 = sum2+ pow(Y-mean,2);
}
fin2.close()//finally standard deviation
double sd=0;
sd = sqrt(sum2/mean); //calculating standard deviation
Проблема в том, что вам нужно знать значение среднего, но вы не узнаете об этом, пока не прочитаете все данные. Вы пытаетесь рассчитать отклонение на основе среднего значения терминов, прочитанных до сих пор. Это неверно
Вы должны использовать формулу sqrt (Sum (x ^ 2) / n — (sum (n) / n) ^ 2) для стандартного отклонения.
Вычислите две суммы в цикле, а затем разделите на n и завершите вычисление в конце. Тогда вам не нужно каждый раз назначать новую переменную.