Логические выражения и тип boolean

В Java тип boolean используют для логических значений.

Тип boolean имеет только два литерала:

true
false

Логическое значение чаще всего получается в результате сравнения двух выражений.

Оператор Смысл true false
== равно 2 == 2 2 == 3
!= не равно 3 != 2 2 != 2
< меньше 2 < 13 13 < 2
<= меньше или равно 2 <= 2 3 <= 2
> больше 13 > 2 2 > 13
>= больше или равно 2 >= 2 2 >= 3

Операторы равенства и сравнения в Java

Простые логические выражения часто выглядят так:

Вопрос Выражение Комментарий
Чётное ли число? (x % 2) == 0 остаток при делении на 2 должен быть равен нулю
Делитель равен нулю? denominator == 0 проверка перед делением
Количество минут делится на 60? (minutes % 60) == 0 используем остаток от деления

Логические операции

Если одного сравнения недостаточно, условия можно объединять с помощью логических операций !, && и ||.

Таблица истинности показывает, какое значение принимает логическое выражение при разных значениях true и false.

Выражение Значение
!false true
!true false

Таблица истинности для НЕ

Выражение Значение
false && false false
false && true false
true && false false
true && true true

Таблица истинности для И

Выражение Значение
false || false false
false || true true
true || false true
true || true true

Таблица истинности для ИЛИ

Составные условия часто выглядят так:

Вопрос Выражение Комментарий
Хотя бы одно из двух чисел положительное? (a > 0) || (b > 0) достаточно, чтобы хотя бы одно условие выполнялось
Месяц корректный? (month >= 1) && (month <= 12) оба условия должны быть истинны
Месяц некорректный? !((month >= 1) && (month <= 12)) отрицание готового условия

Приоритет операций

В выражениях сначала выполняются действия в скобках. Потом идут арифметические операции, затем сравнение. Среди логических операций сначала выполняется !, потом &&, потом ||.

Если рядом стоят операции одного уровня, они выполняются слева направо.

Выражение То же самое Значение Комментарий
2 + 3 * 4 == 20 (2 + (3 * 4)) == 20 false сначала *, потом +, потом ==
(2 + 3) * 4 == 20 (5 * 4) == 20 true скобки меняют порядок действий
7 % 2 == 1 && 5 > 3 ((7 % 2) == 1) && (5 > 3) true сравнения выполняются раньше &&
!(7 % 2 == 0) !((7 % 2) == 0) true сначала вычисляется выражение в скобках
true || false && false true || (false && false) true && выполняется раньше ||

Приоритет операций в выражениях

Даже если скобки не обязательны, их часто ставят, чтобы выражение было легче читать: (month >= 1) && (month <= 12).

Сравнение строк

В Java строки сравнивают по тексту через equals().

String first = "кот";
String second = "кот";

System.out.println(first.equals(second));

Вывод
true

Здесь обе строки содержат один и тот же текст, поэтому equals() возвращает true.

Но если написать так:

String first = "ко";
String second = "т";
String word = first + second;

System.out.println(word == "кот");

Вывод
false

Хотя текст одинаковый, сравнение через == здесь не подходит.

Переменные boolean

Результат логического выражения можно сохранить в переменную типа boolean.

Имена таких переменных обычно начинаются с is, has, can и читаются как ответ на вопрос «да или нет»: isSummerMonth, isCorrectMonth, hasError.

int month = 7;

boolean isSummerMonth = (month == 6) || (month == 7) || (month == 8);

System.out.println(isSummerMonth);

Вывод
true

Здесь переменная isSummerMonth хранит ответ на вопрос: «месяц летний или нет?»

Ещё пример:

int month = 13;

boolean isCorrectMonth = (month >= 1) && (month <= 12);

System.out.println(isCorrectMonth);

Вывод
false

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

Ниже задачи, где основной навык — собрать условие в одно логическое выражение и вывести готовый ответ.

Задачи для тренировки: логические выражения и boolean

1. Запишите логическое выражение, которое истинно, если целые a и b равны.

Ответ

a == b

Это сравнение на равенство. Один знак = здесь не подойдёт: он делает присваивание.


2. Что выведет программа?

System.out.println(7 % 2 == 1 && 5 > 3);

Ответ

true

Сначала Java считает %, потом сравнения, потом &&. Здесь обе части дают true, поэтому итог тоже true.


3. Как правильно проверить, что строки first и second равны по тексту?

Ответ

first.equals(second)

В Java строки сравнивают по тексту через equals(). Оператор == здесь не решает задачу так, как нужно.


4. Исправьте неверную проверку корректного месяца:

1 <= month <= 12

Ответ

(month >= 1) && (month <= 12)

Так писать нужно потому, что 1 <= month уже даёт значение типа boolean. После этого сравнивать результат с 12 уже нельзя.


5. Запишите объявление boolean-переменной с понятным именем, которая хранит ответ на вопрос: «Число x лежит на отрезке [left, right]». Гарантируется, что left <= right.

Ответ

boolean isOnSegment = (x >= left) && (x <= right);

Имя должно читаться как ответ на вопрос «да или нет». Поэтому isOnSegment лучше нейтральных вариантов вроде segment или value.


