プログラミングは「こう書けばいい」……ではないです。
『プログラムは魔法でもなんでもなく、人間が現実世界でやっていることを逐一指示されながら処理しているだけの代物である』です。
つまり、『現実世界でならどうするか』です。
今回の場合を見てみましょうか。
まずプログラミング云々は置いておきましょう。
名前 国語 算数 理科 社会 英語 合計 平均
伊藤 21 68 65 41 76
山田 90 29 43 27 64
佐藤 88 47 68 17 98
吉田 41 21 44 73 36
上野 25 87 14 57 5
合計
平均
ですね。
何かに似ていませんか?
そう、Excelのあの表です。行と列があるやつです。
伊藤, 山田, 佐藤... とあるあれを行、名前, 国語, 算数, 理科……とあるあれを列と見たとき、
どう見えますか?
問題を簡単にするために、数字の範囲だけ(すでにわかっている範囲だけ)をExcelの表と考えてみてください。
Excelは A1 とかですが、二次元配列をイメージするためにも arr[行][列] とし、行も列も0から始まるとします。
そうすると、arr[0][0] には 伊藤さんの国語の点数が入っているはずです。
まずはExcelの方眼用紙(?)に数字を埋めていくイメージで設定していきます。
今回知りたいのはなんでしょうか?
『1人分の五教科の合計』と『各教科の合計』ですね。
では、『1人分の五教科の合計』とはなんでしょうか。
そう、
1人分の五教科の合計 = 国語の点数 + 算数の点数 + 理科の点数 + ... + 英語の点数
ですね。簡単に言えば、1人分の5教科の点数すべての合計ですね。
では、伊藤さんの国語の点数は? そう、(配列をarrとすると) arr[0][0] ですね。
伊藤さんの数学の点数は? そう arr[0][1] ですね。
伊藤さんの理科の点数は? そう arr[0][2] ですね。
つまり、
合計 = arr[0][0] + arr[0][1] + arr[0][2] + arr[0][3] + arr[0][4]
ですね。
それで、数字に着目してみてください。
行番号は変動一切なしですが、列が +1 して行っています。
では、これを計算してみてください。
伊藤さんのは、
合計 = 21 + 68 + 65 + 41 + 76 = 271
ですね。(私は計算が苦手なので計算ミスしている可能性もある。それに関してはご容赦を)
で、計算するとき、一気に計算しますか?
私はすぐにはできないので、算数や数学の問題として出されたら、
1. ノートを用意する(計算用紙でもいいけど)
2. まず21 + 68を計算する
3. (2)での答えをノートに一時的な答えとして記録しておく(これを記録Xとする)
4. 次に記録X に +65 をする
5. 記録X を更新する
6. 記録X に +41 をする
7. 記録Xを更新する
...
のように、一時的にどこかに書いておく。
そうすると、
21 + 68 以外は常に 『記録X + <追加する数字>』となっています。
でも、21 のときも、記録X の初期値を 0 と考えれば、
記録X = 0
記録X + 21
0 + 21 = 21
となり、ちゃんと21になるため、記録Xの初期値を0と仮定すれば最初の21も
記録X + <追加する数字>
という規則性が成り立つ。
つまり、
■ 記録Xの初期値 = 0 とする
■ 記録X = 記録X + <追加する数字>
という規則性が出てくる。
ということで、『1人分の五教科の合計』はわかりましたね。
上記では伊藤さんのみですが、行を降りていけば他の方々も出来ます。
次に、『各教科の合計』とはなんでしょうか。
国語を例にとると、
合計 = 伊藤さんの点数 + 山田さんの点数 + 佐藤さんの点数 + ... + 上野さんの点数
ですね。
伊藤さんの国語の点数はどこにありますか?
そう、arr[0][0] ですね。
山田さんのは?
そう、arr[1][0] ですね。
と考えると、
合計 = arr[0][0] + arr[1][0] + arr[2][0] + arr[3][0] + arr[4][0]
ですね。
これも同様に数字に着目して下さい。
行番号は +1 していっているが、列は完全固定ですね。
(教科が変われば列も変わるが、今は国語だけの話なので)
……と言う風に考えてみてください。
そして出てきた規則性から、ノートなりホワイトボードなりにその規則性を用いて書いてみてください。
それでうまくいくならこれを実装します。
JavaならJavaの書き方とかに書き下させばいいだけです。
後はデバッグやテストをすれば完了です。