0

我正在处理一项作业,我需要从 java 中的输入文件中打印 3 组不同分数的平均值。平均值必须四舍五入到小数点后 2 位。我尝试创建扫描仪,以便可以添加输入文件中的小数并求平均值,但是当我单击运行时,netbeans 只是运行并且没有打印出来。我也没有收到错误。任何关于我如何让它运行的提示将不胜感激。

输入文件内容:7.88 6.44 5.66 3.44 7.50 9.80 4.33 2.31 8.99 7.62 3.67 4.39

``这是代码(所有必要的导入都已导入)

public static void main(String[] args) throws IOException {

    {
        Scanner sc = new Scanner(new File("Gym.in"));

        double Number = sc.nextFloat();
        {
            NumberFormat fmt = NumberFormat.getNumberInstance();
            fmt.setMinimumFractionDigits(2);
            fmt.setMaximumFractionDigits(2);

            Scanner sf = new Scanner(new File("Gym.in"));
            int maxIndx = -1;
            String text[] = new String[100];
            while (sf.hasNext())
                ;
            {
                maxIndx++;
                text[maxIndx] = sf.nextLine();
                System.out.println(text[maxIndx]);
            }
            sf.close();

            String answer;
            double sum;
            double average;

            for (int j = 0; j <= maxIndx; j++) {
                StringTokenizer st = new StringTokenizer(text[j]);
                Scanner sg = new Scanner(text[j]);
                System.out.println(text[j]);

                Scanner ss = new Scanner(text[j]);
                sum = 0;
                average = sum / 10;
                answer = "For Competitor #1, the average is: ";

                while (sc.hasNext()) {
                    double i = sc.nextDouble();
                    answer = answer + i;
                    sum = sum + i;
                }

                answer = answer + average;
                System.out.println(answer);

            }
        }
    }
}
4

2 回答 2

2

这段代码有几个问题 - 一个是您期望'.'作为小数点字符,但在我的语言环境中它是',',所以我得到的第一件事是java.util.InputMismatchException.

无论如何,您的代码似乎没有做任何事情的原因是以下几行:

 while (sf.hasNext())
             ;

这实际上是一个无限循环。当您的扫描仪有更多令牌要传递时,您正在循环,但您永远不会检索下一个令牌。所以hasNext()true永远回来。

如果您删除,;那么您的代码将运行。我还没有验证结果。


您还需要重新计算平均值:使用您的代码,您的平均值将始终保持不变0.0

sum = 0;
average = sum / 10;
...
answer = answer + average;
System.out.println(answer);

我也不确定为什么要将总和除以 10-在您的情况下可能应该是 12(假设“每组分数”是输入文件中的一行)。总而言之,您的方法还不错 - 您基本上必须删除一些不必要的代码并将第二个循环中的语句以正确的顺序放置:)

for (int j = 0; j <= maxIndx; j++) {
    double sum = 0;
    double average = 0;

    Scanner ss = new Scanner(text[j]);
    String answer = "For Competitor #1, the average is: ";

    while (sc.hasNext()) {
        double i = sc.nextDouble();
        sum = sum + i;
    }
    average = sum / 12; // better use number of tokens read instead of hard coded 12

    answer = answer + average;
    System.out.println(answer);
}

最后,您不需要将每一行读入一个String数组 - 只需读取一行并立即处理它。这样可以节省内存,并且IndexOutOfBoundsException在文件超过 100 行时避免 s。我把这作为练习交给你了:)

于 2013-02-28T08:32:45.460 回答
0

去除 ; 一段时间后 (sf.hasNext())

改变

while (sf.hasNext())
;
{

进入

while (sf.hasNext())
{
于 2013-02-28T08:39:49.000 回答