浮点异常错误

时间:2015-08-09 06:23:37

标签: c++ c

这个程序编译得很好,但是当我运行它时会返回一条消息“浮点异常”。我看了其他线程,问题似乎是除以0,但我查看了程序,并且在整个程序中没有除零。我甚至使用了绝对值函数。

顺便说一下,该程序旨在减少分数。

示例输入:6 12,代表分数6/12
预期输出:1/2

#include <stdio.h>

/*declaring variables*/
int num1, num2, num1b, num2b, gcd, x;
int higher, lower, higher_2, lower_2;

/*declaring functions*/
int find_gcd(int num1, int num2);
void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator);

int main(void)
{
    do
    {
        printf("enter 2 numbers:  ");
        scanf("%d %d", &num1, &num2);
        reduce(higher, lower, &higher_2, &lower_2);
        printf("enter 0 to end program and any number continue: \n");
        scanf("%d", &x);
    } while(x != 0);

    return 0;
}

void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator)
{
    num1=numerator;
    num2=denominator;

    gcd =find_gcd(numerator, denominator);

    *reduced_numerator = (numerator/abs(gcd));
    *reduced_denominator = (denominator/abs(gcd));

    printf("The GCD is %d/%d\n", *reduced_numerator, *reduced_denominator); 
}

int find_gcd(int m, int n)
{
    while (n != 0) {
        int remainder = m % n;
        m = n;
        n = remainder;
    }
    return m;
}

1 个答案:

答案 0 :(得分:5)

您的主要问题是您没有将输入值num1num2传递到reduce()函数中。而是传递全局变量higherlower。您没有为它们分配任何值,但默认情况下全局变量始终初始化为0。因此,您遇到异常,因为在reduce()中您将0除以0.您可以使用调试器验证它。

如果我按如下方式更改了您的main(),那么您的代码至少适用于以612作为输入的测试用例:

int main(void)
{
    do
    {
        printf("enter 2 numbers:  ");
        scanf("%d %d", &num1, &num2);
        reduce(num1, num2, &higher_2, &lower_2);
        printf("enter 0 to end program and any number continue: \n");
        scanf("%d", &x);
    } while(x != 0);

    return 0;
}

输出:

  

输入2个数字:6
  12个
  GCD是1/2   输入0结束程序,任何数字继续:

如评论中所示,您还应该摆脱全局和虚假变量。因此,您应首先删除代码中的以下行:

/*declaring variables*/
int num1, num2, num1b, num2b, gcd, x;
int higher, lower, higher_2, lower_2;

然后让您的main()函数以下列方式启动:

int main(void)
{
    int num1, num2, higher_2, lower_2, x;
    ...
}

您的reduce()函数应如下所示:

void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator)
{
    int gcd = find_gcd(numerator, denominator);

    *reduced_numerator = (numerator/abs(gcd));
    *reduced_denominator = (denominator/abs(gcd));

    printf("The GCD is %d/%d\n", *reduced_numerator, *reduced_denominator); 
}

到目前为止,您还没有在higher_2函数中使用变量lower_2main(),但我想您打算这样做。如果没有,您也可以将它们与reduce()函数的参数3和4一起删除。

您提供的代码还有另一个问题(感谢@ user3629249指出):您缺少abs()函数的包含。因此,您需要在代码的开头添加行#include <stdlib.h>include <math.h>也是如此,以及Windows上的include <Windows.h>