Мегаобучалка Главная | О нас | Обратная связь


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



2018-07-06 1006 Обсуждений (0)
Вложенные условные операторы в Паскаль 0.00 из 5.00 0 оценок




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

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

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

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

1. Сложное условие строится с учетом приоритетов логических операций и скобок.

2. Операции отношения в языке Паскаль имеют низший приоритет, поэтому в сложном условии они берутся в скобки.

3. Если в сложном условии используются операции равного приоритета, то они выполняются последовательно слева направо.

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

Решение. Очевидно, один из возможных способов решения задачи может быть оформлен путем проверки двух условий, выполняющихся одновременно: х >= 10 и x < 100.

{Фрагмент кода программы}

· read(x);

· if (x >= 10) and (x < 100) then

· 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

· оператор1

· else

· оператор2

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

Циклы: Виды циклов. Циклы с предусловием. Циклы с постусловием.

Что такое циклы и с чем их едят?

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

 

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


В этом случае будет беда... Программа впадет в бесконечный цикл. И это не так уж и страшно. В самом деле - бесконечный цикл очень легко обнаружить (программа подвисает, время отклика возрастает и т.д.). Хуже если в программе что-то "перемкнуло", и выполнение цикла пошло в совершенно другую степь. При этом программа вполне нормально (с виду) работает, выполняет операции, и неизвестно, когда и в каком месте всплывет ошибка программиста, и когда ее обнаружит пользователь программного продукта.

Это все было сказанно к тому, что следует очень внимательно относится к более-менее сложным циклам, и тщательно, очень тшательно тестировать каждый из них!

Виды циклов

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

Цикл с постусловием:

Пост - значит прошедшее время. То есть цикл сначала выполняется, а потом сверяется с условием выхода из него - продолжать цикл, или уже можно выходить. Структура цикла такова:

repeat
...
...
// код \\
...
until (условие);

В цикле 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<2010 do
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 тогда бы на все про все ушло несколько секунд.

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

if ... then

или

case x of
y:..
y:..
end;

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

9.1Логика работы этой конструкции описывается схемой, показанной на рисунке.

 

 

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

 

 

Обрати внимание!

В цикле-ДЛЯвсегда есть параметр цикла — величина целого типа, изменяющаяся в ходе выполнения цикла от своего начального значения i1 до конечного значения i2 с шагом R.

Выполняется цикл-ДЛЯследующим образом:

· параметру цикла присваивается начальное значение;

· параметр цикла сравнивается с конечным значением; если параметр цикла не превышает конечное значение, то выполняется тело цикла, увеличивается значение параметра цикла на шаг и снова осуществляется проверка параметра цикла; если же параметр цикла превышает конечное значение, то выполнение цикла заканчивается.

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

Пример:

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


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

 

Пример:

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

Вложенные циклы

Цикл называется вложенным, если он размещается внутри другого цикла. На первом проходе, внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. И так до тех пор, пока не завершится внешний цикл. Само собой, как внешний, так и внутренний циклы могут быть прерваны командой break.



2018-07-06 1006 Обсуждений (0)
Вложенные условные операторы в Паскаль 0.00 из 5.00 0 оценок









Обсуждение в статье: Вложенные условные операторы в Паскаль

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1006)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)