Java数组最低数量和平均值无法正确计算

时间:2014-04-15 02:12:06

标签: java arrays average

我是java的新手。我的作业需要以下内容: 开发一个允许用户在数组中输入数字的程序。输入如下:

用户将输入要输入数组的整数总数。

然后,用户将输入该唯一整数(负数或正数)。不要允许输入的值的数量超过数组大小。

开发方法:

对数组进行排序

确定最高值

确定最低值

计算平均值(双倍)

下面的代码确实运行,但它显示我输入的最小数字0,这是不正确的,平均值显示为双重格式,但它总是舍入数字(3.0而不是3.3)。有人可以让我知道我做错了什么,我该如何解决这个问题。我一直在谷歌搜索问题3天,无法找出我出错的地方。

import java.util.Scanner;
import java.util.Arrays;

public class UserArray2 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        //allow user  input;
        System.out.println("How many numbers do you want to enter?");
        int num = input.nextInt();

        int numbers[] = new int[num];        
        int low = numbers[0];
        int max = numbers[0];
        int sum = 0;
        double avgNum;

        System.out.println("Enter the " + num + " numbers now.");

        for (int i = 0 ; i < numbers.length; i++ ) {
           numbers[i] = input.nextInt();
        }


        //sort
        System.out.println("The numbers you entered have been sorted from lowest to greatest:");
        Arrays.sort( numbers );
        for ( int i = 0 ; i < numbers.length ; i++ ) {

            System.out.println(numbers[i]);
        }

        //max

        for (int counter = 1; counter < numbers.length; counter++)
        {
         if (numbers[counter] > max)
         {
          max = numbers[counter];
         } 

         }

        //lowest

        for (int counter = 1; counter < numbers.length; counter++)
        {
         if (numbers[counter] < low)
         {
          low = numbers[counter];
         } 

         }

        //average
        for (int i : numbers)
        sum += i;
        avgNum = sum/numbers.length;


        System.out.println("The largest number on your list is: " + max);
        System.out.println("The lowest number on your list is: " + low);
        System.out.println("The average of the list of numbers is: " + avgNum);
    }


    public static void printArray(int arr[]){

        int n = arr.length;

        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }

}

4 个答案:

答案 0 :(得分:0)

您在接受用户输入之前已完成这些作业:

int low = numbers[0];
int max = numbers[0];

这意味着低和最大初始值将为0.因此,对于您的最小逻辑,用户输入与低比较,没有值低于0,因此您总是得到0作为最小值。

您应该在获取用户输入后定义或重新分配它们,即使用实数数组值。

答案 1 :(得分:0)

在这一行中,

    avgNum = sum/numbers.length;

sumnumbers.length都是整数,因此Java将结果计算为整数。然后,它将结果分配给avgNum,这恰好是一个双精度数。到那个时候,除法结果的任何小数部分都已经消失了。

要解决此问题,您可以:

    avgNum = (double)sum/numbers.length;

在执行分割之前将sum强制转换为double

答案 2 :(得分:0)

  1. 数组索引从0开始,但是你从1开始计数。

    for(int counter = 0; counter&lt; numbers.length; counter ++)

  2. 您需要将int值转换为double。否则它会转到int。

    avgNum =(double)sum / numbers.length;

答案 3 :(得分:0)

你非常接近。以下是阻止代码正确完成的问题:

  • 您过早初始化minmax。对于min,当所有数字都是正数时,这会产生问题;最大,当所有数字都是负数。在读取完成后,您应该声明/初始化两个变量。将声明移动到读取循环之后的点将解决此问题。

  • 虽然您已将avgNum的类型正确定义为double,但您指定的表达式仍为int,因为其元素均为int。因此,划分被截断。按如下方式更改分部:

    avgNum = (double)sum/numbers.length;
    

或者更好的是,将sum声明为double,然后删除演员。