6. Осенние каникулы идут с 3 по 10 ноября включительно. Запишите выражение, которое истинно для даты day, month, если день попадает на каникулы.

Ответ

(month == 11) && (day >= 3) && (day <= 10)

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

Яндекс Контест: «02. Условный оператор if» (boolean / логические выражения: задачи A-E)

Блок собран из пакета yandex-contests/packages/02-if-basic.

Контест: https://new.contest.yandex.ru/contests/92506/

A. Равны ли числа?

Даны два целых числа a и b. Определите, равны ли они.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите true, если a = b, и false в противном случае.

Примеры
Ввод
37
37
Вывод
true
Ввод
48
52
Вывод
false


B. Равны ли строки?

Даны две непустые строки без пробелов. Определите, равны ли они.

Входные данные

В первой строке записана строка s, во второй — строка t. Обе строки непустые, не содержат пробелов, длина каждой не превосходит 100 символов.

Выходные данные

Выведите true, если строки совпадают, и false в противном случае.

Примеры
Ввод
apple
apple
Вывод
true
Ввод
cat
dog
Вывод
false


C. Проверка a > b

Даны два целых числа a и b. Определите значение выражения a > b.

Входные данные

В единственной строке записаны два целых числа a и b.

Выходные данные

Выведите true, если a > b, и false в противном случае.

Примеры
Ввод
7 3
Вывод
true
Ввод
2 9
Вывод
false


D. Принадлежность отрезку

Даны три целых числа a, b и c. Гарантируется, что b ≤ c. Определите, лежит ли число a на отрезке [b, c].

Число лежит на отрезке тогда и только тогда, когда выполняется неравенство b ≤ a ≤ c.

Входные данные

В единственной строке записаны три целых числа a, b и c.
Дополнительно гарантируется, что b ≤ c.

Выходные данные

Выведите true, если a лежит на отрезке [b, c], и false в противном случае.

Примеры
Ввод
13 10 20
Вывод
true
Ввод
24 10 20
Вывод
false


E. Каникулы

Осенние каникулы длятся с 3 по 10 ноября включительно. По заданной дате определите, попадает ли этот день на каникулы.

Входные данные

В единственной строке записаны два целых числа: день и месяц.
Гарантируется, что 1 ≤ день ≤ 31 и 1 ≤ месяц ≤ 12.

Выходные данные

Выведите true, если заданная дата попадает на каникулы, и false в противном случае.

Примеры
Ввод
3 11
Вывод
true
Ввод
10 11
Вывод
true
Ввод
2 11
Вывод
false
Ввод
11 11
Вывод
false


Условный оператор if

В if (...) должно стоять выражение типа boolean. Java сначала вычисляет это выражение, а потом решает, выполнять ли блок кода.

Если условие истинно, инструкции внутри { ... } выполняются. Если условие ложно, этот блок просто пропускается.

int x = -8;

if (x < 0) {
    x = -x;
}

System.out.println(x);

Вывод
8

Здесь строка x = -x; выполняется только для отрицательных значений x.

После if можно написать не одну инструкцию, а целый блок кода. Это удобно, когда при истинном условии нужно выполнить несколько действий подряд.

int a = 9;
int b = 4;

if (a > b) {
    int temp = a;
    a = b;
    b = temp;
}

System.out.println(a);
System.out.println(b);

Вывод
4
9

Здесь внутри блока после if стоят несколько инструкций: объявление переменной temp и три присваивания. Переменная temp создана внутри блока, поэтому после закрывающей } к ней обращаться уже нельзя.

Два варианта: if ... else

Если из двух действий нужно выбрать ровно одно, используют if ... else.

int x = 7;

if ((x % 2) == 0) {
    System.out.println("Чётное");
} else {
    System.out.println("Нечётное");
}

Вывод
Нечётное

В такой конструкции всегда выполняется ровно один блок: либо после if, либо после else.

Несколько вариантов: цепочка else if

Если вариантов больше двух, проверки удобно строить сверху вниз через else if.

int score = 73;

if (score >= 90) {
    System.out.println("5");
} else if (score >= 70) {
    System.out.println("4");
} else if (score >= 50) {
    System.out.println("3");
} else {
    System.out.println("2");
}

Вывод
4

Проверки идут сверху вниз. Для 73 первое условие ложно, второе истинно, поэтому программа печатает 4 и дальше уже не идёт.

Независимые if и вложенные условия

Не все проверки нужно связывать в одну цепочку.

Последовательность из нескольких независимых if подходит, когда несколько действий могут выполниться подряд. В отличие от цепочки else if, здесь могут сработать сразу несколько блоков.

Например, число 12 одновременно положительное, чётное и делится на 3, поэтому могут сработать все три проверки:

int x = 12;

if (x > 0) {
    System.out.println("Положительное");
}

if ((x % 2) == 0) {
    System.out.println("Чётное");
}

if ((x % 3) == 0) {
    System.out.println("Делится на 3");
}

Вывод
Положительное
Чётное
Делится на 3

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

Вложенный if нужен, когда вторая проверка имеет смысл только внутри первой. Если условие можно короче и понятнее записать одной формулой, лучше собрать его через && и ||.

