Являются ли процедуры и функции разновидностью подпрограмм. Подпрограммы. Алгоритм решения поиска НОД

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

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

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

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

В следующем примере на языке Паскаль подпрограмма 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 при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без разыменования, а также повышает надёжность и безопасность программы.

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

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

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

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

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

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

В языке Pascal имеется два вида программных единиц, относящихся к подпрограммам:

  • процедуры;
  • функции.

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

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

  • стандартные;
  • нестандартные.

Стандартные являются принадлежностью самого языка и в языке находятся в так называемых стандартных библиотеках и такие библиотеки находятся в языке в виде самостоятельных программных единицах (модулях). Язык Turbo-Pascal имеет несколько стандартных модулей: System, Dos, WinCrt, Printer, Graph, Overlay. Они подключаются в Uses. Это требование не относится к System, в котором находятся основные процедуры и функции, так как это модуль автоматически подключается компилятором.

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

Описание процедур и функций может быть реализовано двумя способами:

  • в разделе описания программы;
  • в отдельно компилируемых программных единицах, называемых модулями.

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

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

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

Объявление подпрограмм на языке Pascal

Объявление функции:

Function [имя] ([список_формальных_параметров]:[тип]):[тип];

[раздел_описаний_функции];

[операторы_тела_функции];

[имя]:=[результат_работы_операторов_тела_функции];

Function - служебное слово. [имя] - идентификатор имени. [список_формальных_параметров] - параметры в общем виде. [тип] - тип параметров. Имеет раздел описаний и раздел операторов. Вызов функции осуществляется в разделе операторов:

[переменная]:=[имя](список_формальных_параметров);

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

Объявление процедуры:

Procedure [имя] ([список_входных_параметров]:[тип];

Var [выходной_формальный_параметр_1]:[тип];

Var [выходной_формальный_параметр_К]:[тип];):[тип];

[раздел_описаний_процедуры];

[операторы_тела_процедуры];

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

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

Вызов процедуры:

[имя](список_фактических_параметров);

Наименование параметра Значение
Тема статьи: Подпрограммы
Рубрика (тематическая категория) Программирование

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

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

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

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

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

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

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

Формальные и фактические параметры. Чтобы отличать параметры подпрограммы, описанные в её заголовке и телœе, от параметров, указываемых при вызове подпрограммы, первые принято называть формальными параметрами, вторые - фактическими параметрами.

Подпрограмма - ϶ᴛᴏ блок кода между операторами Sub и End Sub или Function и end Function .

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

Подпрограмма-процедура Sub и End Sub . Обычно подпрограмму-процедуру принято называть процедурой.

При написании программы нужно учесть одно правило: ʼʼВнутри одной процедуры не должна быть описана другая процедураʼʼ.

Процедура - это любая подпрограмма, которая не является функцией.

Подпрограмма-функция - ϶ᴛᴏ блок кода, заключенный между операторами Function и End Function. Она выполняет какую-то операцию, но при этом обязательно возвращает какое-нибудь значение. Значение возвращается через имя функции.

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

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

6.2.4 Принцип проектирования программ сверху-вниз и снизу–вверх.

Программирование ʼʼсверху внизʼʼ, или нисходящее программирование - ϶ᴛᴏ методика разработки программ, при которой выработка начинается с определœения целœей решения проблемы, после чего идет последовательная детализация, заканчивающаяся детальной программой. Является противоположной методике программирования ʼʼснизу вверхʼʼ.

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

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

Программирование ʼʼснизу вверхʼʼ, или восходящее программирование - ϶ᴛᴏ методика разработки программ, начинающаяся с разработки подпрограмм (процедур, функций), в то время когда проработка общей схемы не закончилась. Является противоположной методике программирования ʼʼсверху внизʼʼ.

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

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

Пример.
Размещено на реф.рф
Чтобы написать число 512, сначала пишут цифру 5, затем 1 и, наконец, 2. При этом цифры рисуют, последовательно прорисовывая линии, из которых они состоят. Принтер напечатает это число точками.

При разработке программы пошагово, методом ʼʼсверху вниз ʼʼ сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста͵ вставляется вызов подпрограммы, которая будет выполнять данный фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются ʼʼзаглушкиʼʼ, которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём выработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной ʼʼзатычкиʼʼ, которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и должна быть уверен, что общая структура всœех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.

В теории и практике программирования наиболее популярны стратегии ʼʼсверху внизʼʼ и ʼʼснизу вверхʼʼ. Такие полярные варианты взаимодействия процессов проектирования и реализации оказываются применимыми только для программ небольшого или среднего размера. Создание же крупной программы обычно связано с поиском разумного компромисса между этими вариантами. Существует и еще одно решение – программирование ʼʼвширьʼʼ.

