该程序可以很好地编译,但是在我运行它时会返回一条消息“Floating Point Exception”。我看过其他线程,问题似乎是被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;
}

最佳答案

您的主要问题是您没有将输入值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;
}

输出:



如注释中所示,您还应该摆脱全局变量和虚假变量。因此,您应该首先删除代码中的以下几行:
/*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>)。

10-07 14:14
查看更多