Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№2.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
247.81 Кб
Скачать

3.5. Вставка записей в файл

Эта операция предполагает увеличение размеров набора данных и передвижение признака end of file. Она осуществляется так же, как слияние файлов – с использованием временного набора. Последовательность действий такая:

1. Ввод номера (Num) вставляемой записи;

2. Перепись из исходного файла f начальных записей (от 0 до номера, меньшего Num) во временный файл;

3. Передача вставляемой записи (с номером Num) во временный файл.

4. Пока нет конца файла f переписывать из него во временый файл оставшиеся записи ("хвост").

  1. Перепись временного файла на место исходного файла f.

Динамическое распределение памяти. Указатели и списки

Все рассмотренные ранее типы данных - статические. Компилятор выделяет для них память до выполнения программы, после анализа ее текста. При этом достаточно проверить раздел Var текста программы и выделить для переменных соответствующие объемы памяти, которые помечаются именами переменных.

Существуют задачи, в которых заранее не известно количество объектов, обрабатываемых программой (слабо заполненные таблицы, строки, слова, очереди, списки и т.д.). Для таких задач целесообразно выделять память объектам в процессе выполнения программы, т.е. динамически.

Динамические переменные - это переменные, которым выделяется память и присваиваются значения непосредственно при выполнении программы.

Для динамического размещения необходимо задавать адреса данных особым собразом, т.к. в разделе Var нельзя описать динамические переменные непосредственно. Это делается с помощью указателей (ссылок, Pointer).

Указатель описывается обычно в разделе Type в виде:

Type

имя = ^ тип_объекта;

Пример.

Type

p = ^ Char;

q = ^ Integer;

Здесь p и q – указатели для символа и целого числа соотвественно. Используя эти типы, можно описать, например, следующие переменные:

Var

pt,r: q; { Ссылки на динамические данные типа Integer}.

Данные типа "указатель" (адреса) нельзя вывести на экран или печать с помощью Write. Например, не допустим оператор Write(pt);

Данное, связанное с указателем, имеет имя вида:

имя_указателя^

Пример.

pt^, r^ – данные типа Integer, адреса которых определяются указателями pt и r.

Для них допустимы операторы Read и Write.

Пример.

Read (pt^ );

Существует особое значение указателя: Nil ("ничего"). Это значение не указывает ни на какую переменную.

При работе с динамическими переменными используются специальные процедуры:

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

Пример.

New (pt); – выделено место для одной переменной целого типа.

Для задания значения динамической переменной используются пара операторов вида:

New (ук);

Read (ук^ );

Их работу иллюстрируют рисунками вида рис.7.

Рис.7. Запись в память значения динамической переменной,

которое вводится с клавиатуры.

Другой способ задания значения динамической переменной - с помощью оператора присваивания. Он иллюстрируется рис.8.

New (ук);

ук^ := выражение;

Рис.8. Запись в память значения динамической переменной,

которое вычисляется в операторе присваивания

2) Dispose (указатель): – освобождает место в памяти, занятое переменной, адрес которой задан указателем.

Пример.

Dispose (r);

Процедура выполняется, если указатель определен (r <> Nil).

Освобождение места в памяти с помощью процедуры Dispose выполняется, если переменные обработаны и нужно использовать это место для размещения других данных. Такой "мусор" периодически удаляют, чтобы он не мешал (не занимал напрасно динамическую память).

Program Pointers;

Type

point =^ integer;

Var

i,j:Integer;

p,q:point;

Begin

New(p); { Выделение памяти для р }

New(q); { Выделение памяти для q }

i:=5; { Запись 5 на место i }

p^:=7; { Запись 7 на место p }

q^:=p^ -i; { Запись 7-5=2 на место, }

{ адрес которого хранится в q }

q:=p; { Ссылки q и p стали одинаковыми }

{ Объект, адрес которого хранился в q, потерян,

{ стал "мусором" }

End.

При работе с указателями и списками необходимо следить, чтобы связи не терялись и не оставалась "куча мусора". В последнем случае вместо выполнения оператора: q:=p; надо было сделать так:

Dispose(q);

q:=p;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]