如何编写Java程序:保留指定ID学生成绩,降低其余成绩
Java程序修正:指定学生外成绩批量降低功能实现
需求说明
编写Java程序,接收学生ID和一个数值输入,将存储学生信息(姓名、ID、成绩)的字符串中,除指定ID对应学生外的所有成绩降低输入的数值。学生信息每行一条记录,示例输入字符串:
String notesDéchiffrées = "Simon, 12345, 75\nNick, 23456, 85\nFrank, 34567, 97\n";
原代码存在的问题
- ID判断逻辑错误:原代码用
notesDéchiffrées.indexOf(matricule) == -1检查整个字符串是否存在目标ID,而非判断当前行的学生ID,导致要么所有行都修改,要么都不修改。 - 成绩提取错误:用全局的
lastIndexOf(", ")获取成绩位置,会拿到整个字符串最后一个逗号的位置,而非当前行的成绩起始点。 - 结果未拼接:生成修改后的学生记录后,没有将其添加到结果字符串
temporaireD中,最终无法得到修改后的完整数据。 - 边界情况未处理:如果字符串最后一行没有换行符,
finÉlève会返回-1,调用substring时会抛出异常。
修正后的完整代码
import java.util.Scanner; public class StudentScoreAdjuster { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); // 示例学生信息字符串 String notesDéchiffrées = "Simon, 12345, 75\nNick, 23456, 85\nFrank, 34567, 97\n"; System.out.print("请输入要保留成绩的学生ID:"); String matricule = keyboard.nextLine(); System.out.print("请输入要降低的分数值:"); int baisse = keyboard.nextInt(); String temporaireD = ""; int débutÉlève = 0; int finÉlève; while (débutÉlève < notesDéchiffrées.length()) { // 定位当前行的结束位置,处理最后一行无换行的情况 finÉlève = notesDéchiffrées.indexOf('\n', débutÉlève); if (finÉlève == -1) { finÉlève = notesDéchiffrées.length(); } // 截取当前行的完整记录 String currentLine = notesDéchiffrées.substring(débutÉlève, finÉlève); // 分割行数据为姓名、ID、成绩 String[] parts = currentLine.split(", "); if (parts.length == 3) { String name = parts[0]; String studentId = parts[1]; int score = Integer.parseInt(parts[2]); // 仅修改非目标ID学生的成绩 if (!studentId.equals(matricule)) { score -= baisse; } // 将修改后的记录追加到结果字符串 temporaireD += name + ", " + studentId + ", " + score + "\n"; } // 移动到下一行的起始位置 débutÉlève = finÉlève + 1; } // 输出最终结果 System.out.println("\n修改后的学生成绩:"); System.out.print(temporaireD); keyboard.close(); } }
核心修正点说明
- 改用逐行处理:先截取当前行,再分割为独立字段,确保ID和成绩的判断提取仅针对当前学生。
- 处理边界情况:当最后一行无换行符时,手动设置行结束位置为字符串长度,避免索引越界。
- 结果拼接:将每一行修改后的内容追加到结果字符串,最终输出完整的修改后数据。
- 输入提示汉化:把原法语提示改为中文,符合中文使用场景。
内容的提问来源于stack exchange,提问作者Bibz
相关产品推荐
相关产品推荐

