2016-10-08 11 views
0
do { 
      loop = false; 
      if (userInput.equalsIgnoreCase("Score")){ 
       System.out.println("You have chose to input a score.\nEnter your score here: "); 
       score = kbInput.nextDouble(); 
       System.out.println("What was the best possible score?"); 
       total = kbInput.nextDouble(); 
       finalScore = score/total * 100; 
       percent = (finalScore + "%"); 
       if (finalScore >= 90){ 
        grade = 'A'; 
       } else if (finalScore >= 80){ 
        grade = 'B'; 
       } else if (finalScore >= 70){ 
        grade = 'C'; 
       } else if (finalScore >= 60){ 
        grade = 'D'; 
       } else { 
        grade = 'F'; 
       } 
       System.out.println("You got " + percent + ". Which is a letter grade '" + grade + "'."); 
       loop = false; 
      } else if (userInput.equalsIgnoreCase("Percent")) { 
       System.out.println("You have chosen to input a percent.\nEnter your percent here: "); 
       finalScore = kbInput.nextDouble(); 
       if (finalScore >= 90){ 
        grade = 'A'; 
       } else if (finalScore >= 80){ 
        grade = 'B'; 
       } else if (finalScore >= 70){ 
        grade = 'C'; 
       } else if (finalScore >= 60){ 
        grade = 'D'; 
       } else { 
        grade = 'F'; 
       } 
       System.out.println("You got a letter grade '" + grade + "'."); 
       loop = false; 
      } else { 
       System.out.println("Sorry, I don't understand that."); 
       loop = true; 
      } 
     } while (loop = true); 

私はかなりJavaに慣れていません。自分でミニプロジェクトをやっています。無効な文字列(スコアとパーセント以外の文字列)が入力されたため、最後のif文に到達するたびに、コードループを最初に戻すことを計画していました。何が間違っているのか分からないようで、if/else文のセクションだけをループします。入力が無効のときのトラブルルーピングコード

+1

次に、ループ内に 'userInput'を配置する必要があります。 –

+1

'=='比較のため、 '='の代入... '=='を使ってブール値を比較しないでください。 – Li357

答えて

4

あなたはJavaの初心者が行う古典的な間違いをしました。 ==を使用しようとしましたが、間違って入力したのは=です。タイプミスを修正することはできますが、今後この問題を回避するより優れた解決策があります。

ブール値のテストには==を使用しないでください。代わりに、次のパターンに従って、あなたのコードを書き換える必要があります。

while (loop = true) {  // BUG!!!  

while (loop == true) { // WRONG 

while (loop) {   // CORRECT 

while (loop = false) { // BUG!! 

while (loop == false) { // WRONG 

while (!loop) {   // CORRECT 

このアドバイスは、ブールオペランドと==のほとんどすべての用途に適用されます。 (例外はop1またはop2どちらもブールリテラルあるop1 == op2です。)

UPDATE

あなたはユーザからの入力を取得する方法に問題があります。

  1. あなたはループの中でuserInputを読んでいません。要件に応じて、またループの開始前にどのように初期化されたかどうかに応じて、問題が発生する可能性があります。

  2. ユーザが不正な浮動小数点数を入力した場合、例外が発生します。これには、ユーザーが「100.0ポイント」のようなものを入力する場合も含まれます。

  3. 入力を検証しません。例えば陰性スコア、最大値よりも大きいスコア、0..100の範囲外のパーセンテージをテストする。

最後に、ループを終了させる方法は厄介です。このような何か方が良いでしょう:あなたはまだここで、理解するために苦労しているので

while (true) { 
    // do stuff 
    if (...) { 
     // we want to terminate the loop 
     break; // <<------ 
    } 
    // do more stuff 
} 
+0

これは、問題の2つの原因のうちの1つを処理します。プログラムを修正することはありません。スティーブン、あなたの答えは、これよりはるかに優れています。 –

+0

あなたは4を意味しませんか?あなたのコメントは通常これよりも優れています。また、宿題に関するコードを修正することはできません。それは学生が行うことです。 –

+0

さて、あなたのアップデートでこれを修正しました。これは本当に良い答えです。 –

1

を計画問題への「サンプル溶液」である:

import java.util.Scanner; 
import java.util.NoSuchElementException; 

public class Example { 
    public static void main(String[] args) { 
     Scanner kbdInput = new Scanner(System.in); 
     String mode = ""; 
     double percent = -1; 
     while (true) { 
      System.out.println("Enter 'score' or 'percent': "); 
      mode = kbdInput.next().toLowerCase(); 
      kbdInput.nextLine(); 
      if (mode.equals("score") || mode.equals("percent")) { 
       break; 
      } 
      System.out.println("I don't understand that. Try again."); 
     } 
     while (true) { 
      try { 
       if (mode.equals("score")){ 
        System.out.println("You chose to input a score."); 
        System.out.println("Enter it here: "); 
        double score = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        System.out.println("What is the best score?"); 
        double total = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        percent = score/total * 100; 
        if (score >= 0.0 && total > 0.0 && 
         percent >= 0.0 && percent <= 100.0) { 
         break; 
        } 
        System.out.println("The score/best score you " + 
         "gave make no sense."); 
       } else if (mode.equals("percent")) { 
        System.out.println("You chose to input a percent."); 
        System.out.println("Enter it here: "); 
        percent = kbdInput.nextDouble(); 
        kbdInput.nextLine(); 
        if (percent >= 0.0 && percent <= 100.0) { 
         break; 
        } 
        System.out.println("The percent you gave is not " + 
         "between 0 and 100."); 
       } 
      } catch (NoSuchElementException ex) { 
       kbdInput.nextLine(); 
       System.out.println("You entered an invalid number."); 
      } 
      System.out.println("Try again."); 
     } 
     if (percent >= 0.0 && percent <= 100.0) { 
      char grade; 
      if (percent >= 90){ 
       grade = 'A'; 
      } else if (percent >= 80){ 
       grade = 'B'; 
      } else if (percent >= 70){ 
       grade = 'C'; 
      } else if (percent >= 60){ 
       grade = 'D'; 
      } else { 
       grade = 'F'; 
      } 
      System.out.println("You got " + percent + 
        "%. Which is a letter grade '" + grade + "'."); 
     } 
    } 
} 

注意すべき点は:

  1. これを2つのループに分割しました。 1つは、スコアを入力する「モード」を要求し、検証するものです。 2番目は実際に入力します。 (これはあなたのコードからの要件であると推測しましたが、それは正しくない可能性があります)。

  2. あなたのバージョンよりも多くの入力の検証があります。

  3. kbdInput.nextLine()を使用して、いくつかの場所で不要な入力を「消費」しています。nextメソッドは、入力バッファ内で認識したくない入力文字を残すことに注意してください。慎重でない場合は、nextXxxxの次回の呼び出しで同じ文字をもう一度解析しようとします。

  4. 数字を入力する際のエラーを明示的にキャッチして処理します。例外ハンドラを参照してください。

  5. グレードを最終的に計算して表示する共通コードを移動しました。

  6. 複数行のprintlnステートメントを別々のステートメントに変更しました。これには正当な理由があります。

    • "\n"常に出力改行に正しい方法ではありません。実行プラットフォームに依存する
    • println出力がコードが実行されているマシンと同じマシンを宛先としていると仮定すると、正しく実行されます。

    • 見る:最後System.out.println() vs \n in Java

、このコードは、ユーザがキーボード(Linux上で例えば^ D)にファイルの終わりに入る場合に対応しません。

練習:それを行うとどうなるか見てみましょう。何が起こったのかを調べ、適切な修正を見つけます。

関連する問題