Java,找不到数组的平均值

时间:2015-01-09 23:31:05

标签: java arrays

我需要编写一个程序来查找数组中所有值的平均值,然后返回大于平均值的值。

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);
    }
}

在我看来,问题出在这一行 我尝试了下面的一个例外

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:1000     在AboveAvarage.main(AboveAvarage.java:23)

 average = sum / nums[d];

我也试过

 average = sum / nums.length;

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

3 个答案:

答案 0 :(得分:2)

请记住,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仅保证其之前的值小于1000.如果更改该值,则需要再次测试。这就是为什么通常增量步骤是循环中的最后一步。

至于你的逻辑:

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

所以:

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

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

答案 1 :(得分:1)

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

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

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

请注意,您不需要在循环中计算average - 在对值进行求和后执行此操作。

答案 2 :(得分:0)

在循环时不需要其他,在输入时加总和。完成后,只需按计数

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

average = sum / count;