簡體   English   中英

C值中值預處理器宏

[英]C median of values pre-processor macro

我的任務是定義一個宏,該宏以三個數字作為參數並返回其中位數

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

如果沒有很長的if語句序列來確定中間元素,我想不出一種簡單的方法,因為我也不能使用庫函數。

有什么提示嗎?

使用條件表達式來縮短內容。 這是一個用於查找兩個值中最小值的值。

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

但是,通常不贊成使用很多嵌套的條件表達式。

注意:在編寫宏而不是函數時,如果用戶傳入例如i++ ,將會遇到麻煩。

我嘗試了一下,對我有用:

#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)))

我有兩個宏(或至少找到兩個)供您使用:

#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))

那里。 它檢查所有六個條件以找到中位數。 我很快就做到了,我相信可以進一步改進。

#define MEDIAN(x, y, z) (x <= y ? (z < x ? x : \
        (z > y ? y : z)) : (z < y ? y : (z > x ? x : z)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM