Скачиваний:
79
Добавлен:
02.05.2014
Размер:
118.78 Кб
Скачать
  1. Информационная модель

Назначение

Имя

Тип

Указатель на текущий элемент

tek

PEL

Номер элемента списка

i

integer

  1. Программная модель

Текст подпрограммы приведен в седьмом разделе текста программы.

Разработка программы

(с учетом разработанных подпрограмм)

Метод решения

  1. Инициализируем стек (голове присваиваем значение NIL);

  2. Далее реализуем программу как программу-меню. Для этого организуем «вечный» цикл - пока истина повторяем:

2.1 Вывод пунктов меню (1 - включение нового элемента в стек; 2 - исключение очередного элемента из стека; 3 - просмотр списка; 0 - завершение задачи);

    1. Прием номера выбранного пункта меню;

    2. Выбор действия в зависимости от номера выбранного пункта меню:

а) при 0 – снимаем программу с решения;

б) при 1 – запрашиваем информацию, включаемую в стек, и обращаемся к процедуре включения нового элемента в стек vkl(head,inf);

в) при 2 – если операция исключения из стека выполняется, то выводим на экран исключенную информацию, в противном случае сообщаем, что стек пуст. Для этого воспользуемся результатом функции iskl(head,inf);

г) при 3 – обращаемся к процедуре просмотра списка prosmotr(head).

Информационная модель

Статус

Назначение

Имя

Тип

Промежуточная

Голова стека

head

PEL

Вход/выход

Информация, размещаемая в элементе стека

inf

tif

Вход

Номер пункта меню

menu

byte

Программная модель (текст программы)

program obr_stack;

{Раздел описаний нестандартных типов}

type tinf=integer; {тип информации, включаемой в стек}

pel=^tel;{указательный тип на элемент стека}

{тип элемента списка}

tel=record

inf:tinf;

uk:pel

end;

{Раздел подпрограмм}

{Процедура включения нового элемента в стек}

procedure vkl(var head:pel;inf:tinf);

var tek:pel;

begin

{1. Создание структуры, соответствующей элементу списка, с помощью рабочей ссылочной переменной}

new(tek);

{2. Заполнение информационной части нового элемента}

tek^.inf:=inf;

{3. Организация связи между новым элементом и первым элементом стека}

tek^.uk:=head;

{4. Связывание нового элемента с головой стека}

head:=tek

end;

{Функция исключения очередного элемента из стека. Результат функции истина, если операция исключения выполнена успешно, или ложь, если стек пуст – исключать нечего}

function iskl(var head:pel; var inf:tinf):boolean;

var tek:pel;

begin

{1. Проверяем невозможность выполнения операции исключения. Если стек пуст (голова не содержит ссылки на элемент)}

if head=nil then

iskl:=false {стек пуст, исключение выполнить невозможно}

else

{2. Стек не пуст – голова указывыает на первый элемент стека}

begin

iskl:=true; {2.1. Операция исключения выполняется успешно}

inf:=head^.inf; {2.2. Формирование выходного параметра – определение исключаемой

информации}

tek:=head; (2.3. Фиксируем указатель на первый элемент стека)

head:=head^.uk; {2.4. Формируем новое значение головы}

dispose(tek) {2.5. Удаляем первый элемент стека}

end;

end;

{Процедура просмотра содержимого списка}

procedure prosmotr(head:pel);

var tek:pel;

i:integer;

begin

{1. Если голова не содержит никакого адреса}

if head=nil then

writeln('Список пуст!!!')

else

{2. Список не пуст, так как голова указывает на элемент (содержит адрес)}

begin

tek:=head; {2.1. Текущему указателю присваиваем указатель на первый элемент}

i:=1; {2.2. Фиксируем номер первого элемента}

{2.3. Пока текущий указатель ссылается на элемент списка}

while tek<>nil do

begin

writeln(i,' элемент с информацией=',tek^.inf); { а) выводим на экран номера элемента и

его информационной части}}

tek:=tek^.uk; { б) формируем значение текущего указателя на следующий элемент}

i:=i+1 { в) увеличиваем номер элемента на единицу}

end;

writeln('Список исчерпан!!!')

end

end;

{Раздел переменных}

var head:pel;

inf:tinf;

menu:byte;

begin

{Инициализация стека}

head:=nil;

{«Вечный» цикл для организации работы с меню}

while true do

begin

writeln;

writeln('Выберите необходимое действие [0..3]:');

writeln('1 - включение нового элемента в стек;');

writeln('2 - исключение очередного элемента из стека;');

writeln('3 - просмотр списка;');

writeln('0 - завершение задачи.');

readln(menu);

writeln;

{Обработка выбранного пункта меню}

case menu of

0: halt;

1: begin

writeln('Включаемая в стек информация?');

readln(inf);

vkl(head,inf)

end;

2: if iskl(head,inf) then

writeln('Исключенная информация: ',inf)

else

writeln('Стек пуст!!!');

3: prosmotr(head)

else

writeln('Неверный выбор!!!')

end;

writeln;

writeln('Для продолжения нажмите ENTER');

readln

end

end.

Соседние файлы в папке Лекции по Паскалю