分配是使用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);
}
答案 0 :(得分:3)
您必须初始化average
变量
原因是,如果您从未进入while
循环,该程序应该如何知道要打印的内容?
例如,您可以将其初始化为0,但也许更好的解决方案是设置一些错误表示值,如:
int average = Integer.MIN_VALUE;
然后,如果程序打印–2147483648
(Integer.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}}