Например, сначала можно разделить числа на неотрицательные и отрицательные, а потом внутри каждой ветки отдельно проверить чётность:

int x = -7;

if (x >= 0) {
    if ((x % 2) == 0) {
        System.out.println("Неотрицательное чётное");
    } else {
        System.out.println("Неотрицательное нечётное");
    }
} else {
    if ((x % 2) == 0) {
        System.out.println("Отрицательное чётное");
    } else {
        System.out.println("Отрицательное нечётное");
    }
}

Вывод
Отрицательное нечётное

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

Если же нужен только один конкретный случай, условие можно собрать одной формулой:

int x = -7;

if ((x < 0) && ((x % 2) != 0)) {
    System.out.println("Отрицательное нечётное");
}

Вывод
Отрицательное нечётное

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

Упрощение сложных конструкций if через переменную boolean

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

Для boolean-переменных обычно выбирают имена, которые читаются как ответ на вопрос «да или нет». Частые начала: is, has, can.

Например: isLeapYear, hasError, canVote.

int year = 2024;

boolean isDivisibleBy4 = (year % 4) == 0;
boolean isDivisibleBy100 = (year % 100) == 0;
boolean isDivisibleBy400 = (year % 400) == 0;

boolean isLeapYear = (isDivisibleBy4 && !isDivisibleBy100) || isDivisibleBy400;

if (isLeapYear) {
    System.out.println("Високосный");
} else {
    System.out.println("Не високосный");
}

Вывод
Високосный

Здесь длинная проверка разбита на маленькие вопросы: делится ли год на 4, на 100, на 400. После этого строка if (isLeapYear) читается заметно легче.

Такой приём особенно полезен, когда длинное условие хочется сделать понятнее или использовать несколько раз.

Имена вроде isLeapYear и hasError обычно читаются лучше, чем нейтральные leapYear или error.

Ниже задачи, где основной навык — выбрать одно из действий через if, else if или последовательные проверки.

Задачи для тренировки: условный оператор if

1. Что выведет программа?

int x = -8;

if (x < 0) {
    x = -x;
}

System.out.println(x);

Ответ

8

Условие x < 0 истинно, поэтому внутри if число меняется с -8 на 8. Если бы условие было ложным, x остался бы без изменений.


2. Какую конструкцию лучше выбрать, если из двух чисел a и b нужно напечатать ровно одно: большее из них?

Ответ

if ... else.

Здесь из двух действий нужно выбрать ровно одно. Два независимых if только усложнили бы запись.


3. Что выведет программа?

int score = 95;

if (score >= 50) {
    System.out.println("3");
} else if (score >= 70) {
    System.out.println("4");
} else if (score >= 90) {
    System.out.println("5");
} else {
    System.out.println("2");
}

Ответ

3

Первая же проверка score >= 50 истинна, поэтому до следующих веток программа не дойдёт. В else if порядок условий критичен: более строгие проверки ставят выше.


4. Можно ли обратиться к переменной temp после закрывающей }?

int a = 9;
int b = 4;

if (a > b) {
    int temp = a;
    a = b;
    b = temp;
}

System.out.println(temp);

Ответ

Нельзя.

temp существует только внутри блока if. После закрывающей } переменная уже вне области видимости, поэтому такой код не скомпилируется.


5. Что лучше использовать: цепочку if ... else if или несколько независимых if, если для числа 12 программа должна напечатать и "Положительное", и "Чётное"?

Ответ

Несколько независимых if.

Число 12 одновременно положительное и чётное, значит должны сработать обе проверки. Цепочка else if выбрала бы только одну ветку.


6. Запишите один if, который печатает "Отрицательное нечётное" только для таких значений x.

Ответ

if ((x < 0) && ((x % 2) != 0)) {
    System.out.println("Отрицательное нечётное");
}

Здесь нужен один конкретный случай, поэтому условие удобно сразу собрать через &&. Вложенный if здесь только сделал бы код длиннее.

Яндекс Контест: «02. Условный оператор if» (if / ветвления: задачи F-R)

Блок собран из пакета yandex-contests/packages/02-if-basic.

Контест: https://new.contest.yandex.ru/contests/92506/

F. Максимум из двух чисел

Даны два целых числа a и b. Выведите большее из них.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите одно целое число — максимум из двух данных чисел.

Примеры
Ввод
18
42
Вывод
42
Ввод
7
7
Вывод
7


G. Минимум из двух чисел

Даны два целых числа a и b. Выведите меньшее из них.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите одно целое число — минимум из двух данных чисел.

Примеры
Ввод
81
19
Вывод
19
Ввод
12
12
Вывод
12


H. Знак числа

Дано целое число x. Определите его знак.

Входные данные

В единственной строке записано целое число x.

Выходные данные

Выведите число 1, если x > 0, число -1, если x < 0, и число 0, если x = 0.

Примеры
Ввод
-57
Вывод
-1
Ввод
0
Вывод
0
Ввод
64
Вывод
1


I. Четное число ли?

Дано целое число n. Определите, является ли оно четным.

Входные данные

В единственной строке записано целое число n.

Выходные данные

