2015-01-04 3 views
3

Итак, назначение следующее: вы можете вводить все виды чисел, но когда вы вводите 0 два раза подряд, его нужно остановить. Первый раз ввести номер вашего не позволил ввести 0.Пока петля неправильно проверяет все условия?

Это код, у меня есть установка:

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     int givenNumber, prevNumber; 
     Console.WriteLine ("Enter a number: "); 
     int.TryParse (Console.ReadLine(), out givenNumber); 
     // I've set the prevNumber to givenNumber because the variable has to be initialized 
     // before I can use it in the condition below. I thought setting it to the giveNumber 
     // wouldn't harm. Note that the first time your not allowed to enter 0 
     prevNumber = givenNumber; 
     while (givenNumber != 0 && prevNumber != 0) { 
      prevNumber = givenNumber; //Here is where they both are 0 at a given moment, but only after the condition. 
      Console.WriteLine ("Enter a number: "); 
      int.TryParse (Console.ReadLine(), out givenNumber); 
     } 
     Console.WriteLine ("Tada"); 
    } 
} 

Проблема заключается в том, что он уже останавливается, когда вы только вошли один 0. Для пример, если я сначала должен ввести 7, а мой следующий номер будет 0. Когда я его отлаживаю, он говорит, что мой заданный номер равен 0, а prevNumber - 7, когда он возвращается к условию while, которое он останавливает и заканчивает. Когда программа заканчивает отладки, ясно говорит prevNumber = 7 и givenNumber = 0. Я использую условное И правильно, не так ли?

Любой ключ? Мне не разрешено использовать массивы для этого.

Заранее спасибо

+0

попробуйте сделать это следующим образом: 'while ((givenNumber! = 0) && (prevNumber! = 0)) {' – RBarryYoung

+0

@RBarryYoung Пробовал это без успеха – RandomPerson

ответ

2

Ooh, правильно, у вас есть логика неправильно , Оно должно быть таким:

while ((givenNumber != 0) || (prevNumber != 0)) { 

Посмотрите DeMorgan's laws понять, почему ...

+0

(исправлено ...) – RBarryYoung

0

в то время (givenNumber = 0 & & prevNumber = 0!)

Для первого считанного значения из консоли - номер 7 givenNumer будет 7 prevNumber будет 7 тоже (потому что ! передаточный prevNumber = givenNumber;) Таким образом, в то время как (7 = 0 & & 7 = 0) будет проходить

второе чтение из консоли - число 0 Таким образом, в то время как (0! = 0 & & 7! = 0) не пройдет, потому что 0! = 0 ЛОЖЬ и в то время как цикл завершается, если условие результат FALSE

1

Ваша проблема с условным оператором.

Прямо сейчас вы проверяете ли DO как givenNumber и PrevNumber НЕ равен 0.

Так что, если ни один из них равен 0, то утверждение будет вычисляться в TRUE. Однако, если любое из чисел равно 0, то оператор будет оценивать значение FALSE, так как (TRUE) & & (FALSE) оценивается как ЛОЖЬ.

Есть два способа исправить это: вы можете использовать || (оператор «ИЛИ») с двумя операциями «! =», или вы можете отрицать все это и использовать регулярное равенство, а не «! =» как таковое:! (givenNumber == 0 & & prevNumber == 0)

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