Теоретический материал (Паскаль)

Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы

Определение. Подпрограмма - это отдельная функционально независимая часть программы.

Подпрограммы решают три важные задачи:

  • избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;

  • улучшают структуру программы, облегчая ее понимание;

  • повышают устойчивость к ошибкам программирования и непредвиденным последствиям при модификациях программы.

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

  1. Когда Вы несколько раз перепишете в программе одну и ту же последовательность команд, необходимость введения подпрограммы приобретает характер острой внутренней потребности.

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

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

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

  5. Все, что Вы сделали хорошо в одной программе, Вам захочется перенести в новые. Для повторного использования таких частей лучше сразу выделять в программе полезные алгоритмы в отдельные подпрограммы.

Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.

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

Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).

Help содержит подробные описания предусмотренных средой программирования процедур и функций. Для вызова подсказки при работе со стандартными процедурами и функциями нужно поставить на имя подпрограммы курсор и нажать клавиши <Ctrl+F1>. Справочная информация о процедурах и функциях в Help имеет стандартную структуру.

Задание. Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.

Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая  необходима для определения типов фактических параметров. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются подсветкой), то, выбрав одно из них (нажав клавишу <Enter>), можно получить справку по следующей подпрограмме. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка справочной информации. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций может значительно облегчить работу.

Существует другой способ получения сведений о процедурах и функциях. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).

Задание. Рассмотрите список процедур и функций, выберите какие-либо из них и ознакомьтесь со справочной информацией.

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

Существует два способа объединения программ и подпрограмм пользователя:

  1. Текст подпрограммы может быть приведен в разделе описания использующей их программы.

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

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

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

  • подпрограмма начинается с заголовка, содержащего имя подпрограммы, передаваемые в нее и возвращаемые от нее параметры, т.е.  запись заголовка подпрограммы отличается от заголовка программы;

  • подпрограмма кончается не точкой, а точкой с запятой.

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

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

Например, вызов функции

M:= MIN (X, Y)

вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной M.

Все переменные, которые использует подпрограмма, могут быть либо глобальными, либо локальными.

Определение. Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.

Определение. Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.

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

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

Если говорить о плюсах использования  подпрограмм, то можно назвать следующие:

  1. Программы с использованием подпрограмм позволяют реализовать один из самых прогрессивных методов программирования - структурное программирование.

  2. Программа становится более читаемой.

  3. Происходит экономия памяти, которая получается из-за того, что память для хранения переменных, используемых в подпрограммах, выделяется только на время работы подпрограммы.

В языке Паскаль выделяют два вида подпрограмм: процедуры (Procedure) и функции (Function). Любая программа может содержать несколько процедур и функций. Структура любой подпрограммы аналогична структуре всей программы.

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

Процедуры и функции объявляются в разделе описания вслед за разделом переменных.

Общая структура программы выглядит так:

Рrogram hh;
  Label; {описание меток}
  Const; {описание констант}
  Type; {описание типов}
  Var; {описание переменных}
  Procedure; {описание процедур}
  Function; {описание функций}
Begin
  . . .
  . . .
end.

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

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

Подпрограмма вызывается по своему имени с указанием необходимых параметров.

На этом занятии рассмотрим примеры организации наиболее простого вызова подпрограмм.

Задание. Рассмотрите решение предложенных задач, наберите программы на компьютере, проверьте их работоспособность, внесите свои изменения и дополните своими комментариями.

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

Program AkulovE;
Uses
  Crt;
Var
  x, y : LongInt;
Procedure Input;
Begin
  TextColor(12);
  writeln('По вызову активизировалась процедура "Input"',#10);
  TextColor(7);
  writeln('Введите два числа через пробел - ');
  readln(x, y);
End;
{  - - - - - - - - - - - - - - - - - - - -}
Procedure Summa;
Begin
  TextColor(14);
  writeln('Для сложения подключилась процедура "Summa"',#10);
  x:=x+y;
End;
{  - - - - - - - - - - - - - - - - - - - -}
Procedure Output;
Begin
  TextColor(10);
  writeln('Заключительная часть. Процедура "Output"',#10,#13);
  TextColor(7);
  writeln('Их сумма - ',x);
End;
{  - - - - - - - - - - - - - - - - - - - -}
Begin
  ClrScr;
  Input;
  Summa;
  Output;
  readln;
End.

Задача 2. Найти среднее арифметическое двух чисел.

Program Fadeev;
Uses
  Crt;
Var
  A, B : integer;
  Rez :real;
{  - - - - - - - - - - - - - - - - - - - -}
Function SredArif(A, B:integer):real;
Begin
  SredArif:=(A+B)/2;
End;
{  - - - - - - - - - - - - - - - - - - - -}
Begin
  ClrScr;
  write('Введите два числа ');
  readln(A,B);
  Rez:=SredArif(A,B);
  write('Cреднее арифметическое этих чисел равно ',Rez:5:3);
  readln;
End.