【问题标题】:Calculating Average of all numbers between and including first and last numbers with Java使用Java计算第一个和最后一个数字之间的所有数字的平均值
【发布时间】:2014-09-22 23:00:58
【问题描述】:

任务是使用一个 While 循环来获取第一个和最后一个数字,并找到它们之间的数字的平均值。我输入了代码,我认为它在数学上有效,但是当我尝试显示答案时(“答案是”+平均值),我一直收到错误消息,它一直说平均值尚未初始化。

public static void whileLoop()      
{

int smallNumber = Integer.parseInt(JOptionPane.showInputDialog("Enter the smallest number:"));

int largeNumber = Integer.parseInt(JOptionPane.showInputDialog("Enter the largest number:"));

int counter = smallNumber;

int average;

int total = 0;

int numberCounter = 0;

        while (smallNumber <= largeNumber)
        {

            total = counter + total;
            counter = counter + 1;
            numberCounter++;
            average = total / numberCounter;

        }
        JOptionPane.showMessageDialog(null, "Answer is: " + average);
}

【问题讨论】:

  • 试试int average = 0; 而不是int average;
  • 不需要循环。老师显然从未听说过高斯。
  • 与问题无关,但您会陷入无限循环,因为小总是小于/等于大,或者当小大于大时您永远不会进入循环。此外,您不需要计算每一步的平均值,并且您的一个计数器是开销
  • 你建议我如何解决这个问题?我是 Java 新手,完全不知道如何处理这个问题。
  • 作为记录,我的非循环回答:return (first+last)/2;

标签: java loops average


【解决方案1】:

你必须初始化average变量

原因是,如果你从来没有进入过while循环,程序怎么知道要打印什么?

例如,您可以将其初始化为 0,但也许更好的解决方案是放置一些表示错误的值,例如:

int average = Integer.MIN_VALUE;

如果程序打印出–2147483648 (Integer.MIN_VALUE),你就知道出了点问题。

现在,您的代码逻辑实际上也是错误的。您可以进行改进以使代码更简单和正确:

问题陈述是计算:

(sum of all numbers) / (amount of numbers)

因此您不必每次循环计算平均值。循环结束后,您可以通过将total(即所有数字的总和)除以numberCounter(即数字的数量)来计算它。

此外,您的循环实际上是一个无限循环,因为您永远不会增加smallNumber 的值,因此您的循环条件smallNumber &lt;= largeNumber 将始终为真。您改为增加 counter 这是不正确的。

你的循环应该是这样的:

// ...

while(counter <= largeNumber) {  // use counter here instead of smallNumber
    total = counter + total;
    counter = counter + 1;
    numberCounter++;
}

// calculate average here
average = total / numberCounter;

// ...

注意:您可能应该使用double 作为average 变量的类型,因为这样结果会更准确。您只需进行两项更改即可:

// ...

double average = Double.NaN; // NaN means not a number

// ...

average = (double) total / numberCounter;

// ...

此外,由于您是在 while 循环之外计算平均值,因此您不再需要初始化它,但您仍然应该这样做,因为这是一种很好的做法。

【讨论】:

  • 我试过了,但似乎我陷入了无限循环。我的代码中是否存在导致这种情况的原因?
  • 我尝试了计数器
【解决方案2】:

错误是Variable May not Have Been Initialized

虽然对于我们人类来说,显然 smallNumber 在按预期使用时至少小于或等于 largeNumber 一次,但编译器不会知道这一点。如果我们绕过整个 while 循环,理论上,average 自声明以来就没有分配给它的值。

分配初始值 0 将阻止错误发生。

int average = 0;

【讨论】:

    【解决方案3】:

    您需要使用int average = 0; 之类的东西,而不是int average;This is because:

    局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。

    【讨论】:

      【解决方案4】:

      它一直说平均值尚未初始化

      嗯,喜欢

      int average;
      

      你声明了average 变量,但你没有初始化它(局部变量没有用默认值初始化)。编译器不能假设循环中的条件将在运行时被评估为 true 至少一次以使用 total / numberCounter 初始化 average 所以你需要手动完成,比如

      int average = -1; 
      

      此外,您的while 条件基于未在循环中更新的变量,因此如果您进入此循环,您将不会离开它(您将最终进入无限循环)。您应该将条件更改为基于在循环内部发生变化的一些变量。看起来情况应该是这样的

      while (counter <= largeNumber) 
      

      你也不应该在每次循环迭代中计算平均值,你可以在它之后计算。此外,由于平均值是浮点数(不是整数),因此应将其声明为 double。因此,请考虑将您的代码更改为类似

      while (counter <= largeNumber) {
      
          total = counter + total;
          counter = counter + 1;
          numberCounter++;
      }
      double average = (double)total / numberCounter;
      

      我将total 转换为双精度,否则除法的结果将是整数,因此对于像3/2 这样的值,它将返回1,而不是1.5

      无论如何,如果您不必使用循环,则可以使用更简单的方法来计算 avg: min + (max-min)/2

      【讨论】:

      • 我注意到了。它实际上让我陷入了无限循环。我还必须使用while循环,所以我不能使用and if语句。有什么建议吗?
      猜你喜欢
      • 2018-06-08
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2023-01-30
      • 2021-06-23
      相关资源
      最近更新 更多