我试图在不使用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;
}
答案 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