Выбор направления исполнения программы может определяться несколькими условиями. В таких случаях можно использовать вложенные условные операторы или построение сложных условий с помощью логических операций.
Построение сложных условий
Для построения сложных условий в условных операторах применяются логические операции, объединяющие выражения отношения.
Сформулируем правила для построения сложных условий:
- Сложное условие строится с учетом приоритетов логических операций и скобок.
- Операции отношения в языке Паскаль имеют низший приоритет, поэтому в сложном условии они берутся в скобки.
- Если в сложном условии используются операции равного приоритета, то они выполняются последовательно слева направо.
Задача. на вход программе поступает натуральное число. Необходимо выяснить является ли оно двухзначным.
Решение. Очевидно, один из возможных способов решения задачи может быть оформлен путем проверки двух условий, выполняющихся одновременно: х >= 10 и x = 10) and (x then и после else может располагаться только один оператор. Разумеется, этим оператором может быть условный оператор, причем он может располагаться в любой из ветвей исходного оператора. При этом уровень таких вложений неограничен.
If else. Конструкция логического выбора if. Лесенка if — else if. Примеры использования. Урок #12.
Задача. На вход программе поступают три целых числа. Выведите наибольшее из них (программа должна вывести ровно одно число).
Решение. Для решения используем вложенные условные операторы.
- 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 еще не указана .
Источник: informatics-lesson.ru
Вложенные условные операторы в Паскаль
Выбор направления исполнения программы может определяться несколькими условиями. В таких случаях можно использовать вложенные условные операторы или построение сложных условий с помощью логических операций.
Построение сложных условий
Для построения сложных условий в условных операторах применяются логические операции, объединяющие выражения отношения.
16 Вложенный оператор if Python
Сформулируем правила для построения сложных условий:
1. Сложное условие строится с учетом приоритетов логических операций и скобок.
2. Операции отношения в языке Паскаль имеют низший приоритет, поэтому в сложном условии они берутся в скобки.
3. Если в сложном условии используются операции равного приоритета, то они выполняются последовательно слева направо.
Задача. на вход программе поступает натуральное число. Необходимо выяснить является ли оно двухзначным.
Решение. Очевидно, один из возможных способов решения задачи может быть оформлен путем проверки двух условий, выполняющихся одновременно: х >= 10 и x < 100.
· read(x);
· writeln (‘Число двухзначное’)
· else
· writeln (‘Число не двухзначное’);
Использование вложенных условных операторов
Вспомним, что в условном операторе языка Паскаль после then и после else может располагаться только один оператор. Разумеется, этим оператором может быть условный оператор, причем он может располагаться в любой из ветвей исходного оператора. При этом уровень таких вложений неограничен.
Задача. На вход программе поступают три целых числа. Выведите наибольшее из них (программа должна вывести ровно одно число).
Решение. Для решения используем вложенные условные операторы.
· readln (a, b, c);
· if a > b then
· begin
· if a > c then writeln (a)
· elsewriteln (c)
· end
· else if b > c then writeln (b)
· elsewriteln (c);
ВНИМАНИЕ: использование краткой формы условного оператора при построении вложенных условных конструкций требует от программиста быть максимально осторожным, поскольку порождает синтаксическую неоднозначность.
Рассмотрим следующую, конструкцию:
· ifвыражение1then
· ifвыражение1then
· else
Такая запись может быть истолкована двояко с точки зрения принадлежности части elseоператор2 первому или второму оператору if. Эта двусмысленность разрешается следующим правилом языка Паскаль:else всегда соответствует первому предшествующему ему оператору if, для которого ветка else еще не указана.
Циклы: Виды циклов. Циклы с предусловием. Циклы с постусловием.
Что такое циклы и с чем их едят?
Использование циклов — известный прием, позволяющий программисту выполнить миллиарды процессорных инструкций буквально в несколько строчек кода. Вместе с кажущейся простотой, циклы часто становятся камнями преткновения и взаимонедопонимания между компилятором и программистом.
И даже хрен с ними, с синтаксическими ошибками, это не страшно (компилятор носом тыкнет в них), самое страшное ошибки логические. Ведь скомпилив программу, затестив ее на скорую руку, программист объявляет цикл рабочим, и идет строчить программу дальше. Возможно, что в большинстве случаев, цикл сработает как надо, без вопросов. Но остается вероятность того, что условие (или условия) необходимые для прекращения цикла никогда не произойдет. Что будет в этом случае?
В этом случае будет беда. Программа впадет в бесконечный цикл. И это не так уж и страшно. В самом деле — бесконечный цикл очень легко обнаружить (программа подвисает, время отклика возрастает и т.д.). Хуже если в программе что-то «перемкнуло», и выполнение цикла пошло в совершенно другую степь.
При этом программа вполне нормально (с виду) работает, выполняет операции, и неизвестно, когда и в каком месте всплывет ошибка программиста, и когда ее обнаружит пользователь программного продукта.
Это все было сказанно к тому, что следует очень внимательно относится к более-менее сложным циклам, и тщательно, очень тшательно тестировать каждый из них!
Виды циклов
В основном циклы классифицируются по типу условия. Циклы бывают с предусловием и постусловием. Также весьма часто встречается цикл с параметром, в котором переменная целочисленного типа используется вместо счетчика. Рассмотрим подробнее.
Цикл с постусловием:
Пост — значит прошедшее время. То есть цикл сначала выполняется, а потом сверяется с условием выхода из него — продолжать цикл, или уже можно выходить. Структура цикла такова:
В цикле repeatuntil код идущий после слова repeatбудет выполняется до тех пор, пока условие не станет истинным значением. Пример — составить цикл, который будет увеличивать значение целочисленной переменной до тех пор, пока она не достигнет определенного значения. Код:
procedureRepeatUntilP;
var x:integer;
begin
x:=0; //Обнуляем переменную
//Пошел цикл
repeat
inc(x);
until x=50;
end;
Этот цикл завершится ровно тогда, когда в переменной x окажется число 50. inc (increment) увеличивает значение на одну еденицу. Пример бесконечного цикла:
procedureRepeatUntilP;
var x:integer;
begin
x:=0; //Обнуляем переменную
//Пошел цикл
repeat
inc(x);
until x=-50;
end;
Конечно, мы ведь увеличиваем значение переменной, а не уменьшаем! Она никогда не примет значение -50, а стало быть условие для выхода из цикла никогда не произойдет. Еще один пример:
procedureRepeatUntilP;
var x:integer;
begin
randomize;
x:=0; //Обнуляем переменную
//Пошел цикл
repeat
x:=random(50);
until x=30;
end;
Пока сгенерированное псевдослучайное число не примет значение 50, цикл не завершится. Условием может быть любой набор операторов, который позволяет проверить истинность ложность значения. Например перед нами стоит задача сгенерировать строку состоящую из цифр определенной длинны. Для этих целей вполне подойдет цикл такого вида:
procedureRepeatUntilP;
var x:string;
begin
randomize;
x:=»; //Обнуляем переменную
//Пошел цикл
repeat
x:=x+random(IntToStr(random(999)));
untilLength(x)=100;
end;
Этот цикл будет выполнятся до тех пор, пока длинна строки не составит 100 символов.
Цикл с параметром
Последняя задача на генерацию строки определенной длинны нелохо выполнилась циклом с постусловием, это точно, но все таки в данном случае (когда заранее известно сколько раз нужно выполнить операцию), нам больше подойдет цикл с параметром. Он имеет такой вид:
For i:=0 to X do
.. действие
Первый параметр указывает — какое значение задать переменной в начале цикла. При каждом выполнении цикла, значение переменной — счетчика увеличивается. Второй параметр как указывает на то, когда следует завершить выполнение цикла. Например для решения предыдущей задачи вполне подойдет такой цикл:
procedureRepeatUntilP;
var i:integer;
x:string;
begin
randomize;
For i:=0 to 100 do
x:=x+random(50);
end;
Коротко и изящно. Следует отметить, что если вторым параметром идет отрицательное число, вместо оператора to следует указывать downto. Если в цикле идет несколько строчек кода, то просто необходимо взять их в операторные скобки begin. end. Так:
for i:=0 to 5 do
begin
.
несколько операций
.
end;
Цикл с предусловием.
От первого цикла он отличается лишь тем, что проверка условия происходит непосредственно перед выполнением цикла. Имеет такой вид:
while |условие| do
операция
while |условие| do
begin
.
несколько операций
.
end;
Следует учесть: в данном цикле условие служит не для выхода из цикла, а для его продолжения.
Циклы можно (и нужно) комбинировать и осуществлять вхождение одного цикла в другой. Они все вместе весьма хорошо уживаются, если все грамотно сделать. Например у нас есть такая задача:
Представим, что нам нужно срочно составить лист паролей, а под рукой нет необходимых инструментов. Это не беда — ведь мы владеем навыком программирования. Вот код, составляющий лист паролей дней рождения:
procedure TForm1.Button1Click(Sender:TObject);
vari,j,year:integer;
begin
year:=1930;
Whileyear begin
inc(year);
For i:=1 to 12 do
For j:=1 to 31 do
memo1.lines.add(IntToStr(year)+IntToStr(i)+IntToStr(j));
end;
end;
Как мы видим — цикл выполняется довольно долго. Из-за чего? Из-за вывода на экран! Если бы мы запоминали значение вкакой-нибудьневизуальныйTstringList тогда бы на все про все ушло несколько секунд.
Напоследок хочу предостеречь начинающих программистов от использования слишком сложных циклов, особенно, если там присутсвуют ветвления
потому как с точки зрения оптимизации и скорости выполнения программы все проверки лучше по возможности вынести за цикл. Ведь в цикле выполняются миллиарды инструкций, не хорошо, если проверка будет осуществлятся в каждом шаге цикла. Но в сущности — это мелочи.
9.1Логика работы этой конструкции описывается схемой, показанной на рисунке.

На алгоритмическом языке эта конструкция записывается так:

Обрати внимание!
В цикле-ДЛЯвсегда есть параметр цикла — величина целого типа, изменяющаяся в ходе выполнения цикла от своего начального значения i1 до конечного значения i2 с шагом R.
Выполняется цикл-ДЛЯследующим образом:
· параметру цикла присваивается начальное значение;
· параметр цикла сравнивается с конечным значением; если параметр цикла не превышает конечное значение, то выполняется тело цикла, увеличивается значение параметра цикла на шаг и снова осуществляется проверка параметра цикла; если же параметр цикла превышает конечное значение, то выполнение цикла заканчивается.
Если величина шага в цикле с параметром равна единице, то шаг не указывают. Мы ограничимся рассмотрением именно таких циклов. В отличие от двух предыдущих конструкций (цикл-ПОКА, цикл-ДО) цикл-ДЛЯ имеет строго фиксированное число повторений, что позволяет избежать зацикливания, т.е. ситуации, когда тело цикла выполняется бесконечно.
Алгоритм переправы через реку воинского отряда из пяти человек. Солдаты могут воспользоваться помощью двух мальчиков — хозяев небольшой лодки, в которой может переправиться или один солдат, или два мальчика.

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

Так, если правее Робота не встретится препятствий, то, выполнив приведённый ниже алгоритм, он переместится на пять клеток вправо и закрасит эти клетки:

Вложенные циклы
Цикл называется вложенным, если он размещается внутри другого цикла. На первом проходе, внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. И так до тех пор, пока не завершится внешний цикл. Само собой, как внешний, так и внутренний циклы могут быть прерваны командой break.
Источник: megaobuchalka.ru
1.10.6. Вложенный условный оператор
Напомним, что оператор if в полной форме называется оператором if-else и имеет следующую форму записи:
if (выражение ) оператор1; else опертор2;
В качестве выполняемого в условном операторе действия может быть другой условный оператор, т.е. допускается использование вложенных операторов if. Оператор if может быть включен в конструкцию if или в конструкцию else.
Оператор if называется вложенным, если хотя бы один из операторов оператор1, оператор2 содержит условные операторы, и используется для программирования вложенных ветвлений.
Ниже на рис. 6.11 приведен пример программирования вложенного ветвления.

Рис. 6.11. Вложенное ветвление
Пример на рис. 6.11 иллюстрирует программирование вложенного ветвления. Фигурные скобки в данном случае не обязательны, так как компилятор относит часть else к ближайшему if.

Рис. 6.12. Вложенное ветвление
В примере на рис. 6.12 на ветви «Да» внешнего ветвления имеется группа команд, которой соответствует составной оператор < y=5*x+1; z++;>. На ветви «Нет» этого ветвления имеется группа команд, содержащая другое ветвление. Этой группе команд соответствует составной оператор < cout 7 a<> 11) y=3*x; < y=4*x; z—; >>. Вложенное ветвление на ветви «Да» содержит одну команду (соответствующий оператор y=3*x;), а на ветви «Нет» – две команды, которым соответствует составной оператор < y=4*x; z—; >.
Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если же фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.
Использование вложенного условного оператора рассмотрим на примерах.
Использование вложенных условных операторов в программах с проверкой многих условий. Примером сложного выбора является оценка знаний ученика по результатам тестирования. Пусть известен результат ЕГЭ (от 0 до 100 баллов). Оценка по пятибалльной шкале должна быть выставлена по правилам:
В записи этих правил есть избыточность с точки зрения механизмов выполнения условного оператора. Ветвление, это взаимоисключающие варианты, значит, в первой ветви истинность условия ЕГЭ 40, а значит, их не нужно включать в запись условия. Так же и в записи всех последующих условий. Логика вложенных операторов условия присоединяет каждый else к ближайшему сверху if.
// Код программы примера 6.18.
int Ball; // Оценка.
printf («Введите результат ЕГЭ испытуемогоn»);
printf(«Оценка в аттестате: %dn», Ball);
printf(«Если больше нет испытуемых, нажмите ESCn»);
>while (getch() != 27);
Обратите внимание, что цикл по-прежнему управляется событием, но в этом примере вспомогательная переменная key не используется.
Пример 6.19. Вычислить значение функции

