2

ユーザーが入力した値が typeintであり、 と の間liminfであるかどうかを確認するメソッドを作成しましたlimsup。値を返すので、メニュー オプションとして使用できます。文字列messageはユーザ​​ーに何かを入力するように指示し、 はユーザーにとerrorの間の数字を使用するように指示します。limunflimsup

私の問題は、たとえば、ユーザーが数字の 10 を入力し、それliminfが 7 とlimsupe 9 の場合、数字の 10 が と の間にあったように実行されることlimsupですliminf

public static int readInput(String message, String error, int liminf, int limsup, Scanner rd){

    int option = 0;
    do {
        option = rd.nextInt();
        System.out.println(message);
        while (!rd.hasNextInt()) {
            System.out.println("Please enter the option");
            rd.nextLine();
        }
        option = rd.nextInt();
        canal.nextLine();
    } while (option > limsup || option < liminf);

    return option;
}
4

7 に答える 7

2

入力をチェックするときは、次の 2 つのことを行う必要があります。

  1. 値が実際に整数であることを確認してください
  2. 値が範囲内であることを確認します

値が整数かどうかを確認するには、2 つの方法のいずれかを使用できます。で使用するhasNextIntScanner、使用Integer.parseIntしてキャッチしNumberFormatExceptionsます。コメントで 2 番目のものは使用できないと述べたので、最初のものを使用します。

hasNextIntを呼び出す前に常に呼び出すnextInt必要があるため、次のようにできます。

int option = 0;
System.out.println(message);
System.out.println("Please enter the option");
while (!rd.hasNextInt()) {
    rd.nextLine(); // Clears the invalid input
    System.out.println("Please enter the option");
}
option = rd.nextInt();

これは、ユーザーが を入力するまでループしint、それを取得しintます。hasNextInt呼び出す前に呼び出さないとnextIntエラーが発生することに注意してください。これは、現在のコードで数値以外を入力しようとすると発生します。

次に、境界チェックを行う必要があります。私が間違っていなければ、あなたはそれがlimsupとの間にあることを望んでいます。これを可能にする条件を決定する必要があります。liminflimsup > liminf

中間は、低い数値よりも大きく、高い数値よりも小さい値を使用することによって達成されます。この場合、それはoption >= liminf && option <= limsup. これ以外の場合はループしたいので、全体を次のようにラップするだけです!()

int option = 0;
do {
    System.out.println(message);
    System.out.println("Please enter the option");
    while (!rd.hasNextInt()) {
        rd.nextLine(); // Clears the invalid input
        System.out.println("Please enter the option");
    }
    option = rd.nextInt();
} while (!(option >= liminf && option <= limsup));

return option;

エラーメッセージを出力する方法/場所を理解させますが、これで始められるはずです。

注目に値する:

  • hasNextIntnextIntnextLineなどはすべて、使用するとユーザー入力を待ちますScanner rd = new Scanner(System.in);
  • nextLine古い入力を一掃し、ユーザーに新しい入力を強制するために使用する必要があります
  • ド・モルガンの法則はクールですが、条件を逆にする最も簡単な方法は、それを!()
于 2012-11-28T16:13:59.357 に答える
1

このようにあなたの状態を変えてくださいwhile

while (option <= limsup && option >= liminf);

現在の条件では、2番目の条件が評価される場合でもoption = 10、(OR opeartor)を使用している場合、条件はに評価され、式全体がに評価されます。limsup = 9option > limsuptrue||falsetrue

于 2012-11-28T16:08:30.037 に答える
0
while ((option > limsup) || (option < liminf))
于 2012-11-28T16:06:01.313 に答える
0

単一のトークンをチェックしreadLineながら行全体を読み取るため、次のトークン(10)自体を無視するようにしています。hasNextInt以下のように簡単に試してください(ループの最初のステートメントとしてnextエクストラを使用して削除します):rd.nextInt()

 do {
    System.out.println(message);
    while (!rd.hasNextInt()) {
        System.out.println("Please enter the option");
        rd.next();
    }
    //now the next token is int
    option = rd.nextInt();
    //flush the new line if any
    rd.nextLine();
} while (option > limsup || option < liminf);
于 2012-11-28T16:13:43.407 に答える
0

while のチェックが間違っています (オプション > limsup || オプション < liminf) オプション > limsup を見てください。10 は 9 よりも大きいため、この問題が発生しました。

于 2012-11-28T16:28:54.387 に答える
0

入力が整数であるかどうかは、次のInteger.parseInt(input);ようなもので確認できます:-

 try {

  String s = "a";
  int i = Integer.parseInt(s);
  return true;
  }

catch(NumberFormatException nfe){return false;}

そして条件を次のように変更します:-

while (option <= limsup && option >= liminf);
于 2012-11-28T15:57:30.343 に答える
0

文字列が整数かどうかをテストする方法は次のとおりです。

private static boolean isInteger( String s ){

    try{
        Integer.parseInt(s);
        return true;
    catch( Exception e ){
        return false;
    }

}

ただし、 nextInt() 関数を使用しているため、とにかくこの方法で整数入力のみを取得するため、これは必要ありません。

于 2012-11-28T16:01:56.247 に答える