Управляющие операторы

Задачи на использование уловного оператора 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.

Придумайте два варианта решения:

  1. Условия проверяются одно за другим с помощью вложенных if'ов. Это решение задачи в лоб.

  2. Условия сгруппированы в одном выражении. Всё тело метода состоит из одной инструкции.

Простейшим решением в лоб, с лесенкой условий может быть такое:

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;

}