2016-12-09 8 views
-2

次のコードに問題があります。シナリオはそのようなものです:ユーザは文字列を入力します(文でもよい)。コードは、単語ごとに、母音で始まる単語の最後に+ "ay"を表示し、単語の最初の文字を単語の最後に置きます(最後に "ay"を追加します) )。単語を始める文字でない場合は、それを印刷してください。しかし、正しい大文字で「はい」または「いいえ」を入力することによって、ユーザーが続行したいかどうかを尋ねるはずです。(JAVA)次のコードはデバッグできません:どのようなエラーが発生したか、これらのエラーを修正する方法?

私はそれをデバッグしようとし、意図したとおりに動作しません。しばらくして(scanWord.hasNext())すべてのものが動作することがわかります。しかし、そのループの後、残りの部分はexecuterによって無視されます(そのようにコメントされます)。あなたは、私が答えを得るのを助け、間違いを説明し、他人と自分自身をより良いJava開発者にすることができますか?

//import Scanner 
import java.util.Scanner; 

public class Prog508a { 

    public static void main(String [] args) { 


     //Declare variables 
     String word; 
     String response; 
     boolean answer = true; 

     //Declare Scanner objects 
     Scanner scanWord = new Scanner(System.in); 
     Scanner answerQuestion = new Scanner(System.in); 

     //while user still wants to continue 
     while (answer == true) { 

      //ask user for input 
      System.out.print("Enter a sentence: "); 

      //while the input still contains words 
      while (scanWord.hasNext()) { 

       //input from user is word 
       word = scanWord.next(); 

       //if the character is letter at 0 
       if (Character.isLetter(word.charAt(0))) { 

        //and if the character is not a vowel at index 0 
        if (!(word.charAt(0) == 'a') 
          && !(word.charAt(0) == 'e') 
          && !(word.charAt(0) == 'i') 
          && !(word.charAt(0) == 'o') 
          && !(word.charAt(0) == 'u')) { 

         //the output is added the substring of word from the second letter and added first letter at the end 
         word = word.substring(1,word.length())+ word.charAt(0); 
        } 
        //word is added "ay" 
        word+= "ay"; 
       } 
       //print the word result 
       System.out.print(word + " "); 
      } 

      //EVERYTHING UNDER HERE DOES NOT EXECUTE 
      System.out.println("\n"); 
      System.out.print("Do you wish to convert another sentence (Yes or No): "); 
      response = answerQuestion.next(); 

      while (!(response.compareTo("No") == 1) || !(response.compareTo("Yes") == 1)) { 
       //if the answer is no or yes (no capitalization) 
       if (response.compareTo("no") == 1 || response.compareTo("yes") == 1) { 
        while (response.compareTo("no") == 1 || response.compareTo("yes") == 1) { 
         System.out.println("Capitalization is important! Input correctly: "); 
         response = answerQuestion.next(); 
        } 
       } else if (!(response.compareTo("No") == 1) || !(response.compareTo("No") == 1)) { 
        while (!(response.compareTo("No") == 1) 
          || !(response.compareTo("Yes") == 1) 
          || !(response.compareTo("no") == 1) 
          || !(response.compareTo("yes") == 1)) { 
         System.out.println("You must input either yes or no! Input correctly: "); 
         response = answerQuestion.next(); 
        } 
       } 
      } 
      if (response.compareTo("No") == 1) 
       answer = false; 
      if (response.compareTo("Yes") == 1) 
       answer = true; 
     } 
     //close the scanners 
     answerQuestion.close(); 
     scanWord.close(); 
    } 
} 
+0

デバッグから何を学びましたか? – Carcigenicate

+2

'compareTo'がどのように動作するのか分かりません。 –

+0

最初の変換(最初の文)で動作しますが、続行を要求しません。 –

答えて

-1

//EVERYTHING UNDER HERE DOES NOT EXECUTE

あなたは無限whileループを持っています。

//while the input still contains words 
while (scanWord.hasNext()) { 

だから、どういうわけかbreakが必要です。たとえば、whileループを使用せず、一度に文全体を入力します。

//ask user for input 
System.out.print("Enter a sentence: "); 
String sentence = scanWord.nextLine(); 

for (String word : sentence.split("\\s+")) { 
    // sentence is split on spaces 
} 

Just be careful using next() and nextLine() together.


compareTo戻り0の実装1つの目的は、他のより大きいときオブジェクトが等しく、1

== 0を使用するか、if (response.equals("Yes")) { }を使用してください。


大文字化はなぜ重要ですか?あなたもまた

if (response.equalsIgnoreCase("yes")) { } 

を使用し、ケースを気にしない場合は、ループ内でスキャナを閉じないでください。そしてあなたは1つだけ必要です。

スキャナーを1つ閉じると、バッキングストリームが閉じられますので、実際には両方を閉じています。

+0

よろしくお願い致します!ただし、問題は解決されていません。私があなたにアドバイスしたすべての変更を行いましたが、下の部分はまだコンパイルされていません。//実行しません。 –

+0

待機 - コンパイル*しない、または実行しない?コンパイルエラーがある場合は、それは –

+0

であることを言及する必要がありますまた、どのようにブレークステートメントを使用せずにwhileループから壊すことができますか?私はwhileループ内でbreakステートメントを避けるようにしています。 –

0

次の2つの場所で修正が必要になります。

  • まず、あなたは、文が解析されると、制御はYes/No疑問を印刷したいと思うようif (scanWord.hasNext()) {while (scanWord.hasNext()) {を変更する必要があります。

  • 第二に、あなたは大文字小文字を区別しない比較のためにresponse.equalsIgnoreCase("No")で、response.equals("No")、またはより良いにresponse.compareTo("no") == 1を変更する必要があり、文字列比較を修正する必要があります。

+0

whileを条件文に変更しても、私のコードは意図したとおりに動作しません。そのループは、入力文内のすべての異なる単語を評価することになっています。 –

+1

これは無限ループです。最初の文の処理が終了したら、他の文を待つのに対して、別の文を試してみるのが理想です。私は答えをここに掲示する前にそれをデバッグしました。 –

関連する問題