Каким символом разделяются перечень однотипных формальных параметров в процедуре
Список формальных параметров
Параметры, описанные в заголовке подпрограммы, называются формальными.
| (value: integer) (X, Y: Real) (st:string; n:integer; c,fill:char) |
Список формальных параметров – это последовательность объявлений однотипных параметров. Объявления отделяются друг от друга точкой с запятой. Каждое объявление состоит из списка имен параметров, символа ‘:’ и указания их типа. Внутри объявления имена параметров разделяются запятой. Имя параметра – это корректный идентификатор.
Существует два способа передачи параметра в подпрограмму: по значению(параметры-значения) или по ссылке. Для передачи параметра по ссылке рядом с именем параметра используется одно из зарезервированных слов: var (параметры-переменные), const (параметры-константы), out (выходные параметры). Например:
| (var S: string; X: Integer)(const P; I: Integer) |
Чтобы почувствовать разницу в способах передачи параметров, обратимся к следующим примерам (из Help):
| function DoubleByValue(X: Integer): Integer; // X is a value parameter begin X := X * 2; Result := X; end; function DoubleByRef(var X: Integer): Integer; // X is a variable parameter begin X := X * 2; Result := X; end; |
Эти функции возвращают одинаковый результат, но только вторая может изменять значение параметра, переданного в подпрограмму. Вызовем эти функции:
| Var I, J, V, W: Integer; begin I := 4; V := 4; J := DoubleByValue(I); // J = 8, I = 4 W := DoubleByRef(V); // W = 8, V = 8 end; |
Параметры-значения можно рассматривать как локальные переменные, которые получили начальное значение при вызове подпрограммы. Если вы передали какую-нибудь переменную как параметр-значение, то подпрограмма создает копию переменной. Изменения этой копии не приводят к изменению исходной переменной и утериваются после завершения работы подпрограммы.
Параметры-переменные похожи скорее на указатели. Изменения такого параметра внутри тела процедуры или функции сохраняются после завершения работы подпрограммы и возвращаются в вызывающую программу.
Назначение зарезервированных слов:
| Ключевое слово | |
| Var | Можно использовать для передачи данных в подпрограмму и для получения данных из подпрограммы |
| Const | Нельзя изменять значение в теле подпрограммы. Похож на локальную переменную только для чтения. |
| Out | Нельзя использовать для передачи данных в подпрограмму. Используется только для получения данных из подпрограммы. |
Для параметров-значений и параметров-констант возможно указание в заголовке процедуры или функции значения по умолчанию. Для этого в объявлении параметра после типа используется ‘=’ и указывается само значение (константное выражение совместимого типа). Например:
| (var S: string; X: Integer = 5)(const P, I: Integer; const M: real = 4.5) |
Для параметров, передающихся по ссылке, можно не указывать тип параметра. Такие параметры называются нетипизированными. Параметр-значение обязательно типизирован. Примеры:
| (var S, X; out Z)(const P, I; var M) |
Внутри подпрограммы непизированные параметры несовместимы ни с какими типами. Необходимо выполнить приведение типов.
Локальные объявления
Тело процедуры или функции часто начинают с объявления локальных переменных, которые используются внутри подпрограммы. Эти объявления могут также включать константы, типы, другие подпрограммы. Область видимости локальных идентификаторов ограничена подпрограммой, где они объявлены.
Процедуры и функции иногда содержат в секции локальных объявлений другие функции и процедуры, так называемые вложенные. Например:
| procedure DeleteRandomSymbol(var S: string); function RandomNumber(S: string):integer; var LenString: Integer; Begin LenString:=Length(s); Result:= Random(LenString) + 1; end; begin Delete(S, RandomNumber(s), 1); end; |
Область видимости вложенных подпрограмм ограничена подпрограммой, внутри которой они объявлены. В примере функцию RandomNumber можно вызывать только внутри процедуры DeleteRandomSymbol.
Тип возвращаемого значения
Понятие возвращаемого значения имеет смысл только тогда, когда мы говорим о функции, так как процедура не возвращает значения. Функции возвращают значения любых типов данных кроме Text и file of.
В теле функции должен быть, по крайней мере, один оператор, присваивающий значение имени функции или неявной локальной переменной Result. Если такого оператора нет, то значение функции будет не определено.
| Var A, G: Double; procedure Average(const X, Y: Double; out M, P: Double);begin M := (X + Y) / 2; P := Sqrt(X * Y);end; procedure TForm1.Button1Click(Sender:Tobject);begin Average(10, 20, A, G); ShowMessage(‘Среднее арифметическое = ‘, FloatToStr(A)); ShowMessage(‘Среднее геометрическое = ‘, FloatToStr(G));End; end. |
При вызове подпрограмм необходимо помнить следующее:
1. Выражения, используемые для передачи в типизированные параметры-константы и в параметры-значения должны быть совместимыми по присваиванию с соответствующими формальными параметрами.
2. Выражения, используемые для передачи в параметры-переменные и в выходные параметры должны быть одинаковых с соответствующими формальными параметрами типов, исключая непизированные параметры.
3. На место параметров, передаваемых по ссылке можно подставлять только переменные, нельзя – числа и константы.
4. Если список формальных параметров отсутствует, то список фактических параметров (в том числе круглые скобки) не указывается.
5. Если вызывается подпрограмма с параметрами по умолчанию, то все фактические параметры по умолчанию, идущие перед тем параметром, который необходимо передать значение, отличное от умолчания, должны быть заполнены. Например, SomeFunction(,,X) – некорректен
Различные способы передачи параметров в подпрограмму. Передача параметров-массивов в подпрограмму. Передача параметров, значения которых заданы по умолчанию. Примеры.
Pascal: Занятие № 7. Подпрограммы: процедуры в Pascal
Процедуры в Паскале
Подпрограмма — это фрагмент кода, который имеет свое имя и создается в случае необходимости выполнять этот код несколько (много) раз. Подпрограмма описывается единожды перед началом основной программы (до begin ). Компилятор пропускает данный фрагмент кода, пока в основной программе не встретит «вызов» подпрограммы, который выглядит как обращение к ней по имени (возможно, имени с аргументами, указанными в скобках).
Во многих языках программирования подпрограммы существуют только в виде функций. Однако в Паскале подпрограмма — и функция и процедура. Разница между ними станет очевидна в данном уроке.
Итак, рассмотрим синтаксис объявления и описания процедуры в Паскале
procedure pr; var i:integer; begin for i:=1 to 60 do begin <тело подпрограммы>write(‘*’); writeln; end; end; <конец подпрограммы>begin pr; <вызов процедуры>end.
В данном примере работы с процедурой в Паскале очевидно, что компилятор пропустит блок описания процедуры и дойдет до основной программы (9 строка кода). И только после того, как встретится вызов процедуры (10 строка), компилятор перейдет к ее выполнению, вернувшись к строке 1.
Процедуры с параметрами. Фактические и формальные параметры
Рассмотрим пример необходимости использования процедуры.
Особенность: Три похожие фигуры.
Алгоритм решения:
Решение на паскале:
Процедура:
uses GraphABC; procedure Tr( x, y: integer; color:system.Drawing.Color); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); FloodFill(x+20, y-20,color); end; begin SetPenColor(clBlack); Tr(100, 100, clBlue); Tr(200, 100, clGreen); Tr(200, 160, clRed); end.
Рассмотрим синтаксис объявления и описания процедуры с параметрами в Паскале.
Параметры процедуры (в некоторых языках они называются аргументами) указываются в скобках после ее имени (в объявлении).
В данном примере в качестве введенного символа будем использовать параметр процедуры. Формальный параметр процедуры указывается в скобках при ее описании. Обязательно необходимо указать тип формального параметра через двоеточие.
Фактический параметр — это то значение, которое указывается в скобках при вызове процедуры. Фактическим параметром может быть конкретное значение (литерал: число, символ, строка…) либо переменная, которые компилятор подставит вместо формального параметра. Поэтому тип данных у формального и фактического параметра процедуры должен быть одинаковым.
Процедуры с параметрами. Параметр-переменная
В примере формальные параметры a и b служат для помещения в них сравниваемых чисел, а параметр-переменная max — для сохранения в ней максимального из двух чисел. Параметр-переменная или выходной параметр передает свое значение в основную программу (фактическому параметру m ), т.е. возвращает значение, тогда как формальные параметры-значения (входной параметр), наоборот, принимают значения из основной программы (из фактических параметров x и y ). Для параметра-переменной ( max ) используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры (ячейка m ).
Таким образом, сформулируем понятия:
Если в качестве формального параметра указана обычная переменная с указанием ее типа, то такой параметр есть параметр-значение или входной параметр ( a и b в примере). Тип данных формального параметра-значения должен соответствовать типу данных его фактического параметра ( a и b должны попарно соответствовать типу данных x и y ).
Если перед именем формального параметра в объявлении процедуры стоит служебное слово var, то такой параметр называется параметром-переменной или выходным параметром ( max в примере). Для него используются те ячейки памяти, которые отведены под соответствующий параметр при вызове процедуры ( m ). Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой, не литералом и не выражением).

