русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2014-11-27; просмотров: 702; Нарушение авторских прав


 

Эта операция предполагает увеличение размеров набора данных и перемещение признака End Of File. В большинстве случаев новую запись допустимо поместить в конец набора данных, а потом новый набор можно, например, отсортировать.

Для добавления записей в конец текстового файла служит процедура Append, описанная в начале этого раздела.

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

 

Seek(файл, FileSize(файл)),

 

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

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

 

1. Ввести номер (Num) записи, после которой должна быть вставлена новая.

2. Переписать все записи файла, начиная с номера (Num+1), на одну позицию к концу файла.

3. Записать в файл новую запись по номеру (Num+1).

4. Установить текущую позицию в файле после последней записи в нем и закрыть файл.


 

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

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

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



В таких задачах целесообразно выделять память данным в процессе выполнения программы, т.е. динамически.

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

Для динамического размещения необходимо задавать адреса данных особым образом, т.к. в разделе 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. Например,Write(pt^) соответствует выводу значения переменной целого типа, на которую указывает pt.

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

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

 

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

Пример. New(pt); – выделено место для одной переменной целого типа и адрес этой переменной находится в pt (говорят, что pt указывает на эту переменную).

Теперь этой переменной может быть задано значение одним из известных способов: чтением или присваиванием, например

New(pt);

Read(pt ^);

или

New(r);

r^ := выражение соответствующего указателю типа.

2) Dispose(указатель); – освобождает место в памяти, занятое переменной, на которую указывает указатель (адрес которой хранится в переменной-указателе). Перед вызовом процедуры указатель должен быть определен (не равен Nil), например, с помощью процедуры Newили оператора присваивания.

 

Пример. Dispose (r);

 

Освобождение места в памяти с помощью процедуры Dispose следует выполнять после того, как соответствующие переменные обработаны и место, занимаемое ими, можно использовать для размещения других данных. После выполнения процедуры 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:

 

Dispose(q);

q := p;

 

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

 

Program PrimPoint;

Const

Rmax = 10000;

Imax = 15000;

Type

tRe = array [1..RMax] of Real; {Тип для массива вещественных }

tIn = array [1..IMax] of Integer; {Тип для массива целых }

pR = ^tRe; { Указатель на тип массива вещественных }

pI = ^tIn; { Указатель на тип массива целых }

Var

k, i, Max : integer;

f : pR; {Переменная-Указатель на тип массива вещественных }

g : pI; { Переменная-Указатель на тип массива целых }

Begin

New(f); {Выделяется блок памяти для хранения всего массива вещественных}

{Переменная-Указатель fуказывает на начало этого блока }

{f^ – означает весь массив, f^[i] – означает i-ый элемент массива}

For i := 1 to Rmax do

begin

Read(f^[i]); {Читаем i-ый элемент массива }

{ Здесь выполняется обработка массива вещественных чисел }

end;

Dispose(f);{ Освобождаем память, занимаемую массивом вещественных }

New(g); {Выделяется блок памяти для хранения всего массива целых}

{ Переменная-Указатель g указывает на начало этого блока }

{g^ – означает весь массив, g^[i]– означает i-ый элемент массива}

Read(g^[1]); {Читаем i-ый элемент массива }

Max := g^[1];

For i := 2 to Imax do

Begin

Read(g^[i]);

If g^[i] > Max then

Max := g^[i];

End;

WriteLn(Max);

End.

 



<== предыдущая лекция | следующая лекция ==>
Удаление записей из файла | Использование указателей. Списки


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.602 сек.