• Подпрограмма определение. Что такое подпрограмма. II. Изучение нового материала

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

    В ТУРБО ПАСКАЛЕ различают два вида подпрограмм - это процедуры и функции . Процедура и функция - это именованная последовательность описаний и операторов. Так же использование процедур и функций необходимо тогда, когда имеется возможность использовать некоторые фрагменты уже разработанных ранее алгоритмов. Кроме того, подпрограммы применяются для разбиения крупных программ на отдельные смысловые части в соответствии с модульным принципом в программировании. Процедура - это независимая именованная часть программы, которую можно вызвать по имени для выполнения определённой в ней последовательности действий. Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки. В ПАСКАЛЬ, существуют стандартные процедуры: read, readln, write, writeln. Таким образом, концепция процедуры расширяет понятие оператора в языке ПАСКАЛЬ. Функция отличается от процедуры тем, что возвращает результат указанного при её описании типа. Вызов функции может осуществляться из выражения, где имя функции используется в качестве оператора. Функции являются частным случаем процедур, и обязательно возвращают в точку вызова результат как значение имени этой функции. При использовании функций необходимо учитывать совместимость типов в выражениях. В ПАСКАЛЬ, существует ряд стандартных функций, известных любой программе: sin, cos, eof, а также и другие функции из таблицы №3. Таким образом, концепция функции расширяет понятие выражения в языке ПАСКАЛЯ.

    Локальные и глобальные переменные

    Напомним, что каждый модуль (процедура, функция, программа) состоит из заголовка (procedure…, function…, program… ) и блока.

    Если блок какой-либо процедуры p1 содержит внутри процедуру p2, то говорят, что p2 вложена в p1.

    procedure p1(x: real; var y: real);

    procedure p2(var z: real);

    …………………….

    …………………….

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

    var y1, y2: real;

    var a, b, c, d: real;

    { Переменные a, b, c, d являются локальными для sq1,

    область их действия – процедура sq1 }

    ……………………………………

    { Переменные y1, y2 - нелокальные для sq1,

    область их действия – t1 и sq1 }

    Константы, переменные, типы, описанные в блоке program, называются глобальными . Казалось бы, проще иметь дело вообще только с глобальными переменными, описав их все в program. Но использование локальных переменных позволяет системе лучше оптимизировать программы, делать их более наглядными и уменьшает вероятность появления ошибок.

    Назначение подпрограмм.

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

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

    Механизм подпрограмм, их описание и вызов

    В следующем примере на языке Паскаль подпрограмма subprog вызывается из основной программы трижды:

    Program SubProgExample; procedure subprog; begin // начало тела подпрограммы WriteLn ("Bye" ) ; end ; // конец тела подпрограммы begin WriteLn ("Hello" ) ; subprog; // 1-й вызов subprog; // 2-й вызов subprog; // 3-й вызов end .

    Результатом выполнения такой программы станет вывод строки «Hello» и трёх строк «Bye».

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

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

    Назначение параметров

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

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

    Program SubProgExample2; // Описание подпрограммы subprog procedure subprog(Line: String ) ; // Заголовок, включающий имя подпрограммы begin // начало тела подпрограммы WriteLn (Line) ; end ; // конец тела подпрограммы begin WriteLn ("Hello" ) ; subprog("Good bye," ) ; // 1-й вызов subprog("my love," ) ; // 2-й вызов subprog("good bye!" ) ; // 3-й вызов end .

    В приведённом примере параметр Line подпрограммы subprog в каждом вызове получает различное значение, благодаря чему выводятся не одинаковые строки, а разные.

    Формальные и фактические параметры

    Чтобы отличать параметры подпрограммы, описанные в её заголовке и теле, от параметров, указываемых при вызове подпрограммы, первые принято называть формальными параметрами, вторые - фактическими параметрами. Так, в последнем примере параметр Line в заголовке и теле подпрограммы subprog - это формальный параметр, а строка "Good bye" , использованная в первом вызове этой подпрограммы - фактический параметр. При вызове подпрограммы фактические параметры, указанные в команде вызова, становятся значениями соответствующих формальных параметров, чем и обеспечивается передача данных в подпрограмму.

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

    Существует несколько способов передачи параметров в подпрограмму.

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

    int func1(int x) { x=x+1; return x; }

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

    void func2(int &x) { x=x+1; }

    • Передача параметров по имени. В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках Алгол или Алгол 68 .
    • Передача параметров через стек. Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке Форт .

    Язык программирования может предоставлять возможность передавать параметры в подпрограммы либо только по значению (так сделано в языке Си), либо по значению и по ссылке (это реализовано в Паскале , Аде , C++), либо по имени и значению (это реализовано в языках Алгол и Алгол 68). В последних двух случаях для различения способов передачи параметра используются отдельные синтаксическая конструкции (в Паскале это ключевое слово var при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без разыменования, а также повышает надёжность и безопасность программы.

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

    Виды подпрограмм

    В языках программирования высокого уровня используется два типа подпрограмм: процедуры и функции .

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

    Подпрограмма – относительно самостоятельная часть программы, имеющая свое имя и выполняющая определенные действия.

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

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

      заголовок подпрограммы

      раздел описаний

      тело подпрограммы

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

    5.1 Процедуры

    procedure <имя> (список формальных параметров);

    <раздел описаний>;

    begin

    < тело процедуры >;

    Пример 1: Процедура вычисления и вывода на экран куба числа.

    procedure cub(x: real);

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

    Например:

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

    Пример 2: Программа, выводящая на экран следующее:

    var a,b: integer;

    procedure Stars; {без параметров}

    var i: integer;

    for i:=1 to 9 do write(‘*’);

    for a:=1 to 4 do

    writeln(‘a=’,a,’ b=’,b);

    Stars; {вызов процедуры Stars }

    Пример 3:

    var a,b: integer;

    procedure Stroka(ch: char, n: integer);

    var i: integer;

    for i:=1 to n do write(ch);

    Stroka(‘+’,4);

    for a:=1 to 3 do

    writeln(‘a=’,a,’ b=’,b);

    Stroka(‘*’,8);

    Разберем вызов процедуры Stroka(‘*’,8): ‘*’ и 8 – фактические параметры (т.е. те, которые указаны в скобках после имени процедуры при ее вызове), они присваиваются при вызове формальным параметрам ch и n (т.е. тем, которые указаны в скобках после имени процедуры при ее описании).

    Замечание: количество, порядок и тип параметров при вызове процедуры должны совпадать с количеством, порядком и типом параметров, заданным при описании процедуры.

    Результат на экране :

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

    Назначение подпрограмм

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

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

    Преимущества

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

    • Декомпозиция комплексной программной задачи на простые шаги: это один из двух основных инструментов структурированного программирования и структур данных
    • Уменьшение дублированного кода
    • Возможность повторного использования кода в других программах
    • Разделение крупной программной задачи между различными программистами, или различными стадиями проекта
    • Сокрытие деталей реализации от пользователей подпрограммы
    • Улучшение прослеживания (большинство языков предоставляют способ получить след вызова который включает в себя имена задействованных подпрограмм и возможно даже больше такой информации как имена файлов и номера строк). Без декомпозиции кода на подпрограммы, отладка была бы серьезно затруднена.

    Механизм подпрограмм, их описание и вызов

    В следующем примере на языке Паскаль подпрограмма subprog вызывается из основной программы трижды:

    Program SubProgExample ; procedure subprog ; begin // начало тела подпрограммы WriteLn ("Bye" ) ; end ; // конец тела подпрограммы begin WriteLn ("Hello" ) ; subprog ; // 1-й вызов subprog ; // 2-й вызов subprog ; // 3-й вызов end .

    Результатом выполнения такой программы станет вывод строки «Hello» и трёх строк «Bye».

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

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

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

    Назначение параметров

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

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

    Program SubProgExample2 ; // Описание подпрограммы subprog procedure subprog (Line : String ) ; // Заголовок, включающий имя подпрограммы begin // начало тела подпрограммы WriteLn (Line ) ; end ; // конец тела подпрограммы begin WriteLn ("Hello" ) ; subprog ("Good bye," ) ; // 1-й вызов subprog ("my love," ) ; // 2-й вызов subprog ("good bye!" ) ; // 3-й вызов end .

    В приведённом примере параметр Line подпрограммы subprog в каждом вызове получает различное значение, благодаря чему выводятся не одинаковые строки, а разные.

    Формальные и фактические параметры

    Чтобы отличать параметры подпрограммы, описанные в её заголовке и теле, от параметров, указываемых при вызове подпрограммы, используются формальные и фактические параметры. Формальные параметры указываются при объявлении или определении подпрограммы, а фактические - непосредственно при её вызове. Так, в последнем примере параметр Line в заголовке и теле подпрограммы subprog - это формальный параметр, а строка "Good bye" , использованная в первом вызове этой подпрограммы - фактический параметр. При вызове подпрограммы фактические параметры, указанные в команде вызова, становятся значениями соответствующих формальных параметров, чем и обеспечивается передача данных в подпрограмму.

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

    Существует несколько способов передачи параметров в подпрограмму.

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

    int func1(int x)

    { x=x+2; return x;

    • Передача параметров по ссылке. В формальный параметр может быть помещён сам фактический параметр (обычно это реализуется путём помещения в формальный параметр ссылки на фактический). При этом любое изменение формального параметра в подпрограмме отразится на фактическом параметре - оба параметра во время вызова подпрограммы суть одно и то же. Параметры, передаваемые по ссылке, дают возможность не только передавать параметры внутрь подпрограммы, но и возвращать вычисленные значения в точку вызова. Для этого параметру внутри подпрограммы просто присваивается нужное значение, и после возврата из подпрограммы переменная, использованная в качестве фактического параметра, получает это значение.
    • Передача параметров по имени. В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках Алгол или Алгол 68 .
    • Передача параметров через стек. Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке Форт .

    Язык программирования может предоставлять возможность передавать параметры в подпрограммы либо только по значению, либо по значению и по ссылке, либо по имени и значению. В последних двух случаях для различения способов передачи параметра используются отдельные синтаксическая конструкции (в Паскале это ключевое слово var при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без разыменования, а также повышает надёжность и безопасность программы.

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

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

    Подпрограммы, входящие в состав классов в объектных языках программирования, обычно называются методами . Этим термином называют любые подпрограммы-члены класса, как функции, так и процедуры; когда требуется уточнение, говорят о методах-процедурах или методах-функциях .

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

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

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

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

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

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

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

    При составлении подпрограмм с параметрами надо соблюдать следующие правила:

    1) каждая подпрограмма имеет свое имя и список формальных параметров;

    2) процедура из основной программы вызывается командой вызова, которая по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.

    Пример 1. Используем алгоритм нахождения наибольшего общего делителя двух натуральных чисел в качестве вспомогательного при решении задачи: составить программу вычитания дробей (a , b , c , d — натуральные числа). Результат представить в виде обыкновенной несократимой дроби.

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

    1. Ввести натуральные числа M, N.
    2. Если M=N, перейти к п. 5, иначе к следующему пункту.
    3. Если M>N, то M:=M-N, иначе N:=N-M.
    4. Перейти к п. 2.
    5. Передать значение M в основную программу.
    6. Конец подпрограммы.

    Основная программа.

    1. Ввести значения A, B, C, D.
    2. E:=A*D - B*C.
    3. F:= B*D.
    4. Если E=0, вывести значение E и перейти к п. 9, иначе перейти к следующему пункту.
    5. M:=|E|, N:=F, перейти к подпрограмме вычисления НОД.
    6. G:= M.
    7. E и F нацело разделить на G.
    8. Вывести значения E и F на печать.
    9. Конец программы.

    Как видно из примера, объявление подпрограммы-функции находится в разделе описаний прототипов функций, а реализация после основной функции main . В заголовке подпрограммы содержится список формальных параметров с указанием их типа, которые условно можно разделить на входные и выходные (перед ними стоит &). Вообще при обращении к функции со списком параметров без &, внутри функции используются копии параметров, которые после выполнения удаляются. Знак & указывает компилятору что необходимо использовать саму переменную, а не ее копию. При обращении к функции указывается ее имя и список фактических параметров. Формальные и фактические параметры должны соответствовать по количеству и по типу.

    Описание функции в С++ осуществляется следующим образом:

    Тип_возвращаемого_значения ();

    Например,

    Void Nod(int e, int f, int &k); int f1(float a); long f2();

    Функция всегда возвращает единственное значение. Как видно из примера 1, мы использовали тип void в качестве возращаемого типа. Т.е. указали компилятору, что наша функция не возвращает никакого значения.

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

    Int Nod(int m, int n) { while (m!=n) if (m > n) m -=n; else n -= m; return (n); }

    Итак, в теле функции хотя бы один раз встречается команда return, которая указывает, какое значение вернуть в качестве значения функции.

    Вызов функции в основной будет следующим:

    G = Nod(fabs(e), f);

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

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

    Пример 2. Дано натуральное число n . Переставить местами первую и последнюю цифры этого числа.

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

    Возможны также подпрограммы, которые вызывают сами себя. Они называются рекурсивными . Создание таких подпрограмм является красивым приемом программирования, но не всегда целесообразно из-за чрезмерного расхода памяти ЭВМ.

    Пример 3. Найти максимальную цифру в записи данного натурального числа.

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

    Более подробно о рекурсии говорится в следующей статье .

    Контрольные вопросы и задания
    1. Какие алгоритмы называют вспомогательными?
    2. Какое количество вспомогательных алгоритмов может присутствовать в основном алгоритме?
    3. Можно ли вспомогательные алгоритмы, написанные для решения данной задачи, использовать при решении других задач, где их применение было бы целесообразно?
    4. Какие параметры называют формальными? фактическими?
    5. Какое соответствие должно соблюдаться между формальными и фактическими параметрами?
    6. Может ли фактических параметров процедуры (функции) быть больше, чем формальных? А меньше?
    7. Существуют ли подпрограммы без параметров?
    8. Существуют ли ограничения на число параметров подпрограмм? Если нет, то чем же всё-таки ограничивается это количество в С++?
    9. В каком разделе объявляются и в каком реализуются подпрограммы в С++?
    10. Какого типа может быть значение функции?
    11. Расскажите о методе последовательной детализации при разработке программ.
    12. Какие подпрограммы называют рекурсивными?
    13. Что такое граничное условие при организации рекурсивной подпрограммы?