Указатели бывают типизированные и Нетипизированные
Описание указателей:Типизированный указатель хранит адрес переменной определенного типа.
Var
<имя указателя>:^<тип>;
Нетипизированный указатель не связанный с каким-либо конкретным типом данных
Var
<имя указателя>:Pointer;
Оба указателя могут предварительно объявляться как тип, а затем по типу описываться переменные.
Var
p: ^ real;//переменная, в которой будет записан адрес вещественного числа
Операции над указателями:
Для указателей определены операции:
- присваиванияp1 := p2;
- проверки на равенство и неравенство ifp1 = p2 then …;
- разыменование указателя p^;
- взятие адреса переменной p:= @ a.
Операция разыменования (разадресации) указателяприменяется для обращения к значению переменной, адрес которой хранится в указателе:
Var
p1: ^word;
L:word; // предварительно в p1 должен быть записан адрес отличный от nil
p1^ := 2; // по адресу указанному в p1 отослать значение 2,
p1^ := p1^ +1;
L:=2* p1^ ;
inc(p1^);
writeln(p1^);
39. Выделение динамической памяти для типизированных указателей.
Для типизированных указателей память под динамически размещаемую переменную удобно выделять процедурой New(p1), которая выделяет память под переменную соответствующего типа и присваивает указателю адрес, начиная с которого будет располагаться переменная.
Процедура Dispose(p1), наоборот освобождает память выделенную под переменную, указатель остается ему присваивается значение nill возможно его дальнейшее использование.
Для типизированного указателя можно выделять память процедурой GetMem
|
|
Для нетипизированных указателей память под динамически размещаемую переменную следует выделять процедурой GetMem, высвобождать FreeMem
ProcedureGetMem(varP:pointer; Size: Integer); - резервирует за указателем фрагмент памяти размером Size байтов.
ProcedureFreeMem(varP:pointer [; Size: Integer]); - возвращает в динамическую память фрагмент, который был зарезервированным указателем P.
FunctionSizeOf(x):Integer; - возвращает количество байтов, занимаемой переменной или типом х.
40. Динамические структуры данных:В программах чаще всего используются:
a) линейные списки
b) стеки
c) очереди
d) бинарные деревья
Элемент динамической структуры состоит из двух частей:
a) информационной, ради хранения которой и создается структура;
b) указателей, обеспечивающих связь элементов друг с другом, например:
Очередь: Начальное формирование очереди: new(beg); beg^.d := 100; beg^.s := 'Вася'; beg^.p := nil; fin := beg; | Добавление элемента в конец: new(p); p^.d := 10; p^.s := 'Петя'; p^.p := nil; fin^.p := p; fin := p; |
41. Линейные списки:Каждый элемент списка содержит ключ, идентифицирующий этот элемент.
(Односвязные, двусвязные, кольцевые)
Операции со списком:
|
|
начальное формирование списка (создание первого элемента);
добавление элемента в конец списка;
чтение элемента с заданным ключом;
вставка элемента в заданное место списка (до или после элемента с заданным ключом);
удаление элемента с заданным ключом;
упорядочивание списка по ключу.
Примерработы: program linked_list; const n = 5; type pnode = ^node; node = record { элементсписка } d : word; s : string; p : pnode; еnd; | Var beg : pnode; { указатель на начало списка } i, key: word; s: string; option: word; const text: array [1 .. n] of string = ('one', 'two', 'three', 'four', 'five'); |
42.Бинарное дерево:
Бинарное дерево — динамическая структура данных, состоящая из узлов, каждый из которых содержит кроме данных не более двух ссылок на различные бинарные деревья.
На каждый узел имеется ровно одна ссылка.
Начальный узел называется корнем дерева.
Операции:
Для бинарных деревьев определены операции:
• включения узла в дерево;
• поиска по дереву;
• обхода дерева;
• удаления узла.
Элемент дерева:
Type
pnode = ^node;
node = record
data : word; { ключ }
left :pnode; { указатель на левое поддерево }
|
|
right :pnode { указатель на правое поддерево }
end;
Поиск по дереву:
function find(root : pnode; key : word; var p,
parent :pnode) : boolean;
begin
p := root; { поиск начинается от корня }
while p <> nil do begin
if key = p^.data then { такойузелесть }
begin find := true; exit end;
parent := p; { запомнить ук-ль перед спуском }
if key <p^.data
then p := p^.left { спуститьсявлево }
else p := p^.right; { спуститься вправо }
end;
find := false;
end;
ит. д.
42. Модули – это программные единицы, служащие для размещения фрагментов программ, работают они совместно с основной программой, но компилироваться могут отдельно. Используемые модули указываются в разделе Uses.
Конструкция модуля
Unit<имя модуля>;
Interface
…
Implementation
…
Initialization
…
Finalization
…
end.
В разделе interface мы сообщаем компилятору, какие типы, переменные, конс-танты, подпрограммы должны стать доступными основной программе и/или другим модулям.
При объявлении типов и переменных они указываются полностью, а при объяв-лении глобальных подпрограмм указываются только их заголовки.
|
|
В разделе Implementation описываются подпрограммы объявленные в интерфейс-ной части.
Пример:
Требуется написать модуль, в котором реализуется комплексная арифметика.
Меню File/New/Unit – создает новый файл модуля без формы, который будет компилироваться отдельно.
unit comp;
Interface
type com=record
re,im:real;
end;
function add(x,y:com):com;
function sub(x,y:com):com;
functionmul(x,y:com):com;
function dv(x,y:com):com;
implementation
function add(x,y:com):com;
begin
add.re:=x.re+y.re;
add.im:=x.im+y.im;
end;
function sub(x,y:com):com;
begin
sub.re:=x.re+y.re;
sub.im:=x.im+y.im;
end;
functionmul(x,y:com):com;
begin
mul.re:=x.re*y.re-x.im*y.im;
mul.im:=x.re*y.im+x.im*y.re;
end;
end.
Дата добавления: 2018-05-12; просмотров: 250; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!