我正在编写一个程序,要求用户输入2个输入:x和y。这些值用于计算该公式:(3x ^ 2-2xy + 5)/(y ^ 2 + 1)。当我输入值 - > 2,3它计算一个非常小的负数,如-12586511
#include <stdio.h>
int main (void) {
int x, y;
printf("Enter two integer values (x, y): ");
scanf("%d,%d", &x, &y);
float E = (3 * (x*x) - 2 * (x*y) + 5) / (y*y+1);
printf("The expression value is: %.2f\n", E);
return 0;
}
答案 0 :(得分:5)
-12586511
肯定是无效数据输入的结果。
使用"2 3"
或"2 ,3"
或"2 , 3"
等输入时,y
将不会设置。
// Risky code
scanf("%d,%d", &x, &y);
强大的代码会检查scanf()
的结果,以确保输入正确。
if (scanf("%d,%d", &x, &y) != 2) {
puts("Error");
return -1;
}
最好是慷慨,并在数字后留出空格:
// v
if (scanf("%d ,%d", &x, &y) != 2) {
第二个问题涉及使用int
数学进行除法。 OP可能希望方程式使用FP数学。
// float E = (3 * (x*x) - 2 * (x*y) + 5) / (y*y+1);
float E = (3 * (x*x) - 2 * (x*y) + 5) / (y*y+1.0f);
// or
float E = (3.0f * (x*x) - 2 * (x*y) + 5) / (y*y+1.0f);
答案 1 :(得分:1)
如果你想要显式的x,y整数,你应该使用MrDonMatti的方法,或者只是在Float E表达式中的一个数字前加一个点。例如3.
float E = (3. * (x*x) - 2 * (x*y) + 5) / (y*y+1);
这将解决问题,返回0作为结果。 但获得负值的原因是你应该给程序提供x,y,如:&#34; 2,3&#34;。逗号是必不可少的。如果你不使用逗号,即:&#34; 2 3&#34;作为输入,它将y设置为未给定或者我不知道会破坏公式的-nan数。
答案 2 :(得分:0)
真正的快速修复将是这样的:
float E = (3 * (x*x) - 2 * (x*y) + 5) / ((float)y*y+1);
说明:将分母的表达式提升为浮点值,最后,整个表达式产生浮点值。
scanf()
函数中,除了格式说明符之外的所有字符都应该包含在输入中 - 在这种情况下,
在两个整数之间,所以可能性是:
(空格)first_number(空格),(空格)second_number(空格)ENTER
(...) - 可选
答案 3 :(得分:0)
虽然其他海报向您展示了可能的错误,但让我再加上两美分。
如果将整数与浮点运算混合,最好尽可能长时间地保持整数部分的隔离。它在这里没有太大区别,但你应该记住它。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int x, y;
float n, d;
int res;
printf("Enter two integer values (x, y): ");
res = scanf("%d,%d", &x, &y);
if (res != 2) {
fprintf(stderr, "scanf() did not get the expected input\n");
exit(EXIT_FAILURE);
}
// keep integer arithmetic as long as possible
// TODO: check for overflows
n = (3 * (x * x) - 2 * (x * y) + 5);
d = (y * y + 1);
float E = n / d;
printf("The expression value is: %.10f\n", E);
exit(EXIT_SUCCESS);
}
当然是的缺点。最重要的是,整数部分可能会溢出,而完全浮点计算只会失去一些精度。检查上溢/下溢会增加一些可能影响运行时的代码。