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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2795閲覧

コマンドライン引数で二次元配列

hona_tan

総合スコア45

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/04 09:47

編集2020/11/04 09:48

argsで「71 85 93 83 63 31 67 77 81 87 89 55」と指定します。

test[][]に二重for文で入れると思うのですがそのやり方ができず、こんなに長いプログラムになってしまいました。

あと、せっかくint b;を使って最高点を指定しているのですがそれも生かせていません。

どうすれば短く、簡単なプログラムにできますか?

public class a { public static void main(String[] args) { int[][] test = new int[4][3]; int n = args.length; int sum=0,sum2=0,sum3=0,sum4=0; double heikin; if (n == 12) { System.out.println("コマンドライン引数は" +n+ "個です。"); for (int i=0; i<3; i=i+1) { test[0][i] = Integer.parseInt(args[0+i]); test[1][i] = Integer.parseInt(args[3+i]); test[2][i] = Integer.parseInt(args[6+i]); test[3][i] = Integer.parseInt(args[9+i]); } System.out.print("英語:"); for (int i=0; i<3; i=i+1) { System.out.print(test[0][i]+ "\t"); } for (int j=0; j<2; j=j+1) { for (int k=j+1; k<3;k=k+1) { if (test[0][j] < test[0][k]) { int b = test[0][j]; test[0][j] = test[0][k]; test[0][k] = b; } } } for (int i=0; i<3; i=i+1) { sum = sum + test[0][i]; } heikin = (double)sum / 3.0; System.out.print("最高点:" +test[0][0]+ "、最低点:" +test[0][2]+ "、平均点:" +heikin); System.out.println(); System.out.print("数学:"); for (int i=0; i<3; i=i+1) { System.out.print(test[1][i]+ "\t"); } for (int j=0; j<2; j=j+1) { for (int k=j+1; k<3;k=k+1) { if (test[1][j] < test[1][k]) { int b = test[1][j]; test[1][j] = test[1][k]; test[1][k] = b; } } } for (int i=0; i<3; i=i+1) { sum2 = sum2 + test[1][i]; } heikin = (double)sum2 / 3.0; System.out.print("最高点:" +test[1][0]+ "、最低点:" +test[1][2]+ "、平均点:" +heikin); System.out.println(); System.out.print("国語:"); for (int i=0; i<3; i=i+1) { System.out.print(test[2][i]+ "\t"); } for (int j=0; j<2; j=j+1) { for (int k=j+1; k<3;k=k+1) { if (test[2][j] < test[2][k]) { int b = test[2][j]; test[2][j] = test[2][k]; test[2][k] = b; } } } for (int i=0; i<3; i=i+1) { sum3 = sum3 + test[2][i]; } heikin = (double)sum3 / 3.0; System.out.print("最高点:" +test[2][0]+ "、最低点:" +test[2][2]+ "、平均点:" +heikin); System.out.println(); System.out.print("理科:"); for (int i=0; i<3; i=i+1) { System.out.print(test[3][i]+ "\t"); } for (int j=0; j<2; j=j+1) { for (int k=j+1; k<3;k=k+1) { if (test[3][j] < test[3][k]) { int b = test[3][j]; test[3][j] = test[3][k]; test[3][k] = b; } } } for (int i=0; i<3; i=i+1) { sum4 = sum4 + test[3][i]; } heikin = (double)sum4 / 3.0; System.out.print("最高点:" +test[3][0]+ "、最低点:" +test[3][2]+ "、平均点:" +heikin); System.out.println(); } else { System.out.println("エラー! コマンドライン引数が" +n+"個です。"); } } }

実行結果はこんな感じです。

コマンドライン引数は12個です。 英語:71 85 93 最高点:93、最低点:71、平均点:83.0 数学:83 63 31 最高点:83、最低点:31、平均点:59.0 国語:67 77 81 最高点:81、最低点:67、平均点:75.0 理科:87 89 55 最高点:89、最低点:55、平均点:77.0

補足説明
Eclipseを使っています。

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

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

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

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

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

dodox86

2020/11/04 10:47

> test[][]に二重for文で入れると思うのですが いえ、いきなり「入れると思う」と言われてもこの質問を読んだ人は何が何だか分かりません。ですので正しい回答も分かりません。どういう入力に対してどういう出力(結果)が欲しいのか、そもそもどういう課題なのか詳細に質問文に書きましょう。 > 実行結果はこんな感じです。 質問者さんのプログラムがそうなのですか? それとも目指す結果がそうなのですか? 「こんな感じ」という雰囲気で良いのでしょうか。
takasima20

