この問題は、以下の2つのアプローチのいずれかで解くことができます。

多重条件分岐

以下のような条件式を書くことで、3つの変数a、b、cの値がこの順番で大きくなっているかどうかを調べることができます。

a < b && b < c

3つの整数を並べる順列の数は3! = 6となるので、6つの条件式(最後を省略すれば5つ)と対応する処理を書くことで、すべての可能性を網羅し、目的の出力を得ることができます。この方法によるプログラムは以下のようになるでしょう。

if ( a < b && b < c ){
  printf("%d %d %d\n", a, b, c);		    
} else if ( a < c && c < b ){
  printf("%d %d %d\n", a, c, b);		    
} else if ( b < a && a < c ){
  printf("%d %d %d\n", b, a, c);
} ...
 :
 :			 
} else {
  printf("%d %d %d\n", c, b, a);
}

ただし、上の条件式では、同じ値を持つ変数がある場合、うまく動かない場合があるので注意してください。修正方法を考えてみましょう。さらに、このようなプログラムは間違いを埋め込み易く、修正がしにくい欠点があります。以下のアプローチも考えてみましょう。

値の入れ替え

数をある順番に並べることをソートと呼びます。複数の要素を持つ数列に対するソートのアルゴリズムは数多く考案されていますが、この課題は3つの変数しかあつかわないため、シンプルな方法で解くことができます。2つの変数の値を入れ替える操作を応用して解いてみましょう。

2つの変数の値の大小関係が目的に反して逆で、値を入れ替えたい場合は以下のようなプログラムが書けます。

/* 小さい順(昇順)に並べたい場合 */
if (a > b) {
  /* aとbの値を入れ替える処理 */
}

2つの変数の値を交換するには、正しい手順をふむ必要があります。 以下のように変数の中身の交換を行いましょう。

/* ある変数a, bがあるとする*/
int a = 1;
int b = 2;

/* 交換するため、一時的に保存する変数を作る */
int t; /* temporary の t */

t = a; /* 一時保存用の変数にaの値を退避しておく*/
a = b; /* a の中にb の値を入れる ※aは上書きされるため、もし退避していなければ情報が消えてしまう*/
b = t; /* 一時保存しておいた値をb に入れる*/

/* この時点で、a の値が 2, b の値が 1 となる*/

このような、2つの変数の値を交換する処理を組み合わせることによって、3つの変数の値を並べ替えてみましょう。


Reference

 

オンラインジャッジではじめるC/C++プログラミング入門 (マイナビ)

AIZU ONLINE JUDGE のコース問題を題材にした解説書です。各トピックごとに C/C++ 言語の基礎的な内容を学習し、Introduction to Programming の演習問題にチャレンジしていきます。内容は敷居の高いものではなく、プログラミング初学者が取り組む例題からスタートしています。