では、前回のプログラムをもう少しひねった問題を出してみましょう。
実用的ではないかもしれませんが、頭の体操だと思って考えてみてください。
まずは、下の実行結果になるように二重ループを作ってみてください。
<実行結果>
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 続行するには何かキーを押してください・・・
「i」と「j」の関係や、これまでにやってきたことを色々と組み合わせて考えてみましょう。
各行の始まりが変化していることに注意してみましょう。
解答例です。
<sample program 054-01>
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 10) { j = i; while (j < 10) { printf("%2d", j); j++; } printf("\n"); i++; } return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 続行するには何かキーを押してください・・・
「j」を0からはじめるのではなく、毎回変化する「i」から始めることによって繰り返し回数も変化していきます。
別の方法でも同じ結果が出せます。
<sample program 054-02>
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 10) { j = 0; while (j < 10) { if (j >= i) { printf("%2d", j); } j++; } printf("\n"); i++; } return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 続行するには何かキーを押してください・・・
こちらの方法は、繰り返しの回数は変化しませんが、jを表示する際に、i以上という条件をつけています。
プログラムは様々な部品の組み合わせで出来ています。
これまで習ってきたifやwhileも部品の一部です。
これらの部品を上手く組み合わせることで、さまざまなプログラムを作ることが出来るのです。
では、次はこのような結果が表示されるよう作ってみてください。
今度は、各行の終わりが変化していることに注意してみましょう。
<実行結果>
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 続行するには何かキーを押してください・・・
解答例です。
<sample program 054-03>
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 10) { j = 0; while (j < i + 1) { printf("%2d", j); j++; } printf("\n"); i++; } return 0; } |
<実行結果>
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 続行するには何かキーを押してください・・・
実行結果を見ると、10行ありますので、縦方向には10回繰り返していることが想像出来ます。
最初のプログラム同様、横方向のループ回数が変化していますね。
「i」と「j」の関係を考えると、「j」の方(内側のループ)に工夫をする必要があります。
最初のプログラムでは、すべての行の開始の数値は異なりますが、すべて9で終わっています。
このプログラムでは、行の開始数値は同じですが、終わりの数値が異なっています。
内側のループをいつまで繰り返すのかという「繰り返し条件」がポイントになるわけです。
では、最後に難しいパターンを考えてみてください。
これは、かなり難しいかも知れません。
数値的には最初のプログラムと同じですが、表示位置が異なります。
画面への表示は、左から右方向へ表示されますので、右から左へは表示出来ません。
また、行の途中から表示することも出来ません。
ヒントは、何も表示されていないように見える箇所にも「何か」を表示しなければならない、です。
<実行結果>
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 続行するには何かキーを押してください・・・
解答例です。
<sample program 054-04>
#include <stdio.h> int main(void) { int i; int j; i = 0; while (i < 10) { j = 0; while (j < 10) { if (j >= i) { printf("%2d", j); } else { printf(" "); } j++; } printf("\n"); i++; } return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 続行するには何かキーを押してください・・・
空欄に見えている箇所に「スペース」を表示することで完成出来ます。
数値の表示は「%2d」としていますので、2桁で表示されています。
「スペース」も半角2桁分表示する必要があります。
冒頭にも書いたように実用的なプログラムでは無いと思いますが、工夫することによって色々なプログラムが作れることを感じていただければ良いと思います。
とにかく、ループで大事なことは、「i」(外側のループ)と「j」(内側のループ)の関係を良く理解することと、「初期値」「繰り返し条件」「増分」の関係をしっかりと理解することです。
次回は、新しい命令について書きます。