Модули, созданные программистом.
Программы, написанные Вами и оформленные в виде готовых к употреблению процедур и функций, можно применять в других программах. Основная концепция такого подхода заключается в объединении своих процедур и функций в собственные библиотеки, которые могут подключаться к разрабатываемым программным продуктам.
Таким образом мы подошли к понятию модуля Unit. До сих пор Вы имели дело с встроенными модулями. Теперь Вы научитесь подключать к программе библиотеки, которые были созданы Вами.
Использование модулей считается прогрессивным подходом в программировании, т. к. модуль компилируется независимо от программы, а поэтому время компиляции для больших программ может существенно сократиться, что очень важно при отладке программ.
Модуль (Unit) – программная единица, текст которой компилируется независимо. Модуль включает в себя определения констант, типов данных, переменных, процедур и функций, доступных для использования в вызывающих программах. Однако внутренняя структура модуля скрыта от пользователя.
Модуль модно разделить на несколько разделов: заголовок, интерфейсная часть, реализационная часть, инициализационная часть.
Заголовок модуля
Unit<Имя модуля>;
{$N+} <Глобальные директивы компилятора>;
Интерфейсная часть
Interface
Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и доступных для других модулей>;
Type<описания типов, определенных в данном модуле и доступных для других модулей>;
Var<описания переменных, определенных в данном модуле и доступных для других модулей>;
Procedure<Заголовки процедур, определенных в данном модуле и доступных для других модулей>;
Function<Заголовки функций, определенных в данном модуле и доступных для других модулей>;
Реализационная часть
Implementatoin
Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и недоступных для других модулей>;
Type<описания типов, определенных в данном модуле и недоступных для других модулей>;
Var<описания переменных, определенных в данном модуле и недоступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и доступных для других модулей>;
Function<реализация функций, определенных в данном модуле и доступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и недоступных для других модулей>;
Function<реализация функций, определенных в данном модуле и недоступных для других модулей>;
Инициализационная часть
Begin<Слово Begin необходимо, если имеются операторы в следующей части программы>
<часть модуля, исполняемая при его подключении (необязательна)>
End.
Заголовок модуля
Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля.
При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем файла, в котором он хранится, а значит имя модуля не может состоять более чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др.).
Интерфейсная часть
В этой части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами.
Интерфейсная часть модуля несет всю информацию, необходимую для использования процедур и функций, определенных в модуле.
Указав в операторе Uses имена уже существующих готовых модулей, можно сделать их доступными для использования. Аналогично здесь описываются доступные из вне и необходимые для описанных процедур и функций определения типов данных, констант и переменных.
Все процедуры и функции, доступные для общего пользования и определенные в данном модуле, должны быть описаны в интерфейсной части своей строкой-заголовком с указанием типов параметров. Сам текст программы этих процедур и функций находится (с дубликатом их заголовка) в реализационной части.
Примечание. Интерфейсная часть может быть пуста.
Реализационная часть
Реализационная часть – это часть, в которой определяются процедуры и функции. Точно так же, как и внутри обычной программы, Вы можете определить здесь глобальные (для модуля) переменные, типы данных и константы наряду с определением процедур и функций. Определенные здесь типы данных и структуры данных недоступны извне и могут использоваться для своих нужд только программами, входящими в реализационную часть.
Реализационная часть также может быть пустой.
Инициализационная часть
Инициализационная часть представляет собой основной блок модуля. Приведенные в ней операторы выполняются первыми, т. е. они выполняются перед операторами основного блока главной программы, в которую включен данный модуль.
Примечание. Создание собственного модуля не является обязательным для учащегося.
Рекурсия
Занятие 1. Понятие рекурсии.
Рекурсия (от латинского recursio - возвращение) – это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе.
Для того, чтобы такое обращение не было бесконечным, в тексте подпрограммы должно быть условие, по достижению которого дальнейшего обращения не происходит. таким образом, рекурсивное обращение может включаться только в одну из ветвей подпрограммы.
В языке Паскаль нет никаких ограничений на рекурсивные вызовы подпрограмм, необходимо только понимать, что каждый очередной рекурсивный вызов приводит к образованию новой копии локальных объектов подпрограммы и все эти копии, соответствующие цепочке активизированных и не завершенных рекурсивных вызовов, существуют независимо друг от друга
Рекурсия достаточно широко применяется в программировании, что основано на рекурсивной природе многих математических алгоритмов. А также Вы должны знать, что любой рекурсивный алгоритм можно преобразовать в эквивалентный итеративный (то есть использующий циклические конструкции).
В больших и сложных программах иногда приходится заменять рекурсию на итерацию. Дело в том, что рекурсия связана с многократными вызовами процедур, а это несколько менее эффективно при выполнении по сравнению с использованием циклов. Однако рекурсивные версии программ, как правило, гораздо короче и нагляднее.
Хорошей иллюстрацией механизма рекурсии является функция для вычисления факториала натурального числа. Вспомним, что факториалом числа называется произведение всех натуральных чисел от 1 до этого числа включительно:
N! = 1*2*3* . . . *(N-2)*(N-1)*N
1! = 1
0! = 1
Сначала покажем обычную не рекурсивную функцию для вычисления факториала, которая реализует итеративный алгоритм вычисления:
Function NonRecFact(N:integer) : LongInt;
Var
i : integer; {переменная цикла }
Res : LongInt; {результат}
Begin
Res := 1;
for i := 1 to N do
res := Res*i;
NonResFact := Res;
End;
Вторая функция использует рекурсивные обращения, что делает ее гораздо компактнее, и основана на очевидном соотношении:
N! = (N-1)!*N
Иными словами, чтобы получить значение факториала от числа N, достаточно умножить на N значение факториала от предыдущего числа:
Function RecFact(N:integer) : LongInt;
Begin
if N <= 1
then
ResFact := 1
else
ResFact := N*ResFact(N-1);
End;
Полностью программа, вычисляющая факториал числа, будет выглядеть так:
Program Rekurs;
Var
N : integer;
F : Longint;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Function RecFact(N:integer) : LongInt;
Begin
if N <= 1
then
ResFact := 1
else
ResFact := N*ResFact(N-1);
End;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Begin
writeln('Введите число N > ';
read(N);
F := RecFact(N);
writeln('Для числа ',N,' значение факториала равно ',F);
End.
После запуска программы на экран выводится запрос "Введите число N > ", затем с клавиатуры считывается введенное значение и в выражении F:=RecFact(N) вызывается функция RecFact с параметром-значением N. В подпрограмме-функции проверяется условие N<=1. Если оно выполняется, то функции ResFact присваивается значение 1 и на этом выполнение подпрограммы завершается. Если условие N<=1 не соблюдается, то выполняется вычисление произведения N*ResFact(N-1). Вычисление произведения носит рекурсивный характер, так как при этом осуществляется вызов функции ResFact(N-1), значение которой вычисляется, в свою очередь, через вызов функции ResFact, параметром которой также будет функция ResFact, и т. д., до тех пор пока значение формального параметра N не будет равно 1. Так как базовая часть описания рекурсивной функции ResFact определяет значение ResFact для N=1, равным единице, то рекурсивные вызовы функции ResFact больше не выполняются, а наоборот выполняется вычисление функции ResFact для чисел, возрастающих от 1 до N, причем функция ResFact всякий раз возвращает значение, равное произведению очередного числа на факториал от предыдущего числа. Последнее возвращение результата вычисления функции ResFact присвоит переменной F значение произведения всех чисел от 1 до N, т. е. факториал числа N.
Итак, при выполнении рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к нижнему уровню последовательно до тех пор, пока не будет получено тривиальное решение поставленной задачи. В нашем примере решение при N=1 тривиально, т. е. ResFact=1. Затем осуществляется возврат на верхний уровень с последовательным вычислением значения функции ResFact.
Задание. Введите текст рассмотренной выше программы и запишите файл на диск под соответствующим именем, а затем откомпилируйте его. После того, как компиляция закончится успешно, задайте для просмотра в окне отладчика переменные N, F. Установите видимыми одновременно окна редактора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в функцию и пронаблюдайте за изменением значения переменной N при рекурсивных вызовах функции ResFact.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |


