
- •ЛР 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.

Языки программирования
Примечание
Операторы отношения допустимо использовать не только с числовыми, но и с текстовыми данными.
Операторы множеств
В составе Delphi предусмотрен ряд операторов, позволяющих осуществлять операции над однотипными множествами (табл. 1.4).
|
|
Таблица 1.4. Операторы множеств |
|
|
|
Оператор |
Операция |
Результат |
|
|
|
+ |
Объединение |
Новое множество |
- |
Разность |
|
* |
Пересечение |
|
<= |
Подмножество |
Логическое значение |
>= |
Надмножество |
|
= |
Равенство |
|
<> |
Неравенство |
|
in |
Членство |
|
Порядок осуществления операций с множествами демонстрирует листинг 1.5.
Листинг 1.5. Демонстрация операций с множествами
type TWeekDay = set of (Mo, Tu, We, Th, Fr, St, Su);
var WD1,WD2,WD3: TWeekDay; begin
WD1:=[Mo]; |
// |
присваивание, |
результат WD1=[Mo] |
WD2:=WD1+[Tu,We]; // |
объединение, |
результат WD2=[Mo, Tu, We] |
|
WD3:=WD2-WD1-[Tu];// |
вычитание, |
результат WD3=[We] |
|
WD3:=[]; |
// пустое множество, результат WD3=[] |
||
WD1:=[Mo,Su]; |
|
|
|
// пересечение
WD3:=WD1*[Mo, Tu, We, Th, Fr, St, Su]; // результат WD3=[Mo, Su] if WD1<>WD2 then begin//проверка неравенства
//...
end;
if Mo in WD1 then begin//проверка членства
//...
end;
end.
Составной оператор begin..end
Вне зависимости от назначения разрабатываемого приложения программисту не обойтись без составного оператора begin..end. Задача оператора — указание начала и конца программного блока. Характерным примером подобного блока является создаваемый по умолчанию каркас кода консольного приложения, здесь весь исполняемый код заносится вовнутрь begin..end.
Выражения, заключенные в рамки составного оператора, могут рассматриваться компилятором как составной оператор, подлежащий выполнению как единое целое. С одним из примеров использования составного оператора вы столкнетесь буквально на следующей странице (см. листинг 1.7).
5
СКФУ Кафедра компьютерной безопасности

Языки программирования
Условный оператор if..then..else
Условные операторы позволяют осуществлять выбор операции во время выполнения программы. В простейшем случае синтаксис команды выглядит следующим образом:
if <логическое выражение = true> then <выражение>;
Операция подлежит выполнению только при условии, что логическое выражение истинно (возвращает true). Предусмотрен еще один, расширенный вариант применения условного оператора:
if <логическое выражение = true> then <выражение1> else <выражение2>;
В последнем случае мы осуществляем выбор между двумя выражениями. При соблюдении условия выполняется первая операция, в противном случае управление передается второй операции. Оба варианта применения условного оператора if представлены на рис. 1.1 в виде фрагментов блок-схем.
if .. then |
|
if .. then .. else |
|||||
|
|
|
|
|
|
||
|
|
|
|
|
false |
||
Логическое |
|
Логическое |
|||||
условие |
|
условие |
|
|
|
||
|
true |
|
|
true |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Выражение |
|
Выражение1 |
|
Выражение2 |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 1.1. Фрагмент блок-схемы if..then и if..then..else
Простейший пример работы с условным оператором представлен в листинге 1.6. Если A превышает 15, то в переменную B передается произведение переменной A на 15, в противном случае результатом окажется значение A-3.
Листинг 1.6. Демонстрация оператора if..then..else
If A>15 then B:=A*15 else B:=A-2;
В листинге 1.7 предложен более сложный фрагмент кода, демонстрирующий порядок работы с условным оператором. В нашем примере мы осуществляем расчет площади квадрата или круга.
Листинг 1.7. Совместная работа if..then..else с оператором begin..end
var S:Char;
X,Y:Double; begin
WriteLn('Calculation area: "S" - square, "C" - circle');
ReadLn(S); //пользователь вводит символ "S" или "C" if S='S' then
begin
WriteLn('The side of square=?'); ReadLn(X);
Y:=X*X;
WriteLn('Area=',Y); end else
if s='C' then begin
6
СКФУ Кафедра компьютерной безопасности

