Формирование и проверка работоспособности программы и модуля, страница 2

{вариант 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.

Упражнение:сформировать и проверить работоспособность программы и модуля по этому примеру.