根据用户输入求解表达式

时间:2016-09-28 23:11:01

标签: c logic expression

我正在编写一个程序,要求用户输入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;
}

4 个答案:

答案 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);
说明:将分母的表达式提升为浮点值,最后,整个表达式产生浮点值。

编辑:正如Eisa所说,在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);
}

当然是的缺点。最重要的是,整数部分可能会溢出,而完全浮点计算只会失去一些精度。检查上溢/下溢会增加一些可能影响运行时的代码。