Языки программирования
WriteLn('Radius=?');
ReadLn(X);
Y:=pi*X*X;
WriteLn('Area=',Y);
end else WriteLn('Wrong symbol!');
ReadLn; end.
Выбор фигуры осуществляется пользователем нажатием определенной символьной клавиши, расчет площади квадрата инициирует символ "S", а круга — "C". Если пользователь ввел любой другой символ, то программа уведомляет его об этом надписью "Wrong symbol!" (неверный символ).
Замечание
По умолчанию консольное приложение отображает вещественные значения в научном формате. Для перехода от научного представления к обычному следует воспользоваться функцией FloatToStr().
Условный оператор может обслуживать достаточно сложные логические выражения, в состав которых входят булевы операторы из табл. 1.3. Один из примеров сложного условия вы обнаружите в листинге 1.8.
Листинг 1.8. Составное логическое условие в операторе if..then
if (A>15) and ((B=0) or (B=1)) then ...
Условный оператор даст разрешение на выполнение только в случае, когда в A хранится значение, превышающее 15, и в переменной B находится число равное 0 или 1.
Оператор-селектор case
Логическим развитием условного оператора if..then стал оператор-селектор case. Основное преимущество case над своим "коллегой" в том, что он обладает большей наглядностью, чем группа операторов if..then.
Оператор включает селектор и одну или несколько констант выбора. На роль селектора могут претендовать все типы данных, между которыми существуют отношения порядка (например, целочисленные byte, word, integer) и строковый тип данных. В качестве селектора допустимо применять не только переменную, но и выражение или функцию, но при соблюдении единственного условия — выражение (функция) должно возвращать значение порядкового типа.
case <селектор> of <константа1> : <Выражение1>; <константа2> : <Выражение2>;
<константа3> : <Выражение3>; else <Выражение4>;
end;
Оператор case осуществляет проверку на равенство значений селектора и констант оператора. В случае если значение селектора совпадает со значением константы, то выполняется соответствующее константе выражение (листинг 1.9).
Листинг 1.9. Пример обращения к оператору case
type String866 = type AnsiString(866); var X,Y,Z:real;
op:char; begin
WriteLn('X=');
ReadLn(X);
WriteLn(String866('Выбери операцию [+ или - или / или *]'));
7
СКФУ Кафедра компьютерной безопасности

Языки программирования
ReadLn(op);
WriteLn('Y=');
ReadLn(Y);
Case op of
'+': Z:=X+Y;
'-': Z:=X-Y;
'/': if Y<>0 then Z:=X/Y else WriteLn(String866('Ошибка!'));
'*': Z:=X*Y;
else WriteLn(op,String866(' - недопустимая операция!')); end;
WriteLn(X,op,Y,'=',Z);
ReadLn; end.
Предложенный листинг представляет собой реализацию простейшего калькулятора, осуществляющего одну из основных математических операций над двумя значениями. Обратите внимание на то, как мы защитили программу от вероятной ошибки деления на 0: для этого мы воспользовались помощью условного оператора if..then, разрешающего операцию деления только при условии, если знаменатель не равен нулю.
Функционал секции else внутри селектора case аналогичен задачам оператора else в if..then..else. Если селектору не соответствует ни одна из констант, то будет выполнен оператор, следующий за словом else. Если же в конструкции отсутствует ключевое слово else, то выполнению подлежит следующая за оператором строка кода.
Оператор перехода goto
В 1970-е годы, во времена становления языка Pascal достаточно распространенным приемом программирования был стиль, основанный на применении оператора перехода goto. Оператор перехода позволял осуществить быстрый переход от одного участка кода к другому, отмеченному специальной меткой участку (листинг 1.10).
Листинг 1.10. Использование оператора перехода goto
label DemoLabel; //объявление метки
var i:integer=0; begin
DemoLabel: {участок кода отмечен меткой DemoLabel} begin
WriteLn(i);
inc(i);
if i<10 then goto DemoLabel; {переход к метке DemoLabel} end;
ReadLn; end.
Сегодня оператор goto утратил свою актуальность и практически не применяется, вместо него целесообразно отдавать предпочтение вызову процедур и функций. Единственным оправданием обращения к оператору перехода может стать принудительный выход вниз по коду из нескольких вложенных циклов.
Внимание!
Оператор goto противоречит одному из основных принципов структурного программирования — модули программы должны иметь один вход и один выход.
8
СКФУ Кафедра компьютерной безопасности