浮点异常(核心转储)需要帮助确定潜在错误的位置

Floating point exception (core dumped) need help identifying where potential error is

提问人:PapaPumpkin 提问时间:10/9/2023 最后编辑:Eric PostpischilPapaPumpkin 更新时间:10/9/2023 访问量:57

问:

此函数应打印从 while 循环给出的奇数和偶数输入的平均值,直到输入 0,然后结束。它目前无法运行,我将此块从与错误无关的较大代码段中分离出来。有什么想法会在哪里给出点异常错误吗?

 int main()
{
    int numReturn;
    int evenTotal;
    int evenCount;
    int oddTotal;
    int oddCount;
    
    while(numReturn != 0){
      printf("Enter a positive integer: ");
      scanf("%d",&numReturn);
      
      if(numReturn<0){
          printf("That's a negative number!\n");
      }else if(numReturn%2 == 0){
          evenTotal += numReturn;
          evenCount += 1;
      }else{
          oddTotal += numReturn;
          oddCount += 1;
      }
    }

    double evenAvg = evenTotal/evenCount;
    double oddAvg = oddTotal/oddCount;
    
    printf("%d even numbers were entered and the average is %lf\n",evenCount,evenAvg);
    printf("%d odd numbers were entered and the average is %lf\n",oddCount,oddAvg);

   //some code for problem 1
   return 0;
}
c for-循环 浮动

评论

2赞 dbush 10/9/2023
这里没有足够的内容来了解问题出在哪里。请更新您的问题以包含最小的可重现示例,包括按原样编译和运行的代码,以及输入、预期输出和实际输出,以便其他人可以重现您的问题。
4赞 Iłya Bursov 10/9/2023
oddCount =+ 1;看起来像错别字
0赞 Iłya Bursov 10/9/2023
double evenAvg = evenTotal/evenCount;应该是double evenAvg = evenCount > 0 ? ((double)evenTotal/evenCount) : 0;
0赞 Eric Postpischil 10/9/2023
@I亚布尔索夫:零不是空集合的正确平均值。没有定义的平均值,程序应该报告该平均值,而不是零。
0赞 greg spears 10/9/2023
不知道 numReturn (et al) 是 ints 还是什么?以及它们是如何初始化的。请更新代码。

答:

2赞 Eric Postpischil 10/9/2023 #1

默认情况下,具有自动存储持续时间的变量(在没有或其他存储说明符的函数中定义)不会初始化。当使用这样的变量时,它没有确定的值(如果变量可以用 声明,则程序具有未定义的行为,这意味着它的地址没有被采用)。staticregister

当 或的值为零时,或 中出现除以零的情况。很可能,这些都是整数变量,除以零会导致异常。由于历史原因,这被报告为“浮点异常”。evenCountoddCountevenTotal/evenCountoddTotal/oddCount

要解决此问题,您应该首先初始化局部变量:

int numReturn = 0;
int evenTotal = 0;
int evenCount = 0;
int oddTotal  = 0;
int oddCount  = 0;

此外:

  • 您应该在程序中设置 when 或 is zero,因为用户没有输入任何偶数或没有输入任何奇数。在这些情况下,没有定义平均值。evenCountoddCount
  • 计算平均值时,应在执行除法之前转换为浮点数。 将使用整数算术进行计算。将其更改为将使用算术。double evenAvg = evenTotal/evenCount;evenTotal/evenCountdouble evenAvg = (double) evenTotal / evenCount;double