1.2.1 Что такое подпрограмма.
Часто в программах возникает необходимость выполнять (не циклически) несколько раз одну и ту же последовательность операторов. Конечно, можно соответствующий фрагмент
скопировать в программе несколько раз в нужные места, однако при таком подходе текст программы получается обширным и трудным для понимания. Кроме того, для объемной программы требуется больше памяти. Поэтому для упрощения текста программы, а также для исключения необходимости заниматься копированием предложена концепция подпрограмм.
Функционально самостоятельная часть программы, обладающая собственным именем и набором локальных имен, известна как подпрограмма. Вызов подпрограммы осуществляется по ее имени из любых точек тела программы и любое количество раз. Помимо упрощения текстов программ и избавления от копирования, подпрограммы – это еще средство структурирования программ. Идея в том, что чтобы программа состояла не из огромного числа операторов, а из относительно самостоятельных частей (подпрограмм), каждой из которых назначена отдельно, сравнительно узкая роль. Причем подпрограммы могут включать в себя другие подпрограммы, т. е. допускается вложенность подпрограмм.
Подпрограмма, чтобы ее можно было вызывать в программе, должна быть объявлена в разделе описаний программы. Объявить подпрограмму – значит указать ее заголовок (с используемыми в ней формальными параметрами), описать локальные переменные и, наконец, задать ее тело. В разделе описаний подпрограммы могут быть объявлены новые подпрограммы, которые, в свою очередь, также могут включать подпрограммы. Иными словами, возможно множество уровней вложения подпрограмм.
В языке программирования TurboPascal приняты два вида подпрограмм: процедурыи функции, которые мы рассмотрим.
1.2.2 Описание процедуры.
Структура процедуры повторяет структуру программы – в ней также есть заголовок, раздел описаний и тело. Начинается процедура с зарезервированного слова PROCEDURE, за которым через пробел следует имя процедуры. Строка заголовка должна обязательно завершаться точкой с запятой. Затем идет раздел описаний процедуры. После раздела описаний процедуры следует ее тело. Тело процедуры содержит последовательность операторов, заключенных в операторные скобки (представляющие собой пару зарезервированных слов BEGIN … END).
1.2.3 Описание функции.
Помимо процедур, в TurboPаscal применяются подпрограммы и иного вида – функции (чем отличаются функции от процедур, мы выясним позже). Структура функции (как и процедуры) повторяет структуру программы. Первой идет строка заголовка, которая начинается с зарезервированного слова FUNCTION. За ним через пробел следует имя функции, далее (в скобках) перечень формальных параметров, а затем двоеточие, за которым указывается тип значения, возвращаемого функцией. Завершается строка заголовка точкой с запятой. Сразу под заголовком функции расположен ее раздел описаний. После раздела описаний функции следует ее тело. Тело функции содержит последовательность операторов, заключенных в операторные скобки.
Кстати, в отличие от процедур, активизируемых с помощью оператора вызова (включающего имя процедуры и, может быть, фактические параметры), имя функции должно упоминаться в выражении. У функции (в отличие от процедуры) имеются и другие особенности. Например, в результате использования функции возвращается некоторое значение. Тип возвращаемого значения указывается в описании функции (в заголовке). Если имя используется только для ее вызова, то с именем функции ассоциируется некоторое возвращаемое значение. Чем еще функции отличаются от процедур? Поскольку функция должна возвращать некоторое значение, в ее теле обязательно должен присутствовать оператор присваивания, в правой части которого указано имя функции.
Когда лучше использовать процедуры и когда функции? Это зависит от конкретного случая. Если подпрограмма вычисляет единственный результат, ее можно реализовать как функцию. Если же от подпрограммы требуется вычислить несколько значений, ее лучше оформить в виде процедуры.
1.3 Модули.
1.3.1 Описание модулей.
В Паскале под модулем понимают чаще всего подразумевают комплекс подпрограмм, который находится в отдельном файле и может быть использован другими программами.
Модуль состоит из заголовка, интерфейсной части, исполнительной части и секции инициализации.
Заголовок модуля похож на заголовок программы, однако вместо слова program ставится зарезервированное слово unit.
Модуль должен находится в файле, имя которого совпадает с именем в заголовке, файл должен иметь расширение .pas.
Интерфейсная часть служит для взаимодействия основной программы с модулем. Она начинается с зарезервированного слова interface. В ней должны быть указаны константы, типы данных, переменные, процедуры и функции, которые может использовать основная программа, вызывающая этот модуль. Если модуль использует еще какие-то модули, то они должны быть указаны в интерфейсной части следующим образом: пишется зарезервированное слово uses, затем перечисляются необходимые модули (заметим, что так же обозначаются и модули в разделе описания основной программы). Цепочка используемых модулей может быть сколь угодно длинной, однако она не может содержать циклы. Например, допустимацепочка:
unit A;
uses B,C;
...
end.
unit B;
uses C,D;
...
end.
Ацепочка
unit A;
uses B;
...
end.
unit B;
uses A;
...
end.
недопустима, поскольку она содержит цикл AusesBusesA.
Процедуры и функции тоже объявляются в интерфейсной части модуля, но при этом разрешено лишь перечислять их заголовки, подобно предварительному объявлению с директивой forward.
В исполнительной части модуля содержаться процедуры и функции модуля. Здесь могут быть так же и локальные типы, константы, метки или переменные. Исполнительная часть начинается с зарезервированного слова implementation, далее следует описания локальных констант, типов данных и переменных, а затем обычное описание процедур и функций, но с использованием сокращенных заголовков, т.е. без указания в них параметров.
Иногда при вызове модуля следует произвести некоторые действия, например инициализировать какие-либо переменные, установить какие-либо связи и т.д. Все эти действия указываются в секции инициализации, которая выглядит, как обычное тело программы: между словами begin и end с точкой находятся операторы. Если при вызове модуля никаких подобных действий производить не нужно, то секция инициализации состоит лишь из слова end с точкой.
Чтобы использовать процедуры, функции и другие объекты модуля в основной программе, необходимо написать зарезервированное слово uses, затем имя модуля. После этого объекты модуля можно использовать так, как если бы они были описаны в основной программе.
Рассмотрим теперь модули, которые поставляются в стандартном комплексе TurboPascal, но функции и процедуры которых не являются стандартными.
1.3.2 Модуль CRT.
Модуль Crt содержит процедуры, функции и константы для работы с экраном в текстовом режиме, работы с клавиатурой и генерации звука.
Подпрограммы этого модуля позволяют управлять текстовыми режимами экрана, использованием цветов и окнами, яркостью свечения символов, а также расширенными кодами клавиатуры и звуком.
В текстовом режиме весь экран разбивается на строки (их, как правило, 25), а каждая строка – на отдельные позиции (их обычно по 80 в каждой строке) находится в левом верхнем углу экрана.
1.3.2 Модуль DOS.
Здесь собраны процедуры и функции (а также переменные и константы), позволяющие из программ получать доступ к средствам MSDOS и управлять файлами.
1.3.3 Модуль GRAPH.
Содержит множество подпрограмм, а также констант, типов и переменных, предназначенных для управления графическим режимом экрана. Ресурсы модуля позволяют обратится к любому пикселю экрана и управлять его свечением.
Запустить программу, использующую модуль GRAPH, без графического драйвера (одного или нескольких – это файла с расширением .BGI) не удастся. Указанные драйверы не входят в состав модуля, но поставляются с TurboPascal (они содержаться в каталоге BGI). А если в программе используются векторные шрифты, в дополнение е драйверам потребуются также файлы шрифтов (файлы с расширением .CHR).
2. Решение задачи.
2.1 Структурная схема программы.
Итак, представим схему программ.
Programxxx;{заголовок необязателен}
Const
раздел описания констант
Label
Раздел описания меток
Type
Раздел описания типов
Var
Раздел описания переменных
Описания подпрограмм
Begin
Тело программы
End.
В первой строке схемы находится заголовок программы. Заголовок начинается зарезервированным словом PROGRAM, за которым следует имя программы, которое ей было присвоено при создании. Завершается заголовок точкой с запятой. В TurboPascal заголовок не является обязательным элементом программы.
После заголовка на схеме представлены разделы описания констант, типов, меток и переменных. Причем TurboPascal не предписывает порядок, в котором должны следовать эти разделы.
Кроме того, TurboPascal вовсе не предписывает, что в программе должно быть не более одного раздела описания типов, меток, констант или переменных и что все соответствующие описания должны быть собраны в едином разделе. Иными словами, при необходимости ничто не мешает создать в программе два раздела описаний меток или два раздела описаний типов, например.
После раздела описаний меток, типов, констант и переменных идут описания подпрограмм (если в данной программе используются подпрограммы). Описания подпрограмм следует одно за другим, причем если одна подпрограмма вызывается из другой, первая должна быть описана раньше.