Не может обрабатывать отдельные предложения с несколькими словами. Но все вроде нормально - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь выполнить квест на читабельность (от cs50 ), и я думал, что моя программа работала нормально, но когда я попытался оценить правильность моего кода с помощью check50, он показал мне следующее:

":( обрабатывает одно предложение с несколькими ожидаемыми словами" 7 класс \ n ", а не" текст \ nGrade 8 ... ""

, и это было единственным результат неправильный, остальные были зелеными и правильными.

Что я делаю не так?

Вот мой код

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

int main (void)
{
    string text = get_string ("Text: ");
    printf ("text\n");
    int letters=0,words=1,sentences=0;

    for (int i = 0; i < strlen(text); i++)   
    {    
        if ((text[i] >= 'a' && text[i] <= 'z' ) || (text[i] >= 'A' && text[i] <= 'Z'))
        {
            letters++;     
        }  
        else if (text[i]== ' ')
        {
            words++;        
        }       
        else if ((text[i])== '.' || (text[i]) == '!' || (text[i]) == '?')
        {
            sentences++;    
        }    
    }   

    float L = letters * 100 / words;
    float S = sentences * 100 / words;
    float index = 0.0588 * L - 0.296 * S - 15.8;
    if (index >= 16) 
    {
        printf ("Grade 16+\n");       
    }
    else if (index < 1) 
    {
        printf ("Before Grade 1\n"); 
    }
    else
    {       
        printf ("Grade %i\n",(int) round(index));
    }
}
  • слово - любая последовательность символов разделена через пробел - слово.
  • предложение - любая последовательность символов, заканчивающаяся ("?". ".", "!")

1 Ответ

1 голос
/ 15 апреля 2020

Программа сделает это letters * 100 / words, прежде чем это сделает float L. Поскольку все операнды являются целыми числами, результатом будет целое (округленное!) Значение, прежде чем оно будет сохранено как число с плавающей точкой. (То же самое float S). Именно это «раннее округление» делает значения L и S слишком высокими. Простое решение - сделать один из операндов плавающим. (Есть простой и очевидный выбор)

...