Решение. Необходимо задать значение x и проанализировать, по какой из трех формул, необходимо вычислить y . При этом придется задать один или два вопроса. Например, для x=6, зададим вопрос x>5 и x10? Ответ будет «Да», следовательно, вычислять y надо по первой формуле. Пусть x=3,14159.
На вопрос x>5 и x10? ответ будет «Нет», т.е. вычислять y надо по второй или третьей формуле. Для выяснения, по какой конкретно, необходимо задать еще один вопрос, например, 0 x 5? В этом случае ответ будет «Да». Следовательно, y должно вычисляться по второй формуле.
Рассуждая аналогично, придем к выводу, что для x=-5 необходимо задать два вопроса x>5 и x10? и 0 x 5? На каждый из вопросов будет получен ответ «Нет», следовательно, y надо вычислять по третьей формуле. Таким образом, приходим к разветвляющемуся алгоритму, изображенному на рис. 6.13. В алгоритме предусмотрен вывод исходных данных, формулы и номера формулы, по которой производится вычисление y.
Сведем в таблицу соответствия (табл. 6.5) обозначения переменных в задаче и в программе.
Таблица соответствия переменных
исходное данное – аргумент функции
результат – значение функции

Рис. 6.13. Вложенное ветвление
/* Программа задачи 6.19*/
printf(«При x=%.2f y=%.4f (формула %d:%s)n»,x,y,n,z);
Для проверки правильности разработанного алгоритма и программы достаточно подготовить семь тестов. Сделаем это с помощью рис. 6.14. На рис. 6.14 на числовой оси отмечены промежутки значений x с указанием формул для вычисления y для каждого промежутка и каждой граничной точки.
В таблице 9.7 приведены тесты.

