ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 294
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ЛР 1. Операторы и выражения Delphi
Управление жизненным циклом объекта
Ограничение видимости членов класса
Особенности объявления методов
Принадлежность к родительскому контейнеру
Размещение и размеры элемента управления
Видимость и активность элемента управления
ЛР5. Обработка клавиатурных событий и событий мышки
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), и больше не требует упоминания его имени.