こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

多次元配列について質問

以下は、Javaの参考書に掲載されていたある問題です。
その問題文と解答ソースコードを記載しますので、以下の疑問点に答えていただければ幸いです。
また、僭越ながらお願いがあるのですが、このソースコードを一度実行してから私の質問を見たほうが、より私の疑問点が回答者様にわかると思うので、実行してくだされば幸いです。


問題文:次のA~Cの手順に従ってプログラムを作成しなさい。

A:5×4の2次元配列のint型配列pを作成します。つまり、pは5個の要素を持ち、各要素が「4つの要素を持つintの配列」であるような配列です。

B:次にpの全要素にMath.random()で得られる乱数値を代入しなさい。乱数値は0から10の範囲になるように10倍し、さらにintにキャストして配列の要素に代入しなさい。

C:pの全ての要素を例示のように表示しなさい。(※ここでいう「例示」とは、私がこの質問板にupした画像のこと)ただし、pの各要素を5×4の表と見た時、各列の(縦方向の並び)の合計を、その5×4の表と見た時、各列(縦方向の並び)の合計も例示のように表示しなさい。


---解答ソースコード(クラス宣言は除きます)---

public static void main(String[]arg){
//A
int[][]p=new int[5][4];
//B
for(int i=0;i<p.length;i++){
for(int j=0;j<p[i].length;j++){
p[i][j]=(int)(Math.random()*10);
}
}
for(int[]n:p){
for(int m:n){
System.out.print(m+"\t");
}
System.out.println();//改行

}
//C
int[]sum=new int[p[0].length];
for(int[]n:p){
for(int j=0;j<n.length;j++){
sum[j]+=n[j];
}
}
System.out.println();
for(int m:sum){
System.out.print(m+"\t");
}
}


疑問点:Cの手順の解答について疑問なのですが、以下のソースコードで何故各列の合計を求められるかわかりません。何故ですか?凄く頭が引きちぎれるほど考えたのですがわかりませんでした。

int[]sum=new int[p[0].length];
for(int[]n:p){
for(int j=0;j<n.length;j++){
sum[j]+=n[j];
}
}



だって、例えば拡張for文でpの0番目の要素を取り出して、さらにfor文でその0番目の要素の0番目、1番目、2番目、3番目をsumに累計するといったように、縦方向でなく「横方向」に合計するソースコードに僕は思えるんですよ。何故縦方向に合計できるんですか?たしかに実行すると縦方向に合計されてるので、縦方向に合計するものには間違いなのだけれど、、

投稿日時 - 2011-09-06 18:59:47

QNo.6993760

すぐに回答ほしいです

質問者が選んだベストアンサー

横方向に処理という考えはあってます。
ただ、「0番目、1番目、2番目、3番目がsumに累計される」といのが誤りです。
0番目はsum[0]に累計され、1番目はsum[1]に累計され、
2番目はsum[2]に累計されます。

和を保存する変数が配列で、しかもループのたびに配列の添字が変わることを
見落としていたのが勘違いの原因だと思います。
もう一度、sum[j]のjの値に注意しながらソースコードを読んでみましょう。

投稿日時 - 2011-09-06 19:28:13

補足

お返事遅れてしまい大変申し訳ありませんでした。。。

R_Earlさんのご教示でたぶん解決しました!
今から、以下のソースコードが各列方向に累計がされる理由について、その見解を書きますね。正しいかどうか判定してください!



int[]sum=new int[p[0].length];
for(int[]n:p){
for(int j=0;j<n.length;j++){
sum[j]+=n[j];
}
}

例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])が代入され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか?

投稿日時 - 2011-09-08 02:51:37

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問