Если число четное, выведите слово YES, иначе выведите слово NO.

В этой задаче нужно вывести именно YES или NO, а не true или false.

Примеры
Ввод
58
Вывод
YES
Ввод
73
Вывод
NO


J. Два числа по возрастанию

Даны два целых числа a и b. Выведите их в порядке неубывания.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите два числа через пробел в порядке неубывания.

Примеры
Ввод
42
17
Вывод
17 42
Ввод
5
5
Вывод
5 5


K. Максимум из трех

Даны три целых числа a, b и c. Найдите наибольшее из них.

Входные данные

В трех строках записаны целые числа a, b и c.

Выходные данные

Выведите одно целое число — максимум из трех данных чисел.

Примеры
Ввод
4
9
7
Вывод
9
Ввод
6
6
2
Вывод
6


L. Минимум 4 чисел

Даны четыре целых числа a, b, c и d. Найдите наименьшее из них.

Входные данные

В единственной строке записаны четыре целых числа a, b, c и d.

Выходные данные

Выведите одно целое число — минимум из четырех данных чисел.

Примеры
Ввод
4 5 6 7
Вывод
4
Ввод
8 3 3 10
Вывод
3


M. Треугольник

Даны длины трех отрезков a, b и c. Определите, можно ли из них составить треугольник.

Треугольник существует тогда и только тогда, когда выполняются все три неравенства: a + b > c, a + c > b, b + c > a.

Входные данные

В единственной строке записаны три натуральных числа a, b и c — длины отрезков.

Выходные данные

Если из данных отрезков можно составить треугольник, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
7 8 13
Вывод
YES
Ввод
3 4 9
Вывод
NO


N. Координатные четверти

Даны координаты двух точек. Все координаты отличны от нуля. Определите, лежат ли эти точки в одной координатной четверти. Координатные четверти показаны на рисунке.

Координатные четверти

Входные данные

В четырех строках записаны целые числа x1, y1, x2 и y2.
Дополнительно гарантируется, что все координаты отличны от нуля.

Выходные данные

Если точки лежат в одной координатной четверти, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
3
5
7
1
Вывод
YES
Ввод
-4
2
6
7
Вывод
NO


O. Високосный год

Дано целое число y — номер года. Определите, является ли этот год високосным.

Год является високосным, если он делится на 400 или делится на 4, но не делится на 100.

Входные данные

В единственной строке записано целое число y — номер года.

Выходные данные

Если год високосный, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
2000
Вывод
YES
Ввод
1900
Вывод
NO
Ввод
2004
Вывод
YES
Ввод
2100
Вывод
NO


P. Сортировка трех

Даны три целых числа a, b и c. Выведите их в порядке неубывания.

Входные данные

В трех строках записаны целые числа a, b и c.

Выходные данные

Выведите три числа через пробел в порядке неубывания.

Примеры
Ввод
3 1 2
Вывод
1
2
3
Ввод
3 1 3
Вывод
1
3
3


Q. One, Two, Three и Other

Дано целое число n. Выведите:

One, если n = 1;
Two, если n = 2;
Three, если n = 3;
Other во всех остальных случаях.

Входные данные

В единственной строке записано целое число n.

Выходные данные

Выведите одно слово: One, Two, Three или Other.

Примеры
Ввод
1
Вывод
One
Ввод
3
Вывод
Three
Ввод
0
Вывод
Other
Ввод
-5
Вывод
Other


R. Склонение слова korova

По данному числу n выведите одну из строк: <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korov, <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korova или <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korovy.

Слова korov, korova и korovy нужно выводить именно на латинице.

Входные данные

В единственной строке записано целое число n. Гарантируется, что 0 ≤ n < 100.

Выходные данные

Выведите число n и подходящее слово korov, korova или korovy через один пробел.

Примеры
Ввод
1
Вывод
1 korova
Ввод
2
Вывод
2 korovy
Ввод
5
Вывод
5 korov
Ввод
11
Вывод
11 korov
Ввод
14
Вывод
14 korov

Логические выражения и тип bool

В C++ тип bool используют для логических значений.

Тип bool имеет только два литерала:

true
false

Во всех примерах ниже, где логическое значение выводится напрямую, используем boolalpha, чтобы cout печатал true и false, а не 1 и 0.

Логическое значение чаще всего получается в результате сравнения двух выражений.

Оператор Смысл true false
== равно 2 == 2 2 == 3
!= не равно 3 != 2 2 != 2
< меньше 2 < 13 13 < 2
<= меньше или равно 2 <= 2 3 <= 2
> больше 13 > 2 2 > 13
>= больше или равно 2 >= 2 2 >= 3

Операторы равенства и сравнения в C++

Простые логические выражения часто выглядят так:

Вопрос Выражение Комментарий
Чётное ли число? (x % 2) == 0 остаток при делении на 2 должен быть равен нулю
Делитель равен нулю? denominator == 0 проверка перед делением
Количество минут делится на 60? (minutes % 60) == 0 используем остаток от деления

Логические операции

Если одного сравнения недостаточно, условия можно объединять с помощью логических операций !, && и ||.

Таблица истинности показывает, какое значение принимает логическое выражение при разных значениях true и false.

