C浮点异常错误。 。 。在计算读者等级水平的公式上

时间:2020-04-15 03:43:22

标签: c exception point cs50 floating

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

#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");
                    }
                }
        }

我不断收到一个浮点数异常,最后一个部分根据公式从年级开始。 。 。 最后一部分涉及浮点数l,float s,int索引,int等级。 。 。不知道该怎么办

2 个答案:

答案 0 :(得分: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,但描述性不是很好。)

答案 1 :(得分:0)

在现代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);

在计算出字母数之前,您无法计算ls(稍后尝试时并不能正确地进行计算,但这是目前的单独讨论) ,字数和句子数。 C忘记了以后如何进行计算;初始化ls时会执行此操作。而且由于words为零,所以会得到一个浮点异常,因为您要除以零。

在计算出lsnumber之后,进行wordssentences的计算。而且,您可能需要执行浮动操作-因此您需要将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)不会提供字母数。它给出了字符数(严格来说是字节),包括空格(换行符,空格)以及标点符号和数字。

我也不相信您的单词和句子计数,但这是您需要自己检查的内容。这部分取决于输入数据的种类。我认为您的代码会误算奇怪的序列...但是我可能错了! (三点和双感叹号被误算了吗?)