2

3 つの数値をパラメーターとして取り、それらの中央値を返すマクロを定義するタスクが与えられました。

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

ライブラリ関数も使用できないため、中間要素を決定するための if ステートメントの長いシーケンスがなければ、これを行う簡単な方法は考えられません。

ヒントはありますか?

4

5 に答える 5

4

条件式を使用して物事を短縮します。これは、2つの最小値を見つけるためのものです。

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

ただし、通常、ネストされた条件式がたくさんあることは嫌われています。

注:関数ではなくマクロを記述しているため、ユーザーがパスを渡すと問題が発生しますi++

于 2012-05-17T14:39:02.713 に答える
0

私はあなたのために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))
于 2016-03-15T21:41:12.633 に答える
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 に答える
-2

そこには。MEDIAN を見つけるための 6 つの条件すべてをチェックします。私はすぐにそれをやった、私はさらに改善できると確信している.

#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 に答える