Рисунок 6.14. Промежутки значений x
Тесты к задаче 6.19
Значение x
Значение y
Формула для вычисления y
Возможности полной формы условного оператора не ограничиваются только управлением двумя одиночными операторами S1 и S2. Как следует из определения условного оператора, операторы, стоящие в ветвях «Да» и «Нет», могут быть любыми, а значит и условными. Такая структура условного оператора if позволяет описывать разветвляющиеся вычислительные процессы с любым количеством ветвей вычислений. Следовательно, условные операторы могут быть вложены один в другой, то есть либо S1, либо S2, либо оба могут начинаться с if. Например,
Количество вложений одного условного оператора в другой в языке С++ не ограничивается (в ряде трансляторов с языка С++ число вложений не должно превышать 100).
Пример 6.20. Описать с помощью условного оператора Блок-схему алгоритма, изображенную на рис.6.14.

Рис. 6.14. Блок-схема алгоритма примера 6.20
Фрагмент программы на С++, описывающий алгоритм рис. 6.5, может иметь вид
if (a==b) f) x=e; else x=z;> else else goto FIN;
Описать с помощью условного оператора блок-схему алгоритма, изображенную на рис. 6.15.
Фрагмент программы на С++, описывающий алгоритм рис. 6.6, может иметь вид

