Управляющие операторы
Задачи на использование уловного оператора if, оператора ветвления switch, а также циклов for и while и связанных с ними операторов. Данные темы являются базовыми в любом языке программирования, соответственно задачи довольно просты и предназначены в основном для начинающих.
Задача 1
Формула разности квадратов такова:
a2−b2=(a−b)(a+b)
Напишите программу, которая проверяет эту формулу и выводит в консоль фразу "формула верна", если рассчёты покажут, что она действительно верна (достаточно одной комбинации a и b). Или выведет фразу "формула неверна" в противном случае.
Проверка одного случая может выглядеть так:
int a = 15, b = 17;
boolean isFormulaCorrect = (a * a - b * b) == (a - b) * (a + b);
if (isFormulaCorrect) {
System.out.println("формула верна");
} else {
System.out.println("формула неверна");
}
В инструкции boolean isFormulaCorrect = (a * a - b * b) == (a - b) * (a + b); разность квадратов взята в скобки для наглядности.
Задача 2
Дана целочисленная переменная int monthNumber, инициализированная числом от 1 до 12. Напишите код, который выводит название соответствующего месяца.
До 12 версии Java, задача решается с помощью такого синтаксиса оператора switch:
int monthNumber = 10;
String monthName = null;
switch (monthNumber) {
case 1: monthName = "Январь";
break;
case 2: monthName = "Февраль";
break;
case 3: monthName = "Март";
break;
case 4: monthName = "Апрель";
break;
case 5: monthName = "Май";
break;
case 6: monthName = "Июнь";
break;
case 7: monthName = "Июль";
break;
case 8: monthName = "Август";
break;
case 9: monthName = "Сентябрь";
break;
case 10: monthName = "Октябрь";
break;
case 11: monthName = "Ноябрь";
break;
case 12: monthName = "Декабрь";
break;
default: monthName = "Ошибка номера месяца";
}
System.out.println(monthName);
Начиная с Java 12, switch может быть таким:
int monthNumber = 10;
String monthName = switch (monthNumber) {
case 1 -> "Январь";
case 2 -> "Февраль";
case 3 -> "Март";
case 4 -> "Апрель";
case 5 -> "Май";
case 6 -> "Июнь";
case 7 -> "Июль";
case 8 -> "Август";
case 9 -> "Сентябрь";
case 10-> "Октябрь";
case 11-> "Ноябрь";
case 12-> "Декабрь";
default-> "Ошибка номера месяца";
};
System.out.println(monthName);
Задача 3
Дана целочисленная переменная int monthNumber, инициализированная числом от 1 до 12. Напишите код, который выводит название соответствующего времени года.
До 12 версии Java, задача решается с помощью такого синтаксиса оператора switch:
int monthNumber = 6;
String season = null;
switch (monthNumber) {
case 12:
case 1:
case 2: season = "Зима";
break;
case 3:
case 4:
case 5: season = "Весна";
break;
case 6:
case 7:
case 8: season = "Лето";
break;
case 9:
case 10:
case 11: season = "Осень";
break;
default: season = "Ошибка номера месяца";
};
System.out.println(season);
Начиная с Java 12, switch может быть таким:
int monthNumber = 6;
String season =
switch (monthNumber) {
case 12, 1, 2 -> "Зима";
case 3, 4, 5 -> "Весна";
case 6, 7, 8 -> "Лето";
case 9,10,11 -> "Осень";
default -> "Ошибка номера месяца";
};
System.out.println(season);
Задача 4
Даны две целочисленные переменные: int row и int col, которые описывают количество строк и столбцов. Выведите в консоль прямоугольник из звёздочек (или других символов) таким образом, чтобы количество рядов и звёздочек в ряду соответствовало заданным переменным.
Например, при row == 3 и col == 4, вывод ложен выглядеть так:
****
****
****
Возможное решение:
int row = 3;
int col = 4;
for (int i = 0; i < row; i ++) {
for (int j = 0; j < col; j++) {
System.out.print("*");
}
System.out.println();
}
Решение простое, как и сама задача. Главное не забыть, что метод System.out.println() переносит сроку, а System.out.print("") — нет.
Задача 5
Дана целочисленная переменная int a, инициализированная либо положительным, либо отрицательным числом, либо нулём. Напишите программу, которая выведет в консоль модуль этого числа.
Простая задача на работу с условиями. Простейшее решение задачи будет таким:
int a = -1;
if (a < 0) {
System.out.println(-a);
} else {
System.out.println(a);
}
Если переменная a оказывается ниже нуля, то при выводе на консоль к её значению применяется унарный оператор минус "-", который меняет знак на противоположный, в данном случае с отрицательного на положительный.
Задача 6
Напишите метод static int max(int a, int b), который принимает в качестве аргументов два целочисленных значения и возвращает большее из них. Всё тело метода должно состоять из одной инструкции.
Сократить количество инструкций в таких случаях помогает тернарный оператор ? :
static int max (int a, int b) {
return a > b ? a : b;
}
Задача 7
Дан массив натуральных чисел. Найдите наибольшее из них.
Простейшее решение (с использованием циклов) может быть таким:
int array[] = {12, 43, 73, 22, 89, 39, 77};
int max = 0;
for (int i = 0; i < array.length; i++) {
max = array[i] > max ? array[i] : max;
}
System.out.println(max);
Создаём переменную max для хранения максимального значения и инициализируем её нулём. Затем в цикле перебираем массив. Если очередной элемент массива оказывается больше чем max, то обновляем значение переменной max значением этого элемента массива. В итоге в max будет хранится наибольшее из значений массива.
Кроме того, стоит учитывать особенность постановки задачи, а именно, что у нас массив натуральных чисел, то есть целых положительных. Если бы нам был дан массив просто целых чисел, как положительных, так и отрицательных, то инициализировать max нулём было бы неправильно. Тогда для инициализации подошёл бы минимально возможный в Java int:
int max = Integer.MIN_VALUE;
Задача 8
Дан массив натуральных чисел. Найдите наибольшую из возможных сумм двух чисел, входящих в массив.
Задача не только на практику циклов и условий, но и немного на смекалку.
Чтобы вычислить наибольшую из возможных сумм двух элементов массива, совершенно необязательно получать суммы всех возможных комбинаций пар элементов. Достаточно просто найти два самых больших элемента массива и сложить их. Сумма наибольших слагаемых будет наибольшей суммой среди всех возможных комбинаций.
Таким образом, решение задачи может выглядеть так:
int array[] = {12, 43, 73, 22, 89, 39, 77};
int max = 0;
int snd = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
} else if (array[i] > snd) {
snd = array[i];
}
}
System.out.println(max + snd);
Создаём две переменные max и snd для хранения максимального и второго по величине элемента массива. С учётом того, что в массиве хранятся только натуральные числа (целые, положительные) инициализируем переменные нулём.
Затем перебираем в цикле элементы массива. Если очередной элемент оказывается больше максимального, то записываем его величину в max. Если нет, то проверяем не превышает ли он второй по величине элемент. Если превышает, то записываем его в snd.
Таким образом, мы получим два самых больших элемента массива и их сумма будет максимально возможной суммой среди всех комбинаций пар элементов.
Задача 9
Напишите метод boolean isLeapYear(int year), который возвращает true, если переданное в качестве аргумента число соответствует номеру високосного года, и false, если год не високосный.
Год является високосным, если без остатка делится на 4, но будучи кратным 100, также должен быть кратным 400.
Например, 1996 — високосный год, он просто кратен 4 и не кратен 100. 2000 — тоже високосный, он кратен и 100 (и 4, конечно) и 400. Но 1900 — не високосный, он хоть и кратен 100, но не кратен 400.
Придумайте два варианта решения:
Условия проверяются одно за другим с помощью вложенных if'ов. Это решение задачи в лоб.
Условия сгруппированы в одном выражении. Всё тело метода состоит из одной инструкции.
Простейшим решением в лоб, с лесенкой условий может быть такое:
public static boolean isLeapYear(int year) {
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0) {
return true;
} else {
return false;
}
}
return true;
} else {
return false;
}
}
Все условия можно объединить в одном выражении, например, следующим образом:
public static boolean isLeapYear(int year) {
return (year % 4 == 0) && !(year % 100 == 0 && year % 400 != 0);
}
Логика следующая: верно, что (год кратен 4) И не верно, что (год кратен 100 И не кратен 400).
Задача 10
Напишите метод boolean isInRange(int min, int max, int value), который возвращает true, если параметр value оказывается в диапазоне между min (включительно) и max (не включительно) и false в противном случае.
Тело метода должно состоять из одной инструкции.
Это простая задача на использование оператора логическое И (&&):
public static boolean isInRange(int min, int max, int value) {
return value >= min && value < max;
}