在不使用C语言中使用if..else语句的情况下查找最大值

时间:2018-08-08 08:30:26

标签: c

我试图在不使用if ... else语句的情况下查找三个整数的最大值,当我进行一些搜索时,遇到了这行代码。除了abs函数,其他所有行 我能理解。谁能解释代码中的abs函数如何工作?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x, y, z, result, max;

    printf("\nInput the first integer: "); 
    scanf("%d", &x);

    printf("\nInput the second integer: ");
    scanf("%d", &y);

    printf("\nInput the third integer: ");
    scanf("%d", &z);

    result=(x+y+abs(x-y))/2;
    max=(result+z+abs(result-z))/2;

    printf("\nMaximum value of three integers: %d\n", max);

    return 0;
}

3 个答案:

答案 0 :(得分:4)

Group_number

如果(a+b+abs(a-b))/2,则此表达式变为a>b的{​​{1}}。
如果(a+b+(a-b))/2,则此表达式变为a的{​​{1}}。

因此,该表达式只为您提供两个值的最大值。

要获得三个值中的最大值,您只需取前两个和第三个值中最大值的最大值即可。 b>a

答案 1 :(得分:1)

abs()状态的手册页,

  

abs()函数计算整数参数的绝对值。

  

返回该函数的适当整数类型的整数参数的绝对值。

因此,如果您了解基本数学知识,那么您将了解该函数返回表达式的绝对值。

此外,从长远来看,停止这种奇怪的(愚蠢的)练习。这些仅有助于建立逻辑,以后,这些都是无用的。

作为一个双关语,按照问题字面意思,我本可以这样做:

// So, `if..else` statements are banned, right! Take that!
result = (a > b) ? a : b;
max = (result > c) ? result : c;

请记住,阅读功能手册总是有帮助的。

答案 2 :(得分:1)

只需使用if语句。编写不含if语句的C代码是有害而愚蠢的做法。如果您尝试最小化代码中的分支,那将是另一回事,但这对初学者而言并不是真正的任务。


话虽如此,该问题的解决方案是实现一个真值表,并将布尔代数与>运算符一起使用。学习布尔值代数在编程中有许多用途,因此学习如何实现这样的表是有用的做法(与避免if语句相反)。

在这种情况下,真值表为(假设没有值相等):

           x>y  x>z  y>z
x largest   1    1    -
y largest   0    -    1
z largest   -    0    0

-的意思是“无关”。

这可以实现为C语言中的3D数组,其中每个索引都是相应的>比较的结果。那就是:

array [2]  [2]  [2] 
//    x>y  x>z  y>z

然而,这将包含一些永远不可能为真的情况,并且假设没有值相等。您可以这样实现:

#include <stdio.h>

int main()
{
  const char* const largest [2]  [2]  [2] =
  //                        x>y  x>z  y>z
  {
    { // x<y
      { // x<z
        "z", // y<z
        "y"  // y>z
      },
      { // x>z
        "-", // y<z, not possible
        "y", // y>z
      }
    },
    { // x>y
      { //x<z
        "z", //y<z
        "-"  //y>z, not possible
      },
      { //x>z
        "x", // y<z
        "x", // y>z
      },
    },
  };

  const int use_cases [6][3] = 
  {
    {1,2,3},
    {1,3,2},
    {2,1,3},
    {2,3,1},
    {3,1,2},
    {3,2,1}
  };

  for(int i=0; i<6; i++)
  {
    int x = use_cases[i][0];
    int y = use_cases[i][1];
    int z = use_cases[i][2];

    printf("x:%d, y:%d, z:%d, largest: %s\n", x, y, z, largest[x>y][x>z][y>z]);
  }

  return 0;
}

输出:

x:1, y:2, z:3, largest: z
x:1, y:3, z:2, largest: y
x:2, y:1, z:3, largest: z
x:2, y:3, z:1, largest: y
x:3, y:1, z:2, largest: x
x:3, y:2, z:1, largest: x