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

Java成绩计算代码中输入记录与传递机制的疑问

Java成绩计算代码疑问解答

示例代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        double avg;
        String[] name = new String[10]; // 创建一个名为"name"的字符串数组,长度为10
        
        for (int j = 0; j<10; j++)
        {
            System.out.println("What is the name of the student?");
            name[j] = sc.nextLine();    // 使用nextLine读取完整的输入字符串
            System.out.println("What are their test scores?");
            avg = calculateAverage(j);
            System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
        }
    }
    
    public static double calculateAverage(int j) {
        double [][]gradebook = new double[10][5];
        Scanner sc = new Scanner(System.in);
        double sum = 0;
        for (int v=0; v<5; v++)
        {
            gradebook[j][v] = sc.nextDouble();
            sum = gradebook[j][v] + sum;
        }
        
        double avg = sum / 5;
        return avg;
    }
    
    public static String calculateGrade (double avg)
    {
        if (avg >= 90 && avg <= 100) {
            return "A";
        }
        else if (avg >= 80) {
            return "B";
        }
        else if (avg >= 70) {
            return "C";
        }
        else if (avg >= 60) {
            return "D";
        }
        else {
            return "F";
        }
    }
}

用户疑问

疑问:main方法未在后续行直接配置Scanner,为何能接收多个输入?已知calculateAverage内有Scanner,想了解用户输入的多个数字如何传入该方法,是否需在main中直接记录输入,输入是否直接传递至calculateAverage?

解答

  1. 关于main无需后续配置Scanner也能接收输入的原因:
    calculateAverage方法内部自己创建了Scanner sc = new Scanner(System.in),这个Scanner和main里的Scanner一样,都是读取标准输入流(键盘输入)。只要是基于System.in创建的Scanner,读取的都是同一个输入源,所以即使main里没继续用自己的Scanner,calculateAverage里的Scanner依然能获取到用户的键盘输入。

  2. 关于分数输入的传递逻辑:
    用户输入的分数并不是在main里记录后传递给calculateAverage的,而是直接在calculateAverage方法内部通过它自己创建的Scanner读取的。不过这种写法存在明显问题:每次调用calculateAverage都新建一个Scanner实例,多个Scanner混用容易引发输入错位(比如main里用nextLine读取姓名后,输入流里残留的换行符可能被后续的nextDouble跳过,导致读取异常)。

  3. 优化建议:
    更规范的写法是只在main里创建一个Scanner,然后把它作为参数传递给calculateAverage方法,避免多个Scanner操作同一个输入流。修改后的calculateAverage方法可以是这样:

public static double calculateAverage(int j, Scanner sc) {
    double [][]gradebook = new double[10][5];
    double sum = 0;
    for (int v=0; v<5; v++)
    {
        gradebook[j][v] = sc.nextDouble();
        sum = gradebook[j][v] + sum;
    }
    
    double avg = sum / 5;
    return avg;
}

调用的时候改成avg = calculateAverage(j, sc);即可。

内容的提问来源于stack exchange,提问作者ems080

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:10:31