浮点异常错误

3

这个程序编译没问题,但是运行时会返回一个“浮点异常”的信息。我看了其他的讨论帖子,问题似乎是除以0,但我已经检查过整个程序,没有除以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
在调试器中运行,并逐行步进代码。如果没有其他问题,调试器将在异常发生时停止,并让您看到它在哪里以及涉及变量的值是什么。 - Some programmer dude
使用调试器。在调试器中,你应该能够很容易地找到问题所在。 - kaylum
尽管问题很容易看出,但是当你调用reduce函数时,你认为全局变量higherlower的值是什么?你是在哪里给它们赋值的? - Some programmer dude
避免使用全局变量和不必要的变量(例如num1=numerator)。 - user2249683
显示剩余3条评论
1个回答

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
最大公约数是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); 
}

到目前为止,在main()函数中你没有使用变量higher_2lower_2,但我猜你计划这样做。如果不需要使用它们,你也可以与reduce()函数的第三个和第四个参数一起将其删除。
代码中还有另一个问题(感谢@user3629249指出):你缺少abs()函数的包含。所以你需要在代码开头添加#include <stdlib.h>这一行(include <math.h>也可以,Windows系统下还可以用include <Windows.h>) 。

谢谢!在函数调用中,我有变量higher_2和lower_2,因为该函数需要4个参数,当我去掉它们时会出现错误消息。我假设higher_2和lower_2分别是reduced_numerator和reduced_denominator的“实际参数”(希望我使用这个术语正确)。虽然我很新手编程,但我认为我的假设可能是错误的。 - Mike Tucker
@LionelMessi:如果你想要摆脱函数参数,那么你必须从函数声明、函数定义以及所有调用该函数的地方中将它们移除。 - honk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接