【问题标题】:C floating point exception error . . . on a formula for calculating reader grade levelC 浮点异常错误。 . .关于计算读者等级水平的公式
【发布时间】:2020-04-15 03:43:22
【问题描述】:

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

#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 与最后一节有关。 . .不知道怎么办

【问题讨论】:

  • number 没有赋值。
  • 哼。谷歌搜索“浮点异常”会返回一个框,上面写着“浮点异常是当您尝试用浮点数做一些不可能的事情时发生的错误,例如除以零。”这确实是您的问题(int words = 0; 后跟number / words * 100)。您并没有为此付出太多努力:(

标签: c exception point cs50 floating


【解决方案1】:

您将 words 初始化为 0,并且在除法之前不对其进行更新,从而导致整数除以零错误。

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

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

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

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

【讨论】:

    【解决方案2】:

    在现代 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) 没有给出字母的数量。它给出了字符数(严格来说是字节),包括空格(换行符、空格)以及标点符号和数字。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多