2017-12-27 43 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
이 성분의 이름을 입력 :
N
당신이 성분을 입력 하시겠습니까 (Y 또는 N) :
소금
당신은 성분을 입력 하시겠습니까 (Y 또는 n)
5
당신이 성분 입력 하시겠습니까 : Y (또는 n)

가 왜 때 응답 = N을 중단하지 않습니다? 왜 "재료를 넣으시겠습니까?" 누군가 내 실수를 지적하거나 다른 방법을 제안 할 수 있습니까? 덕분에

+2

false입니다. 왜 당신은 그들이 다르게 행동 할 것으로 기대합니까? – shmosel

+0

생각해 보니, 당신의 내부 루프는 결코 실제로 반복되지 않습니다. 만약 당신이 그것을 없애 버리면, '끊어 질 것입니다.'가 대신 바깥에서 벗어날 것입니다. – shmosel

답변

0
while (addMoreIngredients); 

이 줄은 항상 true를 반환합니다. 따라서 do 루프는 루핑을 계속합니다.

outerloop에 대한 내부 루프의 플래그도 설정하는 것이 좋습니다.

- 편집자 - 012-내부 루프를 제거 할 수 있다고 생각합니다. 제대로 작동해야합니다. 추신 : 지금은 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 제 견해를 재검토하고 요구 사항을 충족시켜야한다고 생각하는 코드를 제안했습니다. 귀하의 경우 두 개의 루프가 필요하지 않았습니다. 이렇게하면 코드가 더 최적화되어야합니다. 코드 형식을 변명하십시오. 나에게는 자바 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

은 내부 루프에서 탈출 당신은 루프를 중첩 된 것을 확인하고 내부 루프에서 문을 나누어주십시오 일을해야한다고 생각하면 addMoreIngredients = true

의 DO-while 루프의 두 번째 조건을 적용

break statment는 내부 루프를 구분합니다.

이므로 addMoreIngredients 항상 참이므로 항상 실행됩니다.`문 여부`reply.equals`("Y") '또는 reply.equals ("N")`,

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 루프에서 나옵니다. 그러나 바깥 쪽 루프에서 나오기 위해서는 항상 true 인 addMoreingredients 변수를 확인해야합니다. 그래서 그것은 바깥 고리에서 나오지 않을 것입니다. – Damodar