Вложенные условные операторы

Когда требуется последовательно перепроверять несколько взаимоисключающих условий, для частей else не открывают отдельного блока (записывают следующий if как простую, а не как составную инструкцию), чтобы получить более компактную запись. Такие конструкции в коде называют else…if.

Рассмотрим сначала вариант записи со вложенными блоками. Для примера рассмотрим следующую задачу.

Мужчина заполняет в военкомате анкету и программа должна в зависимости от указанного им возраста выводить разные подсказки, а именно:

  1. Если указан возраст от 18 и до 27 лет, то сообщать, что заполняющий подлежит призыву на срочную службу или может служить по контракту.
  2. Если указан возраст от 28 до 59 лет, то сообщать, что заполняющий может служить по контракту.
  3. Если указан возраст менее 18 или более 59 лет, то сообщать о том, что заполняющий находится в непризывном возрасте.
  4. Если указан неположительный возраст или возраст более 100 лет, то сообщить об ошибке.

Предположим, что возраст сохранён в переменной n, тогда для вывода подсказки потребуется следующий код:

Обратите внимание на то, что как только одно из условий окажется истинным — все последующие проверки не будут выполняться (т.е. в лучшем случае выполниться только первая проверка). Соответственно, сообщение об ошибке будет выведено тогда и только тогда, когда все проверяемые условия дадут ложный результат.

Более того, для сообщения о непризывном возрасте условие подобрано с учётом того, что заполняющий анкету уже не подошёл ни к одному из вариантов призывного возраста. Конечно, можно было бы использовать вот такое условие:

Но оно было бы избыточным, ведь ранее (за счёт выше стоящих проверок) мы уже убедились, что переменная n не попала в промежуток [18;60). Если бы переменная попадала в промежуток, то вывелось бы сообщение «Вы можете пройти срочную или контрактную службу» или «Вы можете служить только по контракту».

Но для случая, когда проверяется последовательность условий можно (но не необходимо) использовать более компактную запись, где содержание каждого else кроме последнего не оформляется в виде отдельного блока. Тот же фрагмент кода с учётом этой возможности может записываться так:

Оператор множественного выбора

Инструкция множественного выбора switch позволяет выполнять различные части программы в зависимости от того, какое значение будет иметь некоторая целочисленная переменной (её называют «переменной-переключателем», а «switch» с английского переводится как раз как «переключатель»).

Схема инструкции такова:

Рассмотрим все элементы оператора:

  • переключатель — это целочисленная переменная или выражение дающее целочисленный результат;
  • значение1, значение2, … — это целочисленные литералы, с которыми будет сравниваться значение переключателя. Если переключатель равен значениюN, то программа будет выполняться со строки, следующей за case значениеN: и до ближайшего встреченного break, либо до конца блока switch (если break не встретится);
  • default: — это метка инструкции после которой будут выполняться в том случае, если выше ни одно из значенийN не совпало с переключателем. Метка default — необязательная: можно её не включать в блок switch меток или не выполнять после неё никаких команд;
  • инструкцияN — простая или составная инструкция. Притом в случае составной несколько команд не обязательно объединять в блок, можно их просто написать друг за другом разделяя с помощью «;» (и начиная новые строки для удобства).

Рассмотрим такую ситуацию: в какой-то момент требуется просить у пользователя, надо ли продолжать программу или можно её завершить. Предположим, что ответ пользователя принимается в виде символа, вводимого с клавиатуры и сохраняемого в переменной ans: Д — да, продолжать, Н — нет, остановить.

Тогда получаем примерно такой программный код:

Если мы захотим как-то оповестить пользователя о том, что он ввёл неподходящий символ, то пригодится метка default:

После инструкций причастных к этой метке break обычно не ставят, потому что default располагается в конце всего блока switch и после неё всё равно завершится оператор множественного выбора. Но в остальных ветках — break необходим. Рассмотрим пример, в котором по ошибке пропущен первый break в ситуации, когда в переменной-переключателе будет находится символ «Д»:

На экран будут выведены сразу две фразы: «Продолжаем программу» и «Останавливаем программу». Это случилось потому, что после первой ветки с литералом «Д» программа выполнялась до первого встреченного break, т.е. выполнилась и часть, относящаяся к ветке с литералом «Н».

Такое поведение программы можно использовать во благо. Например, можно разместить несколько подряд идущих меток с разными литералами, для которых будет выполняться один и тот же код:

Теперь пользователь для продолжения программы сможет ввести не только символ «Д», но и символы «д», «Y», «y» (от английского «yes»).

Любой оператор switch можно заменить конструкцией if…else:

Обратное — неверно, ведь switch позволяет только сравнивать переключатель с конкретными значениями, но не позволяет для какой-то из веток задать условие в виде целого диапазона значений с использованием операторов сравнения (например, с использованием строгих неравенств и логических операторов «и» или «или»). Также напомним, что в качестве переключателя могут выступать только целочисленные переменные или выражения.

if…else более универсальный оператор, чем switch.

Задачи

  1. Создать программу, которая будет проверять попало ли случайно выбранное из отрезка [5;155] целое число в интервал (25;100) и сообщать результат на экран.Примеры работы программы:



  2. Создать программу, выводящую на экран случайно сгенерированное трёхзначное натуральное число и его наибольшую цифру.Примеры работы программы:


  3. В три переменные a, b и c явно записаны программистом три целых попарно неравных между собой числа. Создать программу, которая переставит числа в переменных таким образом, чтобы при выводе на экран последовательность a, b и c оказалась строго возрастающей.


< Предыдущая       Оглавление       Следующая >

Конструкции выбора в языке Java: if…else, switch обновлено: Ноябрь 24, 2015 автором: admin

  1. switch(ans) {
    case ‘Д’:
    case ‘д’:
    case ‘Y’:
    case ‘y’:
    System.out.println(«Продолжаем программу»);
    break;
    //…

  2. package pervueshagi;

    public class If_else {
    public static void main(String[] args) {
    int random = (int) (Math.random() * 155) + 5;
    for (int i = 25; i <=100; i ++) {
    if (random != i) {
    System.out.println("Заданное число " + random + " не содержится в интервале (25,100)");
    }
    else if (random == i) {
    System.out.println("Заданное число " + random + " содержится в интервале (25,100)");
    break;
    }
    }
    }
    }

  3. public class Main {
    public static void main(String[] args) {
    int random = (int) (Math.random() * 150) + 5;
    int i;
    for (i = 25; i <= 100; i++) {
    if (random == i) {
    System.out.println("Заданное число " + random + " содержится в интервале (25,100)");
    break;

    }

    }
    if (random != i) {
    System.out.println("Заданное число " + random + " не содержится в интервале (25,100)");
    }
    }
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*
Website