0

I"m trying to make a program that retrieves an endless amount of numbers that user inputs, and then it tells you how many numbers that you inputted, the sum of all the numbers, and then the average of the numbers. Here is the code I have so far. I don't know why it does not work. I get no errors, but it just does not get a valid sum or average.

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.");
    }
}
4

3 回答 3

5

问题出在这一行:

 numbers = new float[i + 1];

您正在创建一个新数组,但您没有将分配给它的前一个数组中的值复制numbers到其中。

您可以通过两种方式解决此问题:

  • 使用复制值System.arraycopy()(您需要使用新变量进行调用,然后将其分配给numbers
  • 不要使用数组!改用 a 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

最后,如果您不需要存储数字,只需保持运行总和并计数,避免任何类型的数字存储。

于 2012-06-20T18:43:55.797 回答
3

与 Q 无关,但请注意,您可以在不存储所有输入数据的情况下计算运行计数/平均值 - 或者假设您想要保留输入 - 而无需在每次迭代时遍历它。伪代码:

count = 0
sum = 0
while value = getUserInput():
  count++
  sum += value
  print "average:" + (sum / count)
于 2012-06-20T18:47:26.890 回答
2

numbers = new float[i + 1];

您正在每次迭代中创建一个全新的数组。这意味着您总是在创建一个新数组,该数组将在每次迭代时将其大小增加 1,但只有一个字段填充了当前用户输入,并且所有其他字段都为空。

删除此行并在之前初始化数组。

如果数组的大小应该在循环内动态增长,则根本不要使用数组,而是使用动态数据结构,如 List 或 ArrayList。

此外,我建议使用

while (true) {

    //...
}

实现无限循环。

于 2012-06-20T18:49:11.910 回答