Основные операции в Java: арифметические и логические. Practical Tasks
Ниже — шесть практических заданий по основным операциям Java: арифметическим, побитовым, логическим, тернарной условной операции, инкременту/декременту и присваиванию. Задачи закрепляют материал раздела: от классической проверки чётности до «гирлянды» на битовых масках. К каждому заданию есть решение на Patreon, а к гирлянде — ещё и видеоразбор.
Проверка чётности числа
- Создать программу, которая будет сообщать, является ли целое число, введённое пользователем, чётным или нет.
- Ввод числа осуществлять с помощью класса Scanner.
- Если пользователь введёт не целое число, то сообщать ему об ошибке.
Подсказка
Чтобы сообщить об ошибке ввода, не обязательно перехватывать InputMismatchException: метод scanner.hasNextInt() заранее проверяет, что следующий токен — целое число, и только после этого можно безопасно вызывать nextInt().
Меньшее по модулю число
- Создать программу, которая будет выводить на экран меньшее по модулю из трёх введённых пользователем вещественных чисел.
- Для вычисления модуля используйте тернарную условную операцию.
- Для ввода чисел используйте класс Scanner.
Гирлянда, часть 1
Имеется гирлянда, состоящая из 32 лампочек. Каждая лампочка имеет два состояния — включена или выключена, поэтому всю гирлянду удобно хранить в одной переменной типа int: в нём ровно 32 бита. В начале работы программы случайным образом задайте, какие лампочки будут включены. Управляйте гирляндой с помощью побитовых операций. Напишите следующие методы:
- метод
blink, который будет мигать лампочками гирлянды один раз (операция~); - метод
run, который будет запускать гирлянду в режим бегущего огня (операция<<или>>); - метод
isFirstLampOn, который будет выяснять, включена ли лампочка в первой позиции (наложение маски с помощью&); - метод, который будет распечатывать текущее состояние гирлянды. Для получения двоичного формата числа используйте метод
Integer.toBinaryString(a).
Неочевидный момент
Если включена старшая (32-я) лампочка, значение int отрицательно, и сдвиг >> «размножит» её: слева будут появляться всё новые единицы. Для бегущего огня в эту сторону используйте беззнаковый сдвиг >>>.
Смотрите решение задачи в видео.
Среднее значение чисел
Вычислить среднее значение трёх вещественных чисел, передаваемых на вход программы в качестве аргументов. Для преобразования из String в double используйте метод Double.parseDouble(String s).
Обратный отсчёт с накоплением
- Создать программу, которая запрашивает у пользователя число
N— количество чисел для ввода. - Организовать обратный отсчёт с помощью декремента (
n--): на каждом шаге считывать одно вещественное число через Scanner и добавлять его к накопленной сумме с помощью составного оператора присваивания (sum += x). - После каждого шага выводить сообщение вида
"Осталось шагов: " + n + ", сумма пока: " + sum.
Нюанс
В условии цикла while (n-- > 0) используется постфиксный декремент: сначала n сравнивается с 0 в текущем значении, и только потом уменьшается. Из-за этого тело цикла выполнится и для n = 0 на входе — если это не нужно, используйте префиксный --n или отдельную проверку перед циклом.
Допуск на скидку
- Создать программу, которая запрашивает возраст покупателя и сумму покупки.
- Скидка положена, если (возраст ≥ 65 или возраст ≤ 12) и сумма покупки ≥ 1000 — записать условие через логические операторы
&&,||и скобки. - Вывести итоговое сообщение конкатенацией строк:
"Возраст: " + age + ", сумма: " + amount + ", скидка: " + (eligible ? "да" : "нет").
Неочевидный момент
Если убрать скобки вокруг возраст ≥ 65 || возраст ≤ 12, результат может измениться: у && более высокий приоритет, чем у ||, поэтому выражение без скобок разберётся как (возраст ≥ 65) || (возраст ≤ 12 && сумма ≥ 1000) — совсем другая логика.
При написании программ обращайте внимание на рекомендации по оформлению кода.
Проверь свой код
При написании программ обращайте внимание на рекомендации по оформлению кода.
Часто задаваемые вопросы
Как проверить, чётное ли число в Java?
Классический способ — остаток от деления: n % 2 == 0. Нюанс с нечётными: условие n % 2 == 1 не сработает для отрицательных чисел (для -3 остаток равен -1), поэтому нечётность проверяют как n % 2 != 0. Побитовый вариант (n & 1) == 0 работает для любых знаков.
Как найти модуль числа без Math.abs()?
Тернарной операцией: x < 0 ? -x : x. Для вещественных чисел этого достаточно. Для int есть неочевидный момент: у Integer.MIN_VALUE модуль не помещается в int, поэтому -x вернёт то же отрицательное число.
Почему для гирлянды из 32 лампочек подходит тип int?
int в Java занимает ровно 32 бита, поэтому каждая лампочка — это один бит числа: 1 — включена, 0 — выключена. Инверсия ~ мигает всеми лампочками, сдвиги двигают огонь, а маска с & читает состояние конкретной лампочки. Для 64 лампочек взяли бы long.
Почему Scanner не принимает число с точкой?
Метод nextDouble() разбирает число по локали системы: в русской локали разделитель дробной части — запятая, поэтому ввод 3.14 вызовет InputMismatchException. Чтобы принимать точку, настройте сканер: scanner.useLocale(Locale.US).
Чем отличается n-- от --n?
Постфиксный n-- возвращает текущее значение n и только потом уменьшает переменную; префиксный --n сначала уменьшает, а возвращает уже новое значение. В условии while (n-- > 0) это значит, что тело цикла выполнится и для n = 0 — сравнение происходит со старым значением.
Что будет, если убрать скобки в условии с && и ||?
Результат может измениться: у && более высокий приоритет, чем у ||, поэтому Java сама группирует операнды вокруг && в первую очередь. Например, a || b && c означает a || (b && c), а не (a || b) && c — если нужен второй вариант, скобки обязательны.
Comments