- •Тема 1. Указатели и динамические переменные
- •Контрольные вопросы
- •Лабораторная работа 1. Организация списков с помощью динамических переменных
- •Тема 2. Модули
- •Initialization
- •Interface
- •Implementation
- •Контрольные вопросы
- •Лабораторная работа 2. Создание модуля для работы с динамическим списком
- •Тема 3. Объектно-ориентированное программирование
- •Контрольные вопросы
- •Лабораторная работа 3. Создание класса – списка
- •Interface
- •Implementation
- •Библиографический список
Контрольные вопросы
Какие переменные программы называются статическими, где они размещаются и на каком этапе под них выделяется память?
Какие переменные называются динамическими, где они размещаются и на каком этапе под них выделяется память?
Что представляет собой значение указателя?
Адреса каких объектов могут хранить типизированные указатели и как они описываются?
Адреса каких объектов могут хранить нетипизированные указатели и как они описываются?
Каковы характеристики операции получения адреса?
Какие функции используются для работы с адресами?
Какие процедуры используются для работы с указателями?
Каким образом можно присвоить значение переменной-указателю?
Что такое ссылка на переменную?
Какие структуры данных называют динамическими?
Что такое список и как он реализуется с помощью динамических переменных? Как можно описать список в программе?
Какие операции определены для работы со списком?
Лабораторная работа 1. Организация списков с помощью динамических переменных
Задание
Опишите следующие подпрограммы работы со списком: Create(L)– создание пустого спискаL;InsertFirst(L, v)– включение элемента со значениемvв начало спискаL;Size(L)–определение количества элементов списка L; WriteList(f, L)– вывод в файлfэлементов спискаL;Clear(L)– удаление всех элементов спискаL. Тип элемента списка указан в столбце 2 таблицы вариантов заданий (табл. 1).
Составьте подпрограмму или подпрограммы обработки списка, указанные в столбце 3 табл. 1. Спецификации всех подпрограмм приведены в табл. 2.
С использованием разработанных подпрограмм составьте программу работы со списками в соответствии с вашим вариантом задания (столбец 4).
В программе необходимо:
сформировать исходные списки с помощью процедур CreateиInsertFirst, вводя элементы из текстового файла;
определить размеры исходных списков с помощью процедуры Size;
для контроля вывести в текстовый файл размеры исходных списков и их элементы с помощью процедуры WriteList;
выполнить задание на обработку списков, указанное в вашем варианте (столбец 4 табл. 1);
вывести в текстовый файл результаты обработки списков – размеры итоговых списков, их элементы и найденные характеристики списков;
очистить исходные и итоговые списки с помощью процедуры Clear.
Замечание: программа должна использовать для работы со списками только созданные процедуры, не обращаясь непосредственно к элементам списков.
Варианты заданий Таблица 1
|
№ |
Тип элемента |
Подпрограммы |
Действие со списком |
|
1 |
2 |
3 |
4 |
|
1 |
Integer |
DeleteFirst, Search, AssignValue, |
Удалить три первых элемента в каждом из списков L1, L2, L3, затем заменить нулями все элементы с заданным значением. |
|
2 |
Integer |
MaxItem, Move |
Переместить максимальные элементы списков L1, L2, L3 в их начала. |
|
3 |
Integer |
LastValue, DeleteLast |
Удалить все элементы с нулевым значением в конце списков L1, L2, L3 до 1-го отличного от нуля. |
|
4 |
Integer |
FirstValue, DeleteFirst |
Удалить все элементы с нулевым значением в начале списков L1, L2, L3 до 1-го отличного от нуля. |
|
5 |
Integer |
AssLists |
Сформировать список L4, состоящий из элементов, входящих хотя бы в один из списков L1, L2, L3. |
|
6 |
Integer |
CrossLists |
Сформировать список L4, состоящий из элементов, входящих одновременно в каждый из списков L1, L2, L3. |
|
7 |
Integer |
EvenList |
Сформировать список L4, состоящий из четных элементов списков L1, L2, L3. |
|
8 |
Real |
MinItem, LastItem, ChangeP |
Поменять местами минимальный и последний элементы списков L1, L2. |
|
9 |
Real |
ChangeN |
Осуществить перестановку элементов списков L1, L2 – зеркальную относительно их середины. |
|
10 |
Real |
ZeroBeforNeg |
Перед каждым отрицательным элементом списков L1, L2 поместить элемент с нулевым значением. |
|
11 |
Real |
Equal |
Среди 4-х списков найти списки, состоящие из одинаковых элементов. |
|
12 |
Real |
Subtract |
Удалить из списка L1 элементы, входящие в списки L2 и L3. |
|
13 |
Real |
InsertSort, SortList. |
Сформировать упорядоченный список L1 из элементов списков L2, L3. |
|
14 |
Real |
MaxValue |
Найти наименьший из наибольших элементов списков L1, L2, L3. |
|
15 |
Real |
Average |
Найти средние арифметические значения элементов списков L1, L2, L3. |
|
16 |
Char |
SplitLines |
После каждого 10-го элемента списков L1, L2 разместить символы CR, LF (#13, #10). |
|
17 |
Char |
DeleteDigits |
Исключить элементы-цифры из списков L1, L2. |
|
18 |
Char |
FirstValue, DeleteValue |
Удалить элементы списков L1, L2, совпадающие с первым. |
|
19 |
Char |
Identity |
Среди 4-х списков найти эквивалентные списки. |
|
20 |
Char |
DeleteLetters |
Исключить элементы-буквы из списков L1, L2. |
|
21 |
Char |
Quantity |
Среди 4-х списков найти список, содержащий наибольшее количество заданных символов. |
|
22 |
String |
Concat |
Сформировать список L4 сцеплением списков L1, L2, L3. |
|
23 |
String |
SortLength |
Отсортировать списки L1, L2, L3 по длине строкового значения элементов. |
|
24 |
String |
DigitList |
Сформировать списки L3 и L4 из тех элементов списков L1 и L2 соответственно, которые представляют собой правильную запись числовой константы. |
|
25 |
String |
ConsList |
Сформировать списки L3 и L4 из элементов списков L1 и L2 соответственно, содержащих не менее 3 согласных букв. |
|
26 |
String |
MaxVowel |
Найти элементы списков L1, L2, L3, содержащие наибольшее число гласных букв. |
|
27 |
String |
IDList |
Сформировать списки L3 и L4 из тех элементов списков L1 и L2 соответственно, которые являются идентификаторами. |
|
28 |
String |
InsertLast |
Дописать в конец списка слова «конец», «списка», «.» |
|
29 |
String |
Search,Delete |
Удалить элементы списков L1,L2,L3 с заданным значением. |
|
30 |
String |
InsertSort, SortList |
Включить в списки L2,L3 элементы списка L1 в отсортированном порядке. |
Спецификации подпрограмм Таблица 2
|
Подпрограмма |
Спецификация |
|
AssignValue(L,p,v) |
Присвоение элементу с указателем p в списке L значения v. |
|
AssLists(L,L1) |
Пополнение списка L элементами списка L1, отсутствующими в L. |
|
Average(L):tValue |
Возвращение среднего арифметического значений элементов списка. |
|
ChangeN(L,n1,n2) |
Обмен значениями элементов с номерами n1 и n2 в списке L. |
|
ChangeP(L,p1,p2) |
Обмен значениями элементов с адресами p1 и p2 в списке L. |
|
Concat(L,L1,L2) |
Сцепление списков L1 и L2 в список L. |
|
ConsList(L,L1) |
Пополнение списка L элементами списка L1, содержащими не менее 3 согласных букв. |
|
CrossLists(L,L1) |
Удаление из списка L элементов, отсутствующих в списке L1. |
|
Delete(L,p):tValue |
Исключение элемента с указателем p списка L и возвращение его значения. |
|
DeleteDigits(L) |
Исключение символов-цифр из списка L. |
|
DeleteFirst(L):tValue |
Исключение первого элемента списка L и возвращение его значения. |
|
DeleteLast(L):tValue |
Исключение последнего элемента списка L и возвращение его значения. |
|
DeleteLetters(L) |
Исключение символов-букв из списка L. |
|
DeleteValue(L,v) |
Исключение из списка L элементов со значением v. |
|
DigitList(L,L1) |
Пополнение списка L элементами списка L1, представляющими собой правильную запись числовой константы. |
|
Equal(L1,L2): Boolean |
Возвращение True, если списки L1 и L2 состоят из одинаковых элементов. |
|
EvenList(L,L1) |
Пополнение списка L четными элементами списка L1, отсутствующими в списке L. |
|
FirstValue(L):tValue |
Возвращение значения первого элемента списка L. |
|
Identity(L1,L2): Boolean |
Возвращение True, если списки L1 и L2 состоят из одинаковых последовательностей элементов. |
|
IDList(L,L1) |
Пополнение списка L элементами списка L1, представляющими собой правильную запись идентификатора. |
|
IndexOf(L,p):Word |
Возвращение номера элемента с указателем p списка L. |
|
InsertLast(L,v) |
Вставка в конец списка L элемента со значением v. |
|
InsertSort(L,v) |
Вставка в список L элемента со значением v в отсортированном порядке. |
|
Item(L,n):pItem |
Возвращение указателя на элемент с номером n списка L. |
|
LastItem(L):pItem |
Возвращение указателя на последний элемент списка L. |
|
LastValue(L):tValue |
Возвращение значения последнего элемента списка L. |
|
MaxItem(L):pItem |
Поиск в списке L элемента с максимальным значением и возвращение указателя на него. |
|
MaxValue(L):tValue |
Поиск в списке L элемента с максимальным значением и возвращение его значения. |
|
MaxVowel(L):tValue |
Поиск в списке L элемента с максимальным числом гласных букв и возвращение его значения. |
|
MinItem(L):pItem |
Поиск в списке L элемента с минимальным значением и возвращение указателя на него. |
|
Move(L,p1,p2) |
Удаление элемента с указателем p1 списка L и вставка его перед элементом с указателем p2. |
|
Quantity(L,c):Word |
Возвращение количество символов c в списке L. |
|
Search(L,v):pItem |
Поиск в списке L первого элемента со значением v и возвращение указателя на него. |
|
SortLength(L,L1) |
Вставка элементов списка L1 в список L в порядке возрастания длин строк. |
|
SortList(L,L1) |
Вставка элементов списка L1 в список L в отсортированном порядке. |
|
SplitLines(L,n) |
Вставка после каждого n-го элемента (символа) списка L символов CR, LF (разбиение списка на строки). |
|
Subtract(L,L1) |
Удаление из списка L элементов, входящих в список L1. |
|
Value(L,p):tValue |
Возвращение значения элемента с указателем p списка L. |
|
ZeroBeforNeg(L) |
Вставка перед каждым отрицательным элементом списка L элемента с нулевым значением. |
Пример выполнения задания
Создать список целочисленных элементов. Составить процедуру записи отрицательных нечетных элементов исходного списка в один список, положительных четных – в другой и продемонстрировать ее работу.
// Лабораторная работа 1.
// Реализация списков с помощью динамических переменных.
// Выполнил Сергеев Андрей, группа 999.
// Формирование двух списков из исходного списка.
// Исходные данные – элементы основного списка – в файле LW1Dat.txt
// Результаты работы помещаются в файл LW1Res.txt
programLW1;
{$APPTYPECONSOLE}
uses SysUtils;
type
tValue=Integer;// тип содержательной части элемента списка – целый
pItem=^tItem; // тип указателя на элемент списка
tItem=record// тип элемента списка
Value: tValue; // содержательная часть элемента списка
Next : pItem; // указатель на следующий элемент списка
end; // record tItem
procedure Create(var List: pItem); // Создание пустого списка List
begin
List:=nil;
end; //procedure Create
procedure InsertFirst(var List: pItem; v: tValue);
// Включение элемента со значением v в начало списка List
varNewItem:pItem;// указатель на новый элемент списка
begin
New(NewItem);// выделение памяти под новый элемент списка
NewItem^.Value:=v;// запись v в поле Value нового элемента
NewItem^.Next:=List;// новый элемент ссылается на первый
List:=NewItem;// новый элемент становится первым
end; // procedure InsertFirst
procedure InsertLast(var List: pItem; v: tValue);
// Включение элемента со значением v в конец списка List
varNewItem,LastItem:pItem; // указатели на новый и последний элементы
begin
New(NewItem); // выделение памяти под новый элемент списка
NewItem^.Value:=v;// запись значения v в поле Value нового элемента
NewItem^.Next:=nil;// новый элемент становится последним в списке
ifList=nil // если список пуст,
thenList:=NewItem // то новый элемент становится первым в списке
elsebegin// список не пуст – поиск последнего элемента:
LastItem:=List;// устанавливаем LastItem на начало списка,
whileLastItem^.Next<>nil dobegin// пока не достигнут конец списка,
LastItem:=LastItem^.Next;// сдвигаем LastItem на следующий элемент
end;
LastItem^.Next:=NewItem;// новый элемент следует за последним
end;
end; // procedure InsertLast
procedure WriteList(var f: Text; List: pItem); // Вывод в файл f элементов списка List
varItem:pItem;// указатель на элемент списка
begin
Item:=List;// устанавливаем Item на начало списка
whileItem<>nil dobegin // пока не достигнут конец списка:
Write(f, Item^.Value:5); Item:=Item^.Next; // вывод элемента и сдвиг Item
end;
Writeln(f);
end; // procedure WriteList
functionSize(List: pItem): Word;
// Возвращение числа элементов списка
varItem:pItem;// указатель на элемент списка
begin
Item:=List;// устанавливаем Item на начало списка
Result:=0;// обнуляем счетчик числа элементов
whileItem<>nil dobegin // пока не достигнут конец списка:
Item:=Item^.Next;Inc(Result);// сдвигаем Item и увеличиваем счетчик
end; // while
end;
procedure Clear(var List: pItem);
// Удаление элементов списка
varItem:pItem;// указатель на удаляемый элемент списка
begin
while List<>nil do begin // пока список не пуст:
Item:=List;// устанавливаем Item на начало списка,
List:=List^.Next;// передвигаем начало списка на следующий элемент
Dispose(Item); // и удаляем элемент
end; // while
end; //procedure Clear
procedure FormLists(L: pItem; var L1, L2: pItem);
// Формирование списков L1 и L2 из списка L по правилу:
// отрицательные нечетные – в L1, положительные четные – в L2
varItem:pItem;// указатель на текущий элемент списка
begin
Item:=L;// устанавливаем Item на начало списка
whileItem<>nil dobegin // пока не достигнут конец списка L
if (Item^.Value<0) and odd(Item^.Value) // нечетные отрицательные
then InsertLast(L1, Item^.Value); // включаем в список L1
if (Item^.Value>0) and not odd(Item^.Value) // положительные четные
then InsertLast(L2, Item^.Value); // включаем в список L2
Item:=Item^.Next;// сдвигаем Item на следующий элемент
end; // while
end; // procedure FormLists
var
fDat,fRes:Text;// файлы с исходными данными и результатами работы
L,L1,L2:pItem;// указатели на исходный и результирующие списки
v:tValue;// значение элемента списка
begin
Assign(fDat,'LW3Dat.txt');Reset(fDat);// открытие файла для чтения
Assign(fRes,'LW3Res.txt');Rewrite(fRes);// открытие файла для записи
Create(L);Create(L1);Create(L2);// создание пустых списков
whilenoteof(fDat)dobegin// пока не достигнут конец файла fDat:
Read(fDat,v);// чтение из файла очередного значения в v,
InsertFirst(L,v);// вставка элемента со значением v в начало списка L
end;// while
Writeln(fRes, 'Исходный список:');WriteList(fRes,L);// вывод списка L
Writeln(fRes, 'Число элементов списка: ',Size(L));// вывод размера L
FormLists(L,L1,L2);// формирование списков L1 и L2
Writeln(fRes, 'Список отрицательных нечетных элементов:');
WriteList(fRes, L1); // вывод списка L1
Writeln(fRes, 'Число элементов списка: ',Size(L1));// вывод размера L1
Writeln(fRes, 'Список положительных четных элементов:');
WriteList(fRes, L2); // вывод списка L2
Writeln(fRes, 'Число элементов списка: ',Size(L2));// вывод размера L2
Clear(L);Clear(L1);Clear(L2); // удаление списков
Close(fDat);Close(fRes); // закрытие файлов
end.
