Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_SAOD_-_Dinamicheskie_peremennye_OOP.doc
Скачиваний:
12
Добавлен:
21.03.2016
Размер:
1.06 Mб
Скачать

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

  1. Какие переменные программы называются статическими, где они размещаются и на каком этапе под них выделяется память?

  2. Какие переменные называются динамическими, где они размещаются и на каком этапе под них выделяется память?

  3. Что представляет собой значение указателя?

  4. Адреса каких объектов могут хранить типизированные указатели и как они описываются?

  5. Адреса каких объектов могут хранить нетипизированные указатели и как они описываются?

  6. Каковы характеристики операции получения адреса?

  7. Какие функции используются для работы с адресами?

  8. Какие процедуры используются для работы с указателями?

  9. Каким образом можно присвоить значение переменной-указателю?

  10. Что такое ссылка на переменную?

  11. Какие структуры данных называют динамическими?

  12. Что такое список и как он реализуется с помощью динамических переменных? Как можно описать список в программе?

  13. Какие операции определены для работы со списком?

Лабораторная работа 1. Организация списков с помощью динамических переменных

Задание

  1. Опишите следующие подпрограммы работы со списком: Create(L)– создание пустого спискаL;InsertFirst(L, v)– включение элемента со значениемvв начало спискаL;Size(L)–определение количества элементов списка L; WriteList(f, L)– вывод в файлfэлементов спискаL;Clear(L)– удаление всех элементов спискаL. Тип элемента списка указан в столбце 2 таблицы вариантов заданий (табл. 1).

  2. Составьте подпрограмму или подпрограммы обработки списка, указанные в столбце 3 табл. 1. Спецификации всех подпрограмм приведены в табл. 2.

  3. С использованием разработанных подпрограмм составьте программу работы со списками в соответствии с вашим вариантом задания (столбец 4).

В программе необходимо:

  1. сформировать исходные списки с помощью процедур CreateиInsertFirst, вводя элементы из текстового файла;

  2. определить размеры исходных списков с помощью процедуры Size;

  3. для контроля вывести в текстовый файл размеры исходных списков и их элементы с помощью процедуры WriteList;

  4. выполнить задание на обработку списков, указанное в вашем варианте (столбец 4 табл. 1);

  5. вывести в текстовый файл результаты обработки списков – размеры итоговых списков, их элементы и найденные характеристики списков;

  6. очистить исходные и итоговые списки с помощью процедуры 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.

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