Ссылочный тип данных. Динамические объекты.
Категория реферата: Рефераты по математике
Теги реферата: биология 6 класс сонин, доклад
Добавил(а) на сайт: Ustimovich.
Предыдущая страница реферата | 1 2
3. Действия над ссылками
Над значениями ссылочного типа нет операций, которые бы давали значения ссылочного типа. Над значениями ссылочного типа определены только операции присваивания и сравнения на равенство и не равенство. В операторе присваивания вида p:=e ссылочным выражением может быть: - пустая ссылка nil; -ссылочная переменная; -ссылочная функция (т.е. функция чье значение - ссылка). Значения левой и правой частей должны ссылать на объекты одного и того же типа.
Пусть var p, g :^integer. Например, p:=q; приводит к тому что и p и q указывают на один и тот же объект, но если при этом объект, на который указывала ссылочная переменная p, будет утерян, то действия с q станут некорректными!
Неправильно было бы написать p:=q^ т.к. слева переменная ссылочного типа, а справа значение целого типа; p^:=3.0 - опять несоответствие типов (integer и real); p^:=nil - слева переменная целого типа, справа - ссылочное значение.
Отличия использования динамических переменных:
динамические переменный представлены через статические переменные ссылочного типа;
динамическая переменная должна порождаться явно с помощью процедуры 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 указывает на объект, который прекратил свое существование.
Скачали данный реферат: Parmen, Ежов, Эрдниев, Erofej, Janaev, Kornienko.
Последние просмотренные рефераты на тему: скачать реферат бесплатно без регистрации, служба реферат, дипломная работа формирование, 5 баллов.
Предыдущая страница реферата | 1 2