我被赋予了定义一个宏的任务,即将三个数字作为参数并返回它们的中位数
#define MEDIAN(x,y,z) (??)
如果没有很长的if语句来确定中间元素,我想不出一个简单的方法,因为我也不能使用库函数。
任何提示?
答案 0 :(得分:4)
使用条件表达式来缩短事物。这是一个用于找到最小值的两个值。
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
但是,通常不赞成有很多嵌套的条件表达式。
注意:当你编写一个宏而不是一个函数时,如果用户输入了例如宏,你就会遇到麻烦。 i++
。
答案 1 :(得分:1)
我试过这个,它对我有用:
#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)))
答案 2 :(得分: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))
答案 3 :(得分:-1)
有。它检查所有六个条件以找到MEDIAN。我做得很快,我相信可以进一步改进。
#define MEDIAN(x, y, z) (x <= y ? (z < x ? x : \
(z > y ? y : z)) : (z < y ? y : (z > x ? x : z)))