2013-02-23 1 views
1

Я делаю последние штрихи для проекта класса, и я добавляю в сеть безопасности для одного из моих пользовательских входов. Я установил его так, чтобы, если пользователь помещает «1» или «2», данные, которые они вводят, будут отображаться по-разному. Я хочу добавить метод, который запрещает пользователю вводить что-либо, кроме «1» или «2». Вот код для него.Проведите цикл, пока вход не является или b?

do 
{ 
System.out.println("Please type either '1' or '2'."); 
Scanner scan = new Scanner(System.in); 
a = scan.nextInt(); 
} 
while (a != (1||2)); 
//after user enters 1 or 2, return the choice 
return a; 

Я читал об операндах и логике, но я как бы застрял. Я все время прогонял своего учителя, поэтому я решил, что дам ему перерыв, так как я не его единственный ученик. Моя ошибка говорит «плохие типы операндов для бинарного оператора„||“

ответ

7

Это распространенное заблуждение при изучении программирования.

Вы, как человек, можете легко прочитать инструкцию, которая читается следующим образом: «в то время как а не 1 или 2», но компьютер должен следовать определенным правилам, и одно из правил заключается в том, что «или» принимает старшинство.

Что это означает, что он первым испытующий, чтобы выяснить, что «1 или 2» означает, что, так как в основном, ваше утверждение аналогично этому:

while (a != SOMETHING); 

|| на языке Java является «логическим или» , который преобразуется в это: Возьмите два значения (называемые операндами) с каждой стороны || (называемые оператором) и объедините их в соответствии с правилами «логический» или «.

«логический» или «использует» два логических значения, которые могут быть только True или False, и поскольку вы попросили его использовать оператор с числами, вот почему вы получаете это конкретное сообщение об ошибке.

Если вы попытались использовать единственный канал, |, компилятор мог бы перестать жаловаться, но он все равно не сделает то, что вы хотите.

1 or 2 при работе с числами, используя оператор |, который является «побитовым» или «оператором», вы получите два числа, объединенные в цифру 3. Вы можете больше узнать о «побитовых операторах», если хотите знаю, почему.

Одним словом, вы не можете писать свои модели.

В языках программирования сравнения выполняются по два значения за раз, т.е. один против другого, поэтому ваш единственный выбор состоит в том, чтобы развернуть выражение для сравнения дважды.

Вот некоторые эквивалентные выражения, которые дадут вам то, что вы хотите:

while (a != 1 && a != 2); 

или это:

while (!(a == 1 || a == 2)); 

Чтобы быть оттачивает, мне нравится первый лучше.

+0

Спасибо! Вы решили мою проблему, и я тоже кое-что узнал. – formn

0

Это (a != 1 && a!=2). - Вы на самом деле хотите, чтобы выйти из цикла, когда либо 1 или 2.

0

Вы должны сделать отдельные условные операторы . для a!= 1 и a!= 2

Ваше условное выражение должно выглядеть примерно так:

(a!=1) && (a!=2) 
0

проблема здесь вы пытаетесь написать код, который имеет смысл читать как английский язык, но он не работает как это. Оператор || принимает два выражения и возвращает, если один или другой true. Это означает, что то, что вы написали, не имеет смысла.

Самый простой способ заменить это расширить его:

a != 1 && a != 2 

(Мы должны использовать &&, как мы проверяем, что ни один из них является истинным).

Обратите внимание, что это может стать многословным и неудобным. Кроме того, хорошая замена (если у вас есть много значений для проверки) - это проверка членства в коллекции (Set - хороший выбор, так как вам гарантирован тест на членство в O (1)). Например:

Set<Integer> possibles = new HashSet<Integer>(); 
Collections.addAll(possibles, new Integer[] {1, 2, ...}); 
while (!possibles.contains(a)) { 
    ... 
+0

'Arrays.asSet()' ?? Откуда это? – jlordo

+0

@jlordo Ugh, я пошел вперед и предположил, что он существует, по-видимому, нет. –

0

Вы не можете лечить int как псевдо- regex. Заменить

while (a != (1||2)); 

с

while (a != 1 && a!= 2); 
0

попробовать это в вашем состоянии в то время как петля

((a!=1) && (a!=2)) 
0

Вы должны написать

while (a != 1 && a != 2) 

, потому что это эквивалент (a == 1 || a == 2)

0

Бинарный оператор '||' требуется два булевых операнда с обеих сторон. Поскольку ваши операнды являются целыми числами, это синтаксическая ошибка.

Вы должны сделать это таким образом:

do{ 
// core of the loop... 
}while(a!=1 && a!=2); 
Смежные вопросы