这个程序编译得很好,但是当我运行它时会返回一条消息“浮点异常”。我看了其他线程,问题似乎是除以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;
}
答案 0 :(得分:5)
您的主要问题是您没有将输入值num1
和num2
传递到reduce()
函数中。而是传递全局变量higher
和lower
。您没有为它们分配任何值,但默认情况下全局变量始终初始化为0。因此,您遇到异常,因为在reduce()
中您将0除以0.您可以使用调试器验证它。
如果我按如下方式更改了您的main()
,那么您的代码至少适用于以6
和12
作为输入的测试用例:
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_2
和main()
,但我想您打算这样做。如果没有,您也可以将它们与reduce()
函数的参数3和4一起删除。
您提供的代码还有另一个问题(感谢@ user3629249指出):您缺少abs()
函数的包含。因此,您需要在代码的开头添加行#include <stdlib.h>
(include <math.h>
也是如此,以及Windows上的include <Windows.h>
。