【问题标题】:Java - Highest, Lowest and AverageJava - 最高、最低和平均
【发布时间】:2010-05-17 09:45:55
【问题描述】:

我刚开始学习,我的一项练习需要帮助。

我需要最终用户输入每个月的降雨量。 然后我需要输出平均降雨量,最高月份和最低月份以及降雨量高于平均水平的月份。

我一直在最高和最低得到相同的数字,我不知道为什么。我正在认真地拔头发。任何帮助将不胜感激。

这是我目前所拥有的:

public class rainfall {

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
    int[]  numgroup;
    numgroup = new int [13];
    ConsoleReader console = new ConsoleReader();
    int highest;
    int lowest;
    int index;
    int tempVal;
    int minMonth;
    int minIndex;
    int maxMonth;
    int maxIndex;


    System.out.println("Welcome to Rainfall");

    for(index = 1; index < 13; index = index + 1)
    {       
        System.out.println("Please enter the rainfall for month " + index);
                tempVal = console.readInt();
                while (tempVal>100 || tempVal<0)
                    {
                    System.out.println("The rating must be within 0...100. Try again");
                    tempVal = console.readInt();
                    }
                numgroup[index] = tempVal;
    }           



    lowest = numgroup[0];


        for(minIndex = 0; minIndex < numgroup.length; minIndex = minIndex + 1);
        {
                if (numgroup[0] < lowest)
                {
                lowest = numgroup[0];
                minMonth = minIndex;
                }
        }

    highest = numgroup[1];


            for(maxIndex = 0; maxIndex < numgroup.length; maxIndex = maxIndex + 1);
            {
                    if (numgroup[1] > highest)
                    {
                    highest = numgroup[1];
                    maxMonth = maxIndex;
                    }
            }


        System.out.println("The average monthly rainfall was ");
        System.out.println("The lowest monthly rainfall was month " + minIndex);
        System.out.println("The highest monthly rainfall was month " + maxIndex);

        System.out.println("Thank you for using Rainfall");

    }


    private static ConsoleReader ConsoleReader() {

        return null;
    }

}

谢谢,

艾米丽

【问题讨论】:

  • Java 中的数组是从零开始的。你最终必须习惯它。

标签: java arrays


【解决方案1】:

首先,因为这是你的作业,你不应该在 stackoverflow.com 上问它

现在让我们看看你的代码

  1. lowest = numgroup[0];

为什么?看来你试图用这个算法来找到最小值:

