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

Обновлено: 05.07.2024

При решении задач часто приходится рассматривать не два, а большее количество вариантов. Это можно реализовать, используя несколько условных операторов. В этом случае после служебных слов Then и Else записывается новый условный оператор.

Итак, когда оператор if появляется внутри другого оператора if, они считаются вложенными. Такое вложение используется для уменьшения числа необходимых проверок. Этот метод часто обеспечивает большую эффективность, однако одновременно он уменьшает наглядность программы. Не рекомендуется использовать более одного-двух уровней вложения if. За вторым уровнем вложения становится трудно восстановить последовательность проверки условий каждым условным оператором.

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

Построение сложных условий

Для построения сложных условий в условных операторах применяются логические операции, объединяющие выражения отношения.

Сформулируем правила для построения сложных условий:

  1. Сложное условие строится с учетом приоритетов логических операций и скобок.
  2. Операции отношения в языке Паскаль имеют низший приоритет, поэтому в сложном условии они берутся в скобки.
  3. Если в сложном условии используются операции равного приоритета, то они выполняются последовательно слева направо.

Задача. на вход программе поступает натуральное число. Необходимо выяснить является ли оно двухзначным.

Решение. Очевидно, один из возможных способов решения задачи может быть оформлен путем проверки двух условий, выполняющихся одновременно: х >= 10 и x = 10) and (x then и после else может располагаться только один оператор. Разумеется, этим оператором может быть условный оператор, причем он может располагаться в любой из ветвей исходного оператора. При этом уровень таких вложений неограничен.

Задача. На вход программе поступают три целых числа. Выведите наибольшее из них (программа должна вывести ровно одно число).

Решение. Для решения используем вложенные условные операторы.

  • readln (a, b, c);
  • if a > b then
  • begin
  • if a > c then writeln (a)
  • else writeln (c)
  • end
  • else if b > c then writeln (b)
  • else writeln (c);

ВНИМАНИЕ: использование краткой формы условного оператора при построении вложенных условных конструкций требует от программиста быть максимально осторожным, поскольку порождает синтаксическую неоднозначность.

Рассмотрим следующую, конструкцию:

  • if выражение1 then
  • if выражение1 then
  • оператор1
  • else
  • оператор2

Такая запись может быть истолкована двояко с точки зрения принадлежности части else оператор2 первому или второму оператору if . Эта двусмысленность разрешается следующим правилом языка Паскаль: else всегда соответствует первому предшествующему ему оператору if , для которого ветка else еще не указана .

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

Вложенный условный оператор позволяет нам сделать программу более гибкой. Мы можем навесить дополнительные действия с частично правильными условиями, но в то же время нам придется писать больше кода, что не так и хорошо. Однако опустить эту тему, было бы совсем неправильно.

Структура вложенного условного оператора

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

Почему мы называем вложенный условный оператор? Потому что мы взяли условный оператор и положили в него еще один. Поэтому и говорят. Вложенный условный оператор. Это как матрешка. Взяли матрешку и положили в нее еще одну. Взяли еще одну матрешку и положили еще глубже. И так далее.

Какая вложенность может быть?

Сколько угодно. Ходит такая легенда, что какие-то студенты, умудрились вложить 256 операторов. Но так делать не стоит. В промышленном программировании есть стандарт. Не более трех условных операторов. И если вы написали 3 и испытываете необходимость сделать четвертую вложенность. Остановитесь. Что-то вы делаете неправильно.

Сравнение двух путей

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

Посмотрите на изображение сверху и снизу. И подумайте, будут ли они тождественными (равными)? В принципе будут. С точки зрения реализации, они не совсем одинаковы. Но с точки зрения работы программы, они будут работать одинаково.

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

Давайте проверим так ли это. Посмотрите на изображение 1. Если a больше b и условие выполнилось, мы заходим внутрь нашей программы и проверяем следующее условие. Если c меньше d и условие выполнилось, мы заходим внутрь и выполняем тот набор действий, который нам необходим.

Давайте теперь проверим изображение 2. Если a больше b и c меньше d, только при выполнении обоих этих условиях, мы заходим внутрь этого условия и выполняем тот же самый набор действий.

У каждой формы записи есть свои плюсы и минусы.

Вложенный if

Плюсы:
Вложенный if позволяет проявлять определенную гибкость. Мы не проверяем сразу все условия. Мы проверили первое условие, если оно выполнилось, тогда мы переходим к проверке второго условия. А если не выполнилось, мы второе тогда даже проверять не будем.

Минусы:
Посмотрите на первое изображение и посмотрите на второе изображение. Первая запись кажется немного громоздкой. Не сразу можно понять, что происходит в первой записи. При этом кода нам придется писать больше.

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

Плюсы:
Код читается наглядно и он более краток.

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

Решение задач

Подробный разбор задачи

Вам дан номер текущего часа h. Требуется вывести

С клавиатуры вводится целое число h (8 if (t

Вполне можем, так как знаем, что первое значение, которое нам могут задать – это 6. И любая цифра от 6 до 11 будет означать утро. А в противном случае…

И вот в else, мы можем задать другие условия, которые ставятся перед нами.

Значит в else мы можем вписать два других наших условия. И выглядеть будет примерно так:

if (t = 11;
cout = 18;
cout

Високосный год

Дан номер года. Требуется определить количество дней в этом году, учитывая, что обычный год насчитывает 365 дней, а високосный –— 366 дней. Високосным считается год, делящийся на 4, но не делящийся на 100, либо делящиеся на 400 (например, годы 700, 1400 и 1800 не являются високосными, а 1600 и 2000 –— являются).

Формат входных данных
Вводится неотрицательное целое число y (0 31 −1) — номер года.

Формат выходных данных
Выведите количество дней в данном году.
Примеры
входные данные
3
16
выходные данные
365
366

vedro-compota

Условный оператор IF служит для программирования ситуаций выбора (моделирования различных вариантов развития ситуации, с которым мы сталкиваемся в жизни, но теперь уже внутри программы).

Структура условного оператора. Блочность

Условный оператор в общем виде состоит из трёх частей:

  1. Проверкалогического значения
  2. Ветка истинности (обязательна) -- выполнится если логическое значение истинно (true)
  3. Ветка ложности (необязательна) -- выполнится если логическое значение ложно (false)

Сразу отметим, что логическое значение -- это фактически ответ на вопрос формата "да/нет" , напомним, что логическим типом значением обладают:

  1. логические литералы
  2. логические переменные
  3. и логические выражения

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

В программном коде структуру условного оператора можно проиллюстрировать следующей схемой:

-- в данном случае выполнится "ложная" ветка, так как $5 > 7$ возвращает результат false.

Точка с запятой перед else

Заметьте (см. примеры выше и ниже), что перед else точка с запятой не ставится.

Операторные скобки условного оператора

В предыдущем примере обратите внимание на операторные скобки, окружающие тела веток оператора ветвления -- begin и end необходимы, если в ветке выполняется более одной операции, если же в ветке содержится только одна операция, то операторные скобки не нужны.

Паскаль ветвление условный оператор без begin end операторных скобок

Например для ситуации, изображённой на этой блок-схеме:

Эту же ситуацию можно проиллюстрировать кодом:

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

Полная и неполная формы оператора IF

Оператор IF в программе может быть представлен в следующих формах:

  1. Полная форма -- форма оператора if, в которой присутствуют обе ветки -- и then и else
  2. Неполная форма -- форма в которой присутствует только then.

Полная форма условного оператора IF

В полной форме оператора IF присутствуют обе ветки -- именно полную форму мы рассматривали выше, например:

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

Полная форма оператора IF Паскаль

В последнем примере кода, у нас в ветке истинности одна операция, а в ветки ложности 2 -- эту ситуацию можно изобразить на блок-схеме так (с каким-то предварительным действием до if):

Неполная форма условного оператора IF

В неполной форме условного оператора есть только сценарий истинности, ветка ложности же вообще не описывается, например:

-- в ветке ложности здесь вообще ничего нет, то есть если $a$ не больше $5$, то и никаких действий предпринято не будет.

Неполная форма условного оператора ветвления

На блок-схеме неполная форма оператора ветвления выглядит так:

-- правило использования операторных скобок действует и здесь: в данном же случае у нас только одна операция в ветке then, а потому begin и end не нужны.

Разбор задач

Пример №1 -- неполная форма IF

Сравните два числа, если первое больше второго, то выведите на экран "22" и затем отдельным вызовом writeln() число 555.

-- в этой задаче указано, что надо предпринимать какие-то действия только в одном случае ("если первое больше второго"), а значит будет использовать оператор ветвления в неполной форме:

-- в ветке истинности здесь было две операции, а потому мы использовали для неё операторные скобки.

Пример №2 -- полная форма, по одному действию в каждой ветке

Сравните два числа, если первое больше второго, то выведите на экран "22", а иначе выведете на экран 'abc'.

-- в этой задаче указаны два альтернативных действия, а потому будем использовать оператор ветвления в его полной форме:

-- обратите внимание, что перед else точка с запятой не ставится.

Пример №3 - логические выражения и оператор ветвления IF

  1. сумма баллов Коли и Миши больше $20$
  2. и сумма баллов Пети и Миши меньше $55$

В этой в качестве условия требуется выполнение сразу двух подусловий, причем не одного из них -- а двух одновременно, потому в логическом выражении для if мы будем использовать логическую операцию AND, тогда можно решить как-то так:

Пример №4 - вложенные условные операторы

вложенные условные операторы IF ветвление Паскаль пример блоксхемы

Операторы могут вкладываться один в другой так, как как это показано на блок-схеме (на деле внутренний оператор вкладывается в одну из веток внешнего):

Рассмотрим задачу, решение которой будет соответствовать этой блок-схеме:

  1. сначала сравните их сумму с числом $25$, если она больше, то выведите на экран первое число, а если меньше, то только второе.
  2. затем выведите на экран второе число в квадрате

Реализуем решение в виде программы:

Пример №5 - вложенные условные операторы

Например задачу из более раннего примера:

  1. сумма баллов Коли и Миши больше $20$
  2. и сумма баллов Пети и Миши меньше $55$

можно было бы решить с помощью вложенных блоков условного оператора IF:

-- обратите внимание, что begin и end не нужны для ветки истинности внешнего оператора, так как в него вложен лишь один if -- а остальные строки относятся к этому вложенному if.

ВАЖНО: В этом приме здесь налицо дублирование кода, что является плохим стилем. Более того вложенные блоки в коде труднее понимать, поэтому:

Пример №6 - жизненный выбор

паскаль условный оператор IF ветвление ситуация выбора

То есть ситуацию, в которую попал богатырь на этой иллюстрации:

Можно запрограммировать следующим образом:

- по сути это тоже несколько вложенных один в другой операторов ветвления, причем вложение здесь на всех двух младших уровнях происходит в ветку ложности.

Пример №7 Вложение оператора if в неполной форме в оператор if в полной форме

При решении задач или при просмотре/анализе кода написанного не вами может возникнуть проблема понимания того, к какому именно then относится данный else, обычно такая проблема возникает в случае, если количество else не равно количеству then (если эти количества равны, то понять что во что вложено не трудно).

Рассмотрим пример (фрагмент кода), в котором есть подвох:

-- данный код отформатирован неверно, ведь он как бы показывает что else относится к первому then, в то время как Паскаль будет считать (всегда), что else относится к ближайшему then (не "отделённому" от этого else операторными скобками), итак, повторим эту идею ещё раз, назовём её правило "прикрепления" else:

В случае если число else не равно числу then (а это может быть только при вложенных блоках), else всегда "прикрепляется" (относится) к ближайшему "не изолированному" от него операторными скобками then.

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

-- но это значит, что уже неверна логика решения, из за того что на деле при подобной записи else относится к ближайшему then (мы показали это правильным форматированием и комментариями).

Теперь ближайшим не изолированным операторными скобками от else словом then оказывается первое (то, где "if (a > b)"), а не второе (т.е. не то, где "if (a > c)") -- что мы и хотели изначально запрограммировать ;)

Пример №8 -- Интерактивный сценарий текстовой консольной игры

Пример сравнения строк для условного оператора:

Видео-пояснения

Для этого урока есть следующие видео:

Самостоятельная работа

Вопросы

  1. Для чего нужен оператор ветвления (условный оператор)?
  2. Какие ветви условного оператора вы знаете?
  3. Чем полная форма условного оператора отличается от неполной?
  4. Когда нужны операторные скобки в ветвях оператора IF, а когда нет?

Задачи

ПРИМЕЧАНИЕ: эта следующая задача базируются на том, что мы уже решали (см. задачи в конце урока).

Примечание: если не просто или для лучшего понимания решения, см. этот видео-разбор.

Решите тремя способами:

  1. С использованием логической операции and. (Если не получается - см. разбор решения)
  2. С вложенными блоками (без and, все опараторы if должны быть в полной форме).
    (Если не получается - см. разбор решения)
  3. Без вложенных блоков (без and) -- запомнив максимум из первых двух чисел в специальной переменной.
    (Если не получается - см. разбор решения)

Указание: Сначала посрайтесь написать все три решения самостоятельно (по 20 минут размышления на каждую задачу хотя бы), если не получается (или после решения) также можно посмотреть это видео-пояснение.

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

  1. сумма баллов Коли и Миши больше $20$
  2. или произведение баллов Пети и Миши меньше $55$

Перепишите программу оптимальным образом.

Подсказка: если самостоятельно разобраться не получается, смотрите этот видео-разбор.

-- в двух условных операторах действия частично совпадают, а значит наблюдается дублирование кода. Перепишите код так, чтобы дублирования не было.

Подсказка: используйте вложенные блоки if() .
Если идей нет, смотрите разбор решения.

-- блоки условий можно переписать более кратко, без использования сравнения = true или = false , с сохранением той же логики работы программы.

  • оператор if итак неявно сравнивает значение логического выражения в скобках с true (и принимает решение, какую именно ветку then или else выполнить)
  • для второго if в коде выше потребуется исползование оператора Not.

Примечание: это условие давалось как простая разминочная задачка для собеседования в Яндекс.

Читайте также: