
- •ЛР 1. Операторы и выражения Delphi
- •Оператор присваивания
- •Арифметические операторы
- •Оператор конкатенации строк
- •Логические операторы
- •Операторы поразрядного сдвига
- •Операторы отношения
- •Операторы множеств
- •Составной оператор begin..end
- •Условный оператор if..then..else
- •Оператор-селектор case
- •Оператор перехода goto
- •Оператор with..do
- •Организация циклов
- •Цикл с параметром for..do
- •Инструкция in в цикле for..do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Вложенные циклы
- •Операторы break и continue
- •ЗАДАНИЕ
- •Вариант 1.
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 2. Структурные типы
- •Множества
- •Записи
- •Вариантные поля
- •Усовершенствованная запись
- •Массивы
- •Объявление массива
- •Обращение к ячейкам массива
- •Динамический массив
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 3. Объекты и классы
- •Проектирование класса
- •Управление жизненным циклом объекта
- •Опережающее объявление класса
- •Ограничение видимости членов класса
- •Свойства объекта
- •Особенности объявления методов
- •Поля класса и методы класса
- •Иерархия наследования
- •Полиморфизм
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •ЛР4. Опорные классы VCL
- •Класс TObject
- •Класс TPersistent
- •Основа компонента, класс TComponent
- •Владение компонентом
- •Класс TControl
- •Принадлежность к родительскому контейнеру
- •Размещение и размеры элемента управления
- •События, связанные с изменением размеров
- •Выравнивание элемента управления в контейнере
- •Видимость и активность элемента управления
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант5
- •Совет
- •ЛР5. Обработка клавиатурных событий и событий мышки
- •Щелчки кнопками мыши
- •Перемещение указателя мыши
- •Вращение колесика мыши
- •Операция перетаскивания drag and drop
- •Обработка событий клавиатуры
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •ЛР 6. Классы потоков данных
- •Прототип потоков данных, класс TStream
- •Потоки с дескриптором, класс THandleStream
- •Файловый поток данных, класс TFileStream
- •Пример работы с файловым потоком данных
- •Задание
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.

Языки программирования
Внимание!
Ни в коем случае не допускается изменять значения параметра внутри тела цикла 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
СКФУ Кафедра компьютерной безопасности