Выражение Значение
!false true
!true false

Таблица истинности для НЕ

Выражение Значение
false && false false
false && true false
true && false false
true && true true

Таблица истинности для И

Выражение Значение
false || false false
false || true true
true || false true
true || true true

Таблица истинности для ИЛИ

Составные условия часто выглядят так:

Вопрос Выражение Комментарий
Хотя бы одно из двух чисел положительное? (a > 0) || (b > 0) достаточно, чтобы хотя бы одно условие выполнялось
Месяц корректный? (month >= 1) && (month <= 12) оба условия должны быть истинны
Месяц некорректный? !((month >= 1) && (month <= 12)) отрицание готового условия

Приоритет операций

В выражениях сначала выполняются действия в скобках. Потом идут арифметические операции, затем сравнение. Среди логических операций сначала выполняется !, потом &&, потом ||.

Если рядом стоят операции одного уровня, они выполняются слева направо.

Выражение То же самое Значение Комментарий
2 + 3 * 4 == 20 (2 + (3 * 4)) == 20 false сначала *, потом +, потом ==
(2 + 3) * 4 == 20 (5 * 4) == 20 true скобки меняют порядок действий
7 % 2 == 1 && 5 > 3 ((7 % 2) == 1) && (5 > 3) true сравнения выполняются раньше &&
!(7 % 2 == 0) !((7 % 2) == 0) true сначала вычисляется выражение в скобках
true || false && false true || (false && false) true && выполняется раньше ||

Приоритет операций в выражениях

Даже если скобки не обязательны, их часто ставят, чтобы выражение было легче читать: (month >= 1) && (month <= 12).

Сравнение строк

В C++ строки типа string сравнивают по тексту через == и !=.

string first = "кот";
string second = "кот";

cout << boolalpha << (first == second) << endl;

Вывод
true

Здесь boolalpha нужен только для вывода. Само сравнение по тексту делает оператор ==.

Ещё пример:

string first = "ко";
string second = "т";
string word = first + second;

cout << boolalpha << (word == "кот") << endl;

Вывод
true

В C++ для string оператор == сравнивает именно текст, поэтому здесь результат true.

Переменные bool

Результат логического выражения можно сохранить в переменную типа bool.

Имена таких переменных обычно начинаются с is, has, can и читаются как ответ на вопрос «да или нет»: isSummerMonth, isCorrectMonth, hasError.

int month = 7;

bool isSummerMonth = (month == 6) || (month == 7) || (month == 8);

cout << boolalpha << isSummerMonth << endl;

Вывод
true

Здесь переменная isSummerMonth хранит ответ на вопрос: «месяц летний или нет?»

Ещё пример:

int month = 13;

bool isCorrectMonth = (month >= 1) && (month <= 12);

cout << boolalpha << isCorrectMonth << endl;

Вывод
false

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

Ниже задачи, где основной навык — собрать условие в одно логическое выражение и вывести готовый ответ.

Задачи для тренировки: логические выражения и bool

1. Запишите логическое выражение, которое истинно, если целые a и b равны.

Ответ

a == b

Это сравнение на равенство. Один знак = здесь не подойдёт: он делает присваивание.


2. Что выведет программа?

cout << boolalpha << (7 % 2 == 1 && 5 > 3) << endl;

Ответ

true

Сначала C++ считает %, потом сравнения, потом &&. Здесь обе части дают true, поэтому итог тоже true.


3. Как правильно проверить, что строки first и second равны по тексту?

Ответ

first == second

Для string в C++ оператор == как раз сравнивает текст. Это одно из отличий C++ от Java.


4. Исправьте неверную проверку корректного месяца:

1 <= month <= 12

Ответ

(month >= 1) && (month <= 12)

В C++ такая цепочка не работает как в математике. Сначала вычисляется 1 <= month, получается true или false, а потом это значение уже сравнивается с 12.


5. Запишите объявление bool-переменной с понятным именем, которая хранит ответ на вопрос: «Число x лежит на отрезке [left, right]». Гарантируется, что left <= right.

Ответ

bool isOnSegment = (x >= left) && (x <= right);

Имя должно читаться как ответ на вопрос «да или нет». Поэтому isOnSegment лучше нейтральных вариантов вроде segment или value.


6. Осенние каникулы идут с 3 по 10 ноября включительно. Запишите выражение, которое истинно для даты day, month, если день попадает на каникулы.

Ответ

(month == 11) && (day >= 3) && (day <= 10)

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

Яндекс Контест: «02. Условный оператор if» (boolean / логические выражения: задачи A-E)

Блок собран из пакета yandex-contests/packages/02-if-basic.

Контест: https://new.contest.yandex.ru/contests/92506/

Для C++ в задачах на вывод true и false удобно один раз включить cout << boolalpha;, а потом печатать само логическое выражение.

A. Равны ли числа?

Даны два целых числа a и b. Определите, равны ли они.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите true, если a = b, и false в противном случае.

Примеры
Ввод
37
37
Вывод
true
Ввод
48
52
Вывод
false


B. Равны ли строки?

Даны две непустые строки без пробелов. Определите, равны ли они.

Входные данные

