{вариант 1 – все в одной программе} program Stack; uses Crt; type {-- тут привести описания типов tData, pEl, tEl --} var stp: pEl; Data: tData; {данные, читаемые/выводимые пользователю} ActionCode: byte; {код действия для меню} {-- тут привести описания процедур и функций для работы со стеком --} begin Init; {инициализация - принудительно} repeat clrscr; {вывод меню} writeln(‘1 – Add element‘); writeln(‘2 – Get element‘); writeln(‘3 – Count elements‘); writeln(‘4 – Clear stack‘); writeln(‘5 – Print elements‘); writeln(‘0 - Exit‘); readln(ActionCode); {чтение результата выбора из меню} case ActionCode of {обработка} 1: {Add} begin writeln(‘Введите элемент:‘); readln(Data); if Add(Data) then writeln(‘Элемент успешно добавлен‘) else writeln(‘Ошибка при добавлении элемента‘); end; 2: {Get} begin if Get(Data) then writeln(‘Извлечен элемент: ‘, Data) else writeln(‘Ошибка при извлечении элемента: стек пуст‘); end; 3: {Count} writeln(‘В стеке ‘, Count, ‘ элементов‘); 4: {Clear} begin Clear; writeln(‘Стек очищен‘); end; 5: {Print} begin writeln(‘Элементы стека:‘); Print; end; end; {case} if (ActionCode >= 1) and (ActionCode <=5) then readln; {задержка, чтобы пользователь прочитал} until ActionCode = 0; Clear; {очистка - принудительно} end. |
Упражнение:сформировать и протестировать программу по этому примеру.
Теперь можно проиллюстрировать применение принципов структурного программирования: отделение обработки данных от диалога с пользователем (уже сделано – диалог в основной программе, а обработка в специальных процедурах для работы со стеком), а также вынос специализированного функционала в отдельные модули.
Сначала выделим стек и его функциональность в специальный модуль, который назовем uStack.pas.
В дальнейшем формирование меню и получение результата выбора пользователя из меню тоже можно вынести в отдельный модуль.
Модуль со стеком:
{вариант 2 – стек в модуле, а в основной программе работа с пользователем} unit uStack; {заголовок} interface {раздел описаний} type tData = integer; {тип данных должен быть виден пользователю = основной программе} function Add(d: tData): boolean; {объявление заголовков подпрограмм} function Get(var d: tData): boolean; {-- Привести объявление и остальных процедур и функций --} implementation {раздел реализации} type pEl = ^tEl; {это служебные типы данных, пользователю ни к чему} tEl = record {поэтому описываются здесь} Data: tData; pPrev: pEl; end; var stp: pEl; {стековый указатель – тоже для внутреннего пользования} procedure Init; {инициализация} begin stp := nil; {явно показать, что стековый указатель не содержит адреса} end; {-- Привести реализацию и остальных процедур и функций --} begin {раздел инициализации модуля} Init; {принудительная инициализация стека} end. |
Теперь из основной программы можно убрать описания средств работы со стеком, но подключить модуль uStack.pas, она будет иметь такой вид:
{вариант 2 – стек в модуле, а в основной программе только работа с пользователем} program Stack; uses Crt, uStack; var Data: tData; {данные, читаемые/выводимые пользователю} ActionCode: byte; {код действия для меню} begin {инициализация теперь делается при инициализации модуля, так что тут не надо} repeat clrscr; {вывод меню} writeln(‘1 – Add element‘); writeln(‘2 – Get element‘); writeln(‘3 – Count elements‘); writeln(‘4 – Clear stack‘); writeln(‘5 – Print elements‘); writeln(‘0 - Exit‘); readln(ActionCode); {чтение результата выбора из меню} case ActionCode of {обработка} 1: {Add} begin writeln(‘Введите элемент:‘); readln(Data); if Add(Data) then writeln(‘Элемент успешно добавлен‘) else writeln(‘Ошибка при добавлении элемента‘); end; 2: {Get} begin if Get(Data) then writeln(‘Извлечен элемент: ‘, Data) else writeln(‘Ошибка при извлечении элемента: стек пуст‘); end; 3: {Count} writeln(‘В стеке ‘, Count, ‘ элементов‘); 4: {Clear} begin Clear; writeln(‘Стек очищен‘); end; 5: {Print} begin writeln(‘Элементы стека:‘); Print; end; end; {case} if (ActionCode >= 1) and (ActionCode <=5) then readln; {задержка, чтобы пользователь прочитал} until ActionCode = 0; Clear; {принудительную очистку так и оставить} end. |
Упражнение:сформировать и проверить работоспособность программы и модуля по этому примеру.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.