こんにちは。ECF代表のヒガです。
本記事では初心者向けアルゴリズムの演習問題を紹介しています。日頃のプログラミング学習にご活用ください。
はじめに
アルゴリズムとは、コンピューターに行わせる計算手順のことです。自在にプログラムを作るには、プログラム言語の文法の知識とともにアルゴリズムの考え方を身につけることが必要になります。
アルゴリズム技法習得の肝は「繰り返し」の活用です。この連載では、簡単な題材で繰り返しを使うアルゴリズムの基本パターンを練習していきます。
演習問題の一覧や勉強スタイルについてのアドバイスはこちらからどうぞ。
Q030 配列データの合計
配列に格納された数値データの合計を求め表示させてください。ただし、操作対象の配列はプログラムの先頭で宣言し、適当な初期値を代入してください。
初期値として {68, 55, 72, 93, 87} を使って整数型(Javaではint型)配列を準備した場合の実行例は次のとおりです。
配列の要素を1つずつ足し合わせる方法もありますが、今回は繰り返しを使って実現させてください。
ヒント
Q024「配列の内容を表示」やQ029「配列データのコピー」と同じような形で実現できますが、何を繰り返せばいいのかを具体例を使って考えます。実行例で言えば
68 + 55 + 72 + 93 + 87
の計算は、前から順に足していけば答えを導き出せます。この流れを変数をうまく使って繰り返し処理に落とし込みましょう。
解答例と解説
考え方
まず最初に「何を繰り返す」かを考えますが、今回はここが難しいところです。一見何を繰り返せばいいかわかりません。そんなときは具体例を考えてみましょう。
実行例の
68 + 55 + 72 + 93 + 87
という足し算は、とりあえず前から順番に足していけばいい、ということはわかります。これを繰り返し「風」に箇条書きしてみます。
- 68 + 55 を求める
- 1の結果(ここまでの合計) + 72 を求める
- 2の結果(ここまでの合計) + 93 を求める
- 3の結果 (ここまでの合計)+ 87 を求める
と計算すればいいわけです。ちょっと惜しい感じです。「何を繰り返す」かで
- ここまでの合計と配列のデータ要素を足す
を繰り返すことになりそうですが、1の「68 + 55」の部分がうまく繰り返し処理に落とし込めませんでした。そんなときは、逆に「何を繰り返す」かの方針に合わせて変換してしましましょう。具体的には次のようにします。
- 0 + 68 を求める
- 1の結果(ここまでの合計)+ 55 を求める
- 2の結果(ここまでの合計)+ 72 を求める
- 3の結果(ここまでの合計)+ 93 を求める
- 4の結果(ここまでの合計)+ 87 を求める
1の「0 + 68」は一見先程と変わっていないようですが、0というのは「『まだ何も足していない』状態でのここまでの合計」と見なせます。もう一度まとめましょう。「ここまでの合計」は初期状態が0から始まるとして
- ここまでの合計 + 68 を求める
- ここまでの合計 + 55 を求める
- ここまでの合計 + 72 を求める
- ここまでの合計 + 93 を求める
- ここまでの合計 + 87 を求める
よって、「何を繰り返す」かは、
- ここまでの合計と配列のデータ要素を足す(ただし【ここまでの合計】の初期値は0)
を繰り返すことになります。全体を箇条書きでまとめると、
- 変数【ここまでの合計】を用意し、0で初期化する
- 次の動作を配列の要素数の分繰り返す
- 【ここまでの合計】に【カウンタ変数】番目のデータ要素を足す
- 【ここまでの合計】を表示する
という流れになります。
フローチャート例
このフローチャートでは、配列の添字は「1」から始まるとしています。最後の要素の添字は配列の要素数と一致します。表示ループは、1から要素数まで(カウンタ変数iが要素数を超えたら終了)の繰り返しとなります。
考え方にある【ここまでの合計】は「sum」という変数名にしました。変数sumは合計ループに入る前に0で初期化します。この変数sumに対して、ループ内で次々データが足し込まれていくことになります。
Javaでの実装例
public class Q030 { public static void main(String[] args) { int[] a = {68, 55, 72, 93, 87}; // 操作対象配列の宣言と初期化 int sum = 0; // 合計格納用変数 for (int i = 0; i < a.length; i++) { // 合計ループ sum = sum + a[i]; } System.out.println(sum); } }
Javaでは配列の添字は「0」からスタートしますので、カウンタ変数iの初期化や継続条件式は、上記のフローチャートからはそのように変更しています。配列の要素の添字は0から4(要素数 - 1)なので、0から4までの5回の繰り返しです。
上のフローチャートとの対応からプログラム実装例の流れを確認しましょう。
おわりに
繰り返す内容がひと目ではわかりにくい配列計算パターンのアルゴリズムを紹介しました。自力で考えるのは難しいところですが、それでも以前から紹介している「具体例を使いながら手を動かして考える」はここでも有効です。
また、そもそも、この合計アルゴリズムは様々な応用に効いてくるパターンとなっています。今後はその都度アルゴリズムを考えるというより、今回で覚えてしまって活用した方が得策です。
次回はこちらです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。