Подпрограммы и их параметры

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

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

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

Рассмотрим пример использование подпрограмм на Паскале (для упрощения программы не делается проверок на деление на 0):

Function iDiv(a,b:real):real;

{Функция делит одно число на другое и возвращает результат}

begin

iDiv:= a/b;

end;

var x,y : real;

begin

readln(x,y);

writeln(iDiv(x,y),' ',iDiv(x,-y));

end.

Для вызова функции iDiv мы просто вызвали ее в качестве параметра при обращении к встроенной процедуре WRITELN. Параметры X и Y в момент обращения к функции - это фактические параметры. Они подставляются вместо формальных параметров A и B в заголовке функции и затем над ними осуществляются нужные действия. Полученный результат присваивается идентификатору функции - именно он и будет возвращен как значение функции при выходе из нее. В программе функция iDiv вызывается дважды - сначала с параметрами X и Y, а затем X и -Y, поэтому были получены 2 разных результата.

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

Способы передачи параметров

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

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

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

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

5) Текст, макроподстановка –везде, где встречается обработка формального параметра происходит автоматическая замена формального параметра на текст фактического. При этом в зависимости от текста фактического параметра не всегда может произойти корректная работа компилятора. Пример: пусть x заменяется на a+b, тогда выражение вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно значение какой переменной необходимо менять.

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

Пример:

Procedure MyProcedure (var a:real; b:real);

Переменная a передается по ссылке, а bпо значению.

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

Структурное программирование, управляющиеконструкции, пошаговая детализация.

На протяжении 60-х годов попытки создания многих больших программных систем наталкивались на ряд трудностей. Графики создания программного обеспечения обычно не выполнялись, а конечные продукты отличались ненадежностью. Люди начали понимать, что создание программного обеспечения более сложная задача, чем они представляли. Исследовательские работы 60-х годов привели к развитию структурного программирования – дисциплинированного подхода к написанию программ, отличающихся от неструктурированных программ ясностью, простотой тестирования и отладки и легкостью модификации.

Одним из наиболее ощутимых результатов этих исследований была разработка в 1971 году Никлаусом Виртом языка программирования Pascal. Pascal, названный в честь математика и философа семнадцатого столетия Блеза Паскаля, был разработан для изучения структурного программирования в академической среде и вскоре стал наиболее предпочитаемым языком программирования во многих университетах.

Приступим к описанию структурной методологии.

 
  Подпрограммы и их параметры - student2.ru

Определение: Блок-схема — это графическое представление алгоритма или фрагмента алгоритма. Блок-схема рисуется с использованием специальных символов, таких, как прямоугольники, ромбы, овалы, и малые окружности; этисимволы соединяются стрелками, называемыми линиями связи. Например, функциональные узлы, как фрагменты блок схем:

- Подпрограммы и их параметры - student2.ru Узел слияния - 2 входа 1 выход, операции над данными не осуществляются

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

Функция- преобразование входных данных.

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

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

 
  Подпрограммы и их параметры - student2.ru

Существует 15 элементарных программ (≤ 4 узлов)

Подпрограммы и их параметры - student2.ru 7 из них имеют функциональные узлы:

1. функция. 2.Следование

       
  Подпрограммы и их параметры - student2.ru   Подпрограммы и их параметры - student2.ru

 
  Подпрограммы и их параметры - student2.ru

3. Если-то-иначе. 4. Если-то.

Подпрограммы и их параметры - student2.ru
5. Цикл с предусловием. 6. Цикл с постусловием.

 
  Подпрограммы и их параметры - student2.ru

7: Цикл с внутренним условием.

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

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

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

Исследование Бома и Джопини показало, что программы могут быть написаны без использования оператора goto. Также в этом исследовании была доказана следующая теорема.

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

1.Следования.

2.Если-то-иначе.

3.Цикл с предусловием.

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

К неструктурным операторам в языке Pascal относятся:

1. Goto.

2. break.

3. continue.

4. exit.

5. halt.

Наши рекомендации