Функции. Использование динамических переменных

Страницы работы

Содержание работы

Функции

МахАvаil - определить в параграфах объем максимального по размеру блока свободной памяти в ДРП. Функция возвращает целочисленное значение.

МеmАvаil - определить объем свободной области ДРП в параграфах. Функция возвращает целочисленное значение.

Рассмотрим механизм использования указателей и стандартных средств работы с динамическими структурами на следующем примере.

Пусть в программе имеется описание:

Соnst Мах = 30;

Туре Reс = record

Name   : string[20];

Grирра : integer;

Nomer : byte

епd;

Var М : аrrау[1.. Мах] оF ^Rес;

Здесь М - массив указателей на записи типа Rес. Символ ^ перед идентификатором означает, что это указатель. Если символ расположен после идентификатора, то речь идет об объекте, на который ссылается указатель. Например, если М - массив из ^Rес

(т.е. из указателей), то М[1] - указатель, а М^[1] - объект, на который ссылается указатель. В ПАСКАЛе имеется стандартное значение Ni1, которое может быть присвоено указателю любого типа. Ni1 говорит об отсутствии динамической переменной и может быть присвоен указателю для обозначения того, что нет подходящего для использования указателя. Значение Ni1 - это два нулевых слова.

Чтобы работать с динамической переменной, ее надо создать. Для этого используется процедура New. Фактически процедура New создает копию данных указанного в области параметров типа в области ДРП. Обычно процедура New выполняется в программе много

раз, и образование каждой новой динамической переменной вызывает сокращение свободной части ДРП на количество байтов, занимаемое новым объектом.

Для определения объема свободной части области ДРП предназна-

чена функция МеmАvаil, возвращающая целочисленное значение, равное количеству свободных параграфов. Если количество свободной памяти окажется больше 32 К байт, то возвращаемое значение будет отрицательным. Чтобы сделать результат более наглядным, можно вместо МеmАvаil использовать следующую процедуру [15]:

Рrосеdиrе РМет;

Vаг А : rеа1;

begin

А :=  МетАvаil;

if А  <= 0.0 then  А :=А + 65536. 0;

writeln('Свободная часть ДРП=’, А: 7)

епd;

Когда динамическая переменная становится не нужна, ее можно убрать  из  области ДРП с помощью стандартной процедуры Dispose. Освободившееся место становится доступным для размещения  других

объектов,  однако это связано с некоторыми трудностями. При многократном применении процедур создания и уничтожения объектов в области  ДРП может появиться значительное количество внутренних освободившихся участков памяти. В ПАСКАЛе  нет  средств,  чтобы объединить эти участки в единое целое и сместить в начальную или конечную  часть  области ДРП. Однако свободные участки можно использовать без решения этой проблемы программным путем. Для этого все создаваемые и уничтожаемые динамические переменные должны принадлежать одному и тому же типу или иметь один размер.

10. 4.  ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКИХ ПЕРЕМЕННЫХ

Указатели являются эффективным средством построения  списков. Списком называется упорядоченная структура, каждый элемент которой содержит ссылку, связывающую его со следующим элементом. Для организации списков используются записи, состоящие из двух смысловых частей: основной и дополнительной. Основная часть содержит, подлежащую обработке информацию, в дополнительной находится указатель  на следующую запись списка. Начало списка указывается в переменной, которая всегда присутствует  в  программе  обработки списков.  Если в списке нет элементов, т. е. список пустой, значение этой переменной равно Ni1. Если список не  заполнен,  последний элемент содержит в дополнительной части значение N11.

Наибольшее  распространение получили два вида списков – стеки и очереди.

Стек - это  список  с  одной  точкой доступа к его элементам, которая  называется  вершиной стека. Добавить или убрать элемент можно только через его вершину. Принцип работы стека: "последний

пришел - первый  вышел".  Механизм  работы  стека показан  на рис. 10.2.

        a       б      в      г     д      е

C

B

A

Рис. 10. Р. Состояние стека: а - исходное; б - после добавления элемента А; в - после добавления элемента В; г – после добавления элемента С; д - после удаления элемента С; е - после удаления элемента В.

Основные операции над стеком: формирование стека, добавление, удаление и просмотр элементов списка. Для их демонстрации используем следующее описание:

Туре

Ukaz  = ^Stack;

Stack  = record

Inf   : integer;  {информационная часть}                                     

Next : Ukaz {вспомогательная часть}

end;

Var

Top, Kon, NewElement

Value : integer;

Организация стека

Procedure SozdS;

{* Тип элементов стека - integer. *}

{* Ввод элементов прекращается.  *}

{* если введено значение 999     *}

Begin

Top := Nil;

while True do

begin

read (Value);

if  Value = 999 then Exit;

New(Kon);

Kon^. Next : = Top;

Kon^. Inf := Value;

Top := Kon

end

end;

Добавление  элементов в стек

Procedure DobavS;

{* если значение добавляемого   элемента *}

{* равно 999,  происходит выход из процедуры *}

begin

while True do

begin

read (Value);

if Value = 999 then Exit;

New(Element);

NewElement^. Next : =  Top;

NewElenent^. Inf := Value;

Top :-= NewElement

end

end;

Удаление элементов из стека

Procedure UdalS;

begin

Top := Top^. Next

end;

Просмотрэлементовстека

Procedure RaspS;

 {* Вывод элементов стека производится *}

{* в обратном порядке                 *}

begin

Kon := Top;

while Kon <> Nil do

begin

writeIn (Kon^. Inf);

Kon : = Kon^. Next

end

end;

При использовании стека могут возникать следующие ситуации, которые приводят к непредсказуемым последствиям:

переполнение стека (память для стека исчерпана); антипереполнение (попытка извлечения элемента из пустого стека).

     Пользователь должен сам предусмотреть средства предупреждения возникновения таких ситуаций в программе.

Другим видом списка является очередь. Очередь - это структура данных, в один конец которой добавляются элементы, а с другого конца изымаются. Принцип работы очереди: "первый пришел – первый вышел". Для организации такой структуры используются две переменные: для указания начала и конца очереди. Назовем их соответственно Left и Right. При добавлении элемента в очередь он располагается в памяти в соответствии со значением Right, а значение Right  изменяется и указывает на следующее свободное место памяти. Выборка элемента из очереди происходит исходя из значения N,  которое изменяется и указывает на следующий элемент очереди. Очевидно, что когда очередь пуста, значение Right  равно значению Left. Механизм работы очередей показан на рис. 10. 3.

   а               б               в              г              д              е                                                                                                                                                         

A

B

A

C

B

A

C

B

C

  Рис. 10. 3, Состояние очереди: а - исходное; б - после добавления элемента А; в - после добавления элемента В; г – после добавления элемента С; д - после удаления элемента А; е - после удаления элемента В.

Основные операции над очередью те же , что и над стеком . Для их демонстрации используем следующее описание:

Туре

Ukaz  =  ^Stack;

Stack  =  record

Похожие материалы

Информация о работе