Я делаю функцию, которая будет вычислять статистику теста из двух выборочных t-тестов и возвращать ее значение. Однако я получаю неверные результаты. Раньше я использовал scanf
и получал хорошие ответы, но он случайно перестал работать. Поэтому я решил переключиться на fgets
, который считается более надежным, однако возвращаемые им значения неверны.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define VAL 10
double tstat(int x1,int x2,int s1,int s2,int n1,int n2);
int main()
{
char mean1[VAL] = {0};
char sd1[VAL] = {0};
char n1[VAL] = {0};
char mean2[VAL] = {0};
char sd2[VAL] = {0};
char n2[VAL] = {0};
printf("Enter mean 1: \n");
fgets(mean1, 10, stdin);
printf("Enter sd 1: \n");
fgets(sd1, 10, stdin);
printf("Enter sample size 1: \n");
fgets(n1, 10, stdin);
printf("Enter mean 2: \n");
fgets(mean2, 10, stdin);
printf("Enter sd 2: \n");
fgets(sd2, 10, stdin);
printf("Enter n2: \n");
fgets(n2, 10, stdin);
printf("t value is: %lf", tstat(atoi(mean1),atoi(mean2),atoi(sd1),atoi(sd2),atoi(n1),atoi(n2)));
}
double tstat(int x1,int x2,int s1,int s2,int n1,int n2)
{
double t = 0;
t = (x1 - x2)/(sqrt(pow(s1,2)/n1+pow(s2,2)/n2));
return t;
}
Например, установка mean1 = 1.3
, sd1 = 0.5
, n1 = 22
; mean2 = 1.6
, sd2 = 0.3
, n2 = 24
должны давать значение -2,44, однако подстановка этого возвращает -1, за которым следует #IND00
. Я предполагаю, что моя проблема заключается в том, что либо я неправильно истолковываю, как правильно использовать fgets
, либо что-то не так с типами данных, хотя я новичок в C и не смог обнаружить явных ошибок.
Вы всегда должны пытаться сузить круг своей проблемы. Каждый раз, когда вы используете данные, считанные от пользователя, вы должны сначала проверить, работает ли чтение данных должным образом. Если вы уже потерпели неудачу на этом шаге, вы можете пропустить все следующие шаги в своем фрагменте кода. В этом случае это означает, что все материалы t-теста вообще не имеют значения, если вы сначала читаете неправильные данные.
Все ваши переменные имеют тип int
, и вы используете atoi
для преобразования строк в int
. Однако значения, которые вы вводите, не являются целыми числами, это значения с плавающей запятой, поэтому интерпретируется только целая часть каждого числа. Например, atoi("1.3")
дает 1.
Вам нужно изменить типы данных на double
и вместо этого использовать atof
.
double tstat(double x1, double x2, double s1, double s2, double n1, double n2)
{
double t = 0;
t = (x1 - x2)/(sqrt(pow(s1,2)/n1+pow(s2,2)/n2));
return t;
}
...
printf("t value is: %lf", tstat(atof(mean1),atof(mean2),atof(sd1),atof(sd2),atof(n1),atof(n2)));
atoi()
==>atof()
, но попробуйте сstrtod()
, что надежнее. Также сделайте все параметрыtstat()
типаdouble
.