Skip to main content

12. Оператор if

Теория

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

Более сложные программы использую команды перехода. Команды перехода говорят процессору, где находится следующая команда, которую следует выполнить.

Различают условные и безусловные переходы. Команда условного перехода сначала проверяет истинность некоторого условия и выполняет переход, только если условие выполнено. А команда безусловного перехода просто заставляет процессор продолжить выполнение команд по заданного адреса без всяких проверок.

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

Спор о GOTO

Безусловный переход осуществляется с помощью команды goto. Он позволяет осуществить любое ветвление алгоритма, однако код с использованием условного перехода зачастую трудночитаем, хотя и позволяет писать более эффективные решения.

Философия java говорит о том, что нужно писать надёжные, легко поддерживаемые (такие продукты легко дорабатывать стороннему разработчику), и стабильные программы.

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

Подробнее о споре "использовать goto или нет?" можно прочитать здесь.

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

if (условие){
делать_если_да
}else{
делать_если_нет
}

Эта конструкция работает следующим образом. В скобках можно указать логическое выражение любой сложности или просто переменную типа boolean. Если условие или переменная равна true, то выполняется всё, что находится внутри первого структурного блока if (условие){....}else{, если false, то второго }else{...}. В каждом из структурных блоков может быть неограниченное число команд.

Попробуем решить задачу: на вход подаётся целое число aa. Требуется вывести 2a2a, если оно меньше, чем 5 и число a/2a/2 в остальных случаях.

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("НОЛЬ");
}
}

Эта программа читает с клавиатуры целое число и выводит словесное описание его остатка от деления на 33.

обратите внимание

Каждый блок условий может не ограничен по командам. Абсолютно нормально строить конструкции такого вида:

...
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. Даны три переменные вещественного типа: A, B, CA,~B,~C. Если их значения упорядочены по возрастанию, то удвоить их; в противном случае заменить значение каждой переменной на противоположное. Вывести новые значения переменных A, B, CA,~B,~C.
  2. Даны три переменные вещественного типа: A, B, CA,~B,~C. Если их значения упорядочены по возрастанию или убыванию, то утроить их; в противном случае значение каждой переменной уменьшить в два раза. Вывести новые значения переменных A, B, CA,~B,~C.
  3. С клавиатуры вводятся координаты точки (x, y)(x,~y) на плоскости. Известно, что точка не лежит ни на одной координатной оси. Вывести на экран номер четверти, в которой находится точка.
  4. Введите с клавиатуры целое число. Выведите на экран, к какой категории оно относится:
    • ЦИФРА, если это однозначное неотрицательное число;
    • ЧИСЛО, если это двузначное число положительное число;
    • ДРУГОЕ, если оно не относится к первым двум категориям.
  5. Ввести с клавиатуры четырехзначное положительное число. Вывести на экран меньшую из всех его цифр. Если таких цифр окажется несколько, вывести одну из них и сообщение, что таких цифр несколько (>1, если в числе несколько наименьших цифр).
  6. Работа светофора для пешеходов запрограммирована следующим образом: в начале каждого часа в течение трех минут горит зеленый сигнал, затем в течение двух минут - красный, в течение трех минут - опять зеленый и т. д. Дано вещественное число t, означающее время в минутах, прошедшее с начала очередного часа. Определить, сигнал какого цвета горит для пешеходов в этот момент. В качестве ответа выведите цвет по-русски заглавными буквами.
  7. Ввести с клавиатуры три четырехзначных положительных числа. Вывести число с наибольшим средним арифметическим цифр

Ссылка на контест