こんにちは。ECF代表のヒガです。
はじめに
アルゴリズムとは、コンピューターに行わせる計算手順のことです。自在にプログラムを作るには、プログラム言語の文法の知識とともにアルゴリズムの考え方を身につけることが必要になります。
アルゴリズム技法習得の肝は「繰り返し」の活用です。この連載では、簡単な題材で繰り返しを使うアルゴリズムの基本パターンを練習していきます。
演習問題の一覧や勉強スタイルについてのアドバイスはこちらからどうぞ。
Q007 横ストライプ
奇数行にのみ文字「■」を並べて表示することで、横向きのストライプ(縞模様)を表示させてください。ただし、行数や列数はプログラムの先頭で変数に代入することで指定してください。
行数に「5」、列数に「7」を指定した場合の実行例は次のとおりです。
偶数行は、単に改行しただけの空白行です。
ヒント
Q005の二重ループの応用です。ただし、「表示する行」と「表示しない行」で条件分岐させる必要があります。
解答例と解説
考え方
最初に「何を繰り返す」かを考えます。二重ループですので、小さな繰り返しと大きな繰り返しがあることに注目してください。小さな繰り返しは
- 文字'■'を表示する
の繰り返しとなります。この繰り返しを行数分繰り返すのが大きな繰り返しです。つまり、
- 「文字'■'を表示する」の繰り返し
を繰り返す、ということです。ここまではQ005の復習です。
しかし、この繰り返しは偶数行では実行する必要がありません。この条件分岐も考慮してみましょう。
- 奇数行目か偶数行目かを判断する
- 奇数行の場合、「文字'■'を表示する」の繰り返し
- 偶数行の場合、何もしない
という条件分岐が考えられ、これを行数分繰り返します。
ここまでを箇条書きでまとめると、
- 行数と列数を指定する
- 次の動作を行数分繰り返す
- 奇数行目か偶数行目かを判断する
- 奇数行の場合、次の動作を列数分繰り返す
- 文字'■'を表示する
- 偶数行の場合、何もしない
- 奇数行の場合、次の動作を列数分繰り返す
- 改行する
- 奇数行目か偶数行目かを判断する
という流れになります。2.2の改行も忘れないようにしましょう。
偶数行と奇数行の判定には、Q006で行った偶数奇数判定(2で割った余りが1なら奇数、0なら偶数)を使います。
フローチャート例
プログラム実装を意識した都合で、最初の行が「0行目」から始まっています。そのため、考え方の箇条書きとは違い、
- 偶数行(0, 2, 4, ・・・)の場合、「文字'■'を表示する」の繰り返し
- 奇数行(1, 3, 5, ・・・)の場合、何もしない
としています。もちろん、「1文字目」から始めたフローを考えた方も正解です。プログラム実装でも同様です。
Javaでの実装例
public class Q007 { public static void main(String[] args) { int row = 5; // 行(縦方向)の数 int col = 7; // 列(横方向)の数 for (int i = 0; i < row; i++) { // 行ループ if (i % 2 == 0) { // 偶数行の場合のみ実行 for (int j = 0; j < col; j++) { // 列ループ System.out.print('■'); } } System.out.println(); // 列ループが終われば改行 } } }
Q005、Q006のプログラム実装、そして上のフローチャートとの対応からプログラム実装例の流れを確認しましょう。列ループが終わったタイミングで改行だけを出力するのを忘れないようにしましょう。
おわりに
今回は二重ループの中に条件分岐が入るアルゴリズムでした。
箇条書きも実装例のインデント(字下げ)も段々と階層が深くなってきました。この階層を一まとまりとみなすことで、基本の二重ループ(Q005)と同じ形で理解できます。何なら内側のループも「列ループ」とまとめて名前をつけて認識してしまえば、もはや単なる繰り返し構文(Q001)です。
複雑なアルゴリズムでも、このまとまりを一つ一つしっかり認識することで全体の理解が早まります。このあたりもぜひ意識してみましょう。
次回はこちらです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。