1611678431-0e68e83522cb9d960ac896aa5d90854d (826635), страница 11
Текст из файла (страница 11)
Обычно подпрограмма также имеет имя, по которому её можновызвать, хотя ряд языков программирования допускает использование и неименованныхподпрограмм. В языках высокого уровня описание подпрограммы обычно состоит по меньшеймере из двух частей: заголовка и тела. Заголовок подпрограммы описывает её имя и, возможно,параметры, то есть содержит информацию, необходимую для вызова подпрограммы. Тело —набор операторов, который будет выполнен всякий раз, когда подпрограмма будет вызвана.Вызов подпрограммы выполняется с помощью команды вызова, включающей в себя имяподпрограммы. В большинстве современных языков программирования команда вызовапредставляет собой просто имя вызываемой подпрограммы, за которым могут следоватьфактические параметры (см.
ниже).В следующем примере на языке Паскаль подпрограмма subprog вызывается из основнойпрограммы трижды:program SubProgExample;// Описание подпрограммы subprogprocedure subprog; // Заголовок, включающий имя подпрограммыbegin // начало тела подпрограммыWriteLn('Bye');end; // конец тела подпрограммыbeginWriteLn('Hello');subprog; // 1-й вызовsubprog; // 2-й вызовsubprog; // 3-й вызовend.Результатом выполнения такой программы станет вывод строки «Hello» и трёх строк «Bye».Некоторые языки программирования (например, Паскаль, Ада, Модула-2) допускают описаниевложенных подпрограмм, то есть помещение подпрограмм внутрь других подпрограмм.
Такиевложенные подпрограммы могут использоваться только в той подпрограмме, в которой ониописаны. В иных случаях (например, в языке Си) вложение подпрограмм не допускается. Никакихпринципиальных преимуществ вложение подпрограмм не даёт, но может быть удобно для болеелогичной структуризации программы (если какая-то подпрограмма используется только внекоторой другой подпрограмме, логично поместить первую во вторую).25. Процедуры и функции языка Паскаль, побочный эффектПроцедуры и функцииВ языке Паскаль, как и в большинстве языков программирования,предусмотрены средства, позволяющие оформлять вспомогательный алгоритмкак подпрограмму.
Это бывает необходимо тогда, когда какой-либоподалгоритм неоднократно повторяется в программе или имеется возможностьиспользовать некоторые фрагменты уже разработанных ранее алгоритмов.Кроме того, подпрограммы применяются для разбиения крупных программ наотдельные смысловые части в соответствии с модульным принципом впрограммировании.Для использования подалгоритма в качестве подпрограммы ему необходимоприсвоить имя и описать алгоритм по правилам языка Паскаль. В дальнейшем,при необходимости вызвать его в программе, делают вызов подпрограммыупоминанием в нужном месте имени соответствующего подалгоритма сосписком входных и выходных данных. Такое упоминание приводит квыполнению входящих в подпрограмму операторов, работающих с указаннымиданными. После выполнения подпрограммы работа продолжается с тойкоманды, которая непосредственно следует за вызовом подпрограммы.В языке Паскаль имеется два вида подпрограмм - процедуры и функции.Процедуры и функции помещаются в раздел описаний программы.
Для обменаинформацией между процедурами и функциями и другими блоками программысуществует механизм входныхи выходных параметров. Входнымипараметрами называют величины, передающиеся из вызывающего блока вподпрограмму (исходные данные для подпрограммы), а выходными передающиеся из подрограммы в вызывающий блок (результаты работыподпрограммы).Одна и та же подпрограмма может вызываться неоднократно, выполняя одни ите же действия с разными наборами входных данных. Параметры,использующиеся при записи текста подпрограммы в разделе описаний,называют формальными, а те, что используются при ее вызове фактическими.Описание и вызов процедур и функцийСтруктура описания процедур и функций до некоторой степени похожа наструктуру Паскаль-программы: у них также имеются заголовок, разделописаний и исполняемая часть.
Раздел описаний содержит те же подразделы,что и раздел описаний программы: описания констант, типов, меток, процедур,функций, перменных. Исполняемая часть содержит собственно операторыпроцедур.Формат описания процедуры имеет вид:procedure имя процедуры (формальные параметры);раздел описаний процедурыbeginисполняемая часть процедурыend;Формат описания функции:function имя функции (формальные параметры):тип результата;раздел описаний функцииbeginисполняемая часть функцииend;Формальные параметры в заголовке процедур и функций записываются в виде:var имя праметра: имя типаи отделяются друг от друга точкой с запятой.
Ключевое слово var можетотсутствовать (об этом далее). Если параметры однотипны, то их имена можноперечислять через запятую, указывая общее для них имя типа. При описаниипараметров можно использовать только стандартные имена типов, либо именатипов, определенные с помощью команды type.Список формальных параметровможет отсутствовать.Вызов процедуры производится оператором, имеющим следующий формат:имяпроцедуры(список фактических параметров);Список фактических параметров - это их перечисление через запятую. Привызове фактические параметры как бы подставляются вместо формальных,стоящих на тех же местах в заголовке. Таким образом происходит передачавходных параметров, затем выполняются операторы исполняемой частипроцедуры, после чего происходит возврат в вызывающий блок. Передачавыходных параметров происходит непосредственно во время работыисполняемой части.Вызов функции в Турбо Паскаль может производиться аналогичным способом,кроме того имеется возможность осуществить вызов внутри какого-либовыражения.
В частности имя функции может стоять в правой части оператораприсваивания, в разделе условий оператора if и т.д.Для передачи в вызывающий блок выходного значения функции в исполняемойчасти функции перед возвратом в вызывающий блок необходимо поместитьследующую команду:имя функции := результат;При вызове процедур и функций необходимо соблюдать следущие правила:количество фактических параметров должно совпадать с количествомформальных;соответствующие фактические и формальные параметры должнысовпадать по порядку следования и по типу.Заметим, что имена формальных и фактических параметров могут совпадать.Это не приводит к проблемам, так как соответствующие им переменные всеравно будут различны из-за того, что хранятся в разных областях памяти.
Крометого, все формальные параметры являются временными переменными - онисоздаются в момент вызова подпрограммы и уничтожаются в момент выхода изнее.Рассмотрим использование процедуры на примере программы поискамаксимума из двух целых чисел.var x,y,m,n: integer;procedure MaxNumber(a,b: integer; var max: integer);beginif a>b then max:=a else max:=b;end;beginwrite('Введите x,y ');readln(x,y);MaxNumber(x,y,m);MaxNumber(2,x+y,n);writeln('m=',m,'n=',n);end.Аналогичную задачу, но уже с использованием функций, можно решить так:var x,y,m,n: integer;function MaxNumber(a,b: integer): integer;var max: integer;beginif a>b then max:=a else max:=b;MaxNumber := max;end;beginwrite('Введите x,y ');readln(x,y);m := MaxNumber(x,y);n := MaxNumber(2,x+y);writeln('m=',m,'n=',n);end.Побочный эффектПобочным эффектом функции называется любое изменение функцией состояния программнойсреды, кроме возвращаемого значения: изменение значений глобальных переменных, выделениеи освобождение памяти, ввод-вывод и тому подобного.
Теоретически наиболее правильнымявляется использование функций, не имеющих побочного эффекта (то есть таких, в результатевызова которых возвращается вычисленное значение, и только). В функциональной парадигмепрограммирования любая программа представляет собой набор вложенных вызовов функций, невызывающих побочных эффектов. Наиболее известный язык программирования, реализующий этупарадигму — Лисп. В нём любая операция, любая конструкция языка, любое выражение,кроме константы, являются вызовами функций. Наиболее полно парадигма функциональногопрограммирования реализуется в языке Хаскелл.Побочные эффектывс, 10/31/2010 - 02:36 — techЕсли в теле процедуры (функции) используется некоторая нелокальная переменная,т.е.
такая переменная, которая описана в основной части программы, то могутнаблюдаться непредвиденные последствия.Пример. Пусть функция f(x) имеет такой вид:function f(x: real): real;beginv := v * x;f := sqrt(v) + xend;т.е. в процессе работы функция f изменяет некоторую нелокальную величину v.Рассмотрим теперь два выражения, которые вычисляются в программе: f(x) + v и v + f(x).Эти выражения дадут разные результаты, т.к. в первом случае к f(x) прибавляется ужеизмененное значение v (в процессе работы f), а во втором случае к первоначальномузначению v добавляется f(x).Вторая опасность заключается в неправильномпеременных в качестве формальных параметров.использованиипараметров-Пример.
Найти 5-й член последовательностиan + 1 = 3an – 2,a1 = 1.Опасно оформлять функцию в видеfunction f(var a, n: integer): integer;var i: integer;beginfor i := 1 to n doa := 3 * a – 2;f := aend;Так, если обратиться к этой функции оператором b := f(1, 5), будет «испорчена»константа 1, т.к. в ячейку памяти (первый фактический параметр), содержавшую ранееединицу, функция f поместит текущий член последовательности, и при дальнейшейработе программы вместо 1 будет использоваться значение a5. Такие ошибки бываеттрудно найти, поэтому полезно придерживаться следующего правила: в функциях неиспользовать параметры переменные.26.
Механизм параметров, ключевые и позиционные параметры, способы подстановкипараметровПара́ метр в программировании — принятый функцией аргумент. Термин «аргумент»подразумевает, что конкретно и какой конкретной функции было передано, а параметр — в какомкачестве функция применила это принятое. Т.е. вызывающий код передает аргумент в параметр,который определен в спецификации функции. Для усвоения разницы можно запомнить термин«параметризованная функция».Фактический или формальныйПо способу применения различают:фактический параметр — аргумент, используемый как значение (число, символ и т.