繁体   English   中英

浮点异常错误

[英]Floating Point Exception Error

这个程序编译得很好,但是当我运行它时会返回一条消息“浮点异常”。 我看了其他线程,问题似乎是除以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;
}

输出:

输入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); 
}

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM