Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример 1.12



Использование процедур со взаимной рекурсией. Применение директивы Forward. Программа вычисления N -ых членов последовательностей, заданных рекуррентными формулами:

Program VzRec;

Var

N: Integer; {N, Xi, Pi - глобальные переменные}

Xi, Pi: Real;

{Процедура Form_Xi вычисляет значение X}

{*} Procedure Form_Xi (I: Integer; Var Xi: Real); { Опережающее описание процедуры Form_Xi }

Forward;

{Процедура Form_Pi вычисляет значение Р}

Procedure Form_Pi (I: Integer; Var Pi: Real); {Процедура с саморекурсией (вызывает сама себя) и взаимной рекурсией (вызывает процедуру Form_Xi)}

Var

Xi: Real; {Описание локальной переменной Xi}

Begin

If I = 0 Then

Pi:= 2 {Начальное значение Pi}

Else

Begin

Form_Xi (I - 1, Xi); {Вызов процедуры Form_Xi }

Form_Pi (I - 1, Pi); {Рекурсивный вызов процедуры Form_Pi}

Pi:= Xi – Pi {Вычисление i-го члена последовательности Р}

End

End; {Конец процедуры Form_Pi }

Procedure Form_Xi; { Определяющее описание процедуры Form_Xi }

Var

Pi: Real; {Описание локальной переменной Pi}

Begin

If I = 0 Then

Xi:= 1 { Начальное значение Xi}

Else

Begin

Form_Xi (I - 1, Xi); {Рекурсивный вызов процедуры Form_Xi}

Form_Pi (I - 1, Pi); {Вызов процедуры Form_Pi}

Xi:= 0.5 * (Xi+Pi) {Вычисление I-го члена последовательности Х}

End

End;

Begin {Вызывающая программа}

Write ('Введите N:');

Read (N); {Чтение номера N вычисляемых членов последовательностей}

Form_Xi (N, Xi); {Вызов процедуры Form_Xi}

Form_Pi (N, Pi); {Вызов процедуры Form_Pi}

Writeln ('X', N, '=', Xi); {Печать результатов значений глобальных переменных Xi и Pi}

Writeln ('P', N, '=', Pi;)

End.

В данной программе использованы две процедуры - Form_Xi, Form_Pi. В теле обеих процедур содержится как вызов их самих (явная рекурсия), так и взаимный вызов друг друга (неявная рекурсия). В связи с последним одна из процедур (в данном случае Fоrm_Xi) должна быть определена с помощью опережающего описания (см. {*} в программе данного примера).

Определяющее описание процедуры Form_Xi содержит раздел объявлений локальных переменных и раздел операторов. В отличие от обычного описания в заголовке процедуры Form_Xi при определяющем описании отсутствует список формальных параметров.

Между определяющим и опережающим описаниями процедуры Form_Xi описана процедура Form_Pi. Данная процедура описана обычным образом, без директив.

В первый раз процедуры Form_Xi и Form_Pi вызываются из головной программы. Затем осуществляются последовательные вызовы процедурами самих себя и друг друга.

1.6. Библиотечные модули пользователя

1.6.1. Общие сведения

В Паскале существует три типа файлов:

а) файлы, содержащие исходные тексты программ (типа pas);

б) готовые к выполнению exe -файлы – это файлы, получаемые в результате компиляции исходного текста программы;

в) tpu -файлы – это файлы, получаемые в результате компиляции библиотечных модулей (TPU – Turbo Pascal Unit).

В Турбо Паскале имеется ряд стандартных библиотечных модулей (System, Graph, Dos, Crt, Printer, Overlay, Strings, Turbo3, Graph3), поддерживающих работу программных модулей.

Часто используемые процедуры и функции удобно хранить в библиотеках подпрограмм пользователя. Это позволяет использовать их вызовы в различных программах. Средством создания библиотек подпрограмм служат библиотечные модули.

Библиотечный модуль – это результат трансляции в режиме Compile специальной структурной единицы Unit с установленной директивой Destination = Disk.

В результате такой компиляции создается tpu -файл.

Введение tpu-файлов позволяет создавать программы, превышающие 64К байта. Однако каждый tpu-файл не может превышать 64К байта. Сумма объемов модулей, составляющих программу, ограничена лишь объемом оперативной памяти компьютера.

Модуль в Паскале является основой модульного проектирования. В отличие от программы модуль не может быть запущен на выполнение самостоятельно, он может только участвовать в построении программы или другого модуля. Модули компилируются независимо от использующей их программы.

Чтобы подключить модуль к программе (или другому модулю), необходимо и достаточно указать его имя в предложении Uses программы или использующего его модуля.

1.6.2. Структура модуля Unit

Модуль Unit имеет структуру, которую иллюстрирует рисунок 1.10.

Рисунок 1.10 – Синтаксическая диаграмма модуля Unit

Структура модуля в общем виде также может быть представлена следующим образом:

Unit <Имя_модуля>; {Раздел Unit (заголовок модуля)}

Interface {Интерфейсная секция}

Uses <Список_используемых_Unit>

{Описание глобальных программных элементов}

Type

Const

Var

{Заголовки процедур и функций с указанием параметров}

Procedure

Function

Implementation {Секция реализации}

<Описание локальных типов, констант, переменных, процедур и функций, описанных в секции Interface, и внутренних процедур и функций>

Begin {Секция инициализации}

<Операторы>

End.

Таким образом, модуль Unit состоит из разделов, которые называются также секциями.

В разделе Unit (так называется заголовок модуля) содержится имя библиотечного модуля. Оно должно совпадать с именем файла, где содержится исходный текст модуля. Например, если исходный файл имеет имя Arifm. pas, то имя модуля Unit Arifm.

Синтаксическая диаграмма раздела Unit имеет вид, который представляет рисунок 1.11.

Рисунок 1.11 – Синтаксическая диаграмма раздела Unit

В секции Interface(интерфейсном разделе) описываются внешние элементы – глобальные типы, константы, переменные, процедуры и функции. Это те элементы, которые доступны основной программе или другому модулю. Описания могут следовать в любом порядке (как и в программном модуле).

Синтаксическая диаграмма интерфейсной секции имеет вид, который иллюстрирует рисунок 1.12.

Описания процедур и функций представляют собой их заголовки, с указанием параметров и возвращаемых значений функций. Тела процедур и функций в интерфейсной секции не указываются. Основная программа и другие модули имеют доступ к элементам, описанным в интерфейсной секции, как если бы они были описаны в них самих.

Рисунок 1.12 – Синтаксическая диаграмма
интерфейсного раздела

Синтаксическая диаграмма раздела заголовков процедур и функций имеет вид, который изображает рисунок 1.13.

В интерфейсной секции недопустимы заголовки подпрограмм с директивами Interrupt и Forward. Само описание заголовков процедур и функций в интерфейсной секции является аналогом опережающего описания (аналогом директивы Forward).

Если при объявлении типов, данных или подпрограмм интерфейсной секции используются элементы, введенные в других модулях, то эти модули должны быть перечислены в директиве Uses сразу после слова Interface. В директиве Uses данной секции рекомендуется указывать только те модули, которые необходимы именно в этой секции.

Рисунок 1.13 – Синтаксическая диаграмма
раздела заголовков процедур и функций

В секции Implementation(разделе реализации) описываются локальные элементы (типы, константы, переменные, метки). Здесь также содержатся тела процедур и функций, заголовки которых описаны в секции Interface. Для данных процедур и функций заголовок содержит только имя (без описания параметров и возвращаемого значения функции).

Синтаксическая диаграмма секции реализации имеет вид, который представляет рисунок 1.14.

Рисунок 1.14 – Синтаксическая диаграмма раздела реализации

Кроме того, в этой секции может содержаться полное описание внутренних процедур и функций модуля (то есть тех, которые используются для вычисления процедур и функций, описанных в интерфейсной секции). Внутренние подпрограммы недоступны вызывающей программе или другим модулям.

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

Описанные в разделе реализации типы, константы, переменные являются глобальными по отношению к подпрограммам этого раздела, а также операторам раздела инициализации.

Если в телах подпрограмм или при объявлении типов, переменных в разделе реализации используются имена, объявленные в других модулях, и эти модули не попали в предложение Uses раздела Interface, то они перечисляются в предложении Uses после слова Implementation.

Если в модуле содержатся обращения к внешним процедурам или функциям, описанным на языке Assembler, то после заголовка такой подпрограммы вместо ее тела в разделе реализации записывается директива External. Данная директива говорит о том, что тело процедуры или функции описано в другом модуле (на языке Assembler, файл имеет расширение obj).

В секции инициализации содержатся операторы, которые выполняются до операторов из тела программы (обычно это установки некоторых стартовых значений).

Синтаксическая диаграмма раздела инициализации имеет вид, который содержит рисунок 1.15.

Рисунок 1.15 – Синтаксическая диаграмма раздела инициализации

Синтаксическая диаграмма раздела операторов имеет вид, который представляет рисунок 1.16.

Если программный модуль использует несколько модулей Unit, то их разделы инициализации будут выполняться в порядке их перечисления в предложении Uses программы до операторов тела программы. Если операторная часть в секции инициализации отсутствует, то секция состоит из слова End.

Все разделы модуля являются необязательными, но служебные слова, начинающие разделы, должны присутствовать обязательно.

Рисунок 1.16 – Синтаксическая диаграмма
раздела операторов





Дата публикования: 2014-12-11; Прочитано: 328 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...