質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1099閲覧

配列の中身を理解したい

rink

総合スコア80

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/14 09:00

編集2019/01/14 09:06

本当に汚いソースでごめんなさい。初心者です。クラスごとの教科別の点数の合計を示したいのですが、うまくいきません。

java

1 sum[i][q] += a[i][z][q];//クラスの科目ごとの点数の合計を出そうとしています‥

この場合は

java

1for(i=0;i<n;i++){ 2 System.out.printf("\n%d組の人数",i+1); 3 u = stdIn.nextInt(); 4 a[i] = new int[u][];//a[0][]は一組の点数の箱 5 ninzu += u;//u[0]は1組の人数 6 for(z=0;z<a[i].length;z++){ 7 a[i][z] = new int[s.length]; 8 for(q=0;q<s.length;q++){ 9 System.out.printf("%d組%d番の"+s[q]+"の点数",i+1,z+1); 10 a[i][z][q]=stdIn.nextInt(); 11 12 } 13 } 14 }

とは別のfor文を作成して、sum[i][q]を定義しなければならないのでしょうか?

java

1import java.util.Scanner; 2class M6_19{ 3 public static void main(String[] args){ 4 Scanner stdIn = new Scanner(System.in); 5 int n,i,z,p,q; 6 int u=0; 7 int j; 8 int sum[]=null; 9 int total=0; 10 int ninzu=0; 11 String[] s = {"国語","数学","社会","理科","英語"}; 12 13 System.out.print("クラス数:"); 14 n=stdIn.nextInt(); 15 int[][][] a = new int[n][][]; 16 17 for(i=0;i<n;i++){ 18 System.out.printf("\n%d組の人数",i+1); 19 u = stdIn.nextInt(); 20 a[i] = new int[u][];//a[0][]は一組の点数の箱 21 ninzu += u;//u[0]は1組の人数 22 for(z=0;z<a[i].length;z++){ 23 a[i][z] = new int[s.length]; 24 for(q=0;q<s.length;q++){ 25 System.out.printf("%d組%d番の"+s[q]+"の点数",i+1,z+1); 26 a[i][z][q]=stdIn.nextInt(); 27 28 } 29 } 30 } 31 32 33 for(i=0;i<a.length;i++){ 34 System.out.println((i+1)+"組 | 合計  平均"); 35 System.out.println("-----+---------------"); 36 //合計 37 for(q=0;q<s.length;q++){ 38 for(z=0;z<a[i].length;z++){ 39 sum[i][q] += a[i][z][q];//クラスの科目ごとの点数の合計を出そうとしています‥ 40 } 41 } 42 System.out.printf( 43 "%2d|%7d%7.1f\n",s[i],sum[i][q](double)sum[i]/a[i].length); 44 45 sum=null; 46 } 47 // System.out.println("-----+---------------"); 48 // System.out.printf(" 計 |%7d%7.1f\n",total,(double)total/ninzu); 49 50 51 52 53 54 55 56 57 58/* 59 for(i=0;i<a.length;i++){ 60 System.out.println("組 | 合計  平均"); 61 System.out.println("-----+---------------"); 62 //合計 63 for(z=0;z<a[i].length;z++){ 64 for(q=0;q<s.length;q++) 65 sum[i] += a[i][z][q];//クラスごとの合計を出そうとしていますができません‥ 66 } 67 //total += sum[i]; 68 System.out.printf("%2d組|%7d%7.1f\n",i+1,sum[i],(double)sum[i]/a[i].length); 69 sum=null; 70 } 71 // System.out.println("-----+---------------"); 72 // System.out.printf(" 計 |%7d%7.1f\n",total,(double)total/ninzu); 73*/ 74 } 75} 76

変数が多く、読みにくいと思いますが、どうか私にアドバイスをくださるとうれしい限りです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/01/14 09:58

タイトルと中身が合致していないように思います。もう少し中身に寄せたタイトルに修正してください
guest

回答1

0

ベストアンサー

sum[i][q] += a[i][z][q];//クラスの科目ごとの点数の合計を出そうとしています‥

まず、『どのように使いたいか』考えてみましょう。

sum[クラス番号][科目番号] に適切な得点を入れたいのなら、
変数sumの宣言及び初期化はint[][] sum = new int[クラス数][科目数] にすれば良いです。

クラス数は比較的早い段階で確定するので、そのときに初期化してしまえば後はいじる必要がありません。


配列でゴリ押すことが要求された課題だとしても、分かり易くする余地はあります。

  1. インデックスに用いる変数の名前はもうちょっと工夫できます。
  2. 変数のスコープを狭くすると影響範囲も当然狭まり、バグが減ります。

例えばこう書くだけでもかなり雰囲気が変わります。

Java

1for(int class_idx = 0; class_idx < scores.length; ++class_idx) { 2 int[][] class_scores = scores[class_idx]; 3 4 for(int human_idx = 0; human_idx < class_scores.length; ++human_idx) { 5 int[] human_scores = class_scores[human_idx]; 6 7 for(int subject_idx = 0; subject_idx < human_scores.length; ++subject_idx) { 8 sum[class_idx][subject_idx] += human_scores[subject_idx]; 9 } 10 } 11}

そもそも三重ループ自体が読みづらいですが、
現状の縛りで三次元配列を扱うならこうなること自体は仕方ないと思います。


新しくメソッドやクラスやライブラリの知識を得たら、その際は書き直してみると良いでしょう。
圧倒的に簡潔且つセマンティックに書けるので愕然とすること請け合いです。

正直、ゴリ押しプログラミングは労力のわりに得られるものが少ないです。

投稿2019/01/14 09:30

編集2019/01/14 09:34
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rink

2019/01/14 10:17

いつも早い回答をしてくださり、助かります。メソッドなと、お勉強はしたのですが、未だ実践に踏み込んでいませんので、もっとお勉強をして、もう一度この課題に取り組んでみようと思います!もう少し粘りますが。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問