- •1. Структура модулей и преимущества их использования
- •2. Описание объектных типов в языке программирования Pascal. Статические и виртуальные методы.
- •Нетипизированные файлы
- •Текстовые фалы
- •4. Моделирование линейных динамических информационных структур средствами высокого уровня
- •5. Рекурсивные процедуры обхода двоичных деревьев.
- •6. Представление разреженных матриц линейными массивами
- •8. Номенклатура сегментных регистров и способы адресации в младших моделях процессоров Intel.
- •8. Макросредства языка Assembler.
- •9. Основные типы ядра операционной системы
- •11. Семиуровневая модель взаимодействия открытых систем iso.
- •Уровни модели osi
- •12. Технология «клиент-сервер». Назначение прокси-сервера, сервера приложений, web-сервера и т.П.
- •13. Барьерная синхронизация. Флаги и управляющие процессы: крупномодульное решение.
- •15. Алгоритмы сортировки.
- •16. Нормализация. 1нф, н1нф, 2нф, 3нф, нфбк.
- •17. Транзакции. Тупики. Уровни изолированности пользователей.
- •II. Транзакции и параллельная работа
- •III. Транзакции, откаты и восстановление после сбоев
- •18. Язык sql. Таблицы. Запросы. Вставка, удаление и обновление.
- •19. Реляционная алгебра.
- •20. Классические и стандартные технологические процессы.
- •21. Основные технологические подходы.
- •3.5.2.4.
- •23. Создание mdi приложений в Delphi.
- •24. Методы описания языков программирования. Бнф. Классы грамматик языков. Общая схема трансляции. Функции отдельных блоков транслятора.
2. Описание объектных типов в языке программирования Pascal. Статические и виртуальные методы.
Def. ООП – способ видения мира, это технология программирования, как методика создания программ, это и способ записи программ.
Идеи ООП возникли в 70-х годах 20-го века, и впервые они были отражены ОО языке SmallTalk (автор Анан Кей).
3 позиции, характеризующие ООП:
инкапсуляция;
наследование;
полиморфизм.
Базовым понятием в ООП является понятие объекта.
Объект – отражение реальной сущности. Такая сущность характеризуется набором свойств и набором действий, которые эта сущность способна выполнять.
В Turbo Pascal объект это совокупность полей данных (атрибуты) и действий, которые можно выполнять с объектом (может выполнить объект). Действия, которые может выполнять объект – методы. В Turbo Pascal объект определяется в виде типа, и если в объекте заданы методы, они так же должны быть определены.
type <имя> = object
[последовательность_определений_полей]
[последовательность_объявлений_методов]
end;
Методом может быть процедура или функция. Определение методов задается в разделе процедур и функций.
procedure <имя_объекта>.<имя_метода>[(список_формальных_параметров)];
тело_процедуры
function <имя_объекта>.<имя_метода>[(список_формальных_параметров)]:
тип_результата;
тело_функции;
Инкапсуляция понимается как объединение в понятии объекта как полей данных – атрибутов, так и действий, заданных в виде методов.
Экземпляр объекта – переменная объектного типа.
var obj1: имя_объекта;
obj2, obj3: имя_объекта;
mas: array[1..24] of имя_объекта;
obj1.имя_атрибута – обращение к атрибуту;
obj1.имя_метода(список_аргументов) – обращение к методу.
Изменять значение атрибута объекта может только метод этого объекта.
Под инкапсуляцией понимается определенная дисциплина доступа и изменения атрибутов объекта, а именно, считается, что с атрибутом объекта должны работать только методы этого объекта. Для остальных операторов программы, обычных процедур или функций объект закрыт.
Для управления доступом к атрибутам и методам объекта в Turbo Pascal используются следующие уровни доступа:
private – элементы объекта с таким уровнем доступны только методам этого объекта;
public – элементы объекта с таким уровнем доступны везде.
Любой метод объекта имеет доступ ко всем атрибутам.
type имя = object
private
......
public
......
end;
Наследование – способ построения нового объекта на базе уже существующего.
В Turbo Pascal используется схема одиночного объекта:
имя_порожденного_объекта = object(имя_базового_объекта)
[последовательность_опередеоения_новых_полей(атрибутов)]
[последовательность_объявлений_методов_порожденного_объекта]
end;
В порожденном объекте неявно присутствуют все атрибуты базового объекта и все методы базового объекта, однако, если в порожденном объекте атрибуты базового объекта переопределить нельзя, с другой стороны, в порожденном объекте можно переопределить часть или все методы базового объекта.
Turbo Pascal допускает только одиночное наследование, т.е. каждый порожденный объект имеет 1 базовый.
В методе порожденного объекта можно обратиться к одноименному методу базового объекта. Для обращения к методу базового объекта используется:
inherited <имя_базового_объекта>(список_аргументов);
Полиморфизм – возможность задавать методы, относящиеся к одной иерархии наследования имеющие одинаковое имя и список параметров, но имеющие разные реализации.
Переменная Self.
Метод объекта отличается от обычной процедуры или функции тем, что при его вызове ему автоматически передается адрес того экземпляра объекта, для которого он вызывается. Внутри тела метода указанный адрес представлен значением переменной Self, при этом Self рассматривается не как указатель, а именно как экземпляр объекта. Тело метода автоматически подгружается в оператор.
with self do begin тело_метода end; { attrib ~ self.attrib }
Раннее и позднее связывание.
В рассмотренном примере все методы объектов являются статическими, т.е. адрес кода как метода определяется на этапе компиляции программы. Вызов статического метода объекта является самым быстрым, поскольку используется механизм раннего связывания, который действует на этапе компиляции программы.
При позднем связывании в объекте могут быть определены специальные виртуальные методы. Информация об адресах кода таких методов размещается в специальной таблице VMT (Virtual Method Table). Таблица VMT генерируется компилятором для каждого объекта, имеющего хотя бы 1 виртуальный метод.
Для объекта с виртуальными методами каждый его экземпляр имеет указатель на VMT таблицу этого объекта.
type obj1 = object
constructor Init;
procedure Met2; virtual;
end;
obj2 = object( obj1 )
procedure Met2; virtual;
end;
constructor obj1.Init;
begin
Met2;
end;
procedure obj1.Met2;
begin
writeln( ‘obj1.Met2!’ );
end;
procedure obj2.Met2;
begin
writeln( ‘obj2.Met2!’ );
end;
var ob: obj2;
bOb: obj1;
begin
ob.Init; { выведется obj2.Met2! }
readln;
end.
Формат VMT таблицы:
------------------------------------
| размер ОП | -- размер памяти, выделенной для каждого экземпляра объекта
------------------------------------
| - размер ОП | -- то же значение, но с обратным знаком { по 2 байта }
------------------------------------
| адрес виртуального Met1 | \
------------------------------------
| адрес виртуального Met2 | | -- по 4 байта
------------------------------------
| ……………………. | /
------------------------------------
Формат экземпляра объекта:
-------------------
| поле_1 |
-------------------
| поле_2 |
-------------------
| ………… . |
-------------------
| адрес_VMT | -- 4 байта
-------------------
Конструктор объекта с виртуальными методами обеспечивает инициализацию адреса на VMT таблицу для каждого экземпляра этого объекта.
Перед вызовом любого виртуального метода для данного экземпляра объекта сначала должен быть вызван его конструктор. Он обеспечивает инициализацию поля адресов на его таблицу.
В объекте может быть 1 или несколько конструкторов. Конструктор должен быть только статическим. В порожденном объекте виртуальный метод должен иметь такое же имя, как и соответствующий метод в базовом объекте, и такой же список параметров.
Полиморфизм в Turbo Pascal реализуется именно через виртуальные методы.
bOb := ob; { OK }
ob := bOb; { Error }
Величине объектного типа можно присваивать величину экземпляра объекта или того же типа, или любого объекта, порожденного от исходного объекта.
Turbo Pascal предоставляет средства для построения анонимных экземпляров объекта. Доступ к анонимному экземпляру осуществляется через
type obj = object
......
end;
pObj = ^obj;
var ref: pObj;
begin
new( ref );
ref^.Init( список_аргумантов_конструктора ); ~ bew( ref, Init( список_аргументов) );
ref := new( pObj, Init( список_аргументов ) );
Правило соответствия между переменной базового типа и переменной производного типа.
Экземпляру базового объекта можно присваивать в качестве значения экземпляр порожденного объекта от этого базового. Указателю, квалифицированному базовым объектом, можно присваивать значение указателя, квалифицированного любым порожденным от него объектом.
Параметры базового объектного типа можно присваивать в качестве значения при вызове процедуры или функции аргумент любого порожденного от базового объекта.
Dispose( указатель_на_объект )
type of (имя_объектного_типа )
type of( имя_объекта )
Dispose( указатель_на_объект, имя_деструктора( список_аргументов ) )
Деструктор – особый метод и имеет заголовок
destructor Done[( список_параметров )];
begin end; -- может иметь пустое тело
Если оно пустое => его функция – определение размера памяти уничтожаемого объекта.
Если конструктор только статический метод, то деструктор – и статический и виртуальный (желательно).
3. Файлы прямого доступа в языке программирования Pascal
У файлов прямого доступа размер каждой записи фиксирован и доступ к записям осуществляется по их адресу (AN+(i-1)*R), где R – длина записи, i – ее номер, AN - начальный адрес. Файлы прямого доступа допускают перезапись каждой записи. Обычно для описания используется тип запись. Типизированные файлы
Как видно из описания типизированные файлы состоят из записей - участков одинакового размера и типа, расположенных последовательно. Записи нумеруются с 0 и в один и тот же момент для операций чтения/записи доступна только одна из них. Постоянство размера каждой записи позволяет производить позиционирование - установку позиции чтения/записи - на любую из них.
|
Procedure Seek(Var F; N: Longint); |
помещает текущий указатель чтения/записи файловой переменной F на запись номер N |
Следует следить, чтобы позиция, на которую устанавливался указатель чтения/записи была правильной, то есть не выходила за пределы файла.
Чтение и запись для типизированных файлов производятся процедурами
|
Procedure Read(F, V1 [, V2, V3 ..]); |
читает одну или несколько записей из типизированного файла, начиная с текущей позиции чтения |
|
Procedure Write(F, V1 [, V2, V3 ..]); |
записывает в файл одну или несколько записей, начиная с текущей позиции указателя записи |
В результате выполнения любой из них файловый указатель перемещается на следующую после последней прочитанной/записанной записи (или на конец файла). Определить текущее значение файлового указателя можно с помощью функции FilePos(F), а общее количество записей - FileSize(F).
Таким образом существует возможность произвольного доступа к любой из существующих записей типизированного файла. Естественное назначение типизированных файлов - сохранение/восстановление множества (структурированных) однотипных данных.