Программирование ʼʼвширьʼʼ - ориентиром провозглашается набор однородных модулей. В одной программе должна быть выявлено несколько однородных наборов. После того как однородные модули выявлены, приступают к непосредственному программированию, ĸᴏᴛᴏᴩᴏᴇ, собственно, и разбивается на этапы. На первом этапе создается лишь минимальное число представителœей каждого из выделœенных однородных наборов. В случае если поиск однородности проводился достаточно энергично, то обычно оказывается, что объём работ первого этапа реализации сравнительно невелик.

Подпрограммы - понятие и виды. Классификация и особенности категории "Подпрограммы" 2017, 2018.

  • - Call имя подпрограммы (фактические параметры).

    Вызов подпрограммы процедуры Sub Синтаксис процедуры типа Sub Процедура типа Sub [ Public | Private] Sub имя [(параметры)] [операторы внутри процедуры] End Sub Public - процедура доступна для всех других процедур модулей проекта. По умолчанию... .


  • - ПРОГРАММЫ И ПОДПРОГРАММЫ. СВЯЗЬ ПО УПРАВЛЕНИЮ И ПО ДАННЫМ

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


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

    Лабораторная работа № 3. В целях структуризации программ, облегчения их разработки, отладки и понимания большие программы принято разбивать на отдельные модули, логически связанные друг с другом и достаточно автономные. Идея структурного программирования... .


  • - Основы программирования на языке Visual Basic for Applications (VBA). Подпрограммы-процедуры и подпрограммы-функции. Модульная структура программы.

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


  • - Подпрограммы пользователя

    Begin Var s:real; s1: integer;{Ввод числовых данных} s:=StrToFloat(Edit1.Text); s1:=StrToInt(InputBox("Ввод данных","Введите s","")); {Вывод числовых данных} Edit2.Text:=FloatToStr(s); Label1.Caption:=IntToStr(s1); ShowMessage(FloatToStr(s)) End; Для вывода чисел по формату используются: - Процедура Str(F[:Width[:Decimals]], S), которая... .


  • - Вызов подпрограммы на С из подпрограммы на ассемблере

    Вызов подпрограммы на С не отличается от вызова подпрограммы на ассемблере. Однако при вызове С/С++-функции следует учитывать, что она работает в соответствии с рассмотренными положениями функционирования среды выполнения. Поэтому, если вложенная asm-процедура в... .


  • - Вызов подпрограммы на ассемблере из программы на С

    Хорошим стилем программирования считается описание прототипа ассемблерной функции для определения аргументов функции и интерфейса между программой на С и подпрограммой на ассемблере. Run-time модель выполнения определяет некоторые регистры как рабочие (Scratch), а... .


  • - Подпрограммы

    Begin Uses Uses End. Begin . . .//код проектаРабота с модулем: 1. Создать консольное приложение командой Файл => Новый => Другое => Console Application. 2. Cохранить проект в папке KR командой Файл => Сохранить проект как..=> Blank. 3.... .


  • - Основные функции и подпрограммы

    Программное обеспечение USB Библиотечные подпрограммы разработаны для использования с компоновщиком. Нет необходимости создавать дополнительные включаемые файлы. Подпрограммы предлагаются упакованными в следующие файлы: USB_CH9 .ASM - обработка всех команд в... .


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

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

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

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

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

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

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

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

    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. Что такое граничное условие при организации рекурсивной подпрограммы?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Label; {описание меток}

    Const; {описание констант}

    Type; {описание типов}

    Var; {описание переменных}

    Procedure; {описание процедур}

    Function; {описание функций}

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

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

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

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

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

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

    Program AkulovE;

    Procedure Input ;

    writeln("По вызову активизировалась процедура "Input"",#10);

    writeln("Введите два числа через пробел - ");

    Procedure Summa ;

    writeln("Для сложения подключилась процедура "Summa"",#10);

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    Procedure Output ;

    writeln("Заключительная часть. Процедура "Output"",#10,#13);

    writeln("Их сумма - ",x);

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

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

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    Function SredArif (A, B:integer):real;

    SredArif :=(A+B)/2;

    {- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

    write("Введите два числа ");

    Rez:=SredArif (A,B);

    В продолжение темы:
    Asus

    Чтобы строки маркированного списка как-то выделить от основного текста, можно сделать так, чтобы цвет маркеров в списке отличался от цвета текста.По умолчанию стоит черная...

    Новые статьи
    /
    Популярные