Файл: Лр операторы и выражения Delphi.doc

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

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

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

Добавлен: 10.01.2024

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

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

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

СОДЕРЖАНИЕ

ЛР 1. Операторы и выражения Delphi

Оператор присваивания

Арифметические операторы

Оператор конкатенации строк

Логические операторы

Операторы поразрядного сдвига

Операторы отношения

Операторы множеств

Оператор-селектор case

Оператор перехода goto

Организация циклов

ЛР 2. Структурные типы

Множества

Записи

Массивы

ЛР 3. Объекты и классы

Проектирование класса

Управление жизненным циклом объекта

Опережающее объявление класса

Ограничение видимости членов класса

Свойства объекта

Особенности объявления методов

Поля класса и методы класса

Иерархия наследования

Полиморфизм

ЗАДАНИЕ

ЛР4. Опорные классы VCL

Класс TControl

Принадлежность к родительскому контейнеру

Размещение и размеры элемента управления

Видимость и активность элемента управления

Задание

ЛР5. Обработка клавиатурных событий и событий мышки

Щелчки кнопками мыши

Перемещение указателя мыши

Вращение колесика мыши

Операция перетаскивания drag and drop

Задание

ЛР 6. Классы потоков данных

Прототип потоков данных, класс TStream

Организация циклов


При разработке программ зачастую возникает необходимость повторного выполнения ряда одинаковых действий, например вычислений. В подобной ситуации на помощь приходят циклы. Циклы предназначены для многократного выполнения одного или нескольких выражений. В 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 принуждает цикл начать новую итерацию (досрочно увеличивает счетчик цикла на единицу). Поэтому суммируются