Реализация двух примеров t-теста в C - PullRequest
0 голосов
/ 28 мая 2019

Я делаю функцию, которая будет вычислять статистику теста из 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 и не смог обнаружить никаких явных ошибок.

1 Ответ

3 голосов
/ 28 мая 2019

Все ваши переменные имеют тип 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...