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