3

私の Java クラスの課題を手伝っていただければ、とても助かります。質問のプロンプトは次のとおりです。

負でない整数のリストを読み取り、最大の整数、最小の整数、およびすべての整数の平均を表示するプログラムを作成します。ユーザーは、最大値、最小値、および平均値の検索に使用されない負のセンチネル値を入力して、入力の終了を示します。小数部で計算されるように、平均は double 型の値である必要があります。

私のコードで発生している問題は、実行時に入力された最初の値が負でない限りループが終了しないことです。負の場合は次のように返されます。

入力された最大数: 0 入力された最小数: 0 入力された数の平均: NaN

助けてください!ありがとう。-サム

コード:

package blah;
import java.util.Scanner;
public class blahblah
{
    public static void main(String[] args) 
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println ("Please enter a list of positive integers.");
        System.out.println ("Please enter a negative integer when finished.");

        int in = 0;
        int max = 0;
        int min = 0;
        int sum = 0;
        int count = 0;
        in = keyboard.nextInt();

        while (in>=0)
        {
            if (in > max) {
                in = max;
            }
            if (in < min) {
                in = min;
            }
            sum += in;
            count++;
            if (in < 0) {
                 break;
            }
        }

        System.out.println("The maximum number entered was: " + max);
        System.out.println("The minimum number entered was: " + min);
        System.out.println("The average of the numbers entered was: " + (double)sum/count);
    }
}
4

7 に答える 7

3

ループ内で nextInt を再度読み取る必要があります。

while (in>=0)
{
    if (in>max){
        max=in;
    }
    if (in<min){
        min=in;
    }
    sum += in;
    count++;
    in = keyboard.nextInt();
    //Check not needed here, handled by while loop
    //if (in<0){
    //     break;
    //}
}

コメントから編集:割り当てが間違った方向に進んでいたため、最小/最大を入力に等しく設定する代わりに、入力を最小/最大に等しく設定していました

于 2013-03-28T20:58:28.373 に答える
1

値を読み取るステートメントは while ループ内にないため、最初のエントリのみを読み取っています。

in = keyboard.nextInt ();
while (in>=0)
{

}

への変更:

in = keyboard.nextInt ();
while (in>=0)
{
   ... stuff ...
in = keyboard.nextInt ();
}
于 2013-03-28T21:01:48.890 に答える
1

入力の読み取りをループに移動し、負の値で中断します。

while (true) {
    in = keyboard.nextInt();
    if (in < 0) break;
    // rest of loop
}

より良いアプローチはfor、ループに関連するすべてのロジックを適切にまとめたループを使用することです。

for (int in = keyboard.nextInt(); in >= 0; in = keyboard.nextInt()) {
    // your current loop code
}

反復コードを分離することで、どのコードが反復コードであるかが明確になり、ループ コードが完全にプログラムのタスク専用になるため、読みやすく理解しやすくなります。

これは、 を宣言する必要がないことも意味します。またint in、変数のスコープを可能な限り縮小することをお勧めします。この場合in、使用/必要な唯一の場所であるループ内にのみ存在します。

于 2013-03-28T20:58:36.140 に答える
0

ユーザーからの入力を再読み込みする必要があります。それ以外の:

in = keyboard.nextInt ();
while (in>=0) {
    if (in>max){
       in=max;
    }
    if (in<min){
        in=min;
    }

    sum += in;
    count++;
    if (in<0){
         break;
    }
}

使用する:

in = keyboard.nextInt ();
while (in>=0) {
    if (in>max){
        in=max;
    }
    if (in<min){
        in=min;
    }

    sum += in;
    count++;

    // removed if, since loop checks it.

    in = keyboard.nextInt (); // read on!
}
于 2013-03-28T20:58:34.280 に答える
0

コードを次のように変更します

in = keyboard.nextInt ();
while (in>=0){
    if (in>max){
        in=max;
    }

    if (in<min){
        in=min;
    }

    sum += in;
    count++;
    in = keyboard.nextInt ();
}

ご覧のとおりin = keyboard.nextInt ();、ユーザーからより多くの値を取得できるように追加しました

于 2013-03-28T20:59:26.267 に答える
0

同じ変数「in」に値を入れています

で=最大;

それは別の方法である必要があります

最大 = で;

于 2013-03-28T21:11:07.377 に答える