На этом шаге мы приведем пример модуля.
Приведем пример модуля, в котором сосредоточены средства работы с памятью типа "стек". Способ конкретной реализации стека скрыт в разделе Implementation; поэтому переход к другой реализации стека не повлечет за собой необходимость изменения программ, использующих этот модуль (эти программы "не узнают" о таком изменении).
Unit StackOps; {Операции над стеком} Interface {Интерфейсная часть} Procedure Push (Elem:Integer);{Размещение элемента в вершине стека} Function Pop : Integer; {Извлечение элемента из вершины стека} Function Empty : Boolean; {Проверка на пустоту стека} Function Full : Boolean; {Проверка на заполненность стека} Implementation {Секция реализации} {Стек реализован в виде линейного массива элементов; переменная Тор отмечает текущую вершину стека} Const Max = 100; {Максимальное количество элементов в стеке} Var Stack : Array [1..Max] of Integer; {Массив для элементов стека} Top : Integer; {Счетчик количества элементов в стеке} Procedure Push; {Размещение элемента в вершине стека} Begin If Top<=Max Then {Если есть место в стеке} Begin Stack [Top]:=Elem; {Помещаем в стек элемент} Top:=Top+1; {Увеличиваем счетчик количества элементов} End; End; Function Pop; {Извлечение элемента из вершины стека} Begin Pop:=0; {Функция возвращает 0, если извлечь элемент не удается} if Top>1 Then {Если в стеке есть элементы} Begin Top:=Top-1; {Уменьшить количество элементов} Pop:= Stack[Top]; {Вернуть элемент из стека} End; End; Function Empty; {Проверка на пустоту стека} {Возвращает True, если стек пуст, и False - в противном случае} Begin Empty:=(Top=1); End; Function Full; {Проверка на заполненность стека} {Возвращает True, если стек заполнен, и False - в противном случае} Begin Full:=(Top>Max); End; Begin {Инициализация: } {первоначально стек пуст } Top :=1; End.
Проиллюстрируем использование этого модуля. Для этого созданим программу для работы со стеком. Напомним, что стек - это структура данных, работающая по принципу "последним пришел - первым ушел". Цель приведенной ниже программы - показать использование созданного модуля, поэтому программа будет несколько примитивной (отсутствует контроль за количеством вводимых и выводимых чисел и т.п.).
Приведем текст программы:
Program Problem67_1; Uses StackOps; Var N,M,i:Byte; a:Integer; Begin WriteLn('Программа иллюстрирует работу со стеком'); WriteLn('Текущее состояние стека:'); If Empty Then WriteLn('Стек пуст') Else WriteLn('В стеке есть элементы'); Write('Сколько элементов поместить в стек (не больше 100): '); ReadLn(N); For i:=1 To N Do Begin WriteLn(i,'-й элемент: '); ReadLn(a); {Запрос элемента} Push(a); {Помещение элемента в стек} End; WriteLn('Текущее состояние стека:'); If Empty Then WriteLn('Стек пуст') Else WriteLn('В стеке есть элементы'); Write('Стек заполнен? '); If Full Then WriteLn('Да') Else WriteLn('Нет'); Write('Сколько элементов извлечь из стека (не больше ',N,'): '); ReadLn(M); {Читаем и выводим текущий элемент из стека} For i:=1 To M Do WriteLn(i,'-й элемент: ',Pop); WriteLn('Текущее состояние стека:'); If Empty Then WriteLn('Стек пуст') Else WriteLn('В стеке есть элементы'); End.
Прокомментируем некоторые моменты программы. Обратите внимание, что числа из стека
выводятся в обратном порядке. Это обусловлено принципами работы стека. Кроме того,
мы не можем из программы воспользоваться значением переменной Top для определения
количества элементов, находящихся в стеке. Вы можете убедиться в этом, изменив
условную конструкцию следующим образом:
If Empty Then WriteLn('Стек пуст')
Else WriteLn('В стеке находится ',Top-1,' элементов');
Дело в том, что переменная Top описана в разделе Implementation, а
данные из этого раздела недоступны использующей этот модуль программе. Для
получения доступа к этой переменной ее описание нужно перенести в раздел Interface.
Надеемся, что в остальном работа программы вам понятна.
На следующем шаге мы начнем изучать динамические переменные.