Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторки 1-6 по Delphi.pdf
Скачиваний:
39
Добавлен:
08.04.2015
Размер:
1.09 Mб
Скачать

Языки программирования

Внимание!

Ни в коем случае не допускается изменять значения параметра внутри тела цикла for..do. Ведь это

не более чем счетчик числа итераций. Если же ваша интуиция и логика программы подсказывают, что необходимо найти решение, в котором параметр цикла будет выступать не только в виде банального счетчика, но и в роли управляемого параметра, то на службу вместо цикла for..do надо поставить цикл while..do или repeat..until.

Инструкция in в цикле for..do

Цикл for имеет еще один вариант применения. Если вместо конструкции for..to..do задействовать for..in..do, то цикл найдет возможность самостоятельно разобраться с шагом счетчика. Если говорить точнее — шаг передается через дополнительный параметр, например множество, строку, коллекцию, запись или массив (листинг 1.15).

Листинг 1.15. Управление параметром цикла с помощью инструкции in

var x: array[0..7] of byte = (1,2,3,5,8,11,19,45);

i:Integer; begin

for i in x do

WriteLn(i);

ReadLn; end.

Результатом выполнения предложенного кода станет вывод на экран строк со значениями 1, 2, 3,

5, 8, 11, 19, 45.

Цикл с предусловием while..do

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

while <(логическое выражение = true)> do <оператор>;

Условие цикла задается в виде булевого выражения (выражения, возвращающего значение true/false).

Листинг 1.16. Цикл с предусловием

var x: array [0..99] of Integer;

i:Integer; begin

i:=0;

while i<=99 do begin

x[i]:=i;

INC(i); //приращение i:=i+1; end;

Предложенный в листинге 1.16 пример решил задачу заполнения массива рядом целых чисел (от 0

до 99).

Организация цикла while..do требует от программиста большой внимательности — нам нельзя забывать управлять логическим условием цикла. Например, если бы мы с вами забыли в листинге 1.16 ввести команду INC(i), то наш цикл станет выполняться вечно (по крайней мере, до тех пор, пока не сядут аккумуляторы в вашем ноутбуке).

Замечание

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

11

СКФУ Кафедра компьютерной безопасности

Языки программирования

отношения (<, <=, <>, >=,>, =) и булевых операторов (AND, OR, NOT) мы имеем возможность составлять сложные логические комбинации, что существенно расширяет спектр применения цикла while.

Цикл с постусловием repeat..until

Наше знакомство с циклами Delphi продолжит цикл repeat..until. repeat <оператор> until <логическое выражение = false>;

Основные отличия цикла с постусловием repeat..until от цикла с предусловием while..do заключаются в следующем. Во-первых, оператор цикла repeat..until вне зависимости от логического выражения будет выполнен хотя бы один раз. Это объясняется местонахождением логического выражения — проверка условия происходит после того, как выполнилось тело цикла. Во-вторых, в отличие от цикла while..do выход из цикла с постусловием осуществляется при истинности логического выражения. Другими словами, цикл repeat..until будет выполняться до тех пор, пока логическое выражение не соблюдается.

Листинг 1.17 демонстрирует порядок применения цикла с постусловием.

Листинг 1.17. Цикл с постусловием

var ch:char;

X,Y : integer; begin

repeat

WriteLn('X=?, Y=?'); ReadLn(X, Y);

WriteLn(X, '+', Y, '=', x+y); WriteLn('Press "q" to exit');

ReadLn(ch); until (ch='q');

end.

Разработанная нами программа, суммирует два полученных от пользователя значения. Затем предлагает подтвердить выход из программы нажатием клавиши с символом "q", если будет введен любой другой символ, то цикл подсчета суммы X+Y вновь повторится.

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

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

представлен способ обнуления всех элементов двумерного массива A размером 10 × 10 элементов. Обращение к ячейкам массива производится в рамках двойного цикла for..do.

Листинг 1.18. Пример организации вложенного цикла

var A : Array[0..9, 0..9] of Integer;

x, y : byte; begin

for x:=0 to 9 do //внешний цикл

for y:=0 to 9 do A[x, y]:=0; //вложенный цикл end;

Операторы break и continue

Изучение циклов было бы логически незавершенным без рассмотрения операторов прерывания текущей итерации цикла break и внеочередного начала следующей итерации continue.

Рассмотрим представленный в листинге 1.19 пример.

Листинг 1.19. Прерывание цикла оператором break

var Accept : Boolean;

12

СКФУ Кафедра компьютерной безопасности