
- •Алгоритм обработки стека Постановка задачи
- •Логическая структура программы
- •Разработка подпрограмм Разработка первой подпрограммы
- •Спецификация
- •Метод решения
- •Информационная модель
- •Программная модель
- •Разработка второй подпрограммы
- •Спецификация
- •Перечень параметров:
- •Метод решения
- •Информационная модель
- •Программная модель
- •Разработка третьей подпрограммы
- •Спецификация
- •Вид: процедура.
- •Перечень параметров:
- •Метод решения
- •Информационная модель
- •Программная модель
- •Разработка программы
- •Метод решения
- •Информационная модель
- •Программная модель (текст программы)
-
Информационная модель
Назначение |
Имя |
Тип |
Указатель на текущий элемент |
tek |
PEL |
Номер элемента списка |
i |
integer |
-
Программная модель
Текст подпрограммы приведен в седьмом разделе текста программы.
Разработка программы
(с учетом разработанных подпрограмм)
Метод решения
-
Инициализируем стек (голове присваиваем значение NIL);
-
Далее реализуем программу как программу-меню. Для этого организуем «вечный» цикл - пока истина повторяем:
2.1 Вывод пунктов меню (1 - включение нового элемента в стек; 2 - исключение очередного элемента из стека; 3 - просмотр списка; 0 - завершение задачи);
-
Прием номера выбранного пункта меню;
-
Выбор действия в зависимости от номера выбранного пункта меню:
а) при 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.