Основы Object Pascal (551739), страница 4
Текст из файла (страница 4)
Обратите внимание на операции and, or, xor и not. Например, ключевое слово and можно применить и как знак логической операции «И», так и как знак поразрядной операции над битами (двоичными цифрами) машинного кода.
Логические операции участвуют в выражениях, результатом вычисления которых является либо true (истинно), либо false (ложно). Результаты логических вычислений либо присваиваются переменным булевого типа (boolean), либо принимают участие в управлении программой if. . . then . . . ; while . . . do ; until …; Например
if Assigned(MyObject) and (MyObject.Age >=10)
then MyObject.Run;
Битовые операции выполняются над битами целых чисел. При этом операция применяется к значению 0 или 1, так, как если бы это были false или true. Область применения битовых операций – формирование признаков ветвления программы, работа с цветом, масками закраски фона и т.п.
Следующая таблица обобщает логические операции
Операция | Результат |
not a | true становится false и наоборот |
a and b | true только когда оба операнда true |
a or b | true когда один из операндов true |
a xor b | true когда оба операнда имеют противоположную истинность, т.е. любое из двух true-false или false-true, но не true-true или false-false |
Константы
Как было сказано выше, константа есть идентификатор, который обозначает постоянную величину. В процессе выполнения программы значение константы изменить невозможно. Термины «переменная» и «константа» выбраны неслучайно. Так, значения переменных могут изменяться в процессе работы программы, а значения констант – нет. Для объявления константы используется ключевое слово const. Чтобы объявить константы просто перечислите их имена и значения, например
const
DefaultWidth = 400;
DefaultHeight = 200;
Description = Динамическая модель атмосферы;
Обратите внимание на то, что объявление константы содержит знак «равно» (=), а не «присвоить» (:=). Кроме того, нет спецификации типа константы. Компилятор сам определяет тип константы по виду числового значения справа от знака (=). Имена констант в программе следует использовать вместо явного написания чисел или литералов.
Осмысленное применение констант обеспечивает надежность программы и является необходимым условием простоты ее модификации в будущем. Так, чтобы изменить поведение программы (размеры окон, элементов управления, реакции и т.п.), достаточно будет изменить объявления констант только в одном фрагменте исходного кода.
Массивы
Массивы относятся к структурированным типам данных.
Новый термин. Массив – структура, содержащая последовательность элементов (значений данных) одного и того же типа. Элементы массива упорядочены в непрерывной области памяти. Массивы могут быть одномерными, двумерными, трехмерными, а в общем случае, – многомерными.
Одномерные массивы
В одномерном массиве каждый элемент однозначно идентифицируется его порядковым номером в структуре. Такое понятие как «вектор» в программе представляют одномерным массивом.
Следующий пример показывает как объявить в программе одномерный массив с пятью элементами целого типа:
var
MyArray : array[0..4] of integer;
Для придания значений элементам массива надо использовать операцию «индекс» ([]):
MyArray[0] := -200;
MyArray[1] := -100;
MyArray[2] := 0;
MyArray[3] := 100;
MyArray[4] := 200;
Далее в программе можно обращаться к элементу одномерного массива по его индексу:
X := MyArray[3] + MyArray[4]; { результат Х = 300 }
Многомерные массивы
Массивы могут быть многомерными.
Рассмотрим пример объявления двумерного массива значений целого типа:
var
M2Array : array[0..2, 0..4] of Integer;
В данном случае компилятор выделяет в памяти место для 15 целых чисел (всего 60 байт). Для доступа к элементам двумерного массива надо записать два индексных выражения. Существуют два способа записи индексов, которые иллюстрируют следующие строки (они идентичны):
X := M2Array[1][1] + M2Array[2][1];
X := M2Array[1, 1] + M2Array[2, 1];
Порядок размещения элементов двумерного массива показан на рис 1.5. Здесь индекс по вертикали – первый, а по горизонтали – второй.
[0] | [1] | [2] | [3] | [4] | |
[0] | 1 | 2 | 3 | 4 | 5 |
[1] | 6 | 7 | 8 | 9 | 10 |
[2] | 11 | 12 | 13 | 14 | 15 |
Рис.1.5. Размещение элементов двумерного массива в памяти
При включенной опции компилятора «Range checking» осуществляется автоматический контроль принадлежности индексов диапазонам, указанным при объявлении массива. Например, при компиляции следующего фрагмента кода
var
MyArray : array[0..4] of Integer;
X : Integer;
begin
X := MyArray[3] + MyArray[5]; { Ошибка! 5 вне диапазона. }
end;
будет выдано сообщение об ошибке :
Constant expression violates subrange bounds.
Диапазон индексов элементов массива, который указывается при его объявлении, может быть любым по усмотрению программиста. Так, нижняя граница не обязательно должна быть нулевой. Например, такое объявление одномерного массива допустимо:
var
MyArray : array[10..20] of Integer;
Теперь для доступа к элементам массива мы должны использовать индексы с 10 (первый элемент) по 20 (последний элемент).
Можно объявить массив констант и одновременной инициализировать его:
const
myArray:array[0..4] of Integer = (-200,-100, 0, 100, 200 );
При объявлении массива можно использовать имена ограниченных типов данных (отрезки, перечисления) при условии что эти типы уже где–то объявлены. Например:
type
WorkDays = (Monday,Tuesday,Wednesday,Thurthday,Friday);
WorkHours = 9..18;
WorkTime = array[WorkDays,WorkHours] of integer;
Здесь объявление типа массива WorkTime равносильно следующему
WorkTime = array[0..4,9..18] of integer;
Для доступа к элементам массива можно использовать значения перечисляемых типов, например
var
Days : WorkTime;
// Далее. . .
Days[Monday,10] := 56;
Days[Friday,17] := 100;
Функции Low и High
Функции Low и High предназначены для работы с массивами. Функция Low возвращает нижнюю, а функция High – верхнюю границу индексов массива :
var
X, I, Lower, Upper : Integer;
MyArray : array[10..20] of Integer;
begin
{ Code to initialize MyArray here. }
Lower := Low(MyArray); { Lower содержит 10 }
Upper := High(MyArray); { Upper содержит 20 }
X := 0;
for I := Lower to Upper do
X := X + MyArray[I];
{ продолжение кода . . . }
end;
Применение функций Low и High для работы с массивами – хороший способ избежать ошибок, связанных с выходом индекса за допустимые пределы.
Динамические массивы
При объявлении динамического массива достаточно указать только тип его элементов. Память для размещения его элементов на этом этапе не выделяется. Фактически массив создается только во время выполнения программы. Для этого используется функция SetLength. Как только необходимость в массиве отпадает, следует освободить память вызовом процедуры Finalize. Рассмотрим пример:
var
BigArray : array of Integer; {размер массива не указан }
X : Integer;
begin
X := GetArraySize; { Функция вычисляет размер массива }
SetLength(BigArray, X); { Динамическое размещение массива }
{ Теперь массив можно использовать}
. . . . . . . .
{ Массив больше не нужен }
Finalize(BigArray);
end;
Новый термин. Динамический массив размещается в оперативной памяти во время выполнения программы.
Размер динамического массива можно увеличивать или уменьшать во время выполнения. программы
По окончании использования его следует уничтожить.
Несомненное преимущество динамических массивов над статическими заключается в том, что в случае неопределенности потребного количеством элементов нам не надо объявлять массив «с запасом». Достаточно объявить динамический массив и управлять его размерами непосредственно из программы.
Для изменения размеров массива используют функцию Copy. Рассмотрим такой пример. Пусть динамический массив BigArray содержит 100 элементов. Нам необходимо увеличить его размер до 200 элементов. Для этого обращаемся к функции Copy:
Copy(BigArray, 200);
Предыдущее содержимое (значения элементов) массива остается неизменным, а его размер увеличен до 200 элементов.
Двумерные динамические массивы создаются аналогично. Объявление двумерного динамического массива имеет вид:
var
BigArray : array of array of Integer;
begin
SetLength(BigArray, 20, 20);
BigArray[0][0] := 200;
{ . . . . . . . . . . . . }
Finalize(BigArray);
end;
Строки
Строки в программах используются весьма интенсивно. Object Pascal дает нам три различных строковых типа: длинная строка, короткая строка и расширенная строка. Кроме того, есть строки с терминальным нулем.
Короткая строка
Короткая строка – это строка фиксированной длины с числом символов не более 255. Имеются два способа объявления строк фиксированной длины. В первом случае используется предопределенный тип ShortString, который объявляет строку длиной 255 байт. Во втором случае – ключевое слово string со спецификацией длины:
var
S1 : ShortString; { строка длиной 255 символов }
S2 : string[20]; { строка длиной 20 символов }
Так как объем памяти, выделяемой для строк этого типа, в процессе работы программы не изменяется, операции над строками фиксированной длины выполняются очень быстро. Однако, короткие строки – устаревший тип данных. В программах рекомендуется использовать длинные строки. Короткие строки называют строками с байтом длины, ибо первый ее элемент равен текущему числу символов в ней. Значение первого элемента можно прочесть и узнать сколько в строке символов, например,
var
S:ShortString; { строка длины 255 символов }
Len:Integer;
begin
S := 'Hello';
Len:= Ord(S[0]); {Значение Len теперь равно длине S,т.е. 5}