2

我的任务是定义一个宏以将三个数字作为参数并返回它们的中位数

#define MEDIAN(x,y,z) (??)

如果没有长序列的 if 语句来确定中间元素,我想不出一种简单的方法来做到这一点,因为我也不能使用库函数。

有什么提示吗?

4

5 回答 5

4

使用条件表达式来缩短内容。这是一个用于查找两个值的最小值的方法。

#define MIN(x,y)    (((x) < (y)) ? (x) : (y))

但是,通常不赞成有很多嵌套的条件表达式。

注意:当您编写宏而不是函数时,如果用户传入例如i++.

于 2012-05-17T14:39:02.713 回答
2
/* May not be the best implementation but it covers all corner cases of three 
different numbers.  */  
#define MEDIAN(x,y,z) \  
    (((x) > (y) && (x) < (z)) || ((x) < (y) && (x) > (z))) ?  \  
            ((x)) : \  
            ((x) < (y) ? ((y) < (z) ? (y) : (z)) : ((y) > (z) ? (y) : (z)))  
于 2021-08-30T20:35:02.873 回答
0

我试过这个,它对我有用:

#define MAXVAL(val1,val2)  ((val1>val2) ?  (val1):(val2) )
#define MINVAL(val1,val2)  ((val1<val2) ?  (val1):(val2) )
#define MEDIAN3(val1,val2,val3) MINVAL(MINVAL(MAXVAL(val1,val2),MAXVAL(val2,val3)),MAXVAL(val3,val1))

但是由于您需要对值进行排序以获得中位数,我认为针对 3 个值的某种简单冒泡排序算法(http://de.wikipedia.org/wiki/Bubblesort)应该是最好的解决方案。

- 编辑 -

这是一个更好的解决方案:

#define MEDIAN3(val1,val2,val3) MAXVAL(MINVAL(MAXVAL(val1,val2),val3),MINVAL(val1,val2))

最小的 3 个值宏:

#define MIN3(x,y,z) ( ( y ) <= ( z ) ? ((x) <= (y) ? (x) : (y)) : ((x) <= (z) ? (x) : (z)))
于 2014-01-17T16:43:47.850 回答
0

我有两个宏(或至少找到两个)给你:

#define MEDIAN(a,b,c) ((a > b) ? (b > c) ? b : (a > c) ? c : a : \
                       (b > c) ? (a > c) ? a : c : b)

#define MEDIAN(a,b,c) ((a-b)*(b-c) > 1 ? b : ((a-b)*(a-c) < -1 ? a : c))
于 2016-03-15T21:41:12.633 回答
-2

那里。它检查查找 MEDIAN 的所有六个条件。我很快就做到了,我相信可以进一步改进。

#define MEDIAN(x, y, z) (x <= y ? (z < x ? x : \
        (z > y ? y : z)) : (z < y ? y : (z > x ? x : z)))
于 2012-05-17T16:42:18.930 回答