В первой строке записана строка s, во второй — строка t. Обе строки непустые, не содержат пробелов, длина каждой не превосходит 100 символов.

Выходные данные

Выведите true, если строки совпадают, и false в противном случае.

Примеры
Ввод
apple
apple
Вывод
true
Ввод
cat
dog
Вывод
false


C. Проверка a > b

Даны два целых числа a и b. Определите значение выражения a > b.

Входные данные

В единственной строке записаны два целых числа a и b.

Выходные данные

Выведите true, если a > b, и false в противном случае.

Примеры
Ввод
7 3
Вывод
true
Ввод
2 9
Вывод
false


D. Принадлежность отрезку

Даны три целых числа a, b и c. Гарантируется, что b ≤ c. Определите, лежит ли число a на отрезке [b, c].

Число лежит на отрезке тогда и только тогда, когда выполняется неравенство b ≤ a ≤ c.

Входные данные

В единственной строке записаны три целых числа a, b и c.
Дополнительно гарантируется, что b ≤ c.

Выходные данные

Выведите true, если a лежит на отрезке [b, c], и false в противном случае.

Примеры
Ввод
13 10 20
Вывод
true
Ввод
24 10 20
Вывод
false


E. Каникулы

Осенние каникулы длятся с 3 по 10 ноября включительно. По заданной дате определите, попадает ли этот день на каникулы.

Входные данные

В единственной строке записаны два целых числа: день и месяц.
Гарантируется, что 1 ≤ день ≤ 31 и 1 ≤ месяц ≤ 12.

Выходные данные

Выведите true, если заданная дата попадает на каникулы, и false в противном случае.

Примеры
Ввод
3 11
Вывод
true
Ввод
10 11
Вывод
true
Ввод
2 11
Вывод
false
Ввод
11 11
Вывод
false


Условный оператор if

В if (...) обычно пишут выражение типа bool. C++ также умеет неявно приводить к bool числа и другие значения, но в задачах лучше писать явные сравнения.

Если условие истинно, инструкции внутри { ... } выполняются. Если условие ложно, этот блок просто пропускается.

int x = -8;

if (x < 0) {
    x = -x;
}

cout << x << endl;

Вывод
8

Здесь строка x = -x; выполняется только для отрицательных значений x.

После if можно написать не одну инструкцию, а целый блок кода. Это удобно, когда при истинном условии нужно выполнить несколько действий подряд.

int a = 9;
int b = 4;

if (a > b) {
    int temp = a;
    a = b;
    b = temp;
}

cout << a << endl;
cout << b << endl;

Вывод
4
9

Здесь внутри блока после if стоят несколько инструкций: объявление переменной temp и три присваивания. Переменная temp создана внутри блока, поэтому после закрывающей } к ней обращаться уже нельзя.

Два варианта: if ... else

Если из двух действий нужно выбрать ровно одно, используют if ... else.

int x = 7;

if ((x % 2) == 0) {
    cout << "Чётное" << endl;
} else {
    cout << "Нечётное" << endl;
}

Вывод
Нечётное

В такой конструкции всегда выполняется ровно один блок: либо после if, либо после else.

Несколько вариантов: цепочка else if

Если вариантов больше двух, проверки удобно строить сверху вниз через else if.

int score = 73;

if (score >= 90) {
    cout << "5" << endl;
} else if (score >= 70) {
    cout << "4" << endl;
} else if (score >= 50) {
    cout << "3" << endl;
} else {
    cout << "2" << endl;
}

Вывод
4

Проверки идут сверху вниз. Для 73 первое условие ложно, второе истинно, поэтому программа печатает 4 и дальше уже не идёт.

Независимые if и вложенные условия

Не все проверки нужно связывать в одну цепочку.

Последовательность из нескольких независимых if подходит, когда несколько действий могут выполниться подряд. В отличие от цепочки else if, здесь могут сработать сразу несколько блоков.

Например, число 12 одновременно положительное, чётное и делится на 3, поэтому могут сработать все три проверки:

int x = 12;

if (x > 0) {
    cout << "Положительное" << endl;
}

if ((x % 2) == 0) {
    cout << "Чётное" << endl;
}

if ((x % 3) == 0) {
    cout << "Делится на 3" << endl;
}

Вывод
Положительное
Чётное
Делится на 3

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

Вложенный if нужен, когда вторая проверка имеет смысл только внутри первой. Если условие можно короче и понятнее записать одной формулой, лучше собрать его через && и ||.

Например, сначала можно разделить числа на неотрицательные и отрицательные, а потом внутри каждой ветки отдельно проверить чётность:

int x = -7;

if (x >= 0) {
    if ((x % 2) == 0) {
        cout << "Неотрицательное чётное" << endl;
    } else {
        cout << "Неотрицательное нечётное" << endl;
    }
} else {
    if ((x % 2) == 0) {
        cout << "Отрицательное чётное" << endl;
    } else {
        cout << "Отрицательное нечётное" << endl;
    }
}

Вывод
Отрицательное нечётное

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

Если же нужен только один конкретный случай, условие можно собрать одной формулой:

int x = -7;

if ((x < 0) && ((x % 2) != 0)) {
    cout << "Отрицательное нечётное" << endl;
}

