February 18, 2020

Программирование в Java 4

Как вы знаете программа выполняет все операции сверху-вниз
А что делать если программа должна в одном случае работать по одному, во втором по другому? Для решение этой проблемы изучим следующую тему.

Ветвления или Условные конструкции

Выражение if - (переводится как "если"), при помощи этого оператора мы можем выполнять блок кода, если условие верно.

Синтаксис:

if (Условие) {
   // Code
}  

Для работы с ветвлением нужно разобраться с еще одним типом данных и его операциями.

Логический Тип

boolean, он же логический тип

Данный тип работает только с двумя значениями - true (правда), false (ложь).

Пример:
Создадим переменную логического типа со значением true

boolean a = true;

Операции с логическим типом или Условные выражения

Все ниже перечисленные операции являются бинарными (работают только с двумя значениями) и всегда возвращают значения типа boolean, true - если условие верно, false - если не верно.

Сравнение на равенство, оператор "==".

  • true - если значение ровны
  • false - если значения разные

Обратите внимания, что "=" - это оператор присваивания значения, а "==" - это оператор равенства. Это одна из самых распространенных ошибок начинающих программистов. Пожалуйста не путайте их.

Примеры:

boolean a = 10 == 11;

Переменная а, будет ровна false.


Сравнение на неравенство, оператор "!=".

Полная противоположность оператора равенства.

  • true - если значение разные
  • false - если значения ровны

Примеры:

boolean a = 10 != 11;

Переменная а, будет ровна true.


Рассмотрим сразу несколько операторов, так как они очень похожи (к тому же их вы все знаете со школы)

  • > - больше
  • < - меньше
  • >= - больше-ровно
  • <= - меньше-ровно

Надеюсь, что вы и без меня понимаете как с ними работать.
Но все же вот пару примеров:

boolean a = 1 > 10; // false
boolean b = 2 < 2;  // false 

А теперь не большой привет от математической логики. Не пугаемся, все нормально, ничего сложного.

Логическое И - "&&" - Конъюнкция

  • Если два значения true - true
  • В любой другом случае - false

Пример:

boolean a = true  && true;  // true
boolean b = false && true; // false

Логическое ИЛИ - "||" - Дизъюнкция

  • Если любое из значений ровно true - true
  • В любой другом случае - false

Пример:

boolean a = true  || true;   // true
boolean b = false || true;   // true
boolean c = false || false;  // false

Логическое Исключающая ИЛИ (ЛИБО) - "^" - Строгая дизъюнкция

Честно говоря, этот оператор используется крайне редко (если конечно, речь идет не о криптографии), но все же стоит его знать.

  • Если одно из значений будет true (но не одновременно) - false.
  • в любом другом случае - false.

Пример:

boolean a = true ^ false; // true
boolean b = true ^ true;  // false

Логическое НЕ - "!" - Инверсия

Данный оператор является унарным и работает только с одним значением
Операция инвертирует (устанавливает обратное) значение

  • Если значения true - false
  • Если false - true

Пример:

boolean a = !false; // true
boolean b = !true;  // false

Приведу несколько примеров по теме:

boolean a = (10 + 2) < 6 || 2 == 2; // true
boolean b = false ^ 2 < 1;          // true
boolean c = a & b;                  // true
boolean d = 10 < 100 && -1 > 2;     // false
boolean e = !((a && b) || c);       // true


Теперь вернемся к ветвлению

Напомню синтаксис конструкции if:

if (Условие) {
//code
}

В условие принимается значение/выражение типа boolean, если значение ровно true - блок кода внутри фигурных скобок выполнится, в другом случае - будет игнорироваться.

Пример:
Проверяем число на четность

Scanner in = new Scanner(System.in);

System.out.println("Введите число, для проверки на четность");
int input = in.nextInt();

if (input % 2 == 0) {
    System.out.println("Число четное");
}

if (!(input % 2 == 0)) {
    System.out.println("Число не четное");
}
  1. Для начала мы подключаем сканер.
  2. Выводим сообщение, где просим ввести число.
  3. Читаем вводное значение и записываем в переменную input.
  4. Условие: если вводное значение делим по модулю на 2 и получаем 0, выводим сообщение, что число четное. (иными словами если число делится на 2 без остатка)
  5. Условие: такое же условие только в начале стоит оператор НЕ (!), то есть если условие не верное выводим сообщение, что число не четное.

Конструкция else (иначе)

