Процедуры и функции в языке Pascal являются подпрограммами. Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе. Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.
Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:
Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими. Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом. Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.
10 класс. Пользовательские процедуры и функции. Python
Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур и функций:
Процедура:
Функция:
В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные. Те, которые объявляются в основной части, называются глобальными, а в процедуре или функции – локальными. Локальные переменные в отличие от глобальных могут использоваться лишь внутри подпрограммы, к которой они принадлежат.
Теперь более детально рассмотрим в отдельности каждый вид подпрограмм.
Пользовательские процедуры
Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы. Она начинается со служебного слова Procedure, после которого идет имя и заголовок процедуры. Остальная часть аналогична основной программе.
Напишем пример программы, показывающей принцип работы простой процедуры.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program proc;
uses crt;
var k , n , r : integer ;
Процедуры и функции в 1С 8.3: чем они отличаются и как их использовать
procedure sum ( pk , pn : integer ; var rez : integer ) ;
var i : integer ;
begin
rez := 0 ;
for i := pk to pn do
rez := rez + i;
write ( ‘ сумма диапазона = ‘ , rez : 3 ) ;
end ;
begin
clrscr;
write ( ‘ начальное значение = ‘ ) ; readln ( k ) ;
write ( ‘ конечное значение = ‘ ) ; readln ( n ) ;
sum ( k , n , r ) ;
end .
Программа выводит сумму целых чисел заданного диапазона. Имя процедуры прописано после служебного слова, определяющего, что создана именно процедура.
Далее идет заголовок, где первые две переменные – это формальные параметры, в которые передается значение от фактических k и n. Переменная rez возвращает результат и называется параметром-переменной (определяются после слова Var), а k и n – параметрами-значений. Локальная переменная – i, она описана сразу после заголовка процедуры. Вызывая, в основной части программы процедуру sum, в качестве передаваемых параметров мы указали три целочисленных переменных. Заметьте, что их количество соответствует числу формальных параметров. Порядок также важен, т. е. в переменную pk передается значение переменной k, в pn значение n и т. д.
В вышеизложенном примере было бы вполне уместным не использовать параметр-переменную rez, а определить ее локально. В этом состоит различие между процедурами и функциями в Pascal.
Пользовательские функции
В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении. Также для обращения к функции необходимо знать тип данных результата, возвращаемого ей.
Описание функций начинается со служебного слова function, вслед за которым идет ее заголовок, а дальше те же блоки, что и у процедуры.
В вызываемую часть результат работы функции должен быть возвращен посредством имени последней. Это предусматривает хотя бы одно присвоение ей значения.
Допустим необходимо вычислить наибольший общий делитель двух целых чисел. Результатом решения данной задачи будет одно число, поэтому мы воспользуемся именно функцией.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program func;
uses crt;
var
n , m , nod : integer ;
function nod_Evk ( f_n , f_m : integer ) : integer ;
begin
while n<>m do
begin
if m>n then m := m — n
else n := n — m;
end ;
nod_Evk := n;
end ;
begin
clrscr;
write ( ‘ N =: ‘ ) ; read ( n ) ;
write ( ‘ M =: ‘ ) ; read ( m ) ;
write ( ‘ Наибольший общий делитель ‘ , n , ‘ и ‘ , m , ‘ = ‘ ) ;
nod := nod_Evk ( n , m ) ;
write ( nod ) ;
end .
В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod. Как видите, в функцию из основной части передаются только два фактических параметра (m и n), что соответствует количеству формальных параметров. И если в заголовке процедуры после слова Var можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.
Источник: kvodo.ru
ОРГАНИЗАЦИЯ ПОДПРОГРАММ. ПРОЦЕДУРЫ И ФУНКЦИИ. ПРОЦЕДУРЫ И ФУНКЦИИ
Учебник по программированию.
Иногда код в программах может повторяться несколько раз. Что бы ни писать одно и то же по нескольку раз, можно объединить часть кода программы в процедуру или функцию. Тогда эту часть кода можно вызывать в любом месте программы, используя имя процедуры или функции. Ещё процедуры и функции называют подпрограммами, т.к. они выглядят как отдельные программы.
Процедуры от функций отличаются друг от друга тем, что функция возвращает какое-либо значение, а процедура просто производит какое-либо действие. Отсюда и названия: функция – что-то вычисляет и выдаёт результат вычислений, процедура – выполняет какую-либо процедуру.
В начале, научимся пользоваться процедурами. Для того, что бы создать процедуру, необходимо её описать. Делается это следующим образом:
writeln( ‘Привет всем!’ );
Writeln( ‘Меня зовут Денис.’ )
Меня зовут Денис.
Данная программа демонстрирует использование процедуры TryStroky (Три строки), которая вставляет 3 пустых строчки. Описание процедуры происходит перед телом программы. Для этого пишется слово Procedure и имя процедуры, после чего ставится точка с запятой:
Далее идёт тело процедуры, заключённое словами begin и end:
Обратите внимание, что после слова end ставиться не точка, а точка с запятой, это потому, что это – ещё не конец всей программы. В теле самой программы, что бы вызвать процедуру, необходимо написать имя процедуры. В этом месте выполнение основной программы остановиться, и начнётся выполнение процедуры. После того, как процедура закончит свою работу, снова начнёт своё выполнение основная программа с места, где была вызвана процедура.
Теперь, что бы был понятен смысл использования процедуры, приведу пример такой же программы, но без использования процедуры:
writeln( ‘Привет всем!’ );
Writeln( ‘Меня зовут Денис.’ )
Меня зовут Денис.
Как видно, результат выполнения тот же самый, однако в теле самой программы 3-я, 4-я и 5-я строчки абсолютно идентичны. В данном случае количество строк во всём коде стало даже меньше, но представьте себе, что в результате работы программы необходимо неоднократное выведение 3-х пустых строк. В таком случае использование данной процедуры будет вполне оправдано.
Двигаемся дальше. Часто процедура должна выполнить какие-либо действия с переменными. Например, вывести на экран результат вычислений. Если переменные объявлены до объявления процедуры, то в процедуре можно обратиться к ним, просто используя их имена:
Если мы опишем переменную y после процедуры, то компилятор выдаст ошибку «Неизвестное имя ‘ y ’ ». Дело в том, что обработка текста программы происходит последовательно, и если вы используете переменную до того как она будет объявлена, то компилятор будет выдавать ошибку так как он не будет знать, что эта переменная где-то объявлена.
Что бы избежать данной ошибки можно передать процедуре значение переменной в качестве параметра. Для этого после имени процедуры в скобках необходимо поместить параметр. Однако это возможно в том случае, если в описании процедуры это предусмотрено. Т.е. если процедура может получать параметр. Делается это следующим образом:
Procedure VivodRezultata(x: real );
При объявлении процедуры после её имени ставятся круглые скобки. В них указывается имя параметра и через двоеточие тип этого параметра. Далее в теле процедуры этот параметр используется как обычная переменная. В теле программы, при вызове процедуры, в круглых скобках должно находиться значение параметра. Значение параметра может быть или константой или переменной.
Тип переменной или константы должны совпадать с тем типом, который указан в разделе описания процедуры. В противном случае компилятор выдаст ошибку.
Сделаем небольшое отступление. В предыдущем абзаце появилось слово константа. Если в тексте программы какое-либо значение не должно меняться, то можно это значение объявить в разделе объявления констант:
Пишется слово Const, затем имя константы и после знака равно – значение этой константы. Обратите внимание, что здесь используется знак равно, а не оператор присваивания. В тексте программы использование этой константы аналогично переменной, однако если вы попытаетесь изменить её значение, то это будет ошибкой и программа не будет откомпилирована.
Если в теле программы написать просто число, то это тоже будет называться константой. Например, в следующей строчке цифры 3.14 обозначают константу 3.14:
Т. е. константой называется либо просто число, либо имя числа, присвоенное в разделе описания констант. Точно так же константой может называться любой другой тип данных. В следующем примере приведена строковая константа «Привет всем»:
При вызове процедуры, при передаче параметра мы можем написать либо имя константы, объявленное в разделе объявления констант, либо какое-либо число:
В том и другом случае мы будем говорить, что была передана константа.
Ещё один смысл использование констант заключается в том, что если часто используется длинное число, то проще один раз написать его в разделе объявления констант, а потом в тексте программы использовать имя константы. Например, точное значение числа Пи имеет следующее значение – 3.14 15926535, что бы каждый раз не писать такое длинное число можно присвоить его значение константе с именем, например, pi. Тогда вместо такого длинного числа можно будет использовать короткое слово pi.
Двигаемся дальше. Прежде чем начать изучение функций, хочу обратить внимание на команды write и read. До этого мы называли их командами, это в принципе не верно. На самом деле это как раз и есть процедуры. В скобках после имён процедур write или read пишется параметр, который передаётся данной функции.
Далее мы будем называть их именно процедурами.
Работа с функциями аналогична работе с процедурами. Разница в том, что функция возвращает какое-либо значение. Поэтому она должна находиться либо после оператора присваивания, либо внутри арифметического выражения. Далее приведу пример использования функции, а затем его разберём.
Function Summ(x,y: real ): real ;
Вместо слова Procedure, пишется слово Function. После слова Function пишется имя функции. После имени функции могут стоять скобки, в которых описаны передаваемые функции параметры. После скобок ставится двоеточие и тип возвращаемого параметра. В теле функции возвращаемый параметр называется так же, как и сама функция.
Приведу ещё один пример функции, но без передаваемых параметров:
Function Summ: real ;
Результат выполнения тот же самый, однако код программы отличается. В этой программе функция Summ складывает переменные B и С. Стоит отметить, что при вызове функции в любом месте программы она будет складывать переменные B и С. Если нам надо будет сложить другие две переменные, или две константы, то нам понадобиться функция как в предыдущей программе.
Пришло время поговорить о локальных и глобальных переменных. Переменные, объявленные в самом начале кода программы, могут использоваться в любом месте программы, в любой подпрограмме – они являются глобальными. Переменные, объявленные в какой-либо подпрограмме, могут использоваться только подпрограммой. Например, в предыдущей программе, переменные x и y, которые содержат значения передаваемых параметров, являются локальными и могут использоваться только в данной подпрограмме.
Переменные можно объявлять внутри подпрограммы так же, как и в самой программе. Например:
Function Summ: real ;
Результат выполнения здесь равен нулю. В чём дело? Дело в том, что мы внутри функции создали переменные с такими же именами, как и в основной программе. Поэтому функция стала работать со своими переменными и не стала обращать внимание на глобальные переменные.
Почему компилятор не выдал ошибку. На первый взгляд такая ситуация недопустима т.к. в программе существуют разные переменные с одинаковыми именами. Дело в том, что на практике программы пишут целые команды программистов. Или в программу вставляют уже когда-то написанный код.
Так вот, что бы не было конфликтов имён, что бы программистам не договариваться об именах переменных, такая ситуация в Pascal разрешена. В принципе в этом нет ничего опасного. Напротив, если понять принцип и немного привыкнуть, то наоборот вы обезопасите себя от случайных ошибок.
Принцип здесь следующий. Каждая программа или подпрограмма может создавать переменные. Если переменная создана основной программой, то она считается глобальной, если переменная создана подпрограммой, то переменная считается локальной. Глобальные переменные доступны во всех подпрограммах, локальные переменные доступны только в той подпрограмме, в которой они созданы.
Если что-то непонятно, то прочитайте снова. Если же всё понятно, то можно двигаться дальше.
В подпрограмме может быть одна или несколько подпрограмм. Вдумайтесь внимательно в это предложение. Другими словами, каждая подпрограмма может содержать в себе свои собственные подпрограммы. Ещё можно сказать более обобщённо. Каждая подпрограмма представляет собой самостоятельную программу со своими переменными, константами, процедурами и функциями.
Отсюда и название «подпрограмма». Разница лишь в том, что выполнение программы начинается в теле основной программы, а подпрограммы вызываются в течении работы программы. Теперь приведу пример:
Function Summ: real ;
Writeln( ‘Заработала функция Summ’ );
Заработала функция Summ
Подпрограмма Summ содержит в себе подпрограмму Soobshenie. Подпрограмму Soobshenie можно вызвать только в теле подпрограммы Summ. Если нам вдруг понадобится подпрограмма Soobshenie в теле самой программы или в теле другой подпрограммы, тогда необходимо описать Soobshenie отдельно от Summ. Причём сделать это необходимо до того места, где она будет вызвана. Т.е. любая подпрограмма может вызвать другую подпрограмму, но только в том случае если вызываемая подпрограмма описана выше по тексту, чем та, которая её вызывает.
Так же стоит заметить, что подпрограмма Soobshenie может содержать в себе свои подпрограммы, эти подпрограммы в свою очередь свои и так до бесконечности.
Такая организация очень удобна. Если программист пишет какую-либо подпрограмму, выполняющую определённые действия, то его не интересует, в каком месте программы будет вызвана его подпрограмма, и какие имена переменных будут использоваться в самой программе. Программисту можно сосредоточиться только на той задаче, которую должна выполнять его подпрограмма. Причём написанную им подпрограмму можно будет использовать в других программах.
Ещё есть один нюанс. Имена подпрограмм могут повторяться в том случае, если они созданы в разных подпрограммах.
В данном параграфе мы познакомились с процедурами и функциями рассмотрели вопрос о глобальных и локальных переменных. Так же узнали о константах. Здесь довольно много информации, которая на первых порах может не пригодится. Однако я не мог её не включить именно в этот параграф, так как потом возвращаться к этой теме будет нелепо. Не зацикливайтесь на мелочах в данном параграфе.
Более полное понимание придёт со временем, в процессе практической работы.
1.Ниже по тексту приведена программа.
Writeln( ‘Введите радиус круга:’ );
Источник: www.dvkuklin.ru