Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всё_о_Паскале.doc
Скачиваний:
6
Добавлен:
20.11.2018
Размер:
4.54 Mб
Скачать

18. Подпрограммы

Написание любой большой программы невозможно как без разбиения задачи на менее сложные подзадачи, которые мы можем решать независимо, так и без повторного использования ранее написанного кода (представим, что каждая новая программа писалась бы "с нуля"?!). Решить эти важнейшие задачи позволяет механизм подпрограмм, имеющийся в любом языке программирования, в том числе, и в Паскале.

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

Использование подпрограмм в чем-то похоже на расчеты с использованием математических или физических формул. Так, имея общие формулы решения квадратного уравнения, мы можем подставить вместо коэффициентов a, b и c любые числовые значения и решить любое конкретное уравнение. Аналогично, мы могли бы написать подпрограмму с входными параметрами a, b, c и выходными параметрами x1, x2 (найденные корни уравнения), а затем, используя нужное число раз эту подпрограмму (однократное использование подпрограммы называется ее вызовом), решить любое количество квадратных уравнений.

Итак, использование подпрограмм позволяет решить следующие задачи:

  • Уменьшение размеров кода и экономия памяти за счет возможности неоднократного вызова одной и той же подпрограммы в рамках одной программы;

  • Лучшее структурирование программы за счет разбиения задачи на более простые подзадачи;

  • Эффективное повторное использование однажды написанного кода.

Рассмотрим общую структуру сложной программы, содержащей две подпрограммы:

Var раздел_описаний_1;

Заголовок Подпрограммы_1;

Begin

{Тело подпрограммы_1}

End;

Заголовок Подпрограммы_2;

Begin

{Тело подпрограммы_2}

End;

Var раздел_описаний_2;

Begin

{Тело главной программы}

End.

Как видно из описания, каждая подпрограмма имеет заголовок (по меньшей мере, в этом заголовке должно быть указано ее назначенное программистом имя) и тело, состоящее из операторов. Подобно телу цикла, тело подпрограммы заключено в операторные скобки begin … end;. Обратите внимание, что в листинге два раздела описаний. Первый из них расположен до обеих подпрограмм, второй – после них перед телом главной программы. Данные, описанные в первом разделе – глобальные, они доступны всем частям программы, расположенным ниже по ее тексту. Данные второго раздела описаний доступны лишь главной программе, так как описаны непосредственно перед ней. Общее правило очень простое: подпрограммы "видят" все глобальные переменные, описанные выше их тела. Аналогично, без принятия специальных мер подпрограмма "видит" и может вызвать любую другую подпрограмму, расположенную выше нее по тексту программы. Здесь вторая подпрограмма может вызвать первую, но не наоборот. Главная программа, как правило, расположенная последней, может вызвать все подпрограммы.

На практике не рекомендуется делать подпрограммы зависящими от глобальных данных, так как это снижает их переносимость (возможность повторного использования). Разумеется, любого из разделов описаний в конкретной программе может и не быть. Более того, поскольку подпрограмма – отдельная и, в идеале, независимая часть программы, она может содержать собственный раздел описания локальных переменных, предназначенных лишь для ее нужд и невидимых из других частей программы. Например, для подпрограммы решения квадратного уравнения такой локальной переменной могла бы быть переменная d, предназначенная для вычисления дискриминанта уравнения. Поясним этот важный момент на примере:

Var i:integer;

{глобальная переменная – описана вне всех подпрограмм}

Заголовок Подпрограммы;

Var i:integer;

{локальная переменная – описана после заголовка подпрограммы}

Begin

{Тело подпрограммы}

End;

Begin

{Тело главной программы}

End.

Описанная перед телом подпрограммы локальная переменная i не имеет никакого отношения к одноименной переменной, описанной выше. На время выполнения подпрограммы локальная переменная i вытесняет глобальную, делая значение последней недоступной. После завершения подпрограммы значение локальной i будет утеряно, а значение глобальной i никак от этого не изменится. Уточните по этому примеру определения глобальной и локальной переменных.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]