Файл: Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.05.2024

Просмотров: 129

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
if — одно из самых популярных средств, изменяющих естественный порядок выполнения операторов программы. Вот его общий вид:

if <условие> then

<оператор 1>

else

<оператор 2>;

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

Логика работы оператора if очевидна: выполнить оператор 1, если условие истинно, и оператор 2, если условие ложно. Поясним сказанное на примере:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

A, B, C: Integer;
begin

A := 2;

B := 8;

if A > B then

C := A

else

C := B;

Writeln('C=', C);

Writeln('Press Enter to exit...');

Readln;

end.

В данном случае значение выражения А > В ложно, следовательно на экране появится сообщение C=8.

У оператора if существует и другая форма, в которой else отсутствует:

if <условие> then <оператор>;

Логика работы этого оператора if еще проще: выполнить оператор, если условие истинно, и пропустить оператор, если оно ложно. Поясним сказанное на примере:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

A, B, C: Integer;
begin

A := 2;

B := 8;

C := 0;

if A > B then C := A + B;

Writeln('C=', C);

Writeln('Press Enter to exit...');

Readln;

end.

В результате на экране появится сообщение С=0, поскольку выражение А > В ложно и присваивание С := А + В пропускается.

Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов. При вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует. Например:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

A: Integer;
begin

Readln(A);

if A >= 0 then

if A <= 100 then

Writeln('A попадает в диапазон 0 - 100.')

else

Writeln('A больше 100.')

else

Writeln('A меньше 0.');

Writeln('Press Enter to exit...');

Readln;

end.

Конструкций со степенью вложенности более 2–3 лучше избегать из-за сложности их анализа при отладке программ.

2.7.6. Оператор ветвления case

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

case <переключатель> of

<список №1 значений переключателя>: <оператор 1>;

<список №2 значений переключателя>: <оператор 2>;

...

<список №N значений переключателя>: <оператор N>;

else <оператор N+1>

end;

Оператор case вычисляет значение переключателя (который может быть задан выражением), затем последовательно просматривает списки его допустимых значений в поисках вычисленного значения и, если это значение найдено, выполняет соответствующий ему оператор. Если переключатель не попадает ни в один из списков, выполняется оператор, стоящий за словом else. Если часть else отсутствует, управление передается следующему за словом end оператору.

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

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

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

Day: 1..31;
begin

Readln(Day);

case Day of

20..31: Writeln('День попадает в диапазон 20 - 31.');

1, 5..10: Writeln('День попадает в диапазон 1, 5 - 10.');

else Writeln('День не попадает в заданные диапазоны.');

end;

Writeln('Press Enter to exit...');

Readln;

end.

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

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

Day: 1..31;
begin

Readln(Day);

case Day of

1, 5..10: Writeln('День попадает в диапазон 1, 5 - 10.');

20..31: Writeln('День попадает в диапазон 20 - 31.');

else Writeln('День не попадает в заданные диапазоны.');

end;

Writeln('Press Enter to exit...');

Readln;

end.

2.7.7. Операторы повтора — циклы

Алгоритм решения многих задач требует многократного повторения одних и тех же действий. При этом суть действий остается прежней, но меняются данные. С помощью рассмотренных выше операторов трудно представить в компактном виде подобные действия в программе. Для многократного (циклического) выполнения одних и тех же действий предназначены
операторы повтора (циклы). К ним относятся операторы for, while и repeat. Все они используются для организации циклов разного вида.

Любой оператор повтора состоит из условия повтора и повторяемого оператора (тела цикла). Тело цикла представляет собой простой или структурный оператор. Оно выполняется столько раз, сколько предписывает условие повтора. Различие среди операторов повтора связано с различными способами записи условия повтора.

2.7.8. Оператор повтора for

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

for <параметр цикла> := <значение 1> to <значение 2> do

<оператор>;

