C ошибка исключения с плавающей точкой. , , по формуле для расчета уровня читателя - PullRequest
0 голосов
/ 15 апреля 2020

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

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

int main(void)
{
    char text[100];
    int number;
    int words = 0, i;
    int sentences = 0, j;
    float l = number / words * 100;
    float s = sentences / words * 100;
    int index = 0.0588 * l - 0.296 * s - 15.8;
    int grade = round(index);

    // Text Input = Text //

    printf("Text: ");
    fgets(text, sizeof(text), stdin);
    printf("%s", text);

    // Letters = number //

    number = strlen(text);
    printf("%d letters\n", number);

    // Words = words //

    for (i = 0; text[i] != '\0'; i++)
    {
        if (text[i] == ' ' && text[i+1] != ' ')
        words++;
    }
    printf("%d words\n", words + 1);

    // Sentences = sentences

    for (j = 0; j < strlen(text); j++)
        {if (text[j] == '.' || text[j] == '!' || text[j] == '?')
            sentences++;
        }

        printf("%d sentences\n", sentences);

    // grade level based on formula //

    if (index >= 1 && index <= 16)
        {
            printf("Grade %d\n", grade);
        }
             else
                {
                  if (index < 1)
                    {
                printf("Before Grade 1\n");
                    }

                if (index > 16)
                    {
                printf("Grade 16+\n");
                    }
                }
        }

Я продолжаю получать исключение с плавающей запятой с последним разделом, начинающимся на уровне класса на основе формулы , , в последнем разделе рассматриваются float l, float s, int index, int grade. , , понятия не имею, что делать

Ответы [ 2 ]

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

Вы инициализируете words в 0 и не обновляете его до деления, что дает вам целочисленную ошибку деления на ноль.

Вам нужно исправить свой алгоритм и вычислить number, words и sentences, прежде чем вы начнете считать их. После того, как вы это сделаете, у вас все еще будет исправлена ​​еще одна ошибка.

Выражения number / words и sentences / words содержат ошибки, поскольку оба операнда имеют тип int. Разделив int на int, вы получите int и округлите до частного. Чтобы получить результат с плавающей запятой, приведите один из операндов к float или, лучше, double:

double l = (double)number / (double)words * 100.0;

и так далее. Поскольку вам не нужно менять l после его определения, вы можете также объявить его const в той области, где он используется. (Также пересмотрите l как имя переменной: во многих шрифтах оно выглядит как 1 или I и не очень наглядно.)

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

В современном C коде практически единственный способ получить исключение с плавающей запятой - это сделать целое деление на ноль. Да, я имею в виду "целое число". С арифметикой с плавающей точкой c вы просто получаете бесконечность или, возможно, NaN, если дивиденд уже был NaN.

У вас есть:

int number;
int words = 0, i;
int sentences = 0, j;
float l = number / words * 100;
float s = sentences / words * 100;
int index = 0.0588 * l - 0.296 * s - 15.8;
int grade = round(index);

Вы не можете рассчитать l или s до тех пор, пока вы не подсчитаете количество букв (вы не делаете это правильно, когда попробуете, позже, но пока это отдельное обсуждение), а также количество слов и количество предложений. C не помнит, как сделать расчет позже; это происходит при инициализации l и s. А поскольку words равно нулю, вы получаете исключение с плавающей запятой, потому что делите на ноль.

Выполните вычисление l и s после вычисления number, words, sentences. И вам, вероятно, нужно выполнить операцию с плавающей запятой - поэтому вам нужно конвертировать words (или number и sentences) в double (или float, если вы настаиваете, но используйте double, если нет непреодолимая причина не делать этого.

Вам также необходимо исправить вычисления index и grade. В частности, присвоение index усекает (не округляет) значение; функция round() не используется, поскольку ввод является целым числом.

int number;
int words = 0, i;
int sentences = 0, j;

…count letters, words, sentences…

double l = number / (double)words * 100;
double s = sentences / (double)words * 100;
int grade = round(0.0588 * l - 0.296 * s - 15.8);

Обратите внимание, что strlen(text) не дает количество букв. Он дает количество символов (строго в байтах), включая пробелы (перевод строки, пробелы), знаки препинания и цифры.

Я не убежден в подсчете слов и предложений, но это то, что вам нужно нужно пересмотреть самостоятельно. Частично это зависит от того, насколько хороши входные данные. Я думаю, что ваш код будет неправильно сосчитать странные последовательности ... но я могу ошибаться !! (Эта тройная точка и этот двойной восклицательный знак были неверно учтены?)

...