2020/11/04 11:15

ぱっと見た感じだと、科目ごとの処理をサブルーチンにすればいいんじゃないの?
guest

回答2

0

「短く、簡単」の塩梅が難しいですが、私だったらこんな感じにしますかね。

  • 同じような処理はメソッドに切り出す
  • 早期リターンでネストを減らす
  • 最高・最低を出すだけならソートは不要
  • 拡張for文を使えるところは使う

Java

1public class Main { 2 public static void main(String[] args) { 3// args = new String[]{ "71", "85", "93", "83", "63", "31", "67", "77", "81", "87", "89", "55" }; // テスト用 4 5 // 早期リターンすれば、以降のネストが減って見やすい 6 if (args.length != 12) { 7 System.out.println("エラー! コマンドライン引数が" + args.length + "個です。"); 8 return; 9 } 10 11 System.out.println("コマンドライン引数は" + args.length + "個です。"); 12 13 int[][] test = new int[4][3]; 14 15// for (int i = 0; i < 3; i++) { 16// test[0][i] = Integer.parseInt(args[0 + i]); 17// test[1][i] = Integer.parseInt(args[3 + i]); 18// test[2][i] = Integer.parseInt(args[6 + i]); 19// test[3][i] = Integer.parseInt(args[9 + i]); 20// } 21 22 // 二重forで入れたいならこうだが、1行しか減ってないし↑でも良い気もする 23 for (int j = 0; j < 4; j++) { 24 for (int i = 0; i < 3; i++) { 25 test[j][i] = Integer.parseInt(args[i + j * 3]); 26 } 27 } 28 29 // 短くするならこうだが、(定型パターンとはいえ)何をやっているかわかりにくい 30// for (int i = 0; i < 12; i++) { 31// test[i / 3][i % 3] = Integer.parseInt(args[i]); 32// } 33 34 35 // testは配列の中に配列が入っているので、test[0]とするとint[3]が取り出せる 36 print(test[0], "英語"); 37 print(test[1], "数学"); 38 print(test[2], "国語"); 39 print(test[3], "理科"); 40 } 41 42 43 // 同じような処理になった場合は、メソッドに切り出せないか検討する 44 private static void print(int[] source, String subject) { 45 // 最高点・最低点を出すだけならソートする必要もない 46 int min = Integer.MAX_VALUE; 47 int max = Integer.MIN_VALUE; 48 int sum = 0; 49 50 System.out.print(subject + ":"); 51 // 拡張for文のほうがすっきり見える 52 for (int value : source) { 53 System.out.print(value + "\t"); 54 55 if (value < min) min = value; 56 if (value > max) max = value; 57 sum += value; 58 } 59 System.out.println("最高点:" + max + "、最低点:" + min + "、平均点:" + (double) sum / source.length); 60 } 61}

この後個人毎の集計が入ったりすると、また悩ましいところですが^^;

投稿2020/11/04 21:54

TN8001

総合スコア9862

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

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

0

ベストアンサー

短くすればいいんですよね。

Java

1public class a { 2 public static void main(String[] args) { 3 int n = args.length; 4 if (n != 12) 5 System.out.println("エラー! コマンドライン引数が" + n +"個です。"); 6 else { 7 System.out.println("コマンドライン引数は" + n + "個です。"); 8 String[] subject = { "英語", "数学", "国語", "理科" }; 9 int k = 0; 10 for (int i = 0; i < 4; i++) { 11 System.out.print(subject[i] + ":"); 12 int max = 0, min = 100, sum = 0; 13 for (int j = 0; j < 3; j++) { 14 int v = Integer.parseInt(args[k++]); 15 if (v > max) max = v; 16 if (v < min) min = v; 17 sum += v; 18 System.out.printf("%6d", v); 19 } 20 System.out.println(" 最高点:" + max + "、最低点:" + min 21 + "、平均点:" + sum / 3.0); 22 } 23 } 24 } 25}

二次元配列は不要ですが、どうしても二次元配列に値を入れたかったら、
int[][] test = new int[4][3]; を追加し、
for (int j = 0; ... の for文の中で、test[i][j] = v; とすればよいでしょう。

投稿2020/11/04 16:46

編集2020/11/04 16:50
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問