2014-10-18 5 views
2

Я понимаю, что, хотя состояние истинно, цикл будет продолжать работать. Я думал, что если бы я просто набрал loop = false, то после скобки для цикла я мог бы продолжать кодировать. Очевидно, я был неправ, он ничего не будет запускать. КТО-ТО, пожалуйста, покажите мне, как выйти из этого адского цикла.Как я могу выбраться из этого цикла freaking

System.out.println("You total balance is 0.00, " 
       + "please deposit coins and type done when finished"); 

     while(loop){ 
      if (input.hasNextInt()){ 
       deposit = input.nextBigDecimal();} 
       String change = input.next(); 

     switch (change){ 

     case "quarter": 
      balance= quarter.multiply(deposit); 
      total=total.add(balance); 
      System.out.println("Your balance is "+ total +" :Make addiontal deposit(s)"); 
      break; 

     case "dime": 
      balance=dime.multiply(deposit); 
      total=total.add(balance); 
      System.out.println("Your balance is "+ total +" :Make addiontal deposit(s)"); 
      break; 
     case "nickel": 
      balance=nickel.multiply(deposit); 
      total=total.add(balance); 
      System.out.println("Your balance is "+ total +" :Make addiontal deposit(s)"); 
      break; 
     case "penny": 
      balance=penny.multiply(deposit); 
      total=total.add(balance); 
      System.out.println("Your balance is "+ total +" :Make addiontal deposit(s)"); 
      break; 
     case"done": 
      System.out.println("Your total is $"+total); 
      fee=total.multiply(feeRate); 
      System.out.println("The exchance fee is 9.1% which amounts to $"+fee); 
      grandTotal=total.subtract(fee); 
      System.out.println("Your total balance minus the exchange fee is $"+grandTotal); 

      break; 

     default: System.out.println("There is a issue at "+change);} 

      } System.out.println("4"); 

     } 

} 
+0

Вот почему это называется цикл ... один раз в цикле, выполнение остается в цикле, пока условие остановки выполняется. Переменная цикла ** должна быть установлена ​​** внутри цикла, а не ** после ** цикла. – pasty

ответ

5

Ключ состоит в том, чтобы изменить переменную цикла так, чтобы она стала ложной, и, таким образом, вы должны выйти из цикла while. Поэтому измените переменную цикла в блоке case "done". В этом блоке, установите loop = false;

case"done": 
     System.out.println("Your total is $"+total); 
     fee=total.multiply(feeRate); 
     System.out.println("The exchance fee is 9.1% which amounts to $"+fee); 
     grandTotal=total.subtract(fee); 
     System.out.println("Your total balance minus the exchange fee is $"+grandTotal); 

     loop = false; // ************ add this ************ 

     break; 

Имейте в виду, что ключевым понятием является то, что вещь, которая вызывает цикл, чтобы продолжить должны быть изменено каким-то образом в сама петля. В противном случае цикл while никогда не закончится.

+1

@pasty: oops, chit! Благодаря!!!!!!!!!!!!! –

1

Ваша петля будет продолжать вращаться до тех пор, пока переменная цикла не будет установлена ​​в значение false. В «сделанном» случае просто установите для этого значение false. Таким образом, он не будет возвращаться назад.

 case"done": 
      System.out.println("Your total is $"+total); 
      fee=total.multiply(feeRate); 
      System.out.println("The exchance fee is 9.1% which amounts to $"+fee); 
      grandTotal=total.subtract(fee); 
      System.out.println("Your total balance minus the exchange fee is $"+grandTotal); 
      loop = false; // This is the line to add. 
      break; 
+2

Не просто код дампа, где мы должны искать объяснения. Покажите, что вы сделали, и объясните, почему вы сделали это так, чтобы мы могли ясно видеть это.Нет необходимости копировать 50 строк, если вы только меняете 1. –

+1

Но это не убедительная причина, чтобы опросить правильный ответ, они должны прокомментировать его объяснение; что, как вы. –

+0

Теперь я добавил объяснение. В коде есть также комментарий, он должен быть достаточно ясным. 5 голосов, хорошо сделанное сообщество :). «Спасибо, что помогло», было бы очень приятно, что вы говорите - «отбросьте - как вы посмеете помочь». Спасибо за то, что вы сказали, как улучшить его до 1 человека, который сделал, он был улучшен .. нет необходимости в голосовании. – ThePerson

3

Три метода разбить петлю.

A) установите значение переменной флага false:

loop = false; 

Поскольку у вас уже есть эта переменная, этот подход гораздо лучше (и проще).

B) используйте помеченный перерыв.

label: while(true) { 
    // ... 
    switch(something) { 
    break label; // Without a label, it would only leave the switch! 
    } 
} 

Некоторые люди будут недовольны этим последним решением, потому что это по существу «goto».

C) используйте более модульный код.

Во многих случаях гораздо более чистый способ заключается в использовании методов . Затем вы можете «разбить», чтобы выйти из внутреннего цикла или переключателя и return, чтобы фактически оставить подпроцедуру и вернуть результат.

Это приводит к более понятному коду, и семантика return часто бывает более подходящей, чем у break.

+1

[aaah goto ...: -)] (http://xkcd.com/292/). – pasty

+0

с использованием 'меток' в кодировании не является предпочтительным, он делает ваш код неясным –

+0

Но, чтобы дать кредит Анони, он упоминает о нижнем. Ответ обоснован. 1+ –

1

Вы должны изменить значение переменной loop внутри цикла while до false.

Я предполагаю, что это должно быть в том случае, если пользователь вводит done. Таким образом, в этом случае добавьте следующую строку:

loop = false; 

где-нибудь в case "done": блоке

Смежные вопросы