2016-05-26 16 views
2

問題があります。このコードでは、数字が異なる2桁の整数を取ります。それが整数でない場合、コードはあなたに指示し、再入力を求めます。それが整数であるが条件に合わない場合、それはあなたに伝えられ、再入力を促します。ループ/プログラムを終了するために0を入力する以外はすべて動作します。私は2日間これに固執してきた。助言がありますか?範囲と入力タイプのバリデーション

int num = 1; 
    while (num != 0) { 
     System.out.print("Enter a 2-digit number. The digits should be different. Zero to stop: "); 
     while (!in.hasNextInt()) { 
      System.out.print("Not an integer, try again: "); 
      in.next(); 
     } 
     num = in.nextInt(); 
     while (num < 10 || num > 99) { 
      System.out.println("NOT good for your game!"); 
      System.out.print("Enter a 2-digit number. The digits should be different. Zero to stop: "); 
      while (!in.hasNextInt()) { 
       System.out.print("Not an integer, try again: "); 
       in.next(); 
      } 
      num = in.nextInt(); 
     } 
     if (equalDigs(num) == false) 
      System.out.println("NOT good for you game!"); 
     else 
      System.out.println("Good for your game! Play!"); 

    } 

} 
public static boolean equalDigs(int n) { 
    int d1 = n/10; 
    int d2 = n % 10; 

    if (d1 == d2) 
     return false; 
    else 
     return true; 
} 
+1

この使用例では、do-whileを使用してください。試してみると、問題が非常に単純化されます。 –

答えて

0

問題は、重複したチェックに由来します。あなたはチェックの数を減らすためにwhileの文の代わりにdo-whileステートメントを使用することができます:あなたのコードをリファクタリングする

public static void main(String[] args) throws Exception { 
    Scanner in = new Scanner(System.in); 
    int num; 
    do { 
    System.out.print("Enter a 2-digit number. The digits should be different. Zero to stop: "); 
    String input = in.next(); 
    try { 
     num = Integer.valueOf(input); 
     if(num == 0) { 
     break; 
     } 
     if(num < 10 || num > 99) { 
     System.out.println("NOT good for your game!"); 
     } else{ 
     if(input.charAt(0) == input.charAt(1)) { 
      System.out.println("NOT good for you game!"); 
     } else { 
      System.out.println("Good for your game! Play!"); 
     } 
     } 
    } catch (NumberFormatException ignored) { 
     System.out.print("Not an integer, try again: "); 
    } 
    } while (true); 
} 
+0

それを気に入っても例外はありません。これはイントロクラスであり、私たちはすべてを超えていません。 –

0

一つの方法は、コマンドラインからではなく数を読んStringで読むことであろう、そしてそれは、以下の条件を満たしていることを確認するためにその入力を検証する:

  • 入力の長さは、両方の文字が最初の数字
  • ある2つの文字
  • です2番目の数字はユニークです

私はvalidate()と呼ばれる方法を作成しましたが、これは大変です。これにより、main()メソッドは、検証が失敗した場合に限り、ユーザーの入力をポーリングするだけに集中します。

public static boolean validate(String input) { 
    // check that input length is two characters 
    if (input.length() != 2) { 
     return false; 
    } 
    // check that a two digit number was entered 
    if (Character.getNumericValue(input.charAt(0)) < 0 || Character.getNumericValue(input.charAt(0)) > 9 || 
     Character.getNumericValue(input.charAt(0)) < 0 || Character.getNumericValue(input.charAt(0)) > 9) { 
     return false; 
    } 
    // check that first and second numbers are unique 
    if (input.charAt(0) == input.charAt(1)) { 
     return false; 
    } 

    return true; 
} 

public static void main(String[] args) { 
    Scanner reader = new Scanner(System.in); 
    String input; 
    do { 
     System.out.println("Enter a 2-digit number. The digits should be different. Zero to stop: "); 
     input = reader.next(); 
     if (!validate(input)) { 
      System.out.println("NOT good for your game!"); 
     } 
     else { 
      break; 
     } 
    } while(true); 

    System.out.println("Good for your game! Play!"); 
    // you can also use the value of 'input' here if needed 
} 
+0

わかりましたが、Stringと.getNumericalValueを使わなくても、.getNu ...を学んでいないので、int型の文字列でないと入力できます。 –

+0

mgソリューションの利点は、ユーザーが望むものを入力できることです。入力が数字でない場合、コードはそれを単に拒否し、再度尋ねます。 –

関連する問題