Вывод
Отрицательное нечётное

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

Упрощение сложных конструкций if через переменную bool

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

Для bool-переменных обычно выбирают имена, которые читаются как ответ на вопрос «да или нет». Частые начала: is, has, can.

Например: isLeapYear, hasError, canVote.

int year = 2024;

bool isDivisibleBy4 = (year % 4) == 0;
bool isDivisibleBy100 = (year % 100) == 0;
bool isDivisibleBy400 = (year % 400) == 0;

bool isLeapYear = (isDivisibleBy4 && !isDivisibleBy100) || isDivisibleBy400;

if (isLeapYear) {
    cout << "Високосный" << endl;
} else {
    cout << "Не високосный" << endl;
}

Вывод
Високосный

Здесь длинная проверка разбита на маленькие вопросы: делится ли год на 4, на 100, на 400. После этого строка if (isLeapYear) читается заметно легче.

Такой приём особенно полезен, когда длинное условие хочется сделать понятнее или использовать несколько раз.

Имена вроде isLeapYear и hasError обычно читаются лучше, чем нейтральные leapYear или error.

Ниже задачи, где основной навык — выбрать одно из действий через if, else if или последовательные проверки.

Задачи для тренировки: условный оператор if

1. Что выведет программа?

int x = -8;

if (x < 0) {
    x = -x;
}

cout << x << endl;

Ответ

8

Условие x < 0 истинно, поэтому внутри if число меняется с -8 на 8. Если бы условие было ложным, x остался бы без изменений.


2. Какую конструкцию лучше выбрать, если из двух чисел a и b нужно напечатать ровно одно: большее из них?

Ответ

if ... else.

Здесь из двух действий нужно выбрать ровно одно. Два независимых if только усложнили бы запись.


3. Что выведет программа?

int score = 95;

if (score >= 50) {
    cout << "3" << endl;
} else if (score >= 70) {
    cout << "4" << endl;
} else if (score >= 90) {
    cout << "5" << endl;
} else {
    cout << "2" << endl;
}

Ответ

3

Первая же проверка score >= 50 истинна, поэтому до следующих веток программа не дойдёт. В else if порядок условий критичен: более строгие проверки ставят выше.


4. Можно ли обратиться к переменной temp после закрывающей }?

int a = 9;
int b = 4;

if (a > b) {
    int temp = a;
    a = b;
    b = temp;
}

cout << temp << endl;

Ответ

Нельзя.

temp существует только внутри блока if. После закрывающей } переменная уже вне области видимости, поэтому такой код не скомпилируется.


5. Что лучше использовать: цепочку if ... else if или несколько независимых if, если для числа 12 программа должна напечатать и "Положительное", и "Чётное"?

Ответ

Несколько независимых if.

Число 12 одновременно положительное и чётное, значит должны сработать обе проверки. Цепочка else if выбрала бы только одну ветку.


6. Запишите один if, который печатает "Отрицательное нечётное" только для таких значений x.

Ответ

if ((x < 0) && ((x % 2) != 0)) {
    cout << "Отрицательное нечётное" << endl;
}

Здесь нужен один конкретный случай, поэтому условие удобно сразу собрать через &&. Вложенный if здесь только сделал бы код длиннее.

Яндекс Контест: «02. Условный оператор if» (if / ветвления: задачи F-R)

Блок собран из пакета yandex-contests/packages/02-if-basic.

Контест: https://new.contest.yandex.ru/contests/92506/

F. Максимум из двух чисел

Даны два целых числа a и b. Выведите большее из них.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите одно целое число — максимум из двух данных чисел.

Примеры
Ввод
18
42
Вывод
42
Ввод
7
7
Вывод
7


G. Минимум из двух чисел

Даны два целых числа a и b. Выведите меньшее из них.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите одно целое число — минимум из двух данных чисел.

Примеры
Ввод
81
19
Вывод
19
Ввод
12
12
Вывод
12


H. Знак числа

Дано целое число x. Определите его знак.

Входные данные

В единственной строке записано целое число x.

Выходные данные

Выведите число 1, если x > 0, число -1, если x < 0, и число 0, если x = 0.

Примеры
Ввод
-57
Вывод
-1
Ввод
0
Вывод
0
Ввод
64
Вывод
1


I. Четное число ли?

Дано целое число n. Определите, является ли оно четным.

Входные данные

В единственной строке записано целое число n.

Выходные данные

Если число четное, выведите слово YES, иначе выведите слово NO.

В этой задаче нужно вывести именно YES или NO, а не true или false.

Примеры
Ввод
58
Вывод
YES
Ввод
73
Вывод
NO


J. Два числа по возрастанию

Даны два целых числа a и b. Выведите их в порядке неубывания.

Входные данные

В первой строке записано целое число a, во второй — целое число b.

Выходные данные

Выведите два числа через пробел в порядке неубывания.

Примеры
Ввод
42
17
Вывод
17 42
Ввод
5
5
Вывод
5 5


K. Максимум из трех

Даны три целых числа a, b и c. Найдите наибольшее из них.

Входные данные

В трех строках записаны целые числа a, b и c.

Выходные данные

