这是一个程序,用于计算输入文本中字母,单词和句子的数量。在最后一节中,我尝试使用公式,并且不断收到浮点异常。请帮忙。
#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等级。 。 。不知道该怎么办
您将words
初始化为0,并且在除法之前不要更新它,这将给您带来整数除零误差。
在对它们进行数学运算之前,您需要修正算法并计算number
,words
和sentences
。完成此操作后,您仍然需要修复另一个错误。
表达式number / words
和sentences / words
是错误的,因为两个操作数的类型均为int
。除法四舍五入到商。要获得浮点结果,请将操作数之一转换为float
,或者更好地转换为double
:
double l = (double)number / words * 100;
依此类推。由于不必在定义l
后就对其进行更改,因此您可能还想在使用范围内将其声明为const
。
在现代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);
[您无法计算出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);
不提供字母数。它给出了字符数(严格来说是字节),包括空格(换行符,空格)以及标点符号和数字。
我也不相信您的单词和句子计数,但这是您需要自己检查的内容。这部分取决于输入数据的种类。我认为您的代码将误算奇怪的序列...但是我可能错了! (三点和双感叹号被误算了吗?)