我试图创建一个程序来检索用户输入的无穷无尽的数字,然后它会告诉您输入了多少个数字,所有数字的总和,然后是数字的平均值。是我到目前为止的代码。我不知道它为什么不起作用。我没有错误,但它没有得到有效的总和或平均值。
import javax.swing.*;
public class SumAverage {
public static float sum;
public static float averageCalculator;
public static float average;
public static void main(String[]args) {
float numbers[] = null;
String userInput = JOptionPane.showInputDialog(null, "Ready to begin?");
if(userInput.equalsIgnoreCase("no"))
{
System.exit(0);
}
for(int i = 0; i != -2; i++)
{
numbers = new float[i + 1];
userInput = JOptionPane.showInputDialog(null, "Input any number. Input * to exit");
if(userInput.length() == 0 || userInput.equals("*") || userInput.equals(null))
{
break;
}
else
{
numbers[i] = Float.parseFloat(userInput);
}
}
for (int i = 0; i < numbers.length; i++)
{
sum += numbers[i];
}
average = sum / numbers.length;
JOptionPane.showMessageDialog(null, "The sum of all your numbers is " + sum + ". The average is " + average + ". You entered a total of " + numbers.length + " numbers.");
}
}
答案 0 :(得分:5)
问题出在这一行:
numbers = new float[i + 1];
您正在创建一个新数组,但不是将分配给numbers
的上一个数组中的值复制到其中。
您可以通过两种方式解决此问题:
System.arraycopy()
复制值(您需要使用新变量进行调用,然后将其分配给numbers
)List<Float>
,其大小会自动增大通常,应避免使用数组,尤其是“应用程序逻辑”。尽量使用集合 - 它们有许多强大而方便的方法。
如果您想存储这些数字供以后使用,请尝试使您的代码如下所示:
List<Float> numbers = new ArrayList<Float>();
...
numbers.add(Float.parseFloat(userInput));
...
for (float n : numbers) {
sum += n;
}
average = sum / numbers.size(); // Note: Don't even need a count variable
最后,如果您不需要存储数字,只需保留一笔运行金额并计算并避免任何类型的数字存储。
答案 1 :(得分:3)
与Q无关,但请注意,您可以计算运行计数/平均值而不存储所有输入数据 - 或者假设您要保留输入 - 而不是在每次迭代时遍历它。伪代码:
count = 0
sum = 0
while value = getUserInput():
count++
sum += value
print "average:" + (sum / count)
答案 2 :(得分:2)
与
numbers = new float[i + 1];
您正在每次迭代时创建一个全新的数组。这意味着你总是创建一个新的数组,每次迭代时它的大小会增加1,但只有一个字段填充当前用户输入并且所有其他字段都是空的。
删除此行并在之前初始化数组。
如果数组的大小应在循环内动态增长 根本不使用数组,而是使用动态数据结构,如List或ArrayList。
此外我建议使用
while (true) {
//...
}
实现无限循环。