
- •Часть 2
- •Занятие №1 Программирование прикладных задач
- •Программа занятия
- •Контрольные вопросы
- •Методические указания
- •Занятие №2 Программирование списков
- •Программа работы
- •Контрольные вопросы
- •Варианты индивидуальных заданий
- •Методические указания
- •Dispose(pe); {освобождает 4 байта в куче}
- •Занятие № 3 Объектно-ориентированное программирование
- •Программа работы
Методические указания
К п.1.
Оставшаяся свободной область памяти частично или полностью может быть занята динамической памятью. В ней размещаются динамические переменные. Эта часть памяти называется “heap” (“куча”)
Динамические переменные создаются и уничтожаются во время выполнения программы в отличие от статических переменных, память под которые резервируется в сегменте данных еще на этапе компиляции.
Динамические переменные не имеют имени. Для работы с ними введены специальные ссылочные типы, или указатели. По существу указатель - это адрес, начиная с которого динамическая переменная размещена в памяти.
Указатель связывается не с конкретной переменной, а с определенным типом данных. Для описания указателя используется знак “^”.
Пример описания
Type
IP = ^Integer; {тип указателя на целое}
P = ^Zap; {тип указателя на запись Zap}
Zap = record
...
end;
Var
Pointer1 : ^Char; {указатель на Char}
Pointer2 : ^Real; {указатель на Real}
В Паскале определена лишь одна операция над указателями - присваивание. Можно присвоить значение одного указателя другому указателю на тот же тип данных. Существуют также нетипизированные указатели, которые совместимы с указателями на любой тип. Для объявления переменной нетипизированным указателем нужно употреблять ключевое слово Pointer
Var
TypePointer: Pointer;
Значением указателя может являться либо адрес, либо значение NIL. NIL-специальное значение, обозначающее пустой указатель, который ни на что не указывает.
Для того, чтобы выделить место в куче под динамическую переменную, используется процедура NEW.
type
PE = ^integer;
begin
...
New(PE);
...
end.
В приведенном примере в куче выделяется 4 байтf (в соответствии с размером типа integer) и адрес начала этой области возвращается в указателе PE. Для обращения к полученной динамической переменной используется конструкция вида <имя указателя>^:
PE^:=3.1415;
PE^:=sqr(PE^);
Для освобождения динамической памяти используется процедура Dispose -
Dispose(pe); {освобождает 4 байта в куче}
Для подготовки к выполнению индивидуального задания нужно рассмотреть следующие примеры
Пример 1 Изобразить состояние динамических переменных по каждой строчке операторов:
var p1,p2,p3:^Integer;
begin
new(p1);
p1^ := 2;
new(p2);
p2^ := 3;
P1:= P2;
P2^:=nil;
Dispose(P2);
Пример 2 Что будет выведено на экран?
Program DPointer;
var p1,p2,p3:^Integer;
begin
p1:=NIL; p2:=NIL; p3:=NIL;
New(p1); New(p2); New(p3);
p1^:=2; p2^:=4;
p3^:=p1^+Sqr(p2^);
writeln(p1^:3, p2^:3, p3^:3);
p1:=p2;
writeln(p1^:3, p2^:3, p3^:3);
end.
Пример 3. Изобразить структуры списков:
Односвязный список
Стек
Очередь
Кольцо
Двухсвязный список.
Пример 4: Изобразить состояние динамических переменных по каждой строчке операторов:
type tu= ^ tells;
type tells =record
i: integer;
n:tells;
end;
els, w: tu;
begin
new(els,w);
els^.I := 1;
els^.n := nil;
w:= els;
els:= nil;
К п.2. Одной из областей, где необходимо использование указателей, является работа со списками, например, односвязными и двусвязными. Списки имеют начало и конец. Основные действия: создание, просмотр, вставка и удаление элемента в указанном месте списка.
Широкое распространение среди односвязных списков получили такие динамические структуры данных, как стеки, очереди и кольцеобразные списки. Стек организован таким образом, что программе доступна лишь его вершина: оттуда можно взять элемент или записать его туда. Таким образом, элементы можно извлечь из стека в порядке, обратном порядку их записи -"последний вошел - первый вышел". Очередь же реализует другой вариант доступа к данным - "первый вошел - первый вышел’. Новый элемент добавляется в конец очереди, а выбирается первый. Если последний элемент очереди связать с первым элементом, то получится замкнутый, кольцеобразный список..
Для работы с такими структурами при выполнении индивидуального задания рекомендуется использовать базовые процедуры:
создать список;
очистить список;
поместить элемент в список;
взять (удалить) элемент из списка;
просмотреть элементы списка.