我需要编写一个程序来查找数组中所有值的平均值,然后返回大于平均值的值。
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;
这给了我总和而不是平均值。
答案 0 :(得分:2)
请记住,Java中的数组索引从零开始?这意味着nums
数组中允许的索引为0
到999
。
现在看看这个循环:
int d = 0;
while ( d < 1000 ) {
sum += nums[d];
d++;
average = sum / nums[d];
}
nums[d]
来计算平均值。现在,想象一下你在最后一轮。 d
为999
。
nums[d]
。但这意味着nums[1000]
。这是一个非法指数。这就解释了为什么你有一个ArrayIndexOutOfBoundsException
。在增加索引之后,永远不应再使用索引,因为while
仅保证其之前的值小于1000.如果更改该值,则需要再次测试。这就是为什么通常增量步骤是循环中的最后一步。
至于你的逻辑:
要计算平均值,首先需要知道总和。知道总和后,您可以除以平均值的项目数。因此,您需要将总和除以您阅读的项目数。
所以:
count
中保存)。 提示:实际上应该只有两个循环:一个读取数字并计算count
和sum
。然后你计算平均值,但这不是一个重复动作,所以它应该不处于循环中。第二个循环用于打印高于平均值的数字。
答案 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;