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);
你不能计算 l
或 s
直到你计算了字母的数量(你稍后尝试时做的不正确,但这是一个单独的讨论现在),以及单词的数量和句子的数量。 C不记得以后如何计算;它在您初始化 l
和 s
时执行。由于 words
为零,您会得到一个浮点异常,因为您除以零。
计算完number
、words
、sentences
后再计算l
和s
。你可能需要做一个浮动操作——所以你需要将 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);
注意strlen(text)
没有给出字母的个数。它给出了字符数(严格来说是字节数),包括白色 space(换行符、空格)以及标点符号和数字。
我也不相信你的单词和句子计数,但这是你需要自己复习的东西。这部分取决于输入数据的种类。我认为您的代码会错误地计算奇怪的序列……但我可能错了! (那个三点和那个双感叹号算错了吗?)
您将 words
初始化为 0 并且在除法之前不更新它,给您一个整数被零除错误。
您需要修正算法并计算 number
、words
和 sentences
,然后再对它们进行数学运算。完成此操作后,您至少还有一个其他错误需要修复。
表达式 number / words
和 sentences / words
有问题,因为两个操作数的类型都是 int
。 int
除以 int
得到 int
,然后四舍五入为商。要获得浮点结果,请将其中一个操作数转换为 float
或更好的 double
:
double l = (double)number / (double)words * 100.0;
等等。由于一旦定义 l
就不需要更改它,因此您可能还想在使用它的范围内声明它 const
。 (另外,重新考虑 l
作为变量名:它在许多字体中看起来很像 1
或 I
,并且描述性不强。)
这是一个计算输入文本中字母、单词和句子数量的程序。在最后一节中,我尝试使用一个公式,但我不断收到浮点异常。请帮忙。
#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);
你不能计算 l
或 s
直到你计算了字母的数量(你稍后尝试时做的不正确,但这是一个单独的讨论现在),以及单词的数量和句子的数量。 C不记得以后如何计算;它在您初始化 l
和 s
时执行。由于 words
为零,您会得到一个浮点异常,因为您除以零。
计算完number
、words
、sentences
后再计算l
和s
。你可能需要做一个浮动操作——所以你需要将 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);
注意strlen(text)
没有给出字母的个数。它给出了字符数(严格来说是字节数),包括白色 space(换行符、空格)以及标点符号和数字。
我也不相信你的单词和句子计数,但这是你需要自己复习的东西。这部分取决于输入数据的种类。我认为您的代码会错误地计算奇怪的序列……但我可能错了! (那个三点和那个双感叹号算错了吗?)
您将 words
初始化为 0 并且在除法之前不更新它,给您一个整数被零除错误。
您需要修正算法并计算 number
、words
和 sentences
,然后再对它们进行数学运算。完成此操作后,您至少还有一个其他错误需要修复。
表达式 number / words
和 sentences / words
有问题,因为两个操作数的类型都是 int
。 int
除以 int
得到 int
,然后四舍五入为商。要获得浮点结果,请将其中一个操作数转换为 float
或更好的 double
:
double l = (double)number / (double)words * 100.0;
等等。由于一旦定义 l
就不需要更改它,因此您可能还想在使用它的范围内声明它 const
。 (另外,重新考虑 l
作为变量名:它在许多字体中看起来很像 1
或 I
,并且描述性不强。)