Java,找不到数组的平均值

Java, can't find average of an array

我需要编写一个程序来计算数组中所有值的平均值,然后 returns 大于平均值的值。

import java.util.*;
public class AboveAverage {

    public static void main(String args[]) throws Exception {
        Scanner kbd = new Scanner(System.in);
        int count=0, num;
        int nums[] = new int[1000];
        double sum = 0;
        double average = 0;

        System.out.println("Input +ve integers, to stop type 0");
        num = kbd.nextInt();
        while( num > 0 ) {
            nums[count] = num;
            count = count + 1;
            num = kbd.nextInt();
        }

        int d = 0;
        while ( d < 1000 ) {
            sum += nums[d];
            d++;
            average = sum / nums[d];
        }

        for(int i=0; i < count ; i=i+1) {
            System.out.print(nums[i] + " ");
        }
        System.out.println(average);
    }
}

我认为问题出在这一行 我尝试了下面给出异常的那个

线程异常 "main" java.lang.ArrayIndexOutOfBoundsException: 1000 在 AboveAvarage.main(AboveAvarage.java:23)

 average = sum / nums[d];

我也试过了

 average = sum / nums.length;

它给了我总和而不是平均值。

您不需要其他 while 循环,输入时求和。完成后,除以计数

while( num > 0 ) {
  nums[count] = num;
  count = count + 1;
  sum += num;
  num = kbd.nextInt();
 }

average = sum / count;

在收集值的 while 循环中,您正在使用 count 来跟踪提供了多少个值。

在随后的计算平均值的循环中,您应该只查看数组的 count 项:

int d = 0;
while(d<count) {
    sum += nums[d];
}
average = sum/count;

请注意,您不需要在循环内计算 average - 在对值求和后进行计算。

还记得 Java 中的数组索引是从零开始的吗?这意味着 nums 数组中允许的索引是 0999.

现在看看这个循环:

int d = 0;
while ( d < 1000 ) {
sum += nums[d];
d++;
average = sum / nums[d];
}
  • 首先,它将当前数字添加到总和中。这是正确的。
  • 然后,它递增数字。
  • 然后它使用递增的数字访问nums[d]来计算平均值。

现在,假设您处于最后一轮。 d999.

  • 首先,它将当前数字添加到总和中。
  • 然后它递增d。现在是1000.
  • 然后它使用递增的数字访问nums[d]。但这意味着 nums[1000]。这是一个非法索引。

所以这就解释了为什么你有 ArrayIndexOutOfBoundsException。自增索引后不要再使用它,因为 while 只保证它的 previous 值小于 1000。如果更改值,则需要测试再次。这就是为什么通常增量步骤是循环中的最后一步。

至于你的逻辑:

要计算平均值,您首先需要知道总和。知道总和后,您可以除以平均的项目数。所以你需要用总和除以你阅读的项目数。

所以:

  • 你应该循环到1000。如果你在输入数据时在5个数字后输入0,那么数组的其余部分将没有值(或者更确切地说,那里会有零)。
  • 您可以在第一个循环中计算总和,正如另一个答案告诉您的那样。无需在第二个循环中执行此操作。
  • 您没有在同一步骤中计算总和和平均值。您首先必须完成总和的计算(完成循环,无论是第一个还是第二个),然后才能除以项目数(您保存在 count 中)。
  • 然后你必须通过另一个循环,打印大于平均值的数字。您的打印循环打印出 all 个数字。你应该检查每个数字,看看它是否大于你计算的平均值,只有当它是,才打印出来。

提示:实际上应该只有两个循环:一个读取数字并计算 countsum。然后你计算平均值,但这不是一个重复动作,所以它应该 而不是 循环。第二个循环用于打印高于平均值的数字。