使用Java计算包含第一个和最后一个数字之间的所有数字的平均值

时间:2014-09-22 23:00:59

标签: java loops average

分配是使用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);
}

4 个答案:

答案 0 :(得分:3)

您必须初始化average变量

原因是,如果您从未进入while循环,该程序应该如何知道要打印的内容?

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

int average = Integer.MIN_VALUE;

然后,如果程序打印–2147483648Integer.MIN_VALUE),您就会知道出了问题。

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

问题陈述是计算:

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

因此,您不必每次都围绕循环计算平均值。你可以通过除以total来计算它,这是所有数字与numberCounter的总和,即循环结束后的数字量。

此外,你循环实际上是一个无限循环,因为你永远不会增加smallNumber值,所以你的循环条件smallNumber <= 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循环之外的平均值,你不再需要初始化它,但你仍然应该这样做,因为这是一个好习惯。

答案 1 :(得分:0)

错误为Variable May not Have Been Initialized

虽然对于我们人类而言,很明显,当按预期使用时,smallNumber至少一次小于或等于largeNumber,但编译器不会知道这一点。如果我们绕过整个while循环,理论上,average自声明之后就不会赋值给它。

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

int average = 0;

答案 2 :(得分:0)

而不是int average;,您需要int average = 0;之类的内容。 This is because

  

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

答案 3 :(得分:0)

  

它继续说平均值尚未初始化

好吧,就像

一样
int average;

你声明了average变量,但你没有初始化它(局部变量没有用默认值初始化)。编译器不能假设循环中的条件将在运行时以true计算为average,以total / numberCounter初始化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转换为double,否则除法的结果将为整数,因此对于像1这样的值,它将返回1.5,而不是avg

无论如何,如果你不必使用循环,有更简单的方法来计算min + (max-min)/2:{{1}}