Java实现学生成绩计算:避免陷阱,精准输出总分与平均分
```java import java.util.*; class Chengji { int pingshi; int qimo; public Chengji(int pingshi, int qimo) { this.pingshi = pingshi; this.qimo = qimo; } // 计算总成绩:平时*0.4 + 期末*0.6,保留整数部分(直接舍去小数) public int getZong() { return (int)(pingshi * 0.4 + qimo * 0.6); } } class Xuesheng { String xuehao; String xingming; Chengji yuwen; Chengji shuxue; Chengji wuli; public Xuesheng(String xuehao, String xingming) { this.xuehao = xuehao; this.xingming = xingming; } // 设置对应科目的成绩 public void setChengji(String kecheng, Chengji chengji) { if ("语文".equals(kecheng)) { yuwen = chengji; } else if ("数学".equals(kecheng)) { shuxue = chengji; } else if ("物理".equals(kecheng)) { wuli = chengji; } } // 计算总分 public int getTotalScore() { return yuwen.getZong() + shuxue.getZong() + wuli.getZong(); } // 计算平均分,保留两位小数,四舍五入 public double getAverageScore() { return Math.round(getTotalScore() * 100.0 / 3) / 100.0; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Map<String, Xuesheng> xueshengMap = new LinkedHashMap<>(); // 保持输入顺序 while (sc.hasNextLine()) { String line = sc.nextLine().trim(); if (line.isEmpty()) break; String[] parts = line.split(" "); String xuehao = parts[0]; String xingming = parts[1]; String kecheng = parts[2]; int pingshi = Integer.parseInt(parts[3]); int qimo = Integer.parseInt(parts[4]); // 获取或创建学生对象 Xuesheng xs = xueshengMap.get(xuehao); if (xs == null) { xs = new Xuesheng(xuehao, xingming); xueshengMap.put(xuehao, xs); } // 创建成绩对象并设置到对应科目 Chengji cj = new Chengji(pingshi, qimo); xs.setChengji(kecheng, cj); } // 按输入顺序输出每个学生的总分和平均分 for (Xuesheng xs : xueshengMap.values()) { int total = xs.getTotalScore(); double avg = xs.getAverageScore(); System.out.printf("%s %s %d %.2f%n", xs.xuehao, xs.xingming, total, avg); } } } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 成绩计算时 `(int)(平时*0.4 + 期末*0.6)` 是截断小数而非四舍五入,必须确保类型转换前不进行 `Math.round` 等操作。 - 多行输入中可能存在空行或末尾换行,需使用 `trim()` 和判空处理避免 `split` 出现异常或数组越界。 - 学生信息按学号聚合,但输入顺序可能打乱课程顺序,应使用 `LinkedHashMap` 保证输出顺序与输入一致。 ######[AI写代码神器 | 852点数解答 | 2025-10-29 16:07:33]
- C 语言:快速实现 5 个学生信息录入、按成绩升序排序并输出!(字节豆包 | 373点数解答 | 2024-10-30 00:37:20)409
- C语言实现:输入5名学生信息并按成绩升序排序输出(字节豆包 | 354点数解答 | 2024-10-30 18:45:58)354
- C语言:输入5个学生信息,按成绩升序排序并输出(字节豆包 | 373点数解答 | 2024-10-31 19:49:58)344
- C语言:输入5名学生信息并按成绩升序排序输出(字节豆包 | 326点数解答 | 2025-01-01 20:11:47)340
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)404
- 培训机构学员成绩与年龄更新:C++ 代码实现(DeepSeek | 186点数解答 | 2025-12-16 18:04:31)59
- Python 处理培训机构学员培训后年龄与 NOIP 成绩提升情况(DeepSeek | 73点数解答 | 2025-12-16 18:05:20)62
- 培训机构学员成绩提升:C++代码实现年龄与NOIP成绩更新(DeepSeek | 178点数解答 | 2025-12-31 12:20:24)59
- 成绩等级统计:20个60 - 100分成绩的等级数量揭秘(字节豆包 | 219点数解答 | 2025-04-09 10:20:32)218
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)305
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1134
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343