Реферат: Ссылочный тип данных. Динамические объекты.

динамическая переменная должна порождаться явно с помощью процедуры new;

для доступа к значениям динамической переменной используется переменная с указателем.

4. Пример.

Рассмотрим следующую задачу. Есть внешний файл, представляющий учреждение, состоящий из записей о служащих учреждения. О каждом служащем известно ФИО, пол, год рождения, должность (лаборант, техник, инженер, научный сотрудник, администратор, начотдела, замдиректора, директор), специальность (математик, программист, механик, электроник, экономист, юрист, физик, химик), номер отдела (1 .. 32), где работает служащий, характеристика. Требуется определить отдел, где работает больше всего научных сотрудников. В отделе не более 50 сотрудников.

Структура программы может быть описана так:

program выбор (учреждение, output);
begin
for i:= 1 to 32 do
begin{выбрать из файла всех сотрудников из одного отдела}
{если число нс в текущем отделе больше, чем в
результирующем, то взять в качестве нового значения
результирующего массива значение текущего}
end
{вывод номера отдела}
end

Очевидно, что эффективность этой программы будет значительно зависеть от того как мы реализуем "взять в качестве нового значения результирующего массива значение текущего". Простая "перекачка" была бы самым неудачным решением.

program выбор (учреждение, output);
const n=50;
type служащий = record имя:packed array [1..20] of char;
возраст: 1920..1980;
пол:(М,Ж);
должность:(лб,тх,инж,нс,адм,завотд,замдир,дир);
специальность:(мтмтк,пргрммст,мхнк,элктрнк,
экнмст,фзк,хмк,юрст);
отдел: 1..32;
характеристика:packed array[1..1024]of char
end;
var отделтекущий, отделрезультат,R:^array [1..50] of служащий;
номотдела,номрезотдела:1..32;
сотрудник:служащий;
числонс,maxнс,i,j:integer;
учреждение:file of служащий;

begin maxнс:=0;
{порождение динамических массивов}
new(отделтекущий);new(отделрезультат);
for i:= 1 to 32 do
begin{выбрать из файла всех сотрудников из одного отдела}
номотдела:=i;
{подготовка файла учреждение к очередному просмотру}
reset(учреждение) {установили режим чтения};
j:=0; числонс:=0;
while not eof(учреждение) do
begin read(учреждение,сотрудник);j:=j+1;
if сотрудник.отдел=i then
begin отделтекущий^[j]:=сотрудник;
if сотрудник.должность=нсthen числонс:=числонс+1
end
end;
{если число нс в текущем отделе больше, чем в результирующем, то
взять в качестве нового значения результирующего массива значение
текущего}
if числонс>maxнс then
begin {перестановка ссылок}
maxнс:=числонс; номрезотдела:=номотдела;
R:=отделрезультат;
отделрезультат:=отделтекущий;
отделтекущий:=R
end
end
{вывод номера отдела}
write(maxнс,номрезотдела); writeln
end.

Следует обратить внимание в этой программе на

перестановку ссылок, что избавляет нас от необходимости перекачки значений, из одного массива в другой;

нельзя путать окно файла учреждение^ и ссылочную переменную на объекты типа служащий.

5. Уничтожение динамических объектов

Если в ходе вычислений какой-то динамический объект стал не нужен то его можно уничтожить и освободить занимаемую им память. Уничтожение динамического объекта происходит с помощью процедуры

dispose (<имя ссылочной переменной>)

В результате объект, на который указывала ссылочная переменная, исчезает ,а значение переменной становится неопределенным. Сама ссылочная переменная при этом сохраняется.

С появлением процедуры dispose в Pascal становится реальная опасность, о которой мы говорили в начале лекции - уничтожение объекта, на который указывают несколько переменных.

new(p); p^:=3;

d:=p; dispose(p);

Здесь ошибка в том, что в результате описанных действий переменная d указывает на объект, который прекратил свое существование.

К-во Просмотров: 260
Бесплатно скачать Реферат: Ссылочный тип данных. Динамические объекты.