Урок 13. Больше операторов в Java

Мы уже научили нашу игру задавать вопрос пользователю. Теперь нам нужно «поймать» его ответ, то есть узнать по какой кнопке он нажал. Определить верный или неверный ответ он дал. И на основании этого выбрать дальнейшие подходящие действия. Но для этого у нас пока недостаточно знаний и придётся их подтянуть.

 
Нам предстоит изучить еще несколько операторов. Мы уже умеем складывать (+), вычитать (-), умножать (*), делить (/), присваивать (=), инкрементировать (++), декрементировать (—). Познакомимся с еще некоторыми:

  • == — Оператор сравнения. Это проверка на равенство и выявление истинности или же ложности выражения. Выражение (10 == 9), например, ложно (false).
  • ! – Логический оператор НЕ. Выражение (!(2+2==5)) – правдиво (true), так как 2+2 НЕ РАВНО
  • != — Еще один оператор сравнения, проверяет НЕРАВЕНСТВО. Например, выражение (10 != 9) – правдиво (true), так как 10 не равно 9.
  • > — И еще оператор сравнения, проверяет БОЛЬШЕ ли одна часть выражения другой. (10 > 9) – правдиво (true).
  • < — Оператор сравнения МЕНЬШЕ. Проверяет меньше ли значение выражения стоящее слева от значения выражения, находящегося справа. (10 < 9) – ложно (false).
  • >= — Оператор сравнения БОЛЬШЕ ИЛИ РАВНО. Этот оператор проверяет, является ли одно значение больше или равно другому и если является, то выражению присваивается true. К примеру, выражение (10 >=9) правдиво (true), (10 >=10) тоже правдиво (true).
  • <= — Как и предыдущий оператор, это проверяет на совпадение двух условий сразу, только на этот раз МЕНЬШЕ ИЛИ РАВНО. (10 <= 9) – ложь (false), (10 <=10) – правда (true).
  • && — Этот оператор известен как логическое И. Он проверяет две или более части выражения, и все части должны быть истинными, чтобы общий результат был истинным (true). Логическое И обычно используется совместно с другими операторами для построения более сложных проверок. Выражение ((10 > 9) && (10 < 11)) – правдиво (true), так как обе части выражения истинны(true). А выражение ((10 > 9) && (10 < 9)) – ложно (false), так как только одна часть общего выражения правдива, а другая ложная.
  • || — Этот оператор называется логическое ИЛИ. Он аналогичен логическому оператору И, за исключением того, что только одна часть общего выражения должна быть правдива, чтобы общее выражение было истинно (true). Выражение ((10 > 9) || (10 < 9)) истинно (true), так как по крайней мере одна из его частей истинна (true).

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

Решение 1. Если они перешли через мост, застрелить их. Ключевое слово if.

Немного теории о том, как мы можем использовать те операторы, о которых шла речь выше. Давайте сделаем предыдущие примеры менее абстрактными используя одно из множества ключевых слов языка Java – “if” и какую-нибудь интересную ситуацию. Представьте, что генерал армии погибает в бою и нету никого настолько же опытного, как он, чтобы отдавать приказы армии. И тут-то генералу приходит хорошая мысль в голову, он решает написать программу на Java и тем самым передать последние приказы своим подчинённым. Солдаты должны держать одну сторону моста в ожидании подкрепления. И первой командой генерал хочет убедиться понимают ли его солдаты: Если враги перешли мост – застрелите их. Давайте обыграем эту ситуацию на языке Java. Нам нужна переменная типа BooleanisComingOverBridge. В следующем кусочке кода предполагается, что такая переменная уже была объявлена и инициализирована:

if(isComingOverBridge){
        //Застрелить врага
        }

Если переменная isComingOverBridge принимает значение “true”, то будет выполнен код между открывающейся и закрывающейся фигурными скобками. Если переменная isComingOverBridge принимает значение “false”, то программа будет выполнять код, который будет написан после блока if.

Решение 2. Иначе, сделать это. Ключевое слово else.

Генерал также хочет сказать своим солдатам, что делать в случае если враг не переходит через мост. Представляем вам еще одно ключевое слово – else”. Генерал с помощью else” даёт команду своим солдатам держать позицию, в случае если враг не переходит мост:

        if(isComingOverBridge){
//Застрелить врага
                }else{
//Держать позиции
                }

Затем генерал понимает, что проблема не так проста, как ему показалось сначала. Что если враг переходит мост и его войска превосходят количеством войска нашего генерала. Таким образом он приходит к следующему выводу:

    boolean isComingOverTheBridge;
    int enemyTroops;
    int friendlyTroops;
//Объявили переменные
//Переход if
        if(isComingOverTheBridge && friendlyTroops > enemyTroops){
//застрелить врага
        }else if(isComingOverTheBridge && friendlyTroops < enemyTroops) {
//взорвать мост
        }else{
//держать позиции
        }

Наконец, последняя забота генерала заключалась в том, что если враг перейдет через мост, размахивая белым флагом капитуляции, и будет немедленно убит, то его люди окажутся военными преступниками. Введя еще одну переменную типа Boolean – wavingWhiteFlag, он написал следующий код:

if (wavingWhiteFlag){
//Взять в плен
        }

Но куда поместить этот код ему было непонятно. Поразмыслив, генерал решил использовать оператор “логическое НЕ (!)” следующим образом:

if (!wavingWhiteFlag){//если НЕ сдаются, заходим в цикл
        if(isComingOverTheBridge && friendlyTroops > enemyTroops){
//застрелить врага
        }else if(isComingOverTheBridge && friendlyTroops < enemyTroops) {
//взорвать мост
        }
        }else{//этот else для нашего первого if
//взять в плен
        {
//держать позиции

Тут демонстрируется, что мы можем вкладывать if” “else” друг в друга, чтобы создавать различные решения.

Мы могли бы продолжать принимать более и более сложные решения, но того, что мы увидели, более чем достаточно для ознакомления. Можете прочитать еще раз если что-то осталось непонятно.

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

 

Оператор Switch.

Мы видели огромные и практически безграничные возможности Java по комбинированию операторов с помощью условных переходов if” иelse”. Но иногда решение в Java может быть сделано и по-другому.

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

Switch” начинается так:

switch(argument){
        }

Здесь в качестве аргумента должна находится какая-либо переменная или же выражение. Затем в фигурных скобках мы можем принимать решения на основе аргумента case и break элементов:

case x:
//код для x
break;
case y:
//код для y
break;

В этом примере каждый case указывает на возможный результат, а каждый break обозначает конец этого case в случае, когда уже не нужно принимать каких-то действий. Первый же break, который будет достигнут компилятором выкинет вас из switch” и код продолжит исполняться со строчки, которая будет следовать за закрывающейся фигурной скобкой этого switch”.

Так же присутствует возможность использовать ключевое слово default на случай если ни один из case не был достигнут (аргумент из switch не подошел ни к одному из case). К примеру:

default://никакого значения сюда не передаём
//сделать что-нибудь здесь, так как ни один из case не сработал
        break;

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

//обрабатываем ввод от пользователя в String-переменную с именем command
        switch(command){
                case "Go East":
//код для похода на восток
                break;
                case "Go West":
//код для похода на запад
                break;
                case "Take sword":
//код для взятия меча
                break;
//можно добавлять еще case
                default:
//Извините, но я не понимаю, что мне нужно сделать
                break;
        }

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

На этом пока наша теория заканчивается. В следующем уроке мы применим приобретённые знания (в частности switch-переход) для того, чтобы наш метод onClick обрабатывал нажатия по кнопкам.