Java,can';找不到数组的平均值

Java,can';找不到数组的平均值,java,arrays,Java,Arrays,我需要编写一个程序,找到数组中所有值的平均值,然后返回大于平均值的值 import java.util.*; 普通班以上{ 公共静态void main(字符串args[])引发异常{ 扫描仪kbd=新扫描仪(System.in); int count=0,num; int nums[]=新int[1000]; 双和=0; 双平均=0; System.out.println(“输入+ve整数,停止类型0”); num=kbd.nextInt(); while(num>0){ nums[count]

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

import java.util.*;
普通班以上{
公共静态void main(字符串args[])引发异常{
扫描仪kbd=新扫描仪(System.in);
int count=0,num;
int nums[]=新int[1000];
双和=0;
双平均=0;
System.out.println(“输入+ve整数,停止类型0”);
num=kbd.nextInt();
while(num>0){
nums[count]=num;
计数=计数+1;
num=kbd.nextInt();
}
int d=0;
而(d<1000){
总和+=nums[d];
d++;
平均值=总和/单位[d];
}
对于(int i=0;i
在我看来,问题就在这方面 我试了下面的一个,它给出了一个例外

线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1000 在Aboverage.main上(Aboverage.java:23)

我也试过了

 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;
intd=0;

而(d还记得Java中的数组索引是从零开始的吗?这意味着
nums
数组中允许的索引是
0
999

现在看看这个循环:

int d = 0;
while ( d < 1000 ) {
sum += nums[d];
d++;
average = sum / nums[d];
}
intd=0;
而(d<1000){
总和+=nums[d];
d++;
平均值=总和/单位[d];
}
  • 首先,它把当前的数字加到总和上。这是正确的
  • 然后,它增加该数字
  • 然后它使用递增的数字访问
    nums[d]
    来计算平均值
现在,假设你在最后一轮。
d
999

  • 首先,它将当前数字添加到总和中
  • 然后增加d,现在是1000
  • 然后它使用递增的数字访问
    nums[d]
    。但这意味着
    nums[1000]
    。这是非法索引
因此,这就解释了为什么您有一个
ArrayIndexOutOfBoundsException
。在递增索引后,您不应该再次使用它,因为
只保证它以前的值小于1000。如果更改该值,您需要再次测试。这就是为什么通常递增步骤是循环中的最后一步

至于你的逻辑:

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

因此:

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

提示:实际上应该只有两个循环:一个用于读取数字并计算
计数
总和
。然后计算平均值,但这不是重复操作,因此不应该在循环中。第二个循环用于打印高于平均值的数字。

除以
计数d
达到
count
,则停止
d
while
循环。为什么要在
while
循环中指定
平均值
int d = 0;
while ( d < 1000 ) {
sum += nums[d];
d++;
average = sum / nums[d];
}