- •Обращение к полям записи
- •Оператор with
- •Записи с вариантами
- •Рекурсия
- •Вычислить n!
- •Вычисления чисел Фибоначчи
- •Вычисления значений формул
- •Быстрая сортировка
- •Процедуры и функции общие для всех типов файлов
- •Режимы работы файла
- •Опция компиляции
- •Процедуры и функции модуля system
- •Процедуры и функции для типизированных файлов
- •Как добиться прямого доступа??
- •Стандартная конструкция редактирования файла
- •Тектовые файлы
- •Процедуры и функции для текстовых файлов
- •Способы считывания
- •Бинарные файлы
- •Работа с динамической памятью
- •Pointer
- •Дерево Absolute
- •Типизированные ( переменные ) указатели
- •Процедуры работы с кучей
- •Динамические массивы
- •Связные списки
- •Упорядоченные списки
- •Деревья
Pointer
Var p:pointer;
Sizeof(pointer) = 4 байта
Pointer = Сегмент:Смещение (word:word)
P:=nil(Нулевой адрес)
Операции с pointer:
P:=q;
P<>Q илиp=q
Нельзя read Иwrite
P^ - операция разыменования. Позволяет обратиться к значению по адресуP. (x:=p^)
P:=@x- Берется адрес переменнойx
Addr(x):pointer. @x=addr(x)
Function seg(x):word ( возвращает сегмент)
Functionofs(x):word(Возвращает смещение)
Functionptr(s,o:word):pointer(Возвращает адрес по заданному смещению и сегменту)
Дерево Absolute
Var memory:word absolute $1004:$0000;
St:string[30];
Stlen:byte absolute st;
A:integer;
B: array [1..10] of byte absolute a;
{absolute позволяет разместить переменную по заданному адресу}
Begin
Memory:=16;
St:=’123456789a’
Stlen:=5;
Writeln(st); {выведет ‘12345’, ибо мы ограничили переменной stlen=5 размер который выделится для стринга}
End;
Типизированные ( переменные ) указатели
Ссылочный тип= ^базовый тип
Type mass=array[1..100] of byte;
Var
pInt:^integer;
pbyte:^byte;
pmass:^mass
begin
pint^:=5;
pbyte^:10;
pmass^[pint^]:=pbyte^;
Процедуры работы с кучей
New(p) – резервирует в динамической памяти свободный участок для размещения динамической переменной. В параметр Р превращается указатель на данный участок памяти. (newработает с типизированными указателями)
Getmem(p:pointer;size:word) – резервирует участок размераsizeв байтах
Dispose(p:pointer) - освобождает участок памяти на который указывает Р
Freemam(P:pointer;size:word) – освобождает память по адресуPобъемомsize
Proceduremark(p:pointer); - запоминает текущее значение указателя, но память под указатель не резервируется
Procedurerelean(p:pointer); - Позволяет освободить кучу от указателя Р (запомненного с помощьюmark(p)) и до конца.
Functionmaxavail:longint– возвращает размер в байтах максимального свободного участка памяти
Functionmemavail:longint– Возвращает суммарный объем всех свободных участков куч.
Var x:^Boolean;
Y:Boolean;
Begin
New(x);
X^:=true;
Y:=not x^;
Dispose(x);
Rwiteln(y);
End;
Динамические массивы
Type vector = array[1..1]of integer;
Var a1,a2=^vector;
P:pointer;
N,j,s:integer;
Begin
Writeln(‘Введите число элементв’);
Readln(n);
Mark(p); {Указатель на текущий участок}
Getmem(a1,n*sizeof(integer));
For i:=1 to n do readln(a^[i]);
S:=0;
For i:=1 to n do begin s:=s+a1^[i];
End;
Связные списки
Связный список – это последовательность из nузлов, причем в каждом из них есть поле для связи со следующим (ссылка \ указатель)
Достоинства:
Не требует непрерывного участка памяти для размещения
Операция вставки и удаления происходят гораздо быстрее, чем в массивах
Помогают для реализации графов, деревьев
Недостатки:
Последовательный доступ
В паскале единственным исключением из правила опережающего описания является описание связного списка.
Type sp=^el
El=record
Data:integer;
Next:sp;
End;
Соглашения:
Список без головы (первый узел – первое значение)
Список с головой(первый узел не содержит значимых данных. Только ссылку)
Список с хвостом(последний узел списка не имеет данных, ссылается или на nilили на самого себя)
Function seatch(l:sp; M:integer):sp; {Поиск элементов}
Var [:sp;
B:Boolean;
Begin
P:=l;
B:=true;
While p<>nil and b do
If p^.a=m then b=false
Else p:=p^.n;
Search:=p;
End;
Function tolast(l:sp):sp;
Var p:sp;
Begin
P:=l;
While p^.n<>nil do p:=p^.n;
Tolast:=p;
End;