Реклама:

Рис. 7.19. Инвертирование программы Pl.

Если теперь мы вернемся к основному решению программы составления отчета, описанному в разд. 7.2, и предположим, что программа Р1 инвертирована относительно промежуточного файла, то структурированное изложение для программы Р2 примет вид

Р2 поел

Установить N=1, Установить счетчик симв = 1 Открыть Отчет, ВЫЗВАТЬ Pis (IN) Поместить полученную запись в строку (N) Установить N=N+1 Писать заголовок

ПОЛУЧЕНИЕ ТЕЛА ОТЧЕТА повт пока не (Конец-файла в ПФ) ПОЛУЧЕНИЕ СТРОКИ ДЛЯ ЗАПИСИ поел ПСДЗ. ТЕЛО повт пока не Конец-записи (Счетчик симв = 150) ИЛИ

Кинг Д. Создание эффективного программного обеспечения

(Конец-файла в ПФ) ОБРАБОТКА СИМВОЛА поел ВЫЗВАТЬ Pis (IN) Поместить полученную запись в строку (N) Установить счетчик симв = счетчик симв + 1

Установить N=N+1 ОБРАБОТКА СИМВОЛА конец ПСДЗ. ТЕЛО конец Писать запись из строки в отчет Установить Счетчик симв = 1, Установить N=1 Вызвать Pis (IN)

Поместить полученную запись в строку (N) Установить N=N+1 ПОЛУЧЕНИЕ СТРОКИ ДЛЯ ЗАПИСИ конец ПОЛУЧЕНИЕ ТЕЛА ОТЧЕТА конец Писать завершитель Закрыть отчет, СТОП Р2 конец

Все измененные или добавленные части изложения выделены полужирным шрифтом и подчеркнуты.

В каждом случае за оператором ВЫЗВАТЬ подпрограмму Pis сразу следует оператор, помещающий полученный символ в подходящую позицию в строке для последующей печати. Исключены операторы «Открыть» и «Закрыть» для файла ПФ, который более не существует.

Описанные меры касаются программы Р2. А как преобразовать программу Р1 в подпрограмму для Р2?

Для того чтобы при инвертировании программы Р1 сохранилась ее конструктивная целостность, не следует нарушать процедурную логику Pl. Поэтому при обращении к подпрограмме Pis она должна генерировать требуемую запись для Р2, передать ее программе Р2 и затем вернуть управление программе Р2. Кроме того, когда обращение к Pis произойдет в следующий раз, она должна возобновить обработку с того места в структурированном изложении, которое непосредственно следует за местом, в котором она остановилась в последний раз. Иначе говоря, Pis должна быть снабжена механизмом запоминания, до какого места она доходила при последнем обращении к ней.

Это запоминание осуществляется применением так называемой «переменной состояния», которая инициализируется некиим начальным значением, а затем перевычисляется добавлением приращений при каждом обращении к подпрограмме. В сущности эта переменная состояния является указателем на подходящее место перезапуска в тексте подпрограммы.

Пусть эта переменная состояния называется (Зх. Тогда мы поместим в начало нашей инвертированной программы следующие операторы:

Описать Ох значение 1 (Ох = 01) Перейти к 01, или 02, или 03, или 04 и т.д. в " зависимости от значения 0х

01: (Это метка)

Эти операторы предназначены для организации такой ситуации, при которой после первого вхождения в программу обработка начинается в точке, указанной меткой (31. При последующих вхождениях в программу обработка будет возобновляться в метках (32, (33, (34 и т.д. в зависимости от того значения, которое было присвоено переменной (Зх в последний раз до данного вхождения.


⇐ Предыдущая страница| |Следующая страница ⇒