return 3 个值中间的函数?

Function to return middle of 3 values?

我应该实现一个函数,从输入的三个数字中找出中间的数字。所有输入都是正整数。我似乎没有处理导致我的程序无法通过某些测试的特殊情况,但幅度很小。我的意思是 8 位像素值的标准偏差为 1.46,因此我遗漏的情况应该非常具体,并且介于两者之间的情况很少。

根据我对这个问题的理解,数字有以下三种可能性:

  1. 他们都是平等的,所以return或者
  2. 其中两个相等,因此return较小的(较大的也不起作用)
  3. 都不同,求中间值

我没有看到第四种情况,或者我错过了上述三种情况。我无法使用库进行排序。

int middle(int a, int b, int c)
{
    if (a == b && b == c)
    {
        return c;
    }

    if ((a < b && b < c) || (c < b && b < a))
    {
        return b;
    }

    if ((b < a && a < c) || (c < a && a < c))
    {
        return a;
    }

    if ((a < c && c < b) || (b < c && c < a))
    {
        return c;
    }

    if (a == b || b == c || a == c)
    {
        if (a == b && a < c)
        {
            return c;
        }
        else
        {
            return a;
        }

        if (b == c && b < a)
        {
            return a;
        }
        else
        {
            return b;
        }

        if (a == c && a < b)
        {
            return b;
        }
        else
        {
            return c;
        }

    }

return c; // code sometimes reaches this point; it shouldn't
}

这里是这个案例:

if ((b < a && a < c) || (c < a && a < c))

不正确。应该是:

if ((b < a && a < c) || (c < a && a < b))

此外,在

if (a == b || b == c || a == c)

小节,你有

if (...)
    return ...
else
    return ...

这将始终 return,并忽略其后的 if 语句。

也就是说,如果对 3 个值进行排序会容易得多,然后 return b

if ( b < a ) {
    int t = a;
    a = b;
    b = t;
}
if ( c < b ) {
    int t = c;
    c = b;
    b = t;
}
if ( b < a ) {
    int t = a;
    a = b;
    b = t;
}
return b;

为了在可用时促进简单性,只有三个值要比较,使用单个表达式来确定和return是完全合理的中间值。以下使用嵌套的三元运算符来执行此操作。它使用代码中显示的输入进行测试:

int main(int argc, char *argv[])
{
//  int val[] = {7,12,1};
//  int val[] = {0,0,1};
    int val[] = {-1,-4,-2};
//  int val[] = {7,6,2};
//  int val[] = {100,99,103};
    
    printf ("middle value is: %d\n", return_middle(val[0], val[1], val[2]));
    return 0;
}

int return_middle(int a, int b, int c)
{
    return a>b ? ( c>a ? a : (b>c ? b : c)) : (c>b ? b : ( a>c ? a : c));
}