C 浮点异常错误。 . .关于计算 reader 年级水平的公式

C floating point exception error . . . on a formula for calculating reader grade level

这是一个计算输入文本中字母、单词和句子数量的程序。在最后一节中,我尝试使用一个公式,但我不断收到浮点异常。请帮忙。

#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] != '[=11=]'; 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 涉及最后一节。 . .不知道该怎么办

在现代 C 代码中,实际上获得浮点异常的唯一方法是 整数 除以零。是的,我的意思是 "integer"。使用浮点运算,您只会得到无穷大,或者如果被除数已经是 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);

你不能计算 ls 直到你计算了字母的数量(你稍后尝试时做的不正确,但这是一个单独的讨论现在),以及单词的数量和句子的数量。 C不记得以后如何计算;它在您初始化 ls 时执行。由于 words 为零,您会得到一个浮点异常,因为您除以零。

计算完numberwordssentences后再计算ls。你可能需要做一个浮动操作——所以你需要将 words(或 numbersentences)转换为 double(或 float,如果你坚持,但使用 double 除非有令人信服的理由不这样做)。

您还需要修正 indexgrade 的计算。特别是,对 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)没有给出字母的个数。它给出了字符数(严格来说是字节数),包括白色 space(换行符、空格)以及标点符号和数字。

我也不相信你的单词和句子计数,但这是你需要自己复习的东西。这部分取决于输入数据的种类。我认为您的代码会错误地计算奇怪的序列……但我可能错了! (那个三点和那个双感叹号算错了吗?)

您将 words 初始化为 0 并且在除法之前不更新它,给您一个整数被零除错误。

您需要修正算法并计算 numberwordssentences,然后再对它们进行数学运算。完成此操作后,您至少还有一个其他错误需要修复。

表达式 number / wordssentences / words 有问题,因为两个操作数的类型都是 intint 除以 int 得到 int,然后四舍五入为商。要获得浮点结果,请将其中一个操作数转换为 float 或更好的 double:

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

等等。由于一旦定义 l 就不需要更改它,因此您可能还想在使用它的范围内声明它 const 。 (另外,重新考虑 l 作为变量名:它在许多字体中看起来很像 1I,并且描述性不强。)