где <параметр цикла> — это переменная любого порядкового типа данных (переменные вещественных типов данных недопустимы); <значение 1> и <значение 2> — выражения, определяющие соответственно начальное и конечное значения параметра цикла (они вычисляются только один раз перед началом работы цикла); <оператор> — тело цикла.

Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного. После каждого повтора значение параметра цикла увеличивается на единицу. Например, в результате выполнения следующей программы на экран будут выведены все значения параметра цикла (от 1 до 10), причем каждое значение — в отдельной строке:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

I: Integer;
begin

for I := 1 to 10 do Writeln(I);

Writeln('Press Enter to exit...');

Readln;

end.

Заметим, что если начальное значение параметра цикла больше конечного значения, цикл не выполнится ни разу.

В качестве начального и конечного значений параметра цикла могут использоваться выражения. Они вычисляются только один раз перед началом выполнения оператора for. В этом состоит важная особенность цикла for в языке Delphi, которую следует учитывать тем, кто имеет опыт программирования на языках C/C++.

После выполнения цикла значение параметра цикла считается неопределенным, поэтому в предыдущем примере нельзя полагаться на то, что значение переменной I равно 10 при выходе из цикла.

Вторая форма записи оператора for обеспечивает перебор значений параметра цикла не по возрастанию, а по убыванию:

for <параметр цикла> := <значение 1> downto <значение 2> do

<оператор>;

Например, в результате выполнения следующей программы на экран будут выведены значения параметра цикла в порядке убывания (от 10 до 1):


program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

I: Integer;
begin

for I := 10 downto 1 do Writeln(I);

Writeln('Press Enter to exit...');

Readln;

end.

Если в такой записи оператора for начальное значение параметра цикла меньше конечного значения, цикл не выполнится ни разу.

2.7.9. Оператор повтора repeat

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

repeat

<оператор 1>;

...

<оператор N>;

until <условие завершения цикла>;

Тело цикла выполняется до тех пор, пока условие завершения цикла (выражение булевского типа) не станет истинным. Оператор repeat имеет две характерные особенности, о которых нужно всегда помнить:

  • между словами repeat и until может находиться произвольное число операторов без операторных скобок begin и end;

  • так как условие завершения цикла проверяется после выполнения операторов, цикл выполняется, по крайней мере, один раз.

В следующем примере показано, как оператор repeat применяется для суммирования вводимых с клавиатуры чисел. Суммирование прекращается, когда пользователь вводит число 0:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

S, X: Integer;
begin

S := 0;

repeat

Readln(X);

S := S + X;

until X = 0;

Writeln('S=', S);

Writeln('Press Enter to exit...');

Readln;

end.

Часто бывает, что условие выполнения цикла нужно проверять перед каждым повторением тела цикла. В этом случае применяется оператор while, который, в отличие от оператора repeat, содержит условие выполнения цикла, а не условие завершения.

2.7.10. Оператор повтора while

Оператор повтора while имеет следующий формат:

while <условие> do

<оператор>;

Перед каждым выполнением тела цикла происходит проверка условия. Если оно истинно, цикл выполняется и условие вычисляется заново; если оно ложно, происходит выход из цикла, т.е. переход к следующему за циклом оператору. Если первоначально условие ложно, то тело цикла не выполняется ни разу. Следующий пример показывает использование оператора while для вычисления суммы S = 1 + 2 + .. + N, где число N задается пользователем с клавиатуры:

program Console;
{$APPTYPE CONSOLE}
uses

SysUtils;
var

S, N: Integer;
begin

Readln(N);

S := 0;

while N > 0 do

begin

S := S + N;

N := N - 1;

end;

Writeln('S=', S);

Writeln('Press Enter to exit...');

Readln;

end.

2.7.11. Прямая передача управления в операторах повтора


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

Процедура-оператор Continue немедленно передает управление оператору проверки условия, пропуская оставшуюся часть цикла (рисунок 2.4):



Рисунок 2.4. Схема работы процедуры-оператора Continue

Процедура-оператор Break прерывает выполнение цикла и передает управление первому оператору, расположенному за блоком цикла (рисунок 2.5):



Рисунок 2.5. Схема работы процедуры-оператора Break