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

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

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

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

Добавлен: 10.01.2024

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

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

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

СОДЕРЖАНИЕ

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

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

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

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

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

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

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

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

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

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

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

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

Множества

Записи

Массивы

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

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

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

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

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

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

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

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

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

Полиморфизм

ЗАДАНИЕ

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

Класс TControl

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

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

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

Задание

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

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

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

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

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

Задание

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

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



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('Выбери операцию [+ или - или / или *]'));
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 противоречит одному из основных принципов структурного программирования — модули программы должны иметь один вход и один выход.

Оператор with..do

Оператор with..do значительно упрощает процесс написания кода программы, обеспечивая ускоренный доступ к полям записей и объектов. Каким образом? Допустим, что наша программа использует переменную-запись вида, предложенного в листинге 1.11.


Листинг 1.11. Стандартный способ обращения к полям записи




var DemoRecord : record
//объявление записи I : integer;

R : real;

B : boolean;

end; begin

DemoRecord.I:=-41; DemoRecord.R:=0.48; DemoRecord.B:=True;
Как видите, для обращения к полям записи мы вынуждены писать код, повторяющий из строки в строку имя владельца полей — DemoRecord. А если таких полей несколько десятков? Никчемное и рутинное занятие. Разработчики Delphi предложили конструкцию, исключающую необходимость многократных повторов имени объекта (записи, переменой и т. д.):

with <объект> do begin

<действиесполем1объекта>

. . .

<действиесполемNобъекта>

end;

Оператор with..do значительно упрощает труд программиста. Теперь обращение к полям записи происходит без многократного упоминания имени самой записи (листинг 1.12).


Листинг 1.12. Пример работы с оператором with..do




with DemoRecord do begin

I:=-41;

R:=0.48;

B:=true;

end;
Встретив конструкцию with..do, компилятор понимает, что далее идет речь только о конкретном объекте (в нашем случае это запись DemoRecord), и больше не требует упоминания его имени.