プログラムの基本構文は分かるが、どのようにコードに落とし込んだら良いのか悩んでいる方がいましたら、本記事を参考にしてみてください。プログラムを3つの構造に整理します。そのうちのいずれかになるようにコードを考えます。今回は、順次と反復について考えます。サンプルコードは、Javaで記述しています。
構造化プログラミング
プログラムを3つの制御構造に整理します。
- 順次(逐次)
- 上から順に処理する
- 上からコードを書くと順次処理になるので、難しく考えなくて良い。
- 分岐(if文、swithc文)
- 条件を満たすかどうかで、その先の処理が枝分かれする。
- 反復(for文、while文)
- 条件が満たされる間、同じ処理を繰り返す。
この3つの構造に当てはまるように、コードを考えます。
順次
順次とは、記述された順に上から実行する処理です。
反復
合計を求めるプログラムを例に、反復の考え方を見ていきます。
合計を求めるプログラム(1)
例えば、3つの数字の合計を求めるプログラムについて考えます。以下は、3つの変数を全て足してから変数sumに代入するやり方です。
/* Sample.java */ class Sample { public static void main(String[] args) { int x = 10, y = 20, z = 30; int sum = x + y + z; System.out.println("x + y + z = " + sum); } }
ごく普通に足し算をして、合計を求めています。
合計を求めるプログラム(2)
以下は、変数sumに変数を1回ずつ足していくやり方です。
/* Sample.java */ class Sample { public static void main(String[] args) { int x = 10, y = 20, z = 30; int sum = 0; sum = sum + x; // イ sum = sum + y; // ロ sum = sum + z; // ハ System.out.println("x + y + z = " + sum); } }
1回、1回、変数sumに変数x、y、zを足して、変数sumに代入しています(イ、ロ、ハの部分)。わざわざ1回、1回、足さなくても良いと思うかもしれませんが、こちらの方が良い場合があります。例えば、数値を10個足す場合を考えると、(1)の考え方だと変数を10個用意しないといけません。これは、冗長で面倒です。記述ミスもあり得ます。
/* (1)の考え方 */ class Sample { public static void main(String[] args) { int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5, x6 = 6, x7 = 7, x8 = 8, x9 = 9, x10 = 10; int sum = x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10; System.out.println("x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 = " + sum); } }
(2)の考え方だと繰り返し(反復)処理として、以下のように書けます。
/* (2)の考え方 */ class Sample { public static void main(String[] args) { int[] x = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sum = 0; for(int i = 0; i < x.length; i++){ sum = sum + x[i]; // ニ } System.out.println("x[0] + x[1] + x[2] + x[3] + x[4] + x[5] + x[6] + x[7] + x[8] + x[9] = " + sum); } }
イ、ロ、ハは、「2つの変数を足して、変数sumに代入する」という処理で、同じ処理を3行書いています。この部分を(2)では、変数を配列で用意してfor文にすることで、1行で書いています(二の部分)。このコードでは10回足していますが、配列の要素数を100個にしても、同じコードで100回足すことができます。(1)の方法で書くよりも変更箇所が少なく済みます。
まとめ
構造化プログラミングの順次と反復について、簡単ではありますが書きました。順次、分岐、反復の形になるようにプログラムを整理して、コードに落とし込めると良いです。今回のコードで、反復処理のありがたみを感じられたのではないでしょうか。