#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. Пожалуйста. Если мой ответ был полезен или решил вашу проблему, пожалуйста, поддержите или примите его (так работает этот сайт).