Выведите одно целое число — максимум из трех данных чисел.

Примеры
Ввод
4
9
7
Вывод
9
Ввод
6
6
2
Вывод
6


L. Минимум 4 чисел

Даны четыре целых числа a, b, c и d. Найдите наименьшее из них.

Входные данные

В единственной строке записаны четыре целых числа a, b, c и d.

Выходные данные

Выведите одно целое число — минимум из четырех данных чисел.

Примеры
Ввод
4 5 6 7
Вывод
4
Ввод
8 3 3 10
Вывод
3


M. Треугольник

Даны длины трех отрезков a, b и c. Определите, можно ли из них составить треугольник.

Треугольник существует тогда и только тогда, когда выполняются все три неравенства: a + b > c, a + c > b, b + c > a.

Входные данные

В единственной строке записаны три натуральных числа a, b и c — длины отрезков.

Выходные данные

Если из данных отрезков можно составить треугольник, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
7 8 13
Вывод
YES
Ввод
3 4 9
Вывод
NO


N. Координатные четверти

Даны координаты двух точек. Все координаты отличны от нуля. Определите, лежат ли эти точки в одной координатной четверти. Координатные четверти показаны на рисунке.

Координатные четверти

Входные данные

В четырех строках записаны целые числа x1, y1, x2 и y2.
Дополнительно гарантируется, что все координаты отличны от нуля.

Выходные данные

Если точки лежат в одной координатной четверти, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
3
5
7
1
Вывод
YES
Ввод
-4
2
6
7
Вывод
NO


O. Високосный год

Дано целое число y — номер года. Определите, является ли этот год високосным.

Год является високосным, если он делится на 400 или делится на 4, но не делится на 100.

Входные данные

В единственной строке записано целое число y — номер года.

Выходные данные

Если год високосный, выведите слово YES, иначе выведите слово NO.

Примеры
Ввод
2000
Вывод
YES
Ввод
1900
Вывод
NO
Ввод
2004
Вывод
YES
Ввод
2100
Вывод
NO


P. Сортировка трех

Даны три целых числа a, b и c. Выведите их в порядке неубывания.

Входные данные

В трех строках записаны целые числа a, b и c.

Выходные данные

Выведите три числа через пробел в порядке неубывания.

Примеры
Ввод
3 1 2
Вывод
1
2
3
Ввод
3 1 3
Вывод
1
3
3


Q. One, Two, Three и Other

Дано целое число n. Выведите:

One, если n = 1;
Two, если n = 2;
Three, если n = 3;
Other во всех остальных случаях.

Входные данные

В единственной строке записано целое число n.

Выходные данные

Выведите одно слово: One, Two, Three или Other.

Примеры
Ввод
1
Вывод
One
Ввод
3
Вывод
Three
Ввод
0
Вывод
Other
Ввод
-5
Вывод
Other


R. Склонение слова korova

По данному числу n выведите одну из строк: <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korov, <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korova или <span style="font-family:Cambria Math,STIX Two Math,Times New Roman,serif;font-style:italic;white-space:nowrap;font-size:1.18em;">n</span> korovy.

Слова korov, korova и korovy нужно выводить именно на латинице.

Входные данные

В единственной строке записано целое число n. Гарантируется, что 0 ≤ n < 100.

Выходные данные

Выведите число n и подходящее слово korov, korova или korovy через один пробел.

Примеры
Ввод
1
Вывод
1 korova
Ввод
2
Вывод
2 korovy
Ввод
5
Вывод
5 korov
Ввод
11
Вывод
11 korov
Ввод
14
Вывод
14 korov

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

Условия обычно пишут как сравнение (x > 0, a == b) или как логическое выражение с and, or, not.

Основное

if условие: – выполнить блок, если условие истинно.

if ...: ... else: ... – выбрать один из двух вариантов.

if ...: ... elif ...: ... else: ... – выбрать один из нескольких вариантов.

В Python важно, что блоки кода задаются отступами.

Пример: знак числа

x = int(input())

if x > 0:
    print("Положительное")
elif x < 0:
    print("Отрицательное")
else:
    print("Ноль")

Ввод
-3
Вывод
Отрицательное

Пример: чётное или нечётное

x = int(input())

if x % 2 == 0:
    print("Чётное")
else:
    print("Нечётное")

Пример: диапазон

x = int(input())

if 1 <= x <= 100:
    print("В диапазоне 1..100")
else:
    print("Вне диапазона")

Что можно писать в условии

В Java в if (...) должно быть строго boolean.

В C++ в условии можно написать и bool, и число: 0 – ложь, ненулевое – истина.

В Python можно писать True/False, сравнения, а также использовать «истинность» значений (например, 0 считается ложью). В задачах обычно удобнее писать сравнения.

Как выглядит блок кода

В Java и C++ блоки задаются фигурными скобками { ... }.

В Python блоки задаются отступами.

Ключевые слова

Java: if, else if, else.

C++: if, else if, else.

Python: if, elif, else.

Логические операции

Java и C++: &&, ||, !.

Python: and, or, not.

Частая ошибка в C++

В условии легко перепутать == (сравнение) и = (присваивание). В if нужно сравнение.