【问题标题】:Java array lowest number and average not computing correctlyJava数组最小数和平均值未正确计算
【发布时间】:2014-04-15 02:12:06
【问题描述】:

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

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

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

开发方法以:

对数组进行排序

确定最大值

确定最小值

计算平均值(double)

下面的代码确实可以运行,但它显示我输入的最小数字为 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] + " ");
        }
    }

}

【问题讨论】:

    标签: java arrays average


    【解决方案1】:

    你很亲密。以下是阻止您的代码正确完成的问题:

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

    • 虽然您将avgNum 的类型正确定义为double,但您为其分配的表达式仍然是int,因为它的两个元素都是int。因此,除法被截断。更改分区如下:

      avgNum = (double)sum/numbers.length;
      

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

    【讨论】:

    • 非常感谢,这几乎解决了我的问题。现在一切都运行正常,但正如其他人提到的那样,其中一个问题是我将 int max 和 int low 声明为 numbers[0],当输入负数时会导致问题。如果我只是将它们留作 int 低;那么它将无法编译。我该如何声明这些整数,以便将正确的数据放入其中?
    • @user3534165 使用numbers[0] 来初始化minmax 是一个常见的技巧,它同样适用于正数和负数。此外,如果您这样做,您可以在索引 1 而不是零处开始您的第二个循环。
    【解决方案2】:

    在接受用户输入之前,您已经完成了这些任务:

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

    这意味着低和最大初始值将为 0。因此,对于您的最小逻辑,将用户输入与低进行比较,并且没有值低于 0,因此您始终将 0 作为最小值。

    您应该在接受用户输入后定义或重新评估它们,即使用实数数组值。

    【讨论】:

      【解决方案3】:

      在这一行,

          avgNum = sum/numbers.length;
      

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

      要解决此问题,您可以:

          avgNum = (double)sum/numbers.length;
      

      在执行除法之前将sum 转换为double

      【讨论】:

        【解决方案4】:
        1. 数组索引从 0 开始。但您的计数器从 1 开始。

          for (int counter = 0; counter

        2. 您需要将 int 值转换为 double。否则它将四舍五入为 int。

          avgNum = (double)sum/numbers.length;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多