0

我在一项任务中迷失了方向,需要帮助!基本上,我想编写一个代码,用户可以在其中输入 12 个月内每月降雨的英寸数。它将计算总英寸、平均英寸,并指出降雨最多和最少的月份。我控制了总英寸和平均英寸。

不过,最多和最少的雨是我遇到问题的地方。我知道如何编写代码来计算最高和最少的降雨量,但我不知道如何让它实际说出输出中的哪个实际月份。它希望我在 12 个月的数组中列出实际数字,例如,第七个月为 7。

我遇到的另一个问题是十进制格式。我把 import 语句放在了顶部,我把我认为正确的代码放在了我认为正确的地方,但是当计算平均值时,它仍然会产生一长串数字。即 12.12121314141,当我希望它显示 12.1 时。

任何帮助将不胜感激。先感谢您!这是代码:

import java.util.Scanner;
import java.text.DecimalFormat;

public class Rainfall
{
   public static void main (String [] args)
   {
      final int MONTHS = 12;
   double[] rainFall = new double[MONTHS];

   initRain(rainFall);

   DecimalFormat formatter = new DecimalFormat("##0.0");
   System.out.println("The total rainfall for this year is " +      

            totalRain(rainFall));
   System.out.println("The average rainfall for this year is " + 
            averageRain(rainFall));
   System.out.println("The month with the highest amount of rain is " +     
            highest);
   System.out.println("The month with the lowest amount of rain is " +  

            leastRain(rainFall));
        }

   /**
  totalRain method
  @return The total rain fall in the array.
   */

   public static double totalRain(double[] rainFall)
   {
      double total = 0.0;     // Accumulator

  // Accumulate the sum of the elements in the rain fall array
  for (int index = 0; index < rainFall.length; index++)
     //total += rainFall[index];
     total = total + rainFall[index];

  // Return the total.
      return total;
   }

   /**
  averageRain method 
  @return The average rain fall in the array.
   */

   public static double averageRain(double[] rainFall)
   {
      return totalRain(rainFall) / rainFall.length;
   }

   /**
  mostRain method
  @return The most rain in the rain fall array.
   */

   public static double mostRain(double[] rainFall)
   {
  double highest = rainFall[0];

  for (int index = 0; index < rainFall.length; index++)
  {
     if (rainFall[index] > highest)
        highest = rainFall[index];
  }

  return highest;
   }

   /**
  leastRain method
  @returns The least rain in rain fall array.
   */

   public static double leastRain(double[] rainFall)
   {
  double lowest = rainFall[0];

  for (int index = 0; index < rainFall.length; index++)
  {
     if (rainFall[index] < lowest)
        lowest = rainFall[index];
  }

  return lowest;
   }

      /**
  initRain method 
  @return The rain fall array filled with user input
   */
public static void initRain(double[] array)
{
      double input;  // To hold user input.
  Scanner scan = new Scanner(System.in);

      for (int index = 0; index < array.length; index++)
  {
    System.out.print("Enter rain fall for month " + (index + 1)     

            +": ");
    array[index] = scan.nextDouble();
      }
}
}
4

6 回答 6

1

对于格式问题,请执行以下操作:

System.out.println("The total rainfall for this year is " +      
formatter.format(totalRain(rainFall)));

依此类推,所有返回值。

我不明白你几个月的问题。你能再解释一下吗?

编辑。好的,我明白了。当您分配 higuestRain,...值index时,循环内部的值将是您正在搜索的月份;)

于 2013-05-10T11:53:46.390 回答
0

您定义了一个 DecimalFormat 但您从未在程序中使用它。尝试

System.out.println("The average rainfall for this year is " + formatter.format(averageRain(rainFall)));

Format 类对于您的应用程序来说不是全局的,您使用格式化字符串定义它们,然后使用 format 将数字漂亮地打印到字符串或解析以将字符串转换为数字。

于 2013-05-10T11:53:35.877 回答
0

要获取实际月份,您需要将索引存储在数组中,而不是索引包含的值。简而言之,您需要更换

highest = rainFall[index];

highest = index;

这将为您提供一个从 0 到 11 的数字,它们是具有 12 个位置的数组中可用的索引。如果你想要一个从 1 到 12 的数字,与我们的月份相关,你可以这样做:

highest = index + 1

至于格式化程序,你永远不会使用它。如果这是您的想法,Java 不会隐式使用它。您需要显式调用它的方法来获得正确的结果。就像是:

formatter.format(totalRain(rainFall));

编辑

为了帮助您了解这个想法,这是您的mostRain方法的实现

public static double mostRain(double[] rainFall){
    double highest = rainFall[0];

    for (int index = 0; index < rainFall.length; index++)
    {
        if (rainFall[index] > rainFall[highest])
            highest = index;
    }

    return highest + 1;
}
于 2013-05-10T11:56:05.370 回答
0

对于十进制格式问题,这里是您可以使用的解决方案。

导入 java.text.DecimalFormat;导入 java.math.RoundingMode;

公开课测试

{

公共静态无效主(字符串参数 [])

{

    double i = 12.12121314141;
    DecimalFormat format = new DecimalFormat("#.#"); 
    format.setRoundingMode(RoundingMode.FLOOR);
    String s = format.format(i);
    i = Double.parseDouble(s);
    System.out.println(i); //should be 12.1

} }

于 2013-05-10T12:00:37.347 回答
0

要获取索引,您需要 2 个变量,一个用于存储降雨量,另一个用于记住索引(或月份):

public static double mostRain(double[] rainFall)
{
  double highest = rainFall[0];
  int monthIndex;

  for (int index = 0; index < rainFall.length; index++)
  {
    if (rainFall[index] > highest)
      highest = rainFall[index];
      monthIndex = index;
  }

  return monthIndex;
}

该方法将返回降雨量最高的月份的索引,然后您可以使用该索引从数组中检索实际降雨量。

于 2013-05-10T12:40:39.927 回答
0

我知道如何编写代码来计算最高和最少的降雨量,但我不知道如何让它实际说出输出中的哪个实际月份。

您可以返回月份而不是返回该月份的最高降雨量,如下所示:

public static int mostRainMonth(double[] rainFall)
{
  double highest = rainFall[0];
  int month = index;
  for (int index = 0; index < rainFall.length; index++)
  {
    if (rainFall[index] > highest)
    {
       highest = rainFall[index];
       month = index;
    }
  }

  return month;
}

然后,您可以按如下方式使用此方法:

int highestRainMonth = mostRainMonth(rainfall);
System.out.println("The month with the highest amount of rain is " +     
        rainfall[highestRainMonth]+" in the month "+highestRainMonth);

我遇到的另一个问题是十进制格式。我把 import 语句放在了顶部,我把我认为正确的代码放在了我认为正确的地方,但是当计算平均值时,它仍然会产生一长串数字。即 12.12121314141,当我希望它显示 12.1 时。

您刚刚初始化了该DecimalFormatter对象,但还没有在任何地方使用它。您可以使用setMaximumFractionDigits如下方法:

DecimalFormat df = new DecimalFormat("##0.0");
System.out.println("The average rainfall for this year is " + 
        formatter.format(averageRain(rainFall)));
于 2013-05-10T13:23:13.410 回答