1.1 假设第一个数字(您认为是 numgroup[0])是 min(在您的代码中命名为 lowest
1.2.将其与所有其他数字进行比较,如果任何数字较小,请替换 min(即lowest)。

但是,numgroup[0] 不是您的第一个号码!你像这样开始了你的第一个 for 循环

for(index = 1;...

所以,你的第一个号码是numgroup[1]

接下来,你的第二个循环开始

for(minIndex = 0;

而索引 0 处的元素甚至都不打算被您使用(我猜)

接下来,判断当前迭代次数是否小于lowest的条件是

if (numgroup[0] &lt; lowest)

它总是将索引 0 处的元素与 lowest 进行比较(我猜)这不是你的意图。

【讨论】:

  • 这就是我所说的,但由于它的格式更好,对此+1,我将删除我的答案。
【解决方案2】:

而不是

if (numgroup[0] < lowest)

你必须写

if (numgroup[minIndex] < lowest)

同样的道理

if (numgroup[1] > highest)

应该是

if (numgroup[maxIndex] > highest)

【讨论】:

  • 谢谢,所以我把它们换掉了,但我一直收到这个错误:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 13 at rain.main(rainfall.java:43)
【解决方案3】:

你会的

lowest = numgroup[0]

然后

if (numgroup[0] &lt; lowest)

这永远不会是“真”,因为 numgroup[0] 总是等于最低。相反,您的 if 子句应该类似于 if (numgroup[minIndex] &lt; lowest)。同样的事情也适用于最高。

【讨论】:

    【解决方案4】:
    public static void main(String[] args) 
    {
    int[] numgroup = new int [12]; // 12 months - 12 elements
    ConsoleReader console = new ConsoleReader();
    int highest;
    int lowest;
    int index;
    int tempVal;
    int minIndex;
    int maxIndex;
    
    
    System.out.println("Welcome to Rainfall");
    // Input (index now 0-based)
    for(index = 0; index < 12; index = index + 1)
    {       
        System.out.println("Please enter the rainfall for month " + index + 1);
        tempVal = console.readInt();
        while (tempVal>100 || tempVal<0)
        {
            System.out.println("The rating must be within 0...100. Try again");
            tempVal = console.readInt();
        }
        numgroup[index] = tempVal;
    }           
    
    lowest = numgroup[0];
    highest = numgroup[0];
    int total = 0.0;
    // Loop over data (using 1 loop)
    for(index = 0; index < 12; index = index + 1)
    {       
        int curr = numgroup[index];
        if (curr < lowest) {
            lowest = curr;
            minIndex = index;
        }
        if (curr > highest) {
            highest = curr;
            maxIndex = index;
        }
         total += curr;
    }
    float avg = (float)total / numgroup.length;
    
    System.out.println("The average monthly rainfall was " + agv);
    // +1 to go from 0-based index to 1-based month
    System.out.println("The lowest monthly rainfall was month " + minIndex + 1);
    System.out.println("The highest monthly rainfall was month " + maxIndex + 1);
    
    System.out.println("Thank you for using Rainfall");
    
    }
    

    【讨论】:

    • 所以我尝试了这个并提出了:线程“main”中的异常java.lang.Error:未解决的编译问题:局部变量minIndex可能尚未初始化局部变量maxIndex可能没有在rainfall.main(rainfall.java:59)中初始化
    【解决方案5】:

    如果您的作业没有限制,请尝试将集合用于最小值/最大值。

    Vector<Integer> rainfallData = new Vector<Integer>();
    int avg = 0;
    
    for(index = 1; index < 13; index = index + 1)
    {       
        System.out.println("Please enter the rainfall for month " + index);
        tempVal = console.readInt();
        while (tempVal>100 || tempVal<0)
        {
            System.out.println("The rating must be within 0...100. Try again");
            tempVal = console.readInt();
        }
       rainfallData.add(tempVal);
       avg+=tempVal; 
    }
    
    avg /= rainfallData.size();
    int min = Collections.min(rainfallData);
    int max = Collections.max(rainfallData);
    

    否则,最小值/最大值应如下所示:

    public int min(int[] vals) {
        if( vals==null || vals.length==0} {
               throw new IllegalArgumentException();
        } else if( vals.length == 1 ) {
             return vals[0];
        }
        int min = vals[0]; // Dont initialize with Integer.MAX_VALUE or so
        for(int i = 1; i < vals.length; ++i ) {
            if( vals[i] < min ) {
               min = vals[i];
            }
        } 
        return min;
    }
    

    【讨论】:

      【解决方案6】:
      for (index = 0; index < 12; index++) {
      
      }
      

      更改第一个 for 循环和以下

      lowest = numgroup[0];
      
      for (minIndex = 0; minIndex < numgroup.length; minIndex = minIndex + 1)
      {
          if (numgroup[minIndex] < lowest) {
              lowest = numgroup[minIndex];
          }
      }
      
      highest = numgroup[0];
      
      for (maxIndex = 0; maxIndex < numgroup.length; maxIndex = maxIndex + 1)
      {
          if (numgroup[maxIndex] > highest) {
               highest = numgroup[maxIndex];
           }
      }
      

      【讨论】:

      • 不,这不起作用,它输出:最低月降雨量是第 12 个月最高月降雨量是第 12 个月
      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2017-02-08
      • 2017-07-20
      • 2021-02-17
      相关资源
      最近更新 更多