Простое вычисление числа с плавающей запятой в C, в результате чего -nan возвращается как значение

Я пишу простую программу для расчета читаемости текста, и при вычислении среднего значения я получаю странный результат: «-нан». Это то, что возвращается для обеих функций вычисления с плавающей запятой в нижней части моего кода, и когда я вычисляю индекс в основной функции, я получаю обратно отрицательное число. Это должно быть невозможно, так как ни одно из делимых чисел не является отрицательным. Кто-нибудь знает, что означает -nan или как я могу это исправить?

Спасибо!

#include <stdio.h>
#include <string.h>

int count_letters (string text);
int count_words (string text);
int count_sentences (string text);
float avg_letters (int lettercount, int wordcount);
float avg_sents (int wordcount, int sentcount);


int main (void)
{
    string text = get_string("Text: ");
    int lettercount = 0;
    int wordcount = 0;
    int sentcount = 0;
    float S = 0;
    float L = 0;

    count_letters (text);
    count_words (text);
    count_sentences (text);
    avg_letters (lettercount, wordcount);
    avg_sents (wordcount, sentcount);

    float index = 0.0588 * L - 0.296 * S - 15.8;
    printf("%f\n", index);
}

//Counts letters in entire text
int count_letters (string text)
{
    int lettercount = 0;
    for (int i=0, n = strlen(text); i<n; i++)
    {
        if ((text[i] > 64 && text[i] < 91) || (text[i] > 96 && text[i] < 123))
        {
            lettercount ++;
        }
    }
    printf ("%i\n", lettercount);
    return lettercount;
}

//Counts words in text
int count_words (string text)
{
    int wordcount = 0;
    for (int i=0, n = strlen(text); i<n; i++)
    {
        if (text[i] == 32)
        {
            wordcount ++;
        }
    }
    wordcount += 1;
    printf ("%i\n", wordcount);
    return wordcount;
}

//Counts sentences in text
int count_sentences (string text)
{
    int sentcount = 0;
    for (int i=0, n = strlen(text); i<n; i++)
    {
        if ((text[i] == 33) || (text[i] == 63) || (text[i] == 46))
        {
            sentcount ++;
        }
    }
    printf ("%i\n", sentcount);
    return sentcount;
}

//Averages letters per 100 words
float avg_letters (int lettercount, int wordcount)
{
    float L = ((float) lettercount / wordcount) * 100;
    printf("%f\n", L);
    return L;
}

//Averages sentences per 100 words
float avg_sents (int wordcount, int sentcount)
{
    float S = ((float) sentcount / wordcount) * 100;
    printf("%f\n", S);
    return S;
}


person Khaled Nassra    schedule 07.04.2020    source источник
comment
Вы никогда не присваиваете возвращаемые значения функций переменным.   -  person Barmar    schedule 07.04.2020
comment
lettercount / wordcount делится на 0, так как wordcount равно 0.   -  person Barmar    schedule 07.04.2020
comment
nan означает не число. Вы можете получить это, например, извлекая квадратный корень из отрицательного числа. Но в вашем случае вы получили его, разделив 0 на 0, что неопределенно и, следовательно, не является числом.   -  person user3386109    schedule 07.04.2020
comment
Всем большое спасибо! Я не понимал, что я делаю.   -  person Khaled Nassra    schedule 07.04.2020


Ответы (1)


Вы забыли присвоить переменные.

lettercount = count_letters (text);
wordcount = count_words (text);
sentcount = count_sentences (text);
L = avg_letters (lettercount, wordcount);
S = avg_sents (wordcount, sentcount);

Поскольку вы никогда их не назначали, все они по-прежнему имеют значения 0, которыми вы их инициализировали, поэтому вы разделили 0 на 0 в avg_letters и avg_sents. Получается nan, что означает not a number.

person Barmar    schedule 07.04.2020