Реализация двухвыборочного t-теста в C

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

atoi() ==> atof(), но попробуйте с strtod(), что надежнее. Также сделайте все параметры tstat() типа double.
pmg 28.05.2019 16:29

Вы всегда должны пытаться сузить круг своей проблемы. Каждый раз, когда вы используете данные, считанные от пользователя, вы должны сначала проверить, работает ли чтение данных должным образом. Если вы уже потерпели неудачу на этом шаге, вы можете пропустить все следующие шаги в своем фрагменте кода. В этом случае это означает, что все материалы t-теста вообще не имеют значения, если вы сначала читаете неправильные данные.

Gerhardh 28.05.2019 17:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все ваши переменные имеют тип 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)));

Другие вопросы по теме