ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 306
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ЛР 1. Операторы и выражения Delphi
Управление жизненным циклом объекта
Ограничение видимости членов класса
Особенности объявления методов
Принадлежность к родительскому контейнеру
Размещение и размеры элемента управления
Видимость и активность элемента управления
ЛР5. Обработка клавиатурных событий и событий мышки
Организация циклов
При разработке программ зачастую возникает необходимость повторного выполнения ряда одинаковых действий, например вычислений. В подобной ситуации на помощь приходят циклы. Циклы предназначены для многократного выполнения одного или нескольких выражений. В Delphi предусмотрены три разновидности циклов:
-
цикл for с параметром; -
цикл while..do с предусловием; -
цикл repeat..until с постусловием.
На рис. 1.2 представлены структурные схемы всех трех циклов.
Проверка условия
true
Установка условия
Установка условия
Установка параметра цикла
false
Модификация условия
for .. do while .. do repeat .. until
Рис. 1.2. Фрагмент блок-схемы операторов циклов
Цикл с параметром for..do
Наиболее прост для понимания цикл с параметром (счетчиком). Он позволяет явным образом задать число выполняемых итераций. Синтаксическая конструкция цикла со счетчиком выглядит следующим образом:
for <счетчикцикла>:=<стартовоезначение>
to | downto <конечноезначение> do <оператор>;
В качестве счетчика цикла может выступать любая порядковая переменная (ее обычно называют параметром цикла). При каждом проходе цикла переменная получает приращение (уменьшение). Цикл продолжается до тех пор, пока значение параметра не достигнет конечного значения. Пример из листинга 1.13 демонстрирует простейший способ применения цикла со счетчиком.
Листинг 1.13. Пример цикла со счетчиком
var i:integer;
begin
for i:=0 to 9 do begin
...
WriteLn(i);
end;
end;
В предложенном примере работа цикла прекратится в тот момент, когда параметр i превысит значение 9. Таким образом, будет осуществлено 10 итераций.
Отличие ключевого слова to от downto в том, что при использовании в цикле слова to параметр цикла увеличивает свое значение, а во втором — уменьшает. В листинге 1.14 показано, как следует организовывать цикл с убывающим счетчиком.
Листинг 1.14. Цикл с убывающим счетчиком
for i:=99 downto 3 do begin
...
WriteLn(i);
end;
Внимание!
Ни в коем случае не допускается изменять значения параметра внутри тела цикла 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 заключается в возможности определения расширенных условий управления циклом. С помощью операторов
отношения (<, <=, <>, >=,>, =) и булевых операторов (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;
Counter : Integer;
begin
Accept:=true; Counter:=0;
while Accept=true do
begin
Accept:=<ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ>;
INC(Counter); //Counter:=Counter+1;
if Counter>10 then break; end;
end;
Цикл while..do будет выполняться до тех пор, пока переменная Accept принимает значение true. Но количество итераций в любом случае не превысит числа 10, контроль за этим осуществляется с помощью переменной-счетчика Counter. При достижении Counter значения 11 работа цикла прекращается.
В листинге 1.20 предложен еще один пример. На этот раз нам необходимо подсчитать сумму нечетных чисел, входящих в диапазон от 0 до 99. Для этого воспользуемся оператором continue и операцией целочисленного деления MOD, вычисляющей остаток от деления.
Листинг 1.20. Переход к очередной итерации с помощью continue
var X,Sum:Integer;
begin
Sum:=0;
for X:=0 to 99 do begin
if (X MOD 2)=0 then continue; {пропускаем итерации
с четным значением x} Sum:=Sum+X; {накапливаем нечетные числа}
end; WriteLn(Sum); Readln;
end;
Если переменная X принимает четное значение, то оператор continue принуждает цикл начать новую итерацию (досрочно увеличивает счетчик цикла на единицу). Поэтому суммируются