Словесный алгоритм:
В задачах на Паскале часто встречается необходимость заполнить массив данными и затем вывести значения на экран. Почему бы не автоматизировать данную задачу заполнения и вывода массива — т.е. оформить при помощи процедур, а в дальнейшем использовать данные процедуры при надобности.
const n = 10; var i:integer; a, b: array[1..n] of integer; procedure arr_out (k:integer; arr: array[1..n] of integer); var i: byte; begin write (‘вывод массива: ‘); for i := 1 to k do write (arr[i]:4); writeln; end; begin for i:=1 to n do a[i]:=random(10); arr_out (n, a); end.
Пояснение:
Тело основной программы:
— формирование элементов массива (с функцией random ).
— вызов процедуры с двумя параметрами: количество элементов, массив.
Тело процедуры:
— вывод элементов массива с использованием параметров
Продолжим нашу задачу:
const n = 10; var a, b: array[1..n] of integer; procedure arr_rand (k:integer; var arr: array[1..n] of integer); var i: byte; begin write (‘Заполнение массива случайными числами ‘); randomize; for i := 1 to k do arr[i]:=random(100); end; begin arr_rand (n, a); end.
Самостоятельная работа
X и Y — входные параметры, AMean и GMean — выходные параметры вещественного типа.
В основной программе: Для заданных A, B, C, D найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), используя созданную процедуру.
1 вариант: для 5 одномерных массивов определять произведение элементов каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода произведения.
2 вариант: для 5 одномерных массивов определять минимальный элемент каждого массива, используя процедуру с двумя параметрами — число элементов массива и параметр-переменная для вывода минимального элемента.
Подпрограммы
В практике программирования часто складываются ситуации, когда одну и ту же группу операторов, реализующих определённую цель, требуется повторить без изменений в нескольких местах программы. Для избавления от столь нерациональной траты времени была предложена концепция подпрограммы.
4.1 Общие сведения о подпрограммах. Локальные и глобальные переменные
Для правильного определения области действия идентификаторов (переменных) необходимо придерживаться следующих правил:
4.2 Формальные и фактические параметры. Передача параметров в подпрограмму
Обмен информацией между вызываемой и вызывающей функциями осуществляется с помощью механизма передачи параметров. Переменные, указанные в списке в заголовке функции, называются формальными параметрами, или просто параметрами подпрограммы. Все переменные из этого списка могут использоваться внутри подпрограммы. Список переменных в операторе вызова подпрограммы — это фактические параметры, или аргументы.
Механизм передачи параметров обеспечивает обмен данных между формальными и фактическими параметрами, что позволяет выполнять подпрограмму с различными данными. Между фактическими параметрами в операторе вызова и формальными параметрами в заголовке подпрограммы устанавливается взаимно однозначное соответствие. Количество, типы и порядок следования формальных и фактических параметров должны совпадать.
Формальные параметры процедуры можно разделить на два класса: параметры-значения и параметры-переменные.
При передаче данных через параметры-значения в подпрограмму передаются значения фактических параметров, и доступа к самим фактическим параметрам из подпрограммы нет. При передаче данных параметры-переменные заменяют 1 Реально в подпрограмму передаются адреса фактических параметров. формальные параметры, и, следовательно, в подпрограмме есть доступ к значениям фактических параметров. Любое изменение параметров-переменных в подпрограмме приводит к изменению соответствующих им формальных параметров. Следовательно, входные данные следует передавать через параметры-значения, для передачи изменяемых в результате работы подпрограммы данных следует использовать параметры-переменные.
От общетеоретических положений перейдём к практическому использованию подпрограмм при решении задач. Изучение подпрограмм начнем с процедур.
4.3 Процедуры
Описание процедуры имеет вид:
procedure name_1( r : real; i : integer; c : char );
Однотипные параметры могут быть перечислены через запятую:
procedure name_2( a, b : real; i, j, k : integer );
Список формальных параметров необязателен и может отсутствовать:
Если в заголовке процедуры будут применяться параметры-переменные, то перед ними необходимо указывать служебное слово var :
procedure name_4( x, y : real; var z : real );
Для обращения к процедуре необходимо использовать оператор вызова:
Фактические параметры в списке оператора вызова отделяются друг от друга запятой:
a : = 5. 3; k : = 2; s := ’ a ’;
Если в описании процедуры формальные параметры отсутствовали, то и при вызове их быть не должно:
Алгоритм решения этой задачи был подробно описан в задаче 3.3 (рис. 3.14). Однако там не была рассмотрена ситуация некорректного ввода значений коэффициентов. Например, если пользователь введёт 


