C浮点异常错误。 。 。在计算阅读器等级级别的公式上

问题描述 投票:0回答:1

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

#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等级。 。 。不知道该怎么办

c exception point cs50 floating
1个回答
1
投票

您将words初始化为0,并且在除法之前不要更新它,这将给您带来整数除零误差。

在对它们进行数学运算之前,您需要修正算法并计算numberwordssentences。完成此操作后,您仍然需要修复另一个错误。

表达式number / wordssentences / words是错误的,因为两个操作数的类型均为int。除法四舍五入到商。要获得浮点结果,请将操作数之一转换为float,或者更好地转换为double

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

依此类推。由于不必在定义l后就对其进行更改,因此您可能还想在使用范围内将其声明为const


-1
投票

在现代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为零,所以会得到一个浮点异常,因为您要除以零。

计算lsnumber之后,进行wordssentences的计算。而且,您可能需要进行浮点运算-因此,您需要将words(或numbersentences)转换为double(或如果您坚持要转换为float),但除非有令人信服的理由不)。

您还需要修复doubleindex计算。特别是,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); 不提供字母数。它给出了字符数(严格来说是字节),包括空格(换行符,空格)以及标点符号和数字。

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

© www.soinside.com 2019 - 2024. All rights reserved.