удобочитаемость, возвращающая отрицательное значение

#c #cs50

#c #cs50

Вопрос:

Я написал код для удобства чтения cs50, используя C. Я продолжаю получать отрицательное значение независимо от того, какое предложение я использую для проверки. Очевидно, что это проблема в моей математике, однако я использовал отладчик, и я вижу, что все кажется правильным, пока не будет реализован индекс Коулмана-Лиау. Я не уверен, что происходит не так. Я добавил приведенный ниже код.

 #include <stdio.h>
#include <cs50.h>
#include <string.h> //getstring
#include <math.h>
#include <ctype.h>


int main (void) 
    {
        string text = get_string ("Text:") ; //get input from user
        int letter = 0, word = 1, sentance = 0; 
        
        for (int i = 0, n = strlen(text); i < n; i  ) 
      
        if (isalpha(text[i]))      //identify how many characters are alphabetical
        {
            letter  ;
        }
        
        for (int i = 0, n = strlen(text); i < n; i  ) 
        if (isspace(text[i]))     //identify how many spces there are 
        {
            word  ;
        }
        
        for (int i = 0, n = strlen(text); i < n; i  )
        if ((text[i]) == '!' || (text[i]) == '?' || (text[i]) == '.')
        {
            sentance  ;
        }
        
    
         
        float l = (letter / word) *100.00; //average number of letters per 100 words
        float s = (word / sentance) * 100.00; //average number of words per sentance
        float index = 0.0588 * l - 0.296 * s - 15.8; 
        int round_index = round(index);
        
         if (round_index < 16 amp;amp; round_index > 1)
        {
            printf("Grade %i n", round_index);
        } 
        else if (round_index >= 16) 
        {
            printf("Grade 16  n") ;
        }
        else if (round_index < 1) 
        {
            printf("Before Grade 1 n") ;
        }
    }
 

Комментарии:

1. Не использовать float ; использовать double . float это тип с плавающей запятой с ограниченным диапазоном / точностью, который в основном используется для экономии памяти в больших массивах.

2. #include <string.h> вводит стандартный заголовок ISO C, который содержит объявления функций, таких как strlen и memcpy . В get_string заголовке есть a <cs50.h> , а не in <string.h> .

3. . Символ не обязательно завершает предложение. Это происходит в сокращениях, таких как i. d. и Mr. . Если текст строго следует определенным соглашениям, то вы можете рассчитывать на то, что a . , за которым следует как минимум два пробела (или которое встречается в конце данных), будет концом предложения.

4. n = strlen(text); — Почему вы делаете это несколько раз

Ответ №1:

Вы можете попасть в ловушку целочисленного деления: оба letter word и sentance объявляются как int , поэтому выполняется целочисленное деление.

Примеры:

 7 / 2 = 3
6 / 7 = 0 (when the second one is larger, you always get zero)
 

Чтобы избежать этого, вы можете объявить letter and/ or word и / или sentance как числа с плавающей запятой. (Вам нужно иметь только одно число с плавающей запятой, чтобы принудительно выполнять арифметику с плавающей запятой, но лучше всего объявить их все как числа с плавающей запятой)

Только одно замечание: почему вы все еще используете float как число с плавающей запятой? В основном люди используют double в настоящее время (не спрашивайте меня почему).
Извините, второе замечание: sentance разве это не должно быть sentence (с «e»)? 🙂

Комментарии:

1. Большое вам спасибо 🙂 Я понял, что делаю слова / предложения вместо предложений / слов, которые, похоже, устранили проблему, но спасибо за совет.

2. Пожалуйста. Если мой ответ был полезен или решил вашу проблему, пожалуйста, поддержите или примите его (так работает этот сайт).