Процедуры
Процедура предназначена для выполнения какой-то законченной последовательности действий. Объявление процедуры включает заголовок и тело процедуры:
Формат оператора вызова процедуры:
Список фактических параметров может отсутствовать.
Несколько параметров, записываемых в объявлении процедуры и операторе вызова, разделяются запятыми. Фактические параметры должны совпадать по количеству и типам с формальными параметрами процедуры.
Пример. Процедура ввода N целых чисел.
Arr=array[1..100] of Integer;
Procedure InpInt(var Mas:Arr; N:Byte);
Writeln(‘Введите ‘,N,’ целых чисел’);
For i:=1 to N do Readln(Mas[i])
Пример. Функция вычисления факториала числа N.
Function Factorial(N: Byte): LongInt;
For i:=(N-1) downto 2 do
Для досрочного выхода из подпрограммы предусмотрена процедура Exit. Досрочно прекратить выполнение программы можно с помощью процедуры Halt.
Формальные и фактические параметры
подпрограмма турбо паскаль рекурсивный
Формальные параметры указывают, с какими параметрами следует обращаться к этой подпрограмме (количество параметров, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка формальных параметров, разбитого на группы, разделенные точками с запятыми. В группу формальных параметров включаются однотипные параметры одной категории. В языке Turbo Pascal существует четыре категории формальных параметров:
1. параметры-значения, которые в подпрограмме не изменяются;
2. параметры-переменные, которые подпрограмма может изменить и передать в основную программу;
3. параметры-константы (используются только в версии 7.0);
4. параметры-подпрограммы (параметры процедурного типа).
Function Max(A: array[1..100] of Real): Real;
Чтобы правильно объявить данную функцию следует в основной программе объявить тип-массив, а затем использовать его в заголовке функции, например:
Vector: array[1..100] of Real;
Function Max(A: Vector): Real;
При обращении к подпрограмме формальные параметры заменяются на соответствующие фактические вызывающей программы или подпрограммы.
Параметр-значение не может быть файлового типа. Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем через двоеточие указать общий тип, например:
Procedure One(Max,Min: Real; Number: Word);
Function Two(X,Y: Integer): Real;
В качестве фактического параметра на месте параметра-значения при вызове подпрограммы может быть любое выражение допустимого для присваивания типа, например:
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается слово Var. Действие слова Var распространяется в пределах одной группы параметров (до ближайшей точки с запятой). Тип параметров-переменных может быть любым, включая файловый.
Пример. Объявление подпрограммы с разными параметрами:
Procedure MxMn(Mas:Vector; Var Max,Min:Real; Num:Word);
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается слово Const. Действие слова Const распространяется в пределах одной группы параметров. Параметры-константы предназначены для передачи в подпрограмму параметров больших размеров. Тип такого параметра может быть любым, кроме файлового.
В языке Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а согласование формальных и фактических параметров возлагается на программиста.
Pascal | Лекция №6
Подпрограммы. Процедуры и функции
СОДЕРЖАНИЕ:
Подпрограммы (см. Рапаков стр.143-157!)
Понятие подпрограмма встречается во многих языках программирования, т.к. является основным средством структурирования языка. Очень часто в программах встречаются однотипные участки, которые выполняют одни и те же вычисления с различными данными. Такие части программ целесообразно выполнять с помощью подпрограмм.
Использование подпрограмм позволяет:
Таким образом, подпрограмма – это часть операторов программы, выделенных в группу, оформленную в виде отдельной конструкции.
Вызов подпрограммы, т.е. выполнение действий, заданных в подпрограмме, может быть произведен в некоторой точке программы посредством указания имени этой подпрограммы.
Структура подпрограмм
Структура подпрограмм почти в точности повторяет структуру всей Pascal-программы.
При описании подпрограммы в общем случае необходимо задать три основные компоненты:
Интерфейс подпрограммы содержится в заголовке и говорит о том, что именно делает подпрограмма.
Две остальные компоненты называются телом подпрограммы и содержат информацию о том, как выполняется подпрограммой то, что описано в ее заголовке.
В языке Pascal выделяют два вида подпрограмм: процедуры и функции. Различия процедур и функций заключается в назначении и способе их использования.
Функции нужны для вычисления нового значения некоторого выражения, и вызов функции должен быть операндом в выражении.
Процедуры служат для задания последовательности действий и определения новых значений переменных в программе. Вызов процедуры играет роль оператора.
Описание процедур и функций. Формальные параметры
Описание процедур и функций в общем виде:
Тело подпрограммы – это блок, состоящий из двух частей: описание объектов и группа операторов. Более полный общий вид процедуры (общий вид функции отличается только заголовком):
Здесь — имя процедуры.
Раздел описаний, как и в основной программе, может включать разделы Label, Const, Type, Var и раздел процедур и функций.
Формальные параметры представляют собой список переменных с указанием их типа, которые отделяются друг от друга «;». Эти переменные не описываются в разделе описания процедур. Допускается использование процедур без параметров.
Если в качестве параметров используется массив, то предварительно нужно описать имя типа массива в разделе Type, а затем использовать это имя при описании массива в качестве формального параметра.
Параметры процедур бывают двух типов:
Описание входных параметров процедуры в списке формальных параметров имеет также вид:
Список переменных1: тип1; список переменных2: тип2;
Соответственно описание выходных параметров выглядит следующим образом:
Var Список переменных1: тип1; Var список переменных2: тип2;
Вызов процедуры в основной программе имеет следующий вид:
(список фактических параметров);
Фактические параметры перечисляются через запятую, без указания их типа. Идентификаторы формальных параметров можно считать условными обозначениями в теле подпрограммы тех реальных, фактических параметров, с которыми будет вызвана подпрограмма. При этом должны выполняться требования:
Имена соответствующих фактических и формальных параметров могут быть одинаковыми или разными.
Входными фактическими параметрами могут быть константы, переменные или выражения, выходными фактическими параметрами могут быть только переменные.
Другой вид подпрограммы в языке Турбо-Паскаль – функция – оформляется аналогично процедуре и отличается от нее по структуре только заголовком, общий вид которого выглядит следующим образом:
Function (список формальных параметров): тип;
Функции имеют несколько отличительных особенностей:
Область действия имен
Переменные, представленные в разделе описания основной программы, могут быть использованы в теле основной программы и в любой ее подпрограмме. Эти переменные называются глобальными.
Переменные, описанные в подпрограмме, действуют только в теле данной подпрограммы и в любой, объявляемой внутри нее, подпрограмме. Такие переменные называются локальными. Они недоступны для операторов основной программы и др. подпрограмм.
Наглядно схему программы, имеющей некоторые вложенные подпрограммы, можно представить следующим образом:
Самый внешний блок программы обозначен буквой A (имена этого блока «видны» во всех остальных блоках), B и D – подпрограммы, описанные во внешнем блоке, C – подпрограмма, описанная в блоке B (объекты этого блока известны только внутри самого блока).
При написании программ, имеющих вложенные подпрограммы, необходимо соблюдать следующие правила:
Использование процедур и функций на примере
Пример 1: вычислить площадь выпуклого четырехугольника
В результате выполнения данной программы на экран будет выведено:




