лабораторные на Pasca (Кудрявцев)l
.pdfДинамические структуры данных |
183 |
|
|
Наибольшее распространение получили два вида списков – стеки и очереди.
Стек (“магазин”) – это список с одной точкой доступа к его элемен- там, которая называется вершиной списка. Добавить или убрать элемент можно только через его вершину. Принцип работы стека: “последний пришел – первый вышел”.
Пример.
Пусть в трубку с запаянным концом закатывают шарики.
Извлекать их можно только в обратном порядке: тот шарик, что за- катился последним, будетизвлечен первым.
Рис. 4.
Стек состоит из переменного числа компонент одинаковоготипа.
Основные операции над стеком: формирование стека, добавление, удаление и просмотр элементов стека. Для их демонстрации ис- пользуем описание:
Type
StackP = ^ StackComp;
StackComp = Record
I : Integer; Next: StackP;
End;
Var
Top, Kon, NewElement: StackP; Value: Integer;
Организация стека:
Procedure OrgS; Begin
Top:= Nil; While True do begin
read (Value);
if Value = 999 then Exit; |
{Ввод элементов прекращается,} |
New (Kon); |
если введено значение 999} |
Динамические структуры данных |
185 |
|
|
Замечание: Пустым стеком называется стек, не содержащий ком- понент. Такой стек можно получить, присвоив значение Nil соответ- ствующей ссылочной переменной (в нашем случае Top:= Nil;).
Нельзя применять процедуру Out к пустому стеку.
Стеки позволяют гибко и экономно использовать память, т.к. в ка- ждый момент в стеке могут находиться только те переменные, ко- торые нужны для дальнейшей работы программы.
Другим видом списка является очередь. Очередь – это структура данных, в один конец которой добавляются элементы, а с другого – изымаются. Принцип работы очереди: “первый пришел – первый вышел”. В этом случае вводят два указателя: один на начало очере- ди, другой – на ее конец.
Назовем их соответственно Left и Right.
При добавлении элемента в очередь он располагается в памяти в соответствии со значением Right, а значение Right изменяется и ука- зывает на следующее свободное место памяти.
Выборка элемента из очереди происходит исходя из значения N, которое изменяется и указывает на следующий элемент очереди. Очевидно, что, когда очередь пуста, значение Right равно значению
Left.
Операции над очередью те же, что и над стеком. Для их демонстра- ции используем описание:
Type
StackP = ^StackComp; StackComp = record
I: Integer; Next: StackP;
end;
Var
Pp, Top, Kon: StackP; NewElement, Left, Right: StackP; Value: Integer;
Организация очереди:
Procedure OrgO; begin
read (Value);
Динамические структуры данных |
187 |
|
|
Pp:= Pp^. Next end
end;
КОНТРОЛЬНЫЕ ЗАДАНИЯ
1.Описать процедуру, которая по списку L строит два новых списка: L1 – из положительных элементов и L2 из остальных элементов списка L (тип эле- ментов – Real).
2.Описать процедуру, которая вставляет в начало списка L элемент E.
3.Описать процедуру, которая вставляет в конец списка L элемент E.
4.Описать процедуру, которая вставляет новый элемент E после первого элемента непустого списка L.
5.Описать процедуру, которая вставляет в список L новый элемент E1 за каждым вхождением элемента E.
6.Описать процедуру, которая вставляет в список L новый элемент E1 пе- ред первым вхождением элемента E, если Е входит в L.
7.Описать процедуру, которая вставляет в непустой список L пару новых элементов E1 и Е2 перед его последним элементом.
8.Описать процедуру, которая вставляет в непустой список L, элементы которого упорядочены по неубыванию, новый элемент E так, чтобы сохрани- лась упорядоченность (тип элементов – Real).
10.Описать процедуру, которая удаляет из непустого списка L первый элемент.
11.Описать процедуру, которая удаляет из списка L второй элемент, если такой есть.
12.Описать процедуру, которая удаляет из списка L за каждым вхожде- нием элемента Е один элемент, если такой есть, и он отличен от Е.
13.Описать процедуру, которая удаляет из непустого списка L последний элемент.
14.Описать процедуру, которая удаляет из списка L первый отрицатель- ный элемент, если такой есть (тип элементов – Real).
15.Описать процедуру, которая удаляет из списка L все отрицательные элементы (тип элементов – Real).
16.Заданный во входном файле текст (за ним следует точка) распечатать
вобратном порядке.
17.Дана непустая последовательность натуральных чисел, за которой следует 0. Напечатать порядковые номера тех чисел последовательности, ко- торые имеют наибольшую величину.
190
Лабораторная работа № 16
ПРОЦЕДУРЫ ПОДГОТОВКИ К РАБОТЕ В ГРАФИЧЕСКОМ РЕЖИМЕ
При работе с библиотекой графического модуля Graph необходимо в программе после служебного слова Uses указать имя этого моду- ля:
Uses Graph;
Модуль Graph представляет собой библиотеку программ, обеспечи-
вающую полное управление графическими режимами различных адаптеров дисплеев.
Все процедуры и функции модуля Graph можно разбить на функ- циональные группы:
1.Управление графическими режимами и их анализ.
2.Рисование графических примитивов и фигур:
a)управление «текущим указателем»;
b)собственно рисование;
c)стиль линий и коэффициент сжатия изображения.
3.Управление цветами и шаблонами заполнения.
4.Битовые операции.
5.Управление страницами.
6.Графические окна.
7.Управление выводом текста.
Любая программа, использующая графику, обязательно должна со- держать блок вызовов процедур инициализации (установления в исходное состояние) графического режима и обращение к процеду- ре его закрытия.
Процедура инициализации имеет вид:
InitGraph (Var GraphDriver: Integer; |
{тип адаптера} |
Var GraphMode: Integer; |
{режим графики} |
DriverPath: String); |
{путь к драйверу} |
Процедуры подготовки к работе в графическомрежиме |
191 |
|
|
В модуле Graph определены константы для задания вида графиче- ского адаптера параметром GraphDriver перед вызовом InitGraph
Const
Detect = 0; |
{для автоматического выбора адаптера} |
CGA = 1; |
{адаптер CGA} |
MCGA = 2; |
{адаптер MCGA} |
EGA = 3; |
{адаптер EGA 256 k} |
EGA64 = 4; |
{адаптер EGA 64 k} |
EGAMono = 5; |
{адаптер EGA c монодисплеем} |
IBM8514 = 6; |
{адаптер 8514} |
HercMono = 7; |
{адаптер Hercules} |
ATT400 = 8; |
{адаптер для ПЭВМ AT&T} |
VGA = 9; |
{адаптер VGA} |
PC3270 = 10; |
{адаптер 3270} |
Current Driver = - 128; |
{для GetMode Range} |
Если параметру GraphDriver присвоить значение константы Detect, то система включится в режим автоопределения. Если возможно переключение системы в графический режим, то инициализируется соответствующий BGI-драйвер и включается режим с максималь- ным разрешением.
В параметрах GraphDriver и GraphMode при этом будут возвращены автоматически выбранные значения или код ошибки. Если же па- раметр GraphDriver содержит номер конкретного адаптера, то и вто- рой параметр, GraphMode, должен иметь значение (номер) режима, допустимого при этом адаптере.
Все остальные графические установки (положение текущего указа- теля, палитра, цвет, параметры графического окна) при инициали- зации принимаются по умолчанию.
Параметр PathDriver указывает путь в каталог, содержащий файлы с необходимыми драйверами. Если в него передается значение '' (пустая строка), то драйверы должны находиться в текущем катало- ге.
Простейший блок инициализации графического режима в програм- ме может выглядеть так:
Uses Graph; |
{подключен модуль Graph} |
Procedure GrInit; |
{инициализация режима графики} |
Var |
{для графического адаптера} |
GraphDriver: Integer; |
192 |
Лабораторная работа № 16 |
|
|
|
|
GraphMode: Integer; |
{для графического режима} |
|
ErrorCode: Integer; |
{для кода ошибки} |
|
Begin |
{режим автоопределения} |
|
GraphDriver:= Detect; |
||
InitGraph (GraphDriver, GraphMode, ''); |
{инициализация} |
|
ErrorCode:= GraphResult; |
{результат инициализации} |
|
if ErrorCode <> grOk then |
{если не успешно, то ...} |
|
begin |
|
|
Writeln ('Ошибка графики:'); |
|
|
GraphErrorMsg (ErrorCode); |
|
|
Writeln ('Программа остановлена'); |
|
|
Halt (1) |
{if} |
|
end |
||
end; |
{= пример инициализации =} |
|
Begin |
||
{вызов процедуры инициализации} |
||
GrInit; |
||
Line (0, 0, GetMaxX, GetMaxY); |
{работа с графикой ...} |
|
Readln; |
{пауза до нажатия клавиши ввода} |
|
CloseGraph |
{закрытие графического режима} |
|
End. |
|
Для окончательного завершения работы в графическом режиме не- обходимо всегда производить вызов процедуры CloseGraph. Эта процедура не имеет параметров. Она очищает экран, переводит эк- ран в текстовый режим. Последующий возврат в графический ре- жим возможен только через повторную инициализацию.
Процедура InitGraph возвращает также и результат своей работы в параметре GraphDriver. В случае ошибки он может принимать зна- чения, приведенные в таблице 1.
|
Таблица 1. |
|
|
Значение |
Объяснение |
|
|
– 2 |
нет графического адаптера |
– 3 |
не найден файл драйвера |
– 4 |
ошибка в драйвере (его коде) |
–10 |
не возможен режим для выбранного драйвера |
– 15 |
нет такого драйвера |
|
|