Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть2.doc
Скачиваний:
5
Добавлен:
26.11.2019
Размер:
382.98 Кб
Скачать

Контрольные вопросы

  1. Что такое файл? Какие существуют виды файлов?

  2. Какими стандартными процедурами и функциями располагает Object Pascal для работы с файлами?

  3. Каково должно быть содержание программы по созданию файла и его корректировки (замена элементов, добавление элементов, удаление элементов)?

  4. Дайте определение последовательного и прямого доступа к файлам.

  5. Как создать типизированный файл для хранения данных о студентах (фамилия, группа, курс)?

  6. Каковы особенности работы с текстовыми файлами?

  7. Как можно обратиться к последней строке текстового файла?

  8. Каковы особенности работы с типизированными файлами?

  9. Каковы особенности работы с нетипизированными файлами?

  10. Как подсчитать число строк в текстовом файле?

Лабораторная работа № 4 «Динамические структуры данных»

Цель работы: Получить практические навыки работы с динамической памятью, построения различных динамических структур на языке Object Pascal.

Общие сведения

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

Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. На самый первый элемент (голову списка) имеется отдельный указатель.

Из определения следует, что каждый элемент списка содержит поле данных (оно может иметь сложную структуру) и поле ссылки на следующий элемент. После ссылки последнего элемента должно содержать пустой указатель (nil).

Число элементов связанного списка может расти или уменьшаться в зависимости от того, сколько данных мы хотим хранить в нем. Чтобы добавить новый элемент в список, необходимо:

1. Получить память для него;

2. Поместить туда информацию;

3. Добавить элемент в конец списка (или начало).

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

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

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

Значением указателя, представляющего стек, является ссылка на вершину стека, каждый элемент стека содержит поле ссылки на следующий элемент.

Перед выполнением данной работы необходимо изучить особенности организации динамических структур данных, основы работы с динамической памятью [1–7].

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

Удалить последний нечетный. Если в списке нет нечетных элементов, выдать соответствующее сообщение.

Этапы решения задачи.

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

  2. Ввести число для вставки.

  3. Просмотреть список от начала до конца, определить позиции вставок и добавить требуемые элементы. Полученный список вывести на экран.

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

  5. Программа

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils;

type

PList = ^TRList; // тип указатель на динамическую структуру

TRList = record // тип-структура

data:integer; //поле данных

next, prev: PList;// поля адреса следующего и предыдущего элементов списка

end;

var

PB, PE, PK, PA: PList; // указатели для создания списка

x:integer; //элемент списка

a:integer; // элемент для вставки

F:0..1; //F=0 если нечетных элементов нет, иначе F=1

procedure CreateList;

//======== Создание двунаправленного списка =============

begin

Write('введите элемент: ');readln(x);

PB := nil;

while x<>0 do

begin

New(PA);

//если в списке элементов нет

// то добавляем первый (PB)

if PB = nil then

begin

PB := PA;

PE := PB;

PB^.prev := nil;

end

// иначе следующий (в конец - PE)

else begin

PA^.prev := PE;

PE^.next := PA;

PE := PA;

end;

// заполняем поле данных добавленного элемента

PE^.data := x;

// у последнего элемента нет следующих

PE^.next := nil;

//Вводим следующее число последовательности

readln(x);

end;

end; {of CreateList}

procedure PrintList;

//=========вывод полученного списка на экран==========

begin

writeln;writeln;

PK := PB;

while PK<>nil do

begin

x := PK^.data;

Write (x,' ');

PK := PK^.next;

end;

end; {of PrintList}

procedure InsertElem(a:integer);

//===========Вставка новых элементов ================

begin

//просматриваем список с начала до конца

PK := PB;

while PK<>nil do

begin

x := PK^.data;

//если элемент четный

if not odd(x) then

begin

New (PA); //создаем новый элемент

PA^.prev := PK; // для PA предыдущий равен текущему элементу

PA^.next := PK^.next; // следующим для PA будет следующий для PK

if PK = PE then PE := PA

else PK^.next^.prev := PA; //для следующего за PK предыдущим элементом будет PA

PK^.next := PA; // следующим для текущего элемента будет новый

PK := PK^.next; //переходим к добавленному элементу

// требуется, чтобы его не анализировать на четность

PA^.data := a; // записываем заданное число в структуру

end;

PK := PK^.next; //переход к следующему элементу списка

end;

end; {of InsertElem}

procedure DelElem(PK : PList);

//===Удаление элемента списка, на который указывает PK =======

begin

if PK = PB then begin

PB := PB^.next;

PB^.prev := nil;

end

else if PK = PE then begin

PE := PE^.prev;

PE^.next := nil;

end

else begin

PK^.prev^.next := PK^.next;

PK^.next^.prev := PK^.prev;

end;

dispose(PK);

end; {of DelElem}

procedure DeleteList; //Удаление списка и очистка памяти

begin

PK := PE;

while PE <> nil do

begin

PK := PK^.prev;

dispose(PE);

PE := PK;

end;

end; {of DeleteList}

begin {of Main program}

CreateList; //Создаем список

Write('Введите число для вставки: ');Readln(a);

InsertElem(a); //Вставляем элемент после каждого четного

writeln('Результат добавления элементов:');

PrintList; //вывод полученного списка на экран

//поиск последнего нечетного элемента списка

F := 0;

PK := PE;

while PK <> nil do

begin

x := PK^.data;

if odd(x) then begin

F := 1;

break;

end;

PK := PK^.prev;

end;

{Если F = 1, то на последний нечетный элемент указывает указатель PK}

writeln; writeln;

if F = 0 then Writeln ('В списке нет нечетных элементов!')

else begin

DelElem(PK);

//вывод полученного списка на экран

writeln('Результат удаления элемента:');

PrintList;

end;

DeleteList;//Удаляем список и очищаем память из под него

readln; readln;

end.