Pascal. Процедуры и функции
Процедуры и функции в языке Pascal являются подпрограммами. Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе. Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.
Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:
Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими. Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом. Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.
Stored Procedure vs Function
Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур и функций:
Процедура:
Функция:
В 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 ;
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 можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.
- Операторы ввода вывода Паскаль
- Записи в Паскале
- Создаём шаблон программы Pascal.
- Pascal. Тип данных char.
- Принципы управления палитрой Паскаль
Источник: kvodo.ru
Процедуры и функции — создание подпрограмм в Pascal
Использование подпрограмм является главной особенностью структурного программирования. Подпрограмма представляет собой составной оператор, объединяющий ряд простых операторов. При этом этот «составной оператор» оснащается именем и внешне оформляется как программа. В подпрограмме бывают свои константы и переменные, невидимые из глобальной области (основной программы).
Зачем нужны подпрограммы? Их использование удобно, когда в программе несколько раз решается одна и та же подзадача, но для разных наборов данных. Кроме того, использование подпрограмм естественно для человека, которому проще воспринимать логически связанные объекты, чем множество разнородных данных.
Программный код подпрограммы описывается единожды перед телом основной программы, затем из основной программы можно им пользоваться многократно. Обращение к этому программному коду из тела основной программы осуществляется по его имени (имени подпрограммы).
В большинстве языков структурного программирования подпрограммы существуют только в виде функций. В Паскале же их два типа: процедуры и функции. Их заголовки выглядят соответственно так:
procedure имя (параметры);
function имя (параметры): тип результата;
Между функциями и процедурами есть существенное отличие. Значение, полученное в результате выполнения кода функции, жестко соотносится с ее именем путем присвоения этому имени конкретного значения. Тип, который может принять вычисляемое значение, указывается в заголовке функции ( тип результата ).
Параметры не являются обязательным компонентом, однако их использование повышает гибкость процедуры или функции, т.к. они перестают быть привязанными к определенным данным.
Когда процедура или функция вызываются, то в скобках вместо формальных параметров, указываются фактические параметры (аргументы). Это могут быть либо конкретные значения, либо переменные из основной программы.
Тело подпрограммы, как и любого составного оператора на языке Паскаль, ограничивается скобками begin и end .
Примеры определения процедуры и ее вызововы из основной программы:
procedure box (s: char; w, h: integer); var i,j:integer; begin for i := 1 to h do begin for j := 1 to w do write(s); writeln end; end; begin box (‘+’, 10, 5); box (‘$’, 20, 3); end.
Результат выполнения программы:
Примеры определения функции и ее вызовов из основной программы:
var num: longint; function digits (n: longint): byte; var i: byte; begin i := 0; while n > 0 do begin n := n div 10; i := i + 1 end; digits := i end; begin write(‘Введите положительное число: ‘); readln(num); num := digits(num); writeln (‘Количество разрядов = ‘, num); end.
Результат выполнения программы:
Введите положительное число: 346114 Количество разрядов = 6
Формальные и фактические параметры
Формальные параметры – это наименование переменных, через которые передается информация из программы в подпрограмму, либо из подпрограммы в программу.
Когда процедура или функция вызывается в нее передаются фактические параметры.
При вызове подпрограммы машина производит следующие действия. Устанавливает взаимно однозначное соответствие между фактическими и формальными параметрами, затем управление передает подпрограмме. После того, как она завершит свою работу, управление передается вызывающей программе на оператор, следующий за вызовом подпрограммы.
Соответствие между фактическими и формальными параметрами должно быть следующим:
а) число фактических параметров должно быть равно числу формальных параметров;
б) соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.
Соответствующие параметры не обязательно должны быть одинаково обозначены.
Параметры процедур могут быть четырех видов: параметры-значения, параметры-переменные, параметры-процедуры, параметры-функции.
Параметры-значения
Для параметров-значений машина при вызове процедур производит следующие действия: выделяет место в памяти для каждого формального параметра, вычисляет значение фактического параметра и записывает его в ячейку, соответствующую формальному параметру.
Если фактический параметр есть имя переменной, например, r , то значение этой переменной пересылается в соответствующий формальный параметр, например, a . На этом всякая связь между a и r обрывается.
Если даже фактический и формальный параметры одинаково обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это полезно знать, чтобы не допустить распространенной среди начинающих программистов ошибки – пытаться передать информацию из процедуры в вызывающую программу через параметр-значение. Пример:
var i: integer; procedure p(i: integer); begin i := i * 2 end; begin i := 2; p(i); writeln(‘ i = ‘, i); end.
В программе происходит засылка числа 2 в ячейку, отведенную для переменной i , затем идет обращение к процедуре p с фактическим параметром i = 2 . При этом значение 2 пересылается в другую ячейку, отведенную для формального параметра i . В этой ячейке после выполнения оператора i := i * 2 появляется число 4. Но после возврата из процедуры на оператор writeln программа «знает» только одну переменную i , которая по-прежнему содержит число 2. Поэтому программа выведет i = 2 .
Если формальный параметр есть параметр-значение, то соответствующим фактическим параметром должно быть выражение того же типа, что и формальный параметр.
Параметры-переменные
Если перед именем формального параметра стоит ключевое слово var, то такой параметр есть параметр-переменная. Примерами таких параметров служат x1 и x2 в заголовке:
procedure sq(a, b, c: real; var x1, x2: real);
Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).
При вызове процедур (функций) параметры-переменные обрабатываются так: для формального параметра используется именно та ячейка, которая содержит соответствующий фактический параметр.
Через параметр-переменную можно передать результат выполнения процедуры:
var a, b: integer; procedure h(x: integer; var y: integer); begin x := x + 1; y := y + 1; writeln(x, y) end; begin a := 0; b := 0; h(a, b); writeln(a, b); end.
Результаты, выдаваемые процедурой h – это 11; основная ветка программы выводит 01.
Разберем пример. Фактический параметр a соответствует формальному параметру-значению x , а фактический параметр b – формальному параметру-переменной y . Под параметры a и x отведены две разные ячейки памяти, под b и y – одна и та же ячейка.
При вызове h(a, b) из ячейки a пересылается значение 0 в ячейку x , а в ячейку y засылается адрес ячейки b , содержащей 0, т.к. в процедуре h параметр x – это параметр-значение, а y – параметр-переменная.
При выполнении оператора x := x + 1 в ячейку x прибавляется 1 и в ячейке x окажется 1, а в ячейке a по-прежнему 0.
Выполнение оператора y := y + 1 имеет следующий смысл: «взять число из ячейки, адрес которой находится в y (т.е. из ячейки b ), прибавить 1 и заслать в ту же ячейку (т.е. в b ).
Поэтому в результате выполнения оператора y := y + 1 значение ячейки b станет 1. Оператор печати из процедуры выдаст содержимое ячейки x и ячейки y , т.е. 1 и 1. Оператор печати в программе напечатает содержимое a , которое осталось равным 0, и содержимое ячейки b , которое теперь равно 1.
Процедуры в Паскале допускают рекурсию, т.е. процедура может вызвать сама себя.
Если в процедуре p есть обращение к процедуре q , описанной ниже, то перед описанием p процедура q декларируется как forward: после заголовка процедуры q ставится двоеточие, а затем ключевое слово forward . В этом случае параметры процедуры описываются только в операторе с forward . В заголовке самой процедуры параметры опускаются.
procedure q(x: t1): forward; procedure p(x: y); begin q(a) end; procedure q; begin p(b) end;
Источник: pas1.ru
5. Подпрограммы (процедуры и функции)
Подпрограмма – относительно самостоятельная часть программы, имеющая свое имя и выполняющая определенные действия.
Подпрограммы повышают надежность и наглядность программ, т.к. позволяют разрабатывать и отлаживать каждый блок программы независимо (например, разными людьми).
Структура подпрограммы почти полностью повторяет структуру всей программы и состоит из следующих частей:
- заголовок подпрограммы
- раздел описаний
- тело подпрограммы
5.1 Процедуры
procedure (список формальных параметров); ; begin тело процедуры>; end; Пример 1: Процедура вычисления и вывода на экран куба числа. procedure cub(x: real); var y: real; begin y:=x*x*x; writeln(y); end; Указание имени процедуры в программе приводит к активизации процедуры и называется ее вызовом. Сразу после активизации процедуры начинают выполняться входящие в нее операторы.
После выполнения последнего оператора процедуры управление передается в основную программу и далее выполняются операторы, следующие за вызовом процедуры. Процедура может вызываться в основной программе неоднократно.
Например: cub(5); … readln(z); cub(z); Для обмена информацией между основной программой и процедурой используются параметры, которые придают процедуре универсальность. Пример 2: Программа, выводящая на экран следующее: ********* a=1 b=1 ********* a=2 b=4 ********* a=3 b=9 ********* a=4 b=16 ********* var a,b: integer; procedure Stars; var i: integer; begin for i:=1 to 9 do write(‘*’); writeln; end; begin Stars; for a:=1 to 4 do begin b:=sqr(a); writeln(‘a=’,a,’ b=’,b); Stars; end; end. Пример 3: var a,b: integer; procedure Stroka(ch: char, n: integer); var i: integer; begin for i:=1 to n do write(ch); writeln; end; begin Stroka(‘+’,4); for a:=1 to 3 do begin b:=sqr(a); writeln(‘a=’,a,’ b=’,b); Stroka(‘*’,8); end; end. Разберем вызов процедуры Stroka(‘*’,8): ‘*’ и 8 – фактические параметры (т.е. те, которые указаны в скобках после имени процедуры при ее вызове), они присваиваются при вызове формальным параметрам ch и n (т.е. тем, которые указаны в скобках после имени процедуры при ее описании). Замечание: количество, порядок и тип параметров при вызове процедуры должны совпадать с количеством, порядком и типом параметров, заданным при описании процедуры. Результат на экране: ++++ a=1 b=1 ******** a=2 b=4 ******** a=3 b=9 ********
Источник: studfile.net
Урок 14. Описание и вызов процедуры
Процедуры— это разновидность подпрограмм. Процедура, в отличие от функции, может содержать несколько выходных параметров или ни одного. Её нельзя использовать в качестве операнда в выражених.
Процедуры, не входящие в комплект поставки Паскаль (то есть не встроенные в Паскаль), называются пользовательскими процедурами, потому что их должен определять пользователь.
На этом уроке вы научитесь определять и вызывать пользовательские процедуры.
Прежде чем использовать процедуру, ее нужно описать в разделе описаний основной программы.
В разделе описаний процедуры и функции определяют после раздела описания переменных (после раздела Var) и до до начала раздела операторов (до слова Begin).
Структура процедуры в языке Паскаль похожа на структуру основной программы: в ней есть заголовок, раздел описаний и раздел операторов.
Общий вид процедуры:
Procedure []; Begin End;
Параметры, перечисленные в скобках после имени процедуры, называются формальными. Их назначение — указать количество и тип переменных, с помощью которых будет осуществляться обмен информацией между подпрограммой и основной программой. Формальные параметы определяют место подстановки фактических параметров, над которыми и производятся действие.
Через параметры-значения в подпрограмму поступает входная информация. Перед ними слово Var не ставится и идет передача по значению, то есть передается только копия значений этих параметров.
Через параметры- переменные из подпрограммы в основную программу передаются результаты. Перед параметрами-переменными ставится служебное слово Var.
Вызов процедуры
Процедура не может выполнится сама, ее необходимо вызвать. Чтобы вызвать процедуру, нужно указать ее имя и список фактические параметров.
Общий вид вызова процедуры:
Фактические параметры — это параметры, которые передаются процедуре при обращении к ней. При вызове процедуры ее формальные параметры заменяются фактическими. Число и тип формальных и фактических параметров должны совпадать с точностью до их следования. Имя фактического параметра никак не связано с именем соответствующего формального параметра.
Пример 1. Оформить в виде процедуры алгоритм вычисления степени y = x n с натуральным показателем n.
procedure degree(x,y: integer; var st: longint); var i:integer; begin st :=1; For i:=1 to y do st:= st * x; end;
Процедура имеет три параметра: первый параметр — основание степени, второй — показатель степени, а третий — это результат. Поэтому первые два параметра — это параметры значения, а третий — это параметр-переменная и перед ним надо написать слово Var.
В программе процедуры и функции описывается в разделе описаний основной программы после раздела описания переменных. Вся программа для нашей задачи имеет следующий вид:
program primer1; var a, n: integer; s:longint; procedure degree(x,y: integer; var st: longint); var i:integer; begin st :=1; For i:=1 to y do st:= st * x; end; begin writeln(‘Введите два числа’); readln(a, n); degree(a,n,s); writeln(‘Результат: ‘, s); end.
Процедура вызывается по имени. В нашем примере, фактические параметры а, n и s передают свои значения соответствующим формальным параметрам x, y и st. После завершения работы процедуры переменные a и n имеют те же значения, что и при вызове, а s получает новое значение.
Вы научились определять и вызывать пользовательские процедуры. На следующем уроке рассмотрим пользовательские функции.
Источник: gospodaretsva.com