
- •Часть II
- •Содержание
- •Общие указания к выполнению лабораторных работ
- •Лабораторная работа № 1 «Строки, записи, множества»
- •Общие сведения.
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 2 «Процедуры и функции»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 3 «Файлы»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа № 4 «Динамические структуры данных»
- •Общие сведения
- •Задания
- •Контрольные вопросы
- •Список рекомендуемой литературы
- •Приложение
- •3.3. Спецификация подпрограмм:
- •Вывод элементов массива в начальном расположении
- •Отсутствуют
- •Процедура
- •Текст программы:
- •Контрольный пример:
Контрольные вопросы
Что такое файл? Какие существуют виды файлов?
Какими стандартными процедурами и функциями располагает Object Pascal для работы с файлами?
Каково должно быть содержание программы по созданию файла и его корректировки (замена элементов, добавление элементов, удаление элементов)?
Дайте определение последовательного и прямого доступа к файлам.
Как создать типизированный файл для хранения данных о студентах (фамилия, группа, курс)?
Каковы особенности работы с текстовыми файлами?
Как можно обратиться к последней строке текстового файла?
Каковы особенности работы с типизированными файлами?
Каковы особенности работы с нетипизированными файлами?
Как подсчитать число строк в текстовом файле?
Лабораторная работа № 4 «Динамические структуры данных»
Цель работы: Получить практические навыки работы с динамической памятью, построения различных динамических структур на языке Object Pascal.
Общие сведения
Для работы с динамическими структурами данных используются указатели. Указатели представляют собой специальный тип данных. Они принимают значения, равные адресам размещения в оперативной памяти соответствующих динамических переменных.
Списком называется структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. На самый первый элемент (голову списка) имеется отдельный указатель.
Из определения следует, что каждый элемент списка содержит поле данных (оно может иметь сложную структуру) и поле ссылки на следующий элемент. После ссылки последнего элемента должно содержать пустой указатель (nil).
Число элементов связанного списка может расти или уменьшаться в зависимости от того, сколько данных мы хотим хранить в нем. Чтобы добавить новый элемент в список, необходимо:
1. Получить память для него;
2. Поместить туда информацию;
3. Добавить элемент в конец списка (или начало).
Элемент списка состоит из разнотипных частей (хранимая информация и указатель), и его естественно представить записью. Перед описанием самой записи описывают указатель на нее.
Стек – упорядоченный набор элементов, в котором добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека.
В любой момент времени доступен лишь один элемент стека – верхний. Извлекать элементы из стека можно только в порядке, обратном их добавлению в стек (первым пришел, последним ушел).
Значением указателя, представляющего стек, является ссылка на вершину стека, каждый элемент стека содержит поле ссылки на следующий элемент.
Перед выполнением данной работы необходимо изучить особенности организации динамических структур данных, основы работы с динамической памятью [1–7].
Пример. В двунаправленном списке записаны целые числа, за которыми следует ноль (ноль в список не входит). После каждого четного числа вставить в список заданное с клавиатуры число (Примечание: добавленные элементы на четность не проверять).
Удалить последний нечетный. Если в списке нет нечетных элементов, выдать соответствующее сообщение.
Этапы решения задачи.
Создать двунаправленный список: элементы в список добавляются до тех пор, пока не введен ноль.
Ввести число для вставки.
Просмотреть список от начала до конца, определить позиции вставок и добавить требуемые элементы. Полученный список вывести на экран.
Определить позицию последнего нечетного и удалить его. Если в списке нет нечетных элементов, выдать соответствующее сообщение.
Программа
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.