-5

このコードを実行して合計が 100 を超える数値を入力すると、カウントと合計の出力は正しいのですが、平均が間​​違っています。例えば; 入力 8,10,99... カウントは 3、合計は 117 で、平均 39 を返す必要があります...返される実際の出力は、カウント 3、合計 117、平均 58.5 です。これは、平均が 3 ではなく 2 のカウントを使用して行われているためであることに気付きました (または、異なる値を使用する場合は常に 1 少ない値になります)。どうしてこれなの?入力合計<= 100に最適です。助けてください :)

 public static void main(String[] args) {
    //Use Main Method for gathering input
    float input = 1;
    // Declare variable for sum
    float theSum = 0;
    // Declare variable for average
    float average = 0;
    // Declare variable for counting the number of user inputs
    int counter = 0;
    /* Initialize the while loop using an input of 0 as a sentinel value
     * to exit the loop*/
    while (input != 0) {
        // Use JOptionPane method to accept input from user
        input = Float.parseFloat(
                JOptionPane.showInputDialog(
                null, "Please enter a number.  Enter 0 to quit: "));
        // Invoke sum method and pass input and summation to sum method
        theSum = (sum(input, theSum));
        // Invoke avg method and pass summation and counter to avg
        average = (avg(theSum, counter));
        // Increment the counter variable
        counter++;

        if (theSum > 100)
        {
            JOptionPane.showMessageDialog(null, "The sum of your numbers "
                    + "are greater than 100!");
            break;
        }
    }
        // Invoke display method and pass summation, average, and counter variables to it
        display(theSum, average, counter);
    }


public static float sum(float num1, float sum) {
    //Add the user's input number to the sum variable
    sum += num1;
    //Return value of sum variable as new summation variable
    return sum;
}

public static float avg(float num1, int num2) {
    //Declare and initialize variable for average
    float average = 0;
    //Calculate average
    average = num1 / num2;
    //Return value of average variable
    return average;
}

public static void display(float sum, float average, int counter) {

    /* I am subtracting 1 from variable counter so as not to include the sentinel value
     * of 0 that the user had to enter to exit the input loop in the overall count*/

    // Display the count, sum, and average to the user
    if (sum > 100) {
        JOptionPane.showMessageDialog(null, "Count = " + (counter) + ", Sum = " + sum + ", Average = " + average);
    }
    if (sum <= 100) {
        JOptionPane.showMessageDialog(null, "Count = " + (counter - 1) + ", Sum = " + sum + ", Average = " + average);
    }

}

}

4

1 に答える 1

1

平均を取った後にカウンターをインクリメントします。これが、予想される 3 ではなく 2 つの数値に基づいて平均が表示される理由です。

    average = (avg(theSum, counter));
    // Increment the counter variable
    counter++;

平均をとる前に、これら2つを交換してカウンターを増やします。

    counter++;
    // Increment the counter variable
    average = (avg(theSum, counter));

編集:

変更する必要があるのは次のとおりです。

まず、入力が 0 でない場合にのみカウンターを更新します。

    if(input!=0)
    {
    counter++;
    }

次に、平均コードをループの外に移動し、表示の直前に最後に配置します。平均を何度も計算する必要はありません。

    average = (avg(theSum, counter));
    display(theSum, average, counter);

3番目に、メソッドcounter-1から削除して印刷しますdisplaycounter

public static void display(float sum, float average, int counter) {
 JOptionPane.showMessageDialog(null, "Count = " + (counter) + ", Sum = " + sum + ", Average = " + average);
 }

その後、期待どおりに両方のケースで機能します

于 2013-09-14T03:17:05.913 に答える