2017-12-27 12 views
-1
import java.util.ArrayList; 
import java.util.Scanner; 

class SteppingStone4_Loops { 

    public static void main(String[] args) { 
     Scanner scnr = new Scanner(System.in); 
     String recipeName = ""; 
     ArrayList<String> ingredientList = new ArrayList(); 
     String newIngredient = ""; 
     boolean addMoreIngredients = true; 

     System.out.println("Please enter the recipe name: "); 
     recipeName = scnr.nextLine(); 


     do {   
      System.out.println("Would you like to enter an ingredient: (y or n)"); 
      String reply = scnr.next().toLowerCase(); 

      /**The code should check the reply: 
      * "y" --> prompt for the ingredient and add it to the ingredient list; 
      * "n" --> break out of the loop; 
      * anything else --> prompt for a "y" or "n" 
      */ 

      while (true) { 
      if (reply.equals("y")) { 
       System.out.println("Enter ingredient name: "); 
       newIngredient = scnr.next(); 
       ingredientList.add(newIngredient); 
      break; 
      } 
      else if (reply.equals("n")) { 
       System.out.println("Goodbye!"); 
       break; 
      } 

      else 
       break; 
      } 


      } while (addMoreIngredients); 
      for (int i = 0; i < ingredientList.size(); i++) { 
      String ingredient = ingredientList.get(i); 
      System.out.println(ingredient); 
     } 
    } 
} 

走った、プログラムがこれを返します。なぜこのループは最初に戻りますか?

レシピ名を入力してください:
ポレンタ
あなたは成分を入力したいと思います:(yまたはn)
Y
成分の名称を入力します。

あなたは成分を入力したいと思います:(yまたはn)
のn
あなたは成分を入力したいと思います:(Yあるいはn)
あなたは成分を入力したいと思います:ときの応答= N(yまたはn)

なぜそれが壊れていないのですか?なぜそれは "あなたは原料を入れたいですか"に戻るのですか?誰かが私の間違いを突き止めたり、別の方法を提案したりすることはできますか?おかげで

+2

であることを確認してください;' reply.equals( "Y") 'や' reply.equals( "N") 'か'ステートメントを。なぜあなたは彼らの行動が異なっていると思いますか? – shmosel

+0

それを考えると、内側のループは決して実際にはループしません。もしあなたがそれを取り除くならば、代わりに外側のものから壊れてしまうでしょう。 – shmosel

答えて

0
while (addMoreIngredients); 

この行は常にtrueを返します。だからあなたのdoループはループし続けます。

outerloopの内側ループからもフラグを設定することをお勧めします。

--edit ----- 内部ループを取り除くことができます。うまくいくはずです。 PS:今はJREにアクセスできない。しかし、私は、それは

do {   
      System.out.println("Would you like to enter an ingredient: (y or n)"); 
      String reply = scnr.next().toLowerCase(); 

      if (reply.equals("y")) { 
       System.out.println("Enter ingredient name: "); 
       newIngredient = scnr.next(); 
       ingredientList.add(newIngredient); 
       continue; 
      } 
      else if (reply.equals("n")) { 
       System.out.println("Goodbye!"); 
       break; 
      } 

      else { 
      System.out.println("Invalid option!"); 
      continue; 
      } 
} while (addMoreIngredients); 
+0

このようなフラグを設定するにはどうすればよいですか?私はbreakコマンドがループを終了させると思った。 – Tulcea65

+0

@ Tulcea65私は自分の立場を改訂し、要件を満たすべきだと思うコードを提案しました。あなたの場合、2つのループは必要ありませんでした。このようにして、コードをより最適化する必要があります。コードの書式を間違えてください。私はJavaのIDEを持っていませんし、ここでそれを整列させるための適切な知識もありません。 –

+0

お寄せいただきありがとうございます!私はコードを実行し、それは正しく動作するように見えます。 NetBeansは、2が続行すると言います。コマンドは必要ありませんが、私はそこに残しておきます。 – Tulcea65

1

あなたがループと外側のループはまだ継続する一方ながら、上記の条件は、内側から抜け出すだろう2つのwhileループ

else if (reply.equals("n")) { 
      System.out.println("Goodbye!"); 
      break; 
     } 

を持って、注意してください、あなたは出力を得ている理由です「あなたが入力したいです成分 "、外側ループの一部。

外側のループでは、以下の条件があります。これはtrueに設定されており、決して変更されていないようです。

while (addMoreIngredients) 

だから、内側のループから飛び出し前に、あなたはまた、代わりにラベルのブレークを使用することができ、ちょうどあなたが知っているように addMoreIngredients

else if (reply.equals("n")) { 
     System.out.println("Goodbye!"); 
     addMoreIngredients = false; 
     break; 
    } 

falseに変更することができます。

0

を動作するはずだと思うあなたが唯一の内側のループから抜け出す内部ループでループとbreak文を入れ子にしていると、あなたはDO-whileループ addMoreIngredients = true

上の第二の条件を適用することを確認してください

ブレークステートメントは、内側のループを壊すだけです。

addMoreIngredientsが常にtrueであるため、常に実行されます。

0

addMoreIngredientsあなたは `壊れてい偽

else if (reply.equals("n")) { 
      System.out.println("Goodbye!"); 
      addMoreIngredients = false; 
      break; 
     } 
+0

私はその変更をしましたが、助けているようですが、今は、私は「n」を選択したときに、これは、私が得るものです:レシピ名を入力してください: あなたは成分を入力したい ポレンタ: 成分 はあなたがしたいと思います:(yまたはn) Y は、成分の名称を入力します。成分を入力してください:(yまたはn)成分を入力しますか: n さようなら! 成分 BUILD SUCCESSFUL(合計時間:19秒) – Tulcea65

+0

最後の入力(成分)が「さよなら! 'n'が選択されたとき... – Tulcea65

+0

addMoreingredients = falseにしないと、break文は内部whileループから出てきます。しかし、外側のループから出てくるためには、常に真であるaddMoreingredients変数をチェックしています。だから、それは外側のループから出ることはありません。 – Damodar

関連する問題