- •Windows -приложение
- •Среда программирования
- •Встроенный отладчик
- •Использование графики
- •Графические данные и палитра
- •Сохранение проекта
- •Структура приложения
- •Структура модуля
- •Простые типы
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Составной оператор
- •Оператор if
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Пример приложения 6
- •Пример приложения 7
- •Статические массивы
- •Динамические массивы
- •Оператор with
- •Идентичность типов
- •Совместимость типов
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Рекурсия
- •Процедура exit
- •Директивы подпрограммы
- •Класс как объектный тип
- •Наследование
- •Операции is и as
- •Типы ссылки на класс
- •Типизированные файлы
- •Файлы без типа
- •Пример приложения 17
- •Компонент tmainmenii
- •Двунаправленные списки
- •Потоки данных
- •Пример приложения 22
- •Интерфейс drag and drop
- •Пример приложения 24
- •С файлами
- •Пример приложения 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Проблемы синхронизации потоков
Символьные типы
Смысл символьного типа очевиден при выводе символов на экран или принтер. Обычно символьные типы задают некоторые стандартные схемы кодирования и декодирования информации для обмена символьными данными. Символьная схема должна воспроизводиться так же, как ее определяет операционная система. Существуют две схемы: набор 8-битовых символов, известный как расширенный (extended) ANSI-стандарт (American National Standards Institute - Американский национальный институт стандартов), и схема, соответствующая международному стандарту UNICODE и представлящая набор 16-битовых символов, в котором первые 256 символов совпадают с символами, определенными ANSI-стандартом.
В Delphi определены два физических символьных типа и один общий. Два физических типа ANSIChar и WideChar реализуют соответственно ANSI-стандарт и UNICODE-схему. Общий тип, именуемый Char, обычно соответствует типу AnsiChar. Каждый символ имеет свой собственный порядковый номер. Номер символа можно извлечь с помощью функции Ord(C), где С - какой-либо символ.
36
Значения переменным символьного типа присваивают, записывая тот или иной символ в апострофах (например, с := 'А' ;) или используя порядковый номер того или иного символа (например, с := #65;, где 65 -порядковый номер символа А в наборе символов; : = - знак присваивания).
Логические типы
Минимальной единицей измерения информации является бит, два значения которого: 0,1 - можно использовать для записи информации о чем-либо, представляющем одно из двух: да (истина, true, 1) или нет (ложь, false, 0). Информация о чем-либо, что можно представить как истина или ложь, хранится в переменных логического или булевого типа. Для совместимости с языком C++ или другими языками программирования и различными операционными системами имеются три физических булевых типа. Предпочтительней использовать общий Boolean (1 байт) тип. Другие типы именуются следующим образом: ByteBool (1 байт), WordBool (2 байта) и LongBool (4 байта).
Переменным булевого типа можно присваивать только значения true или false. Если память, соответствующая логической переменной типа Boolean, содержит 0, то ее значение равно false, если в памяти содержится I, то значение логической переменной равно true. В данном случае тип Boolean задает приведенную выше схему интерпретации содержимого памяти. Переменные физических булевых типов интерпретируют содержимое памяти по-другому: если в памяти содержится 0, значение переменной равно false, при любом другом значении значение переменной равно true. Однако функция Ord всегда возвращает значение 1, если переменная равна true, и 0, если значение переменной равно false. Таким образом, порядковый номер false равен 0, a true - 1.
С помощью булевых типов выполняются сравнения. Это их основное назначение.
Тип перечень
Запишем пример объявления типа перечень (иногда этот тип неправильно называют перечисляемым или перечислимым): Type EnumType = (Valuel, Value2, Value3);.
Обычно данные типа перечень содержат дискретные значения, представляя их не числами, а именами (идентификаторами). Простейшим встроенным типом перечень является тип Boolean, который можно определить следующим образом: Type Boolean = (false, true);.
Единственное, что отличает тип Boolean от типа перечень, это множество операций сравнения, которые встроены в рассматриваемый тип. Тип перечень - это просто список уникальных имен или идентификаторов, зарезер-
37
вированных программистом для каких-то конкретных целей. Например, можно создать список цветов: туре MyColor = (Red, Green, Blue);.
В этом типе объявлены четыре идентификатора: MyColor обозначает соответствующий тип, Red, Green, Blue - значения этого типа. Учитывая, что тип перечень относится к порядковому типу, можно извлечь порядковый номер с помощью функции Ord для каждого значения (Ord(Red) = О, Ord(Green) = 1, Ord(Blue) = 2).
ИНТЕРВАЛЬНЫЙ ТИП
Интервальный тип (диапазон) позволяет объявить переменные, содержащие информацию из некоторого заданного поддиапазона для какого-то исходного базового типа. Базовый тип должен быть порядковым, кроме типа диапазон.
Синтаксис объявления интервального типа имеет следующий вид: Туре D = MinValue. .MaxValue;, где константы: MinValue и MaxValue определяют соответственно минимальное и максимальное значения среди всех возможных значений для данного типа. Например: Type Day = 1. .31;.
ВЕЩЕСТВЕННЫЙ ТИП
С помощью вещественных типов (табл. 5) вводятся переменные, содержащие числа, которые состоят из целой и дробной частей.
|
|
|
|
|
Таблица 5 |
|
Тип |
Пороговое значение |
Максимальное по модулю значение |
Число значащих цифр |
Размер в байтах |
|
Single Double Extended Comp Currency |
1,5*10-45 5.4*10-324 3.6*10-4951 1 0,0001 |
3,4*1038 1,7*10308 1,1*104932 263 -1 9,2*1014 |
7-8 15-16 19-20 19-20 19-20 |
4 8 10 8 8 |
|
Real |
5.4*10-324
|
1,7*10308 |
15-16 |
8 |
Все вещественные типы различаются пороговым (минимальным положительным или отрицательным) и максимальным по модулю значениями. Все типы могут представлять число 0. Если при выполнении вычислений образуется число, меньшее порогового, то в память запишется 0 - произошло исчезновение порядка.
Особенность вещественных типов заключается в том, что они представляют некоторое подмножество математических вещественных чисел, которое можно представить в формате с плавающей запятой и фиксированным числом цифр, т. е. точное представление чисел не всегда возможно. Удивительно, но такое простое число, как 0.1, записывается с некоторой погрешностью, пусть очень небольшой. Из-за этого представление чисел с плаваю-
щей запятой оказывается неудобным, когда сохраняется и печатается фиксированное число десятичных разрядов, например при вычислениях с денежными величинами. Дня частичного решения этой проблемы введен тип Comp, фактически представляющий собой целые числа, т.е. вещественные числа, дробная часть которых равна 0.
Некоторые операции с этим типом приведены в табл. 6.
Таблица 6
Операция |
Результат |
Abs(X) |
Абсолютная величина X |
АгсТаn(Х) |
Арктангенс X |
Cos(X) |
Косинус X |
Ехр(Х) |
Экспоненциальная функция от X |
Frac(X) |
Дробная часть X |
Int(X) |
Целая часть от X (результат - вещественный) |
Ln(X) |
Натуральный логарифм от X |
Pi |
Число Пи (3,1416...) |
Round(X) |
Ближайшее к X целое (результат - целый) |
Sin(X) |
Синус X |
Sqr(X) |
Квадрат X, т. е. Х*Х |
Sqrt(X) |
Квадратный корень от X |
Trunc(X) |
Отсекает дробную часть X (результат-целый) |
Тип Currency (денежный) введен для удобства работы с денежными суммами. Физически значения в соответствии с этим типом записываются как целые числа в память того же объема, что и в случае типа Сотр. Однако в этот тип встроено автоматическое представление чисел в виде рублей и копеек. Компилятор не забывает умножать их на 10000 перед записью в память и делить их на 10000 при выполнении вычислений - таким образом, обеспечивается точность расчетов с четырьмя знаками после запятой.
ТИП ДАТА-ВРЕМЯ
Стандартный тип дата-время (TDateTime), определенный в модуле System, совпадает с типом Double. Например, если определена константа типа дата-время 35065.75, то это число означает 1 января 1996 г., 18.00. Способ преобразования этого числа в дату-время встроен в тип. Целая часть числа типа TDateTime задает число дней, прошедшее с 30 декабря 1899 года, а Дробная часть - прошедшую долю текущих суток. Символьное представление типа дата-время определяется установками Windows. Различные функции преобразования находятся в модуле SysUtils.
ВЫРАЖЕНИЯ
Многие операторы содержат в своем составе конструкции, называемые выражениями. Выражение - это синтаксическая единица языка, опреде-
38
39
Var
КОНСТАНТЫ
Константами называют параметры, значения которых не могут изменяться в процессе выполнения программы. В выражениях возможно двоякое использование констант:
-
непосредственное использование значения константы;
-
использование имени константы.
В качестве констант могут использоваться значения различных типов. Возможно не только десятичное представление числовых констант, но и ше-стнадцатеричное, например SF5, где первый символ указывает, что далее следует шестнадцатеричная константа.
Для задания имени константы используется следующее объявление: const <имя> = <значекие>; - например, const a = 5; s = ' Pascal' ;. В описании const можно использовать константные выражения (например, const Ъ = Pi/4;). Все вычисления константных выражений выполняются на стадии компиляции. Код программы не увеличивается при использовании поименованных констант.
ТИПИЗИРОВАННЫЕ КОНСТАНТЫ
Данное название не совсем удачное, так как типизированная константа представляет собой фактически переменную. Название это появилось потому, что типизированная константа определяется ключевым словом Const, например Const Maximum: integer = 100;. Не будет ошибки, если вместо данной строки записать: Var Maximum: integer = 100;. Таким образом, типизированные константы используются для задания начального значения переменных.
Использование типизированных констант зависит от директивы компилятора {$J}. Если она выключена {$J-}, типизированные константы становятся просто константами, если она включена {SJ+} (установлено по умолчанию) - типизированная константа представляет собой инициализированную переменную.
ПЕРЕМЕННЫЕ
Переменными называют параметры, значения которых могут изменяться в процессе выполнения программы. Запишем следующие примеры объявления переменных:
40
Var а: integer;
х,у: single;
operat:(plus, minus, mult, divide);.
В данном случае объявлены четыре переменных: а - целого типа, х, у -вещественного типа, operat - типа перечень.
ОПЕРАЦИИ
Можно выделить следующие операции:
-
арифметические;
-
логические;
-
операции над битами;
-
операции отношения;
-
операции со строками;
-
операции с множествами;
-
операции над объектами;
-
адресная операция @.
Арифметические операции для вещественных чисел определяются с помощью символов: +, -, *, /. Для целых чисел определены пять операций: +, -, *, div (деление нацело), mod (остаток от деления), например, a div в; {если А=7, ав = 3, то результат равен 2}, с mod 3; {если с = 10, то результат равен 1}.
Логические операции применяются к операндам логического типа, как, например, приведено в табл. 7 для унарной операции отрицания not.
|
Таблица 7 |
Значение операнда X |
Результат операции not X |
True |
False |
False |
True |
Результат вычисления логической операции получается также логического типа. Определяются эти операции специальными таблицами. Рассмотрим три бинарные логические операции: and - логическое И (конъюнкция); or - логическое ИЛИ (дизъюнкция); хог - ИСКЛЮЧАЮЩЕЕ ИЛИ (табл. 8).
Таблица 8
Значения операндов Результаты операций |
||||
X |
Y |
XandY |
XorY |
XiorY |
True |
True |
True |
True |
False |
False |
True |
False |
True |
True |
True |
False |
False |
True |
True |
False |
False |
False |
False |
False |
Существуют 2 варианта вычисления логических выражений, задаваемые Директивой {$В}: полное {$В+} и укороченное {$В-}. Полное вычисление означает, что выполняются все запрограммированные действия, даже если
41
на промежуточном этапе становится известным значение всего выражения. При укороченном вычислении все расчеты прекращаются, как только становится известным значение заданного выражения. Например, если в выражении (A and в) or (х xor Y) значение (A and в) равно true (когда операция or дает true, см. табл. 8), то при укороченной форме вычисления прекращаются без расчета второй части (х xor Y) исходного выражения, так как полученное значение true уже не изменится.
Операции над битами выполняются над целыми числами. Существуют следующие битовые операции:
-
not X - инверсия всех битов числа X;
-
X and Y - побитовое логическое умножение чисел X и V;
-
X or Y - побитовое логическое ИЛИ над X и Y;
-
X xor Y - побитовое исключающее ИЛИ над X и Y;
-
X shr J - сдвиг содержимого числа X на J бит вправо;
-
X shlJ - сдвиг числа X на J бит влево.
Операции сдвига часто используются для умножения и деления целых чисел на 2, 22, 23 и т. д. Например, пусть X = 3 (в двоичной формг 0011). Выполним X shl 1 -ООП сдвигаем влево на 1 разряд, получим 0110. Двоичное число 0110 равно 6 в десятичной системе, т. е. выполнено умножение на 2.
Операции отношения предназначены для сравнения двух величин. Величины должны быть сравнимых типов. Результат сравнения имеет логический тип. Существуют шесть операций:
= - равно, < - меньше, <= - меньше или равно,
<> - не равно, > - больше, >= - больше или равно.
Адресная операция @ позволяет определить адрес расположения переменной, типизированной константы, подпрограммы и некоторых других программных элементов в памяти. Остальные операции будут рассмотрены далее.
ФУНКЦИИ
Функция представляет собой специальную подпрограмму, предназначенную для вычисления какого-либо параметра, исходя из значений ее аргументов. Имеется большое количество встроенных стандартных функций. Возможно создание собственных функций, которые используются наряду со стандартными. Любая функция задается своим именем с указанием после него в круглых скобках перечня аргументов, например sin(X).
ПОРЯДОК ВЫЧИСЛЕНИЯ ВЫРАЖЕНИЙ
Выражения вычисляются в определенном порядке в соответствии с приоритетами (табл. 9) выполняемых операций.
42
Таблица 9
Приоритет |
Операции |
1 |
( ) - круглые скобки |
2 |
Вычисление функций |
3 |
@, not, унарные +, - |
4 |
•, /, div, mod, and, shl, shr, as |
5 |
+, -, or, xor |
6 |
=, <>, >, < <=, >= is, in |
Для того чтобы изменить приоритет выполняемых действий, используются круглые скобки. Действия выполняются чаще всего слева направо. Компилятор в целях оптимизации может нарушить этот порядок.
ВИДЫ ОПЕРАТОРОВ
С помощью операторов осуществляется контроль за потоком вычислений и проводятся различные манипуляции с данными. Операторами описываются выполняемые программой алгоритмические действия, которые необходимы для решения задачи. Все операторы условно можно разделить на две группы: простые и структурированные.
Простыми называют операторы, которые не содержат внутри себя других операторов.
Структурированными являются такие операторы, которые состоят из других операторов. К ним относятся:
-
составной оператор;
-
операторы условного перехода;
-
операторы цикла;
-
оператор над записями;
-
операторы обработки исключительных ситуаций.
Иногда объявления программных элементов называют операторами объявления, которые, в отличие от "настоящих" операторов, являются неисполнимыми.
ПРОСТЫЕ ОПЕРАТОРЫ
Таких операторов четыре: оператор присваивания, обращение к процедуре, оператор безусловного перехода и пустой оператор.
Оператор присваивания является средством изменения содержимого памяти. Синтаксически с помощью этого оператора переменной присваивается значение какого-либо выражения. Записывается этот оператор следующим образом: Y := <выражение>;, где Y - переменная, := - знак присваивания. Например, Х:= 5; Y:= sin (X) ; С : = 'А';.
43
Выражение вычисляется независимо от типа переменной. Однако чтобы присваивание было корректным, необходимо, чтобы тип переменной был совместим с типом выражения. Например, переменной вещественного типа можно присваивать выражения целого типа, но переменной целого типа нельзя присваивать значения выражений вещественного типа.
Обращение к процедуре позволяет выполнить вычисления, задаваемые подпрограммой вида "процедура". Как и функция, процедура имеет имя и может иметь список аргументов. При вызове вычислений из процедуры записывается имя нужной процедуры, а затем справа от имени в круглых скобках записывается список параметров-аргументов. Например, ProcName{x, У) ;. Существует большое количество встроенных стандартных процедур, например Dec(X) и Inc(Х) (см. табл. 1). Программист может составлять собственные процедуры.
Оператор безусловного перехода записывается в следуюшем виде: goto <метка>;. Этот оператор позволяет изменить последовательный порядок выполнения операторов и перейти к выполнению программы, начиная с заданного оператора. Оператор, на который происходит переход, должен быть помечен меткой. Метки бывают двух видов: или какое-либо число 1...9999 или обычный идентификатор: А, В25, Point. Все метки должны быть описаны в объявлении Label: 56, А, В25, Point;. Одной меткой можно пометить только один оператор: Point: y := 2*х,-. Использование оператора GOTO считается плохим стилем программирования.
Пустой оператор не выполняет никаких действий и никак не отображается в программе, разве только точкой с запятой.