- •ЛР 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.
Языки программирования
...
type TStudent=record
private |
//секция частных объявлений |
function GetAge: Integer; |
//метод записи |
public |
//секция публичных объявлений |
SName,FName:string[15]; |
//фамилия и имя |
BDate:TDate; |
//дата рождения |
property Age:integer read GetAge; //свойство записи — возраст end;
{ TStudent }
function TStudent.GetAge: integer; //реализация метода begin
{узнаем разницу между текущей датой и датой рождения} Result:=YearsBetween(Now, BDate);
{для работы функции YearsBetween необходимо подключить модуль DateUtils} end;
По сравнению классическим способом описания записи наш пример (см. листинг 2.7) содержит много необычного:
появились секции частных и публичных объявлений;
запись приобрела право обладать методами;
у записи могут быть свойства.
Безусловно, даже усовершенствованная запись не способна заменить класс (записи не поддерживают наследование, у них не могут быть объявлены виртуальные и динамические методы, запись не может обладать деструктором), но такая задача перед программистами Embarcadero и не ставилась. Новый синтаксис записей просто предоставляет программисту Delphi существенно улучшенный инструмент для разработки программ.
Примечание
Начиная с Delphi 2009, при описании типа записи допускается задавать поля с заранее неопределенным (обобщенным) типом данных.
Массивы
Массивы вряд ли нуждаются в представлении для человека, имеющего даже самый небольшой опыт программирования, ведь это очень востребованная структура данных. Массив (array) предназначен для хранения некоторого количества однотипных элементов. Ключевое достоинство массива в том, что он обеспечивает максимально быстрый доступ к любому из своих элементов. Такая особенность массива имеет простое объяснение. Так как все элементы массива задействуют одно и то же число байтов, то они хранятся последовательно один за другим в памяти компьютера
(рис. 2.2).
20
СКФУ Кафедра компьютерной безопасности
Языки программирования
Указатель на массив
|
|
|
|
0 |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Память |
||
|
|
|
|
|
2 |
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
компьютера |
||||
|
Ячейки |
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
массива |
|
... |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N-–11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 2.2. Представление массива в памяти
Для адресации нужного элемента массива достаточно знать адрес первого элемента. Элемент с нужным индексом легко вычисляется путем элементарного умножения индекса на размер элемента в байтах, результат произведения прибавляется к адресу первой ячейки.
Внимание!
В составе модуля Generics.Collections.pas объявлен шаблон класса TArray,
специализирующийся на объектно-ориентированном представлении массива. Одно из основных достоинств класса в том, что в нем реализованы универсальные методы сортировки и поиска данных в массиве.
Объявление массива
Массив, как и переменную, необходимо объявить. Для этого следует указать размер массива и тип хранимых данных:
var <имя>: array [<нижняя граница>..<верхняя граница>]
of <тип_элементов>;
Если известно, что в программе будет задействовано несколько одинаковых массивов, то предварительно стоит определить тип массива и затем создавать массивы на базе объявленного типа (листинг 2.7).
Листинг 2.7. Объявление двух однотипных массивов
type TMyArray = Array [0..9] of integer; // массив из 10 элементов var A1, A2 : TMyArray;
Допускается объявлять массив-константу с одновременным заполнением данными. В предложенном в листинге 2.8 примере двенадцать ячеек массива используются для хранения количества дней в месяцах високосного года.
Листинг 2.8. Объявление массива с постоянными значениями
const DaysInMonth:
array [1..12] of byte = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Наряду с одномерными, вполне реально объявлять "квадратные", "кубические" массивы и массивы более высоких размерностей. Например, объявление пары двумерных массивов предложено в листинге 2.9.
21
СКФУ Кафедра компьютерной безопасности
Языки программирования
Листинг 2.9. Объявление двумерных массивов
var A1 : Array[0..99,0..99] of cardinal;
A2 : Array[0..99] of Array[0..99] of cardinal;
Несмотря на разницу в коде объявления массивов A1 и A2, оба массива идентичны — они представляют собой матрицы размером 100 × 100 ячеек.
Обращение к ячейкам массива
Для обращения к элементам массива с целью чтения или записи достаточно указать индекс элемента в массиве. В листинге 2.10 предложен фрагмент кода, демонстрирующий порядок заполнения одномерного массива случайными значениями.
Листинг 2.10. Заполнение массива случайными числами
const N=9;
var A:Array[0..N] of integer;
i:cardinal; begin
Randomize;
for i := 0 to N do
A[i]:=Random(100); end.
Мы постарались сделать код максимально универсальным. Размер массива определяется с помощью константы N, в нашем примере это значение 9.
Динамический массив
У всех рассмотренных ранее способов объявления массива есть один существенный недостаток — объявив в коде программы размер массива (сделав его статическим), мы не сможем выйти за его границы. Зачастую, во время программирования разработчику неизвестен объем подлежащих хранению данных. Что делать, если в одном случае приложению потребуется массив из 10 элементов, а в другом из 100? В таких случаях стоит воспользоваться услугами динамических массивов (листинг 2.11). Для этого к нашим услугам две очень полез ные процедуры Delphi. Процедура SetLength() во время выполнения программы распределит память под массив, функция High() возвратит индекс старшего элемента в массиве.
Листинг 2.11. Создание динамического массива
type String866 = type AnsiString(866); const S:String866='Введи размер массива';
var A:Array of integer; // объявление динамического массива
N,i:cardinal; begin
WriteLn(S); |
// |
запрашиваем размер массива |
ReadLn(N); |
// |
пользователь ввел число элементов |
SetLength(A,N); // распределяем память под массив
Randomize;
for i := 0 to High(A) do
A[i]:=Random(100); // заполняем массив случайными значениями end;
22
СКФУ Кафедра компьютерной безопасности