3 つの数値をパラメーターとして取り、それらの中央値を返すマクロを定義するタスクが与えられました。
#define MEDIAN(x,y,z) (??)
ライブラリ関数も使用できないため、中間要素を決定するための if ステートメントの長いシーケンスがなければ、これを行う簡単な方法は考えられません。
ヒントはありますか?
条件式を使用して物事を短縮します。これは、2つの最小値を見つけるためのものです。
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
ただし、通常、ネストされた条件式がたくさんあることは嫌われています。
注:関数ではなくマクロを記述しているため、ユーザーがパスを渡すと問題が発生しますi++
。
私はあなたのために2つのマクロを持っています(または少なくとも2つ見つけました):
#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 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)))
そこには。MEDIAN を見つけるための 6 つの条件すべてをチェックします。私はすぐにそれをやった、私はさらに改善できると確信している.
#define MEDIAN(x, y, z) (x <= y ? (z < x ? x : \
(z > y ? y : z)) : (z < y ? y : (z > x ? x : z)))