Рис. 6.15. Блок-схема алгоритма примера 6.21
С помощью условного оператора описать поведение функции заданной графически на рис. 6.16.

Рис. 6.16. График функции у = f (х)
Прежде чей описать поведение функции с помощью условного оператора, перейдем от графической формы записи функции к ее аналитической записи
Обычно аналитическая форма записи поведения функции намного облегчает описание ее поведения средствами языка C++. При аналитической записи таких функций (аналогично приведенной) следует условия поведения функции располагать по нарастанию аргумента или же по убыванию его. Такой порядок записи условий также впоследствии облегчит описание поведения функции средствами языка C++.
Для функции, представленной на рис. 6.16, можно записать несколько вариантов условного оператора:
if (x = 1) y = 1; else y = x;
if (x >= 1) y = 1; else if (x >0) y = x; else y = 0;
В случае использования вложенных условных операторов очень часто в некоторых из них опускается ветвь else . Поэтому, чтобы не было недоразумений в конструкциях условных операторов, во вложенных условных операторах действует следующее правило: ветвь else относится к ближайшему слева if (вернее его ветви «Да»), не имеющей else. Например,
Схема выполнения этого оператора представлена на рис. 6.17.

Рис. 6.17. Схема выполнения примера вложенного условного оператора
Лучше всего избегать такого рода конструкций, а если требуется ис-пользовать вложенные операторы if, то либо везде задавать else либо везде опускать.
Пример 6.23
Написать последовательность операторов для вычисления суммы членов ряда
Фрагмент программы, реализующей указанные вычисления,может иметь вид
START: n = n + 1; t = t+x/n;
В данном примере с помощью оператора t = t+x/n; реализован итерационный принцип вычисления членов рассматриваемого ряда, то есть каждый последующий член ряда вычисляется путем умножения предыдущего члена ряда на определенный коэффициент.
Рассмотрим примеры составления программ, вычислительные процессы которых реализуются по достаточно сложным разветвляющимся схемам.
Пример 6.24.
Составить программу для перевода прямоугольных координат х, у в полярные r, (0 2) по формулам
Решение. Условимся иметь в виду, что если значение |arctan(y/x)| близко к 0,5, то есть, когда у >> х, то при вычислении на машине возможен аварийный останов. Поэтому при у > х следует arctan(y/x) вычислять через дополнительный угол arctan(x/y). Обозначим: p = arctan(y/x), q = arctan(x/y).
Блок-схема алгоритма решения задачи приведена на рис. 6.18.
Таблица идентификаторов примера 6.16
В исходном выражении
В программе на языке С++
Учитывая сделанные замечания, программу можно записать в следующеем виде:
float x, y, r, fi, pi, p, q;
if (x<0) fi = pi +p; else if (y>=0) fi = p; else fi = 2*pi + p;

