You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Java程序:保留指定ID学生成绩,降低其余成绩

Java程序修正:指定学生外成绩批量降低功能实现

需求说明

编写Java程序,接收学生ID和一个数值输入,将存储学生信息(姓名、ID、成绩)的字符串中,除指定ID对应学生外的所有成绩降低输入的数值。学生信息每行一条记录,示例输入字符串:

String notesDéchiffrées = "Simon, 12345, 75\nNick, 23456, 85\nFrank, 34567, 97\n";

原代码存在的问题

  1. ID判断逻辑错误:原代码用notesDéchiffrées.indexOf(matricule) == -1检查整个字符串是否存在目标ID,而非判断当前行的学生ID,导致要么所有行都修改,要么都不修改。
  2. 成绩提取错误:用全局的lastIndexOf(", ")获取成绩位置,会拿到整个字符串最后一个逗号的位置,而非当前行的成绩起始点。
  3. 结果未拼接:生成修改后的学生记录后,没有将其添加到结果字符串temporaireD中,最终无法得到修改后的完整数据。
  4. 边界情况未处理:如果字符串最后一行没有换行符,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:40:27