こんにちは。ECF代表のヒガです。
本記事では初心者向けアルゴリズムの演習問題を紹介しています。日頃のプログラミング学習にご活用ください。
はじめに
アルゴリズムとは、コンピューターに行わせる計算手順のことです。自在にプログラムを作るには、プログラム言語の文法の知識とともにアルゴリズムの考え方を身につけることが必要になります。
アルゴリズム技法習得の肝は「繰り返し」の活用です。この連載では、簡単な題材で繰り返しを使うアルゴリズムの基本パターンを練習していきます。
演習問題の一覧や勉強スタイルについてのアドバイスはこちらからどうぞ。
Q012 右下がりに文字を並べる
複数行にわたり1つずつずらしながら文字「■」を表示することで、実行例のような右下がりの線を表示させてください。ただし、行数はプログラムの先頭で変数に代入することで指定してください。なお、各列で■の前にあるスペース部分は、全角スペースを埋めてください。
行数に「8」を指定した場合の実行例は次のとおりです。
ヒント
いつもの二重ループです。列ループでは単純に表示を繰り返すのではなく、「どういう条件のときに'■'を表示するか?」を判断して表示させる必要があります。
解答例と解説
考え方
以下の全角スペースを可視化した図で考えると、ほぼ基本の二重ループなのなのがわかります。(行数に「5」を指定した場合)
■□□□□
□■□□□
□□■□□
□□□■□
□□□□■
あとはヒントにもあるように、どのタイミングで'■'を表示するか、を判断するのがポイントです。つまり、二重ループの内側の繰り返しは、
- 文字' '(全角スペース)を表示する、ただし、適切なタイミングで文字'■'を表示する
の繰り返しとなります。この「適切なタイミング」を条件に' '(全角スペース)または'■'のいずれかを表示することになります。
条件を探るために、具体的に行数に「8」を指定したときの'■'を表示する位置を考えてみましょう。
i行目 | '■'を表示する位置(j列目) |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
どうでしょう。つまり、「i行目の文字'■'はi文字目で表示する」という条件で決まるということです。外側の行ループも合わせて、箇条書きにしてみましょう。
- 行数(繰り返し回数)を指定する
- 次の動作を行数分繰り返す
- 次の動作を列数分(=行数分)繰り返す
- 列番号と行番号が等しいか?
- 等しい場合、文字'■'を表示する
- 等しくない場合、文字' '(全角スペース)を表示する
- 列番号と行番号が等しいか?
- 改行する
- 次の動作を列数分(=行数分)繰り返す
となります。
これでも実行例と見た目は同じになっているのですが、もう少しだけ改善できます。'■'を表示した後にも' '(全角スペース)を続けて表示することになりますが、この表示は無駄です。'■'を表示し終わった時点で続きの繰り返しをやめてしまいましょう。つまり箇条書きは
- 行数(繰り返し回数)を指定する
- 次の動作を行数分繰り返す
- 次の動作を列数分(=行数分)繰り返す
- 列番号と行番号が等しいか?
- 等しい場合、次の動作を実行する
- 文字'■'を表示する
- 列の繰り返しを終了する
- 等しくない場合、文字' '(全角スペース)を表示する
- 等しい場合、次の動作を実行する
- 列番号と行番号が等しいか?
- 改行する
- 次の動作を列数分(=行数分)繰り返す
となります。階層が深くなって見にくいのですが、具体的には次のフローチャート例を見ると理解しやすいでしょう。
フローチャート例
いつもの通りなのですが、プログラム実装を意識した都合で、行ループと列ループの開始が「0回目」から始まっています。今回に関しては大した問題にはならず、具体的に行数に「8」を指定したときを考えると、
i行目 | '■'を表示する位置(j列目) |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
となり、条件は「行番号=列番号(i = j)」と変わりませんでした。
Javaでの実装例
public class Q012 { public static void main(String[] args) { int n = 8; // 繰り返しの数 for (int i = 0; i < n; i++) { // 行ループ for (int j = 0; j < n; j++) { // 列ループ if (j == i) { // 行カウンタと列カウンタが等しいか System.out.print('■'); break; // ループを抜ける } else { System.out.print(' '); } } System.out.println(); // 列ループが終われば改行 } } }
上のフローチャートとの対応からプログラム実装例の流れを確認しましょう。
Javaでループを終了させるには「break;」命令を使います。実装例のようにif文と組み合わせて使うのが定番です。breakが実行されると、直近のループ(今回の場合は列ループ)を終了し、14行目の処理に移ります。
おわりに
今回は二重ループの2つのカウンタ変数を交えた条件式について、対応表を書いて考えてみました。
今回は比較的単純だったのですが、さて次回はどうでしょう。簡単な例で慣れておくのは重要です。しっかり皆さん自身でも手を動かして、必要な対応表を作ってみてください。
次回はこちらです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。