12. Оператор if
Теория
Самые простые программы представляют собой последовательность действий, каждое из которых последовательно хранится в удобной для процессора форме в оперативной памяти.
Более сложные программы использую команды перехода. Команды перехода говорят процессору, где находится следующая команда, которую следует выполнить.
Различают условные и безусловные переходы. Команда условного перехода сначала проверяет истинность некоторого условия и выполняет переход, только если условие выполнено. А команда безусловного перехода просто заставляет процессор продолжить выполнение команд по заданного адреса без всяких проверок.
Процессоры обычно поддерживают также переходы с запоминанием точки возврата, которые используют для вызова подпрограмм.
Безусловный переход осуществляется с помощью команды goto
. Он позволяет осуществить
любое ветвление алгоритма, однако код с использованием условного перехода
зачастую трудночитаем, хотя и позволяет писать более эффективные решения.
Философия java
говорит о том, что нужно писать надёжные, легко поддерживаемые (такие продукты
легко дорабатывать стороннему разработчику), и стабильные программы.
Поэтому в язык java
эта конструкция не включена в явном виде, её урезанной
формой можно считать прерывание с меткой. Об этом будет рассказано в
главе про циклы for.
Подробнее о споре "использовать goto или нет?" можно прочитать здесь.
Условный переход - это низкий уровень программирования, в высокоуровневых языках
безусловный переход заменяется конструкцией if...else
:
if (условие){
делать_если_да
}else{
делать_если_нет
}
Эта конструкция работает следующим образом.
В скобках можно указать логическое выражение любой сложности или просто
переменную типа boolean
. Если условие или переменная равна true
,
то выполняется всё, что находится внутри первого структурного блока if (условие){....}else{
,
если false
, то второго }else{...}
. В каждом из структурных блоков может быть
неограниченное число команд.
Попробуем решить задачу: на вход подаётся целое число . Требуется вывести , если оно меньше, чем 5 и число в остальных случаях.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
if (a < 5){
a = a * 2;
}else{
a = a / 2;
}
System.out.println(a);
}
}
Если команда всего одна, то можно использовать укороченную форму:
if (a < 5)
a = a * 2;
else
a = a / 2;
Если нужно выполнить несколько команд, то использование скобок становится обязательным**
Такой код выдаст ошибку:
if (a < 5)
a = a * 2;
System.out.println("БОЛЬШЕ");
else
a = a / 2;
Если добавить скобки, то всё заработает:
if (a < 5){
a = a * 2;
System.out.println("БОЛЬШЕ");
}else
a = a / 2;
К else
это тоже относится:
if (a < 5){
a = a * 2;
System.out.println("БОЛЬШЕ");
}else{
a = a / 2;
System.out.println("МЕНЬШЕ ИЛИ РАВНО");
}
Здесь я добавил второе действие в блок команд, срабатывающий при невыполнении условий, поэтому нужно было добавить фигурные скобки и ему тоже.
Бывают случаи, когда нам нужно что-то сделать только если условие выполнено, а если не выполнено, то ничего не делать.
if (условие){
делать_если_да
}
Например, если задача состоит в том, что нужно только умножить число на два, если оно меньше пяти, то программа будет такой:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
if (a < 5){
a = a * 2;
}
System.out.println(a);
}
}
Хотя мы не используем здесь else
, мы всё равно можем
заменить ветвление программы укороченной формой:
if (a < 5)
a = a * 2;
Можно писать цепочки условий:
import java.util.Scanner;
public class Task5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
if (Math.abs(a) % 3 == 1) {
System.out.println("ОДИН");
} else if (Math.abs(a) % 3 == 2) {
System.out.println("ДВА");
} else {
System.out.println("НОЛЬ");
}
}
}
Если в каждом блоке по одной команде, то можно использовать укороченную форму:
import java.util.Scanner;
public class Task5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
if (Math.abs(a) % 3 == 1)
System.out.println("ОДИН");
else if (Math.abs(a) % 3 == 2)
System.out.println("ДВА");
else
System.out.println("НОЛЬ");
}
}
Эта программа читает с клавиатуры целое число и выводит словесное описание его остатка от деления на .
Каждый блок условий может не ограничен по командам. Абсолютно нормально строить конструкции такого вида:
...
if (a%2 == 0){
b = b + 3;
a = a / 2;
if (a > b){
int c = a;
a = b;
b = c;
}else{
System.out.println("B МЕНЬШЕ A");
a = b;
}
}else
System.out.println("НЕЧЁТНОЕ");
...
Задание
- Даны три переменные вещественного типа: . Если их значения упорядочены по возрастанию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. Вывести новые значения переменных .
- Даны три переменные вещественного типа: . Если их значения упорядочены по возрастанию или убыванию, то утроить их; в противном случае значение каждой переменной уменьшить в два раза. Вывести новые значения переменных .
- С клавиатуры вводятся координаты точки на плоскости. Известно, что точка не лежит ни на одной координатной оси. Вывести на экран номер четверти, в которой находится точка.
- Введите с клавиатуры целое число. Выведите на экран, к какой категории оно относится:
ЦИФРА
, если это однозначное неотрицательное число;ЧИСЛО
, если это двузначное число положительное число;ДРУГОЕ
, если оно не относится к первым двум категориям.
- Ввести с клавиатуры четырехзначное положительное число.
Вывести на экран меньшую из всех его цифр.
Если таких цифр окажется несколько, вывести одну из них и сообщение, что таких цифр несколько
(
>1
, если в числе несколько наименьших цифр). - Работа светофора для пешеходов запрограммирована следующим образом: в начале каждого часа в
течение трех минут горит зеленый сигнал, затем в течение двух минут - красный, в течение
трех минут - опять зеленый и т. д. Дано вещественное число
t
, означающее время в минутах, прошедшее с начала очередного часа. Определить, сигнал какого цвета горит для пешеходов в этот момент. В качестве ответа выведите цвет по-русски заглавными буквами. - Ввести с клавиатуры три четырехзначных положительных числа. Вывести число с наибольшим средним арифметическим цифр