2015-01-09 42 views
-1

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

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; 

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

+0

如果'd'达到'count',用'count'除法,并停止''while''循环。 – rgettman 2015-01-09 23:34:20

+2

你为什么在'while'循环中指定'average'? – khelwood 2015-01-09 23:35:11

回答

0

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

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

average = sum/count; 
1

在while循环正在收集值划分,使用的是count跟踪提供了多少价值。

在随后的循环来计算平均,你应该只看看count项目数组:

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

注意你不需要在循环中计算average - 做到这一点,一旦你总结了价值。

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如果输入0后5个号码,当你输入的数据,那么就会出现在阵列的其余部分没有值(或者说,那里会有零)。
  • 您可以计算总和,正如另一个答案告诉您的,在第一个循环中。没有必要在第二个循环中做到这一点。
  • 您不会在同一步骤中计算总和和平均值。您首先必须完成计算总和(完成循环,无论是第一个还是第二个循环),然后才能除以项目数(您保存在count中)。
  • 然后你必须经过另一个循环,打印比平均值大的数字。您的打印循环打印全部的数字。您应该检查每个数字,看它是否大于您计算的平均值,并且只有在打印出来。

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