Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_IVT.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
11.58 Mб
Скачать

5. Файлы

Файл - это поименованная область памяти на каком-либо носителе информации, предназначенная для хранения данных. Этим носителем может быть гибкий или жесткий диск (магнитная лента).

Внешние файлы должны быть описаны в разделе описаний программы. Описание файлов в общем случае имеет следующий вид:

type <имя типа> = file of <тип компонент>;

var <имя файловой переменной>:<имя файла>; или

var <имя файловой переменной> file of <тип компонент>;

Файловая переменная (обозначим ее как f) служит для доступа к файлу.

В Турбо-Паскале существуют следующие категории файлов:

-типизированные; -нетипизированные; -текстовые.

Стандартные процедуры для работы с файлами.

АSSIGN (f, '<имя внешнего файла>') - эта процедура связывает файловую переменную f с именем внешнего файла на диске.

RESET (f) - процедура открывает существующий файл f для чтения.

REWRITE (f) - создает и открывает новый файл для записи.

APPEND (f) - открывает существующий файл для добавления данных.

READ (f, X1,...,Xn) или READLN (f, X1,...,Xn)- считывает из файла f значения переменных X1 … Xn.

WRITE (f, X1,...,Xn) или WRITELN (f, X1,...,Xn) - записывает в файл f значения переменных X1 … Xn.

CLOSE (f) - закрывает файл f после окончания работы с ним.

Пример работы с файлами: прочитать из текстового файла dan.txt радиус и высоту цилиндра вычислить и напечатать его объем с помощью принтера (логическое имя принтера – lst):

program zilindr;

uses crt;

var r, h, v: real;

f: text;

begin clrscr;

assign(f, ‘dan.txt);

reset(f);

readln(f,r,h);

close(f);

v:=3.14*r*r*h;

writeln(‘объем цилиндра = ‘, v:2:3); // вывод на экран

assign(f, ‘lst’);

writeln(f, (‘объем цилиндра = ‘, v:2:3); // вывод на принтер

close(f);

readkey;

end.

4. Динамические структуры данных: списки, стеки, очереди.

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

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

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

Для работы с динамическими данными используется специальный статический тип данных − указатели (величины ссылочного типа). Указатель содержит адрес ячейки −номер первого байта в динамической памяти, с которого размещается значение динамической величины. Сам указатель, как статическая величина, располагается в статической памяти (В Паскале - 4 байта).

В качестве значения указателя может быть стандартная константа nil, обозначающая пустую ссылку, т.е. ссылку, которая ни на что не указывает.

Стандартная процедура dispose(имя указателя) позволяет освободить динамическую память от соответствующего динамического объекта, например, если динамический массив p^ больше не нужен, то оператор dispose(p) удаляет его из памяти.

Кроме динамических массивов широко применяются для решения задач связанные списки. Связанный список − это последовательность звеньев (записей) произвольной длины, в которой каждое звено содержит данные и указатель на следующее (или на предыдущее) звено. Последнее звено содержит пустой указатель “nil”:

Список располагается в динамически распределяемой памяти, в статической памяти хранится лишь указатель на заглавное звено

Связанный список

Здесь Inf — информационная часть звена списка (величина любого простого или структурированного типа, кроме файлового), Next — указатель на следующее звено списка; First — указатель на заглавное звено списка.

Если указатель ссылается только на следующее звено списка (как показано на рисунке и в объявленной выше структуре), то такой список называют однонаправленным, если на следующее и предыдущее звенья — двунаправленным списком. Если указатель в последнем звене установлен не в Nil, а ссылается на заглавное звено списка, то такой список называется кольцевым. Кольцевыми могут быть и однонаправленные, и двунаправленные списки.

Procedure V_Spisok(Pred : U; X : BT);

Var Vsp : U;

Begin

New(Vsp); {Создаем пустое звено}

Vsp^.Inf := X; {Заносим информацию}

Vsp^.Next := Pred^.Next; {Теперь это звено ссылается на то, что было следом за звеном Pred}

Pred^.Next := Vsp; {Теперь новое звено встало вслед за звеном Pred}

End;

Procedure Iz_Spiska(Pred : U; Var X : BT);

Var Vsp : U;

Begin

Vsp := Pred^.Next; {Забираем ссылку на удаляемое звено}

{Удаляем звено из списка, перенаправив ссылку на следующее за ним звено}

Pred^.Next := Pred^.Next^.Next;

X := Vsp^.Inf; {Забираем информацию из удаляемого звена}

Dispose(Vsp); {Уничтожаем звено}

End;

Стек — динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека.

По определению, элементы извлекаются из стека в порядке, обратном их добавлению в эту структуру, т.е. действует принцип "последний пришёл — первый ушёл".

Наиболее наглядным примером организации стека служит детская пирамидка, где добавление и снятие колец осуществляется как раз согласно определению стека.

Операции: добавление элемента в стек; удаление элемента из стека; проверка, пуст ли стек; просмотр элемента в вершине стека без удаления; очистка стека.

Очередь — это информационная структура, в которой для добавления элементов доступен только один конец, называемыйхвостом, а для удаления — другой, называемый головой. В англоязычной литературе для обозначения очередей довольно часто используется аббревиатура FIFO (first-in-first-out — первый вошёл — первым вышел).

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

Операции: добавление элемента в очередь (помещение в хвост); удаление элемента из очереди (удаление из головы); проверка, пуста ли очередь; очистка очереди.

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