Используется вместе с конструкцией if позволяет выполнить блок кода, если условие if - false.

Синтаксис:

if (Условие) {
    // Выполняемый код, если условие верное
}
else {
    // Выполняемый код, если условие не верное
}

В качестве примера можно переписать прошлый пример с использованием else (как и нужно было писать эту программу):

Scanner in = new Scanner(System.in);

System.out.println("Введите число, для проверки на четность");
int input = in.nextInt();

if (input % 2 == 0) {
    System.out.println("Число четное");
}
else {
    System.out.println("Число не четное");
}

А как бы вы решили такую задачу:
Вводится число, если оно четное выводим 1, если нет, выводим 2, если число четное и больше 3-х выводим 3.

Предполагаю, что некоторые будут пытаться написать примерно так:

Scanner in = new Scanner(System.in);

System.out.println("Введите число, для проверки на четность");
int input = in.nextInt();

if (input % 2 == 0) {
    System.out.println("1");
}
else {
    System.out.println("2");
}
if (input % 2 == 0 && input > 10) {
    System.out.println("3");
}

Давайте разберем, что здесь не так

если мы вводим нечетное число - все хорошо, выведется 2
и если введем четное число, но меньше 10 - выведется 1,
а вот если вводим четное число больше 10 - выведется и 1, и 3

Почему так происходит? Ответ прост, потому что так написана программа. Например если вводится число 12 подойдет к первому условию и к третьему.

На самом деле логика должна быть примерно такая:
Проверяем число на четность
Если четное, то
проверяем больше ли оно 10-ти
Если больше - выводим 3
Если нет - выводим 1
Если не четное, то выводим 2

/////////////Блок - схема

А вот и сам код программы:

Scanner in = new Scanner(System.in);

System.out.println("Введите число, для проверки на четность");
int input = in.nextInt();

if (input % 2 == 0) {
    if (input % 2 == 0 && input > 10) {
        System.out.println("3");
    }
    
    System.out.println("1");
}
else {
    System.out.println("2");
}

Конструкция else if

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

Для этого отлично подходит конструкция else if.

Синтаксис:

if (Условие 1) {
    // Code 1...
}
else if (Условие 2) {
    // Code 2...
} 
else if (Условие 3) {
    // Code 3...
}
else {
    // Code 4...
}

Как это будет работать:

  1. Если 1 условие верное - выполняется code 1
  2. Если 1 условие не верное, следует условие 2, если оно верное - выполняется code 2
  3. Если условие 2 не верное, следует условие 3, если оно верное - выполняется code 3
  4. Если условие 3 не верное -выполняется code 4

Разберем на примере программы, которая будет выводит расписание занятий для конкретной группы.
Идея такая: У нас есть факультет "Программирования", на ней учится 3 группы (для простоты с номерами 1, 2, 3) . Программа будет спрашивать группу, в ответ выдавать - расписание занятий на завтра.

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

System.out.println("Введите номер группы");

Затем нужно считать данные, которые ввел пользователь.

Scanner in = new Scanner(System.in);
int groupNumber = in.nextInt();

Далее нам нужно судя из ответа, вывести нужно расписание. Тут мы и будем использовать конструкцию else if.

if (groupNumber == 1) {
    System.out.println("Расписание для первой группы");
}
else if (groupNumber == 2) {
    System.out.println("Расписание для второй группы");
}
else if (groupNumber == 3) {
    System.out.println("Расписание для третей группы");
}  
else {
    System.out.println("Данной группы не существует");
}

Здесь вы можете посмотреть полный код программы

Конструкция Switch

В некоторых случаях из-за конструкции else if код может стать слишком громоздким и излишним, конструкция switch помогает решить эту проблему.
Работа switch аналогична.

Синтаксис:

switch (Принимаемое значение) {    
    case 1:         
        // Code 1..        
        break;    
    case 2:        
        // Code 2..        
        break;    
    case 3:        
        // Code 3..        
        break;
    default:
        // Code 4..
}

Здесь дела обстоят также как и в примере выше (про if else), но немного меняется принцип.
В "принимаемые значение" можно вставить переменную/значение, далее идут несколько case'ов, "принимаемое значение" сравнивается со всеми значениями написанные после оператора case, если они ровны - выполняется код после ":" до оператора break, если не один не подошел - выполняется код после оператора default (оператор default может отсутствовать).

В качестве примера предлагаю переписать пример выше (с использованием else if).

Пример:

// ПОправить скин (забыл sout)


//Резюме