Рис. 6.18. Блок-схема алгоритма примера 6.24
Классической задачей, рассматриваемой в большинстве учебников по программированию, является определение корней квадратного уравнения вида ax 2 + bx + c = 0.
Решение. Существуют различные методы решения этой задачи. В частности, можно воспользоваться привычными формулами;
которые будут лежать в основе алгоритма, так как они указывают последовательность действий при решении задачи. После подстановки в эти формулы числовых значений а, в, c производятся вычисления, и получается решение в виде двух чисел. Остается предусмотреть исключительные ситуации, в противном случае программа не будет полностью описывать вычислительный процесс, то есть не будет универсальной. Исключительными ситуациями могут быть следующие ситуации:
1) а = 0. Уравнение перестает быть квадратным. Приведенные формулы неприемлемы, и единственный корень линейного уравнения вх + с = 0 вычисляется по формуле: х = — с/в. Случай в = 0 при а = 0 требует, чтобы при этом и с = 0, то есть уравнение вообще отсутствует и задачи как таковой нет.
2) в 2 — 4ас 0. В случае равенства нулю дискриминанта уравнение имеет два совпадающих корня; если же подкоренное выражение отрицательное, то корни комплексные и вычислять квадратный корень следует из значения этого выражения с обратным знаком.
1. Анализ условия задачи. Квадратное уравнение может иметь одно или два решения, или не иметь их вообще. Результат решения зависит от определителя уравнения, вычисляемого по формуле d = b 2 – 4ac.
2. Входными данными являются коэффициенты уравнения a, b, c. Чтобы уравнение осталось квадратным, первый коэффициент должен быть отличен от нуля. Имена переменных, обозначающих коэффициенты, могут совпадать с их математической записью, то есть a, b, c. Тип коэффициентов вещественный.
3. Выходными данными программы будут значения корней уравнения, если их удастся найти по формулам
Если же корней нет, об этом следует напечатать сообщение.
4. Для вычисления и хранения значения определителя требуется ввести новую переменную, которая не является результатом задачи, но необходима для ее решения. Такие переменные называются рабочими переменными программы. Обозначим ее буквой d, как и в постановке задачи.
5. Определение необходимых формул вычисления очевидно.
6. Кодирование алгоритма. При выполнении алгоритма можно выполнить предварительное словесное описание:
1) ввести значения коэффициентов (названы a, b ,c);
2) вычислить дискриминант (назван d);
3) если дискриминант отрицательный, решения нет, вывести сообщение;
4) если дискриминант > или = 0, решение есть, вычислить значения корней и вывести на печать.
Рассмотрим использование составных операторов при решении этой задачи.
В первой ветви условного оператора нужно выполнить не одно, а три действия, поэтому используется блок , который показывает компилятору, что эти действия следует воспринимать как единое целое.
Блок-схема программы для рассматриваемой задачи может быть изображена в таком виде, как показано на рис. 6.19.

Рис. 6.19. Блок-схема алгоритма решения квадратного уравнения
Составим таблицу идентификаторов.
Таблица идентификаторов примера 6.25
Источник: studfile.net