0Pricing
Java Academy · レッスン

2次元ミニプロジェクト:成績表

2次元のint行列を使って小さな成績表を作成します。表を揃えて出力し、学生ごと・課題ごとの平均を計算し、優秀な成績を見つけ、得点を調整して概要レポートを出力します。

「2次元ミニプロジェクト:成績表」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全6レッスンが含まれています。

プロジェクトの概要

プロジェクトの目標: 成績表を2Dのint行列で表します。各行は学生、各列は宿題・小テスト・試験を表します。位置を揃えた表を出力し、学生ごとおよび課題ごとの平均を計算し、最も成績の高い学生と課題を見つけ、得点を調整して、概要レポートを生成します。

シーンに沿って、各コードサンプルを順番に実行してください。入力は必要ありません。

作成と出力

ステップ1: 小さな成績表の行列を作成し、列を揃えて出力します。ヘルパーで列幅を計算し、各値に空白を追加する出力処理を使います。

public class Main {
				  // Join helper for one-dimensional arrays (space-separated)
				  static String join(int[] a) {
					String s = "";
					for (int i = 0; i < a.length; i = i + 1) {
					  s = s + a[i] + (i + 1 < a.length ? " " : "");
					}
					return s;
				  }

				  // Compute column widths for aligned printing (jagged-aware)
				  static int[] widths(int[][] m) {
					int maxCols = 0;
					for (int r = 0; r < m.length; r = r + 1) {
					  if (m[r].length > maxCols) maxCols = m[r].length;
					}
					int[] w = new int[maxCols];
					for (int r = 0; r < m.length; r = r + 1) {
					  for (int c = 0; c < m[r].length; c = c + 1) {
						int len = Integer.toString(m[r][c]).length();
						if (len > w[c]) w[c] = len;
					  }
					}
					for (int c = 0; c < w.length; c = c + 1) if (w[c] < 1) w[c] = 1;
					return w;
				  }

				  // Print matrix with aligned columns
				  static void printAligned(int[][] m) {
					int[] w = widths(m);
					for (int r = 0; r < m.length; r = r + 1) {
					  String line = "";
					  for (int c = 0; c < m[r].length; c = c + 1) {
						String s = Integer.toString(m[r][c]);
						while (s.length() < w[c]) s = " " + s;
						line = line + s + (c + 1 < m[r].length ? " " : "");
					  }
					  System.out.println(line);
					}
				  }

				  public static void main(String[] args) {
					// Create a 4x5 gradebook (4 students, 5 assignments)
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("Gradebook (rows: students, cols: assignments):");
					printAligned(g);
				  }
				}
				

行と列の平均

ステップ2: 学生ごと(行ごと)および課題ごと(列ごと)の平均を計算します。列の平均では、ジャグ配列に対応するため、各行の長さを確認する必要があります。

public class Main {
				  // Average of one row (student r)
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  // Average of one column (assignment c)
				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Compute per-student averages
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Compute per-assignment averages
					int assignments = g[0].length;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  System.out.println("assignment " + c + " avg = " + String.format("%.2f", avg));
					}
				  }
				}
				

最も成績の高い学生と課題

ステップ3: 最も成績の高い学生(行の平均が最大)と課題(列の平均が最大)を見つけます。

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double colAverage(int[][] g, int c) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) { if (c < g[r].length) { sum = sum + g[r][c]; count = count + 1; } }
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					// Find top student by average
					int bestStudent = -1;
					double bestAvg = -1.0;
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  if (avg > bestAvg) { bestAvg = avg; bestStudent = r; }
					}

					// Find top assignment by average
					int assignments = g[0].length;
					int bestAssign = -1;
					double bestCol = -1.0;
					for (int c = 0; c < assignments; c = c + 1) {
					  double avg = colAverage(g, c);
					  if (avg > bestCol) { bestCol = avg; bestAssign = c; }
					}

					System.out.println("top student = " + bestStudent + " (avg=" + String.format("%.2f", bestAvg) + ")");
					System.out.println("top assignment = " + bestAssign + " (avg=" + String.format("%.2f", bestCol) + ")");
				  }
				}
				

得点の調整

ステップ4: 一律の調整(例: 各得点に+5点、ただし100点を上限とする)を適用し、調整前後の行列を出力します。

public class Main {
				  // Add a flat curve of k points (capped at 100)
				  static void curve(int[][] g, int k) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						int v = g[r][c] + k;
						if (v > 100) v = 100;
						g[r][c] = v;
					  }
					}
				  }

				  static void print(int[][] g) {
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) {
						System.out.print(g[r][c] + (c + 1 < g[r].length ? " " : ""));
					  }
					  System.out.println();
					}
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {78, 85, 90, 88, 92},
					  {95, 91, 89, 93, 87},
					  {60, 72, 70, 68, 75},
					  {88, 84, 79, 85, 90}
					};

					System.out.println("before curve:");
					print(g);
					curve(g, 5); // +5 points each
					System.out.println("after curve (+5, capped at 100):");
					print(g);
				  }
				}
				

概要レポート

ステップ5: 学生ごとの平均とクラス全体の平均を含む簡単なレポートを生成します。(後でこれをレターグレードに拡張することもできます。)

public class Main {
				  static double rowAverage(int[][] g, int r) {
					int sum = 0;
					for (int c = 0; c < g[r].length; c = c + 1) sum = sum + g[r][c];
					return (double) sum / g[r].length;
				  }

				  static double overallAverage(int[][] g) {
					int sum = 0;
					int count = 0;
					for (int r = 0; r < g.length; r = r + 1) {
					  for (int c = 0; c < g[r].length; c = c + 1) { sum = sum + g[r][c]; count = count + 1; }
					}
					return (double) sum / count;
				  }

				  public static void main(String[] args) {
					int[][] g = {
					  {83, 90, 95, 93, 97},  // assume already curved values
					  {100, 96, 94, 98, 92},
					  {65, 77, 75, 73, 80},
					  {93, 89, 84, 90, 95}
					};

					// Print each student average
					for (int r = 0; r < g.length; r = r + 1) {
					  double avg = rowAverage(g, r);
					  System.out.println("student " + r + " avg = " + String.format("%.2f", avg));
					}

					// Print overall average
					System.out.println("overall avg = " + String.format("%.2f", overallAverage(g)));
				  }
				}
				

学生の平均の確認

クイックチェック: 学生rの平均を計算する式はどれですか?

まとめと次のステップ

復習:2次元配列で成績表をモデル化し、列を揃えた表を出力し、行と列の平均を計算し、上位の成績を見つけ、得点を補正し、概要レポートを作成しました。次は、これらのユーティリティを再利用可能なヘルパークラスにまとめます。

よくある質問

「2次元ミニプロジェクト:成績表」レッスンは無料ですか?

はい。「2次元ミニプロジェクト:成績表」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全6レッスンが含まれています。

「2次元ミニプロジェクト:成績表」で何を学びますか?

2次元のint行列を使って小さな成績表を作成します。表を揃えて出力し、学生ごと・課題ごとの平均を計算し、優秀な成績を見つけ、得点を調整して概要レポートを出力します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/6です。

「2次元ミニプロジェクト:成績表」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 2次元配列の基礎とネストした反復処理
  2. 不揃いな配列と表の整形
  3. 行・列の最大値、転置、整形
  4. 2次元ミニプロジェクト:成績表
  5. ヘルパークラスとしての2次元ユーティリティ(リファクタリング)
  6. 2次元データのクリーニングと検証
← Java Academyに戻る