0Pricing
Java Academy · 课时

二维小项目:成绩簿

小项目:使用二维 int 矩阵构建一个简单的成绩簿。打印对齐的表格,计算每位学生和每项作业的平均分,找出表现最佳者,调整分数,并输出汇总报告。

二维小项目:成绩簿 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 6 节课。

项目概览

项目目标:将成绩表表示为一个二维 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 的平均分?

回顾与下一步

回顾:您使用二维数组建模了成绩册,打印了对齐的表格,计算了行平均值和列平均值,找出了表现最佳者,调整了分数,并生成了汇总报告。下一步:将这些工具封装到可复用的辅助类中。

常见问题解答

「二维小项目:成绩簿」课时是免费的吗?

是的 — 「二维小项目:成绩簿」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 6 节课。

「二维小项目:成绩簿」这节课中我会学到什么?

小项目:使用二维 int 矩阵构建一个简单的成绩簿。打印对齐的表格,计算每位学生和每项作业的平均分,找出表现最佳者,调整分数,并输出汇总报告。 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 6 节。

「二维小项目:成绩簿」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 二维数组基础与嵌套遍历
  2. 不规则数组与表格格式化
  3. 行列最大值、转置与格式化
  4. 二维小项目:成绩簿
  5. 将二维工具提取为辅助类(重构)
  6. 二维数据清理与验证
← 返回 Java Academy