0

私は、ユーザーが入力した無限の数を取得するプログラムを作成しようとしています。次に、入力した数、すべての数の合計、そして数の平均を示します。コードは次のとおりです。これまでのところ、なぜ機能しないのかわかりません。エラーは発生しませんが、有効な合計または平均が得られません。

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

これは2つの方法で修正できます。

  • を使用して値をコピーします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

そして最後に、数値を保存する必要がない場合は、現在の合計とカウントを維持し、いかなる種類の数値の保存も避けてください。

于 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ずつ増える新しい配列を常に作成していますが、現在のユーザー入力で埋められたフィールドは1つだけで、他のすべてのフィールドは空です。

この行を削除し、前に配列を初期化します。

配列のサイズがループ内で動的に大きくなる必要がある場合は、配列をまったく使用せず、代わりにListやArrayListなどの動的データ構造を使用してください。

さらに私は使用することをお勧めします

while (true) {

    //...
}

無限ループを実現します。

于 2012-06-20T18:49:11.910 に答える