Подпрограммы. Процедуры и функции

Содержание

Слайд 2

Общие положения Подпрограмма - именованная логически законченная группа операторов, которую можно

Общие положения

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

по имени (выполнить) любое количество раз из различных мест программы.

Процедура – действие, которое вы просите компьютер выполнить.
Функция – некоторое вычисление, возвращающее значение.

Слайд 3

Объявление процедуры Формат объявления: procedure ( ); ; const ...; type ...; var ...; begin end;

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

Формат объявления:
procedure <имя процедуры> ( <список формальных параметров> ); <директивы>;
<локальные

объявления>
const ...;
type ...;
var ...;
<вложенные подпрограммы>
begin
<операторы>
end;
Слайд 4

Объявление процедуры Заголовок процедуры – имя подпрограммы, список формальных параметров, директивы.

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

Заголовок процедуры – имя подпрограммы, список формальных параметров, директивы.
<имя процедуры>

- любой корректный идентификатор
<операторы> (тело подпрограммы) - операторы, которые будут выполнены при вызове подпрограммы
<список формальных параметров>, <директивы>, <локальные объявления> могут отсутствовать
Слайд 5

Объявление функции Формат объявления: function ( ) : ; ; const

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

Формат объявления:
function <имя функции> ( <список формальных параметров> ) :

<тип>; <директивы>;
<локальные объявления>
const ...;
type ...;
var ...;
<вложенные подпрограммы>
begin
<операторы>
Result := <значение>;
// или <имя функции> := <значение>;
end;
Слайд 6

Объявление функции Заголовок функции – имя подпрограммы, список формальных параметров, тип

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

Заголовок функции – имя подпрограммы, список формальных параметров, тип результата,

директивы.
<имя функции> - любой корректный идентификатор
<операторы> (тело подпрограммы) - операторы, которые будут выполнены при обращении к функции
<список формальных параметров>, <директивы>, <локальные объявления> могут отсутствовать
Слайд 7

Примеры Процедура: procedure Max2 (a,b: integer; var c: integer); begin if

Примеры

Процедура:
procedure Max2 (a,b: integer; var c: integer);
begin
if a>b then c:=a

else c:=b;
end;
Обращение в программе:
x:=32; y:=45; . . . ; Max2(x,y,z);
Параметры, передаваемые в подпрограмму при ее вызове, называются фактическими
В примерах x, y, z – фактические параметры
Слайд 8

Примеры Функция: function Max2 (a,b: integer) : integer; begin if a>b

Примеры

Функция:
function Max2 (a,b: integer) : integer;
begin
if a>b then Result:=a else

Result:=b;
end;
Обращение в программе:
x:=32; y:=45; . . . ; z:=Max2(x,y);
Слайд 9

Формальные параметры Список формальных параметров – последовательность объявлений однотипных параметров Объявления

Формальные параметры

Список формальных параметров – последовательность объявлений однотипных параметров
Объявления отделяются друг

от друга точкой с запятой.
Каждое объявление состоит из списка имен параметров, символа ‘:’ и указания их типа.
Внутри объявления имена параметров разделяются запятой.
Слайд 10

Формальные параметры ПР: procedure Primer1 ( x, y : integer ;

Формальные параметры

ПР:
procedure Primer1 ( x, y : integer ; c,

ch : char ; var s : real );
function Primer2 ( x : integer; c, ch : real ; var k : integer ) : real;
Слайд 11

Способы передачи параметров в подпрограмму

Способы передачи параметров в подпрограмму

Слайд 12

Способы передачи параметров в подпрограмму параметры- переменные var параметры-константы const выходные

Способы передачи параметров в подпрограмму

параметры- переменные
var

параметры-константы
const

выходные параметры
out

Используется только для получения данных из

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

Нельзя изменять значение в теле подпрограммы (только для чтения)

Для передачи данных в подпрограмму и для получения данных из подпрограммы

Слайд 13

Параметры-значения Параметры-значения - локальные переменные, которые получили начальное значение при вызове

Параметры-значения

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

переменная передана как параметр-значение, то подпрограмма создает копию переменной.
Изменения этой копии не приводят к изменению исходной переменной и утериваются после завершения работы подпрограммы.
Слайд 14

Параметры-значения ПР: function DoubleByValue (X: Integer): Integer; // X – параметр-значение

Параметры-значения

ПР: function DoubleByValue (X: Integer): Integer;
// X – параметр-значение
begin

X := X*2; Result :=X; end;
Вызовем функцию:
Var K, J, V: Integer;
begin
K := 4; V := 4;
J := DoubleByValue(K); // J = 8, K = 4
end;
Слайд 15

Параметры-переменные Параметры-переменные похожи скорее на указатели. Изменения параметра-переменной внутри тела подпрограммы

Параметры-переменные

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

завершения работы подпрограммы и возвращаются в вызывающую программу.
Слайд 16

Параметры-переменные ПР: function DoubleByRef (var X: Integer): Integer; // X –

Параметры-переменные

ПР: function DoubleByRef (var X: Integer): Integer;
// X – параметр-переменная

begin X := X * 2; Result := X; end;
Вызовем функцию:
Var K, V, W: Integer;
begin
K := 4; V := 4;
W := DoubleByRef(V); // W = 8, V = 8
end;
Слайд 17

Особенности Для параметров-значений и параметров-констант возможно указание в заголовке процедуры или

Особенности

Для параметров-значений и параметров-констант возможно указание в заголовке процедуры или функции

значения по умолчанию.
ПР:
(var S: string; X: Integer = 5)
(const P, I: Integer; const M: real = 4.5)
Слайд 18

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

Особенности

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

параметры называют нетипизированными.
ПР: (var S, X; out Z)
(const P, I; var M)
Внутри подпрограммы нетипизированные параметры несовместимы ни с какими типами.
Необходимо выполнить приведение типов.
Слайд 19

Локальные объявления Локальные переменные – переменные, которые описываются и используются внутри

Локальные объявления

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

теле подпрограммы можно описать константы, типы, другие подпрограммы (вложенные функции и процедуры).
Область видимости локальных идентификаторов ограничена подпрограммой, где они объявлены.
Слайд 20

Локальные объявления procedure DeleteRandomSymbol (var S : string); function RandomNumber (S

Локальные объявления

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.
Слайд 21

Замечания В теле функции должен быть, по крайней мере, один оператор,

Замечания

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

значение имени функции или неявной локальной переменной Result
Переменная Result может участвовать в выражениях как операнд внутри тела функции
Переменная Result и имя функции всегда представляют одно и то же значение
Слайд 22

Замечания ПР: function MyFunction : Integer; begin MyFunction := 5; Result

Замечания

ПР: function MyFunction : Integer;
begin
MyFunction := 5;
Result :=

Result * 2;
MyFunction := Result + 1;
end;
// Эта функция вернет значение 11.
Использование имени функции в правой части оператора присваивания приведет к рекурсивному вызову этой функции в отличие от переменной Result
Слайд 23

Соглашения о вызове подпрограмм Директивы, определяющие правила вызова подпрограммы (в заголовке

Соглашения о вызове подпрограмм

Директивы, определяющие правила вызова подпрограммы (в заголовке подпрограммы):
register,

stdcall, pascal, cdecl
ПР: procedure Proc; register;
function Func(X: Integer): Boolean; stdcall;
Соглашения о вызове подпрограмм определяют порядок передачи параметров
Слайд 24

Соглашения о вызове подпрограмм register задействует регистры процессора для передачи параметров

Соглашения о вызове подпрограмм

register задействует регистры процессора для передачи параметров и

обеспечивает наиболее эффективный способ вызова подпрограмм. Эта директива применяется по умолчанию.
Директива stdcall используется для вызова стандартных подпрограмм операционной системы.
Директивы pascal и cdecl используются для вызова подпрограмм, написанных на языках Delphi и C/C++ соответственно.
Директиву safecall изучим позже
Слайд 25

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

Вызов процедур и функций

При вызове подпрограмм необходимо помнить:
Выражения, используемые для передачи

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

Вызов процедур и функций При вызове подпрограмм необходимо помнить: На место

Вызов процедур и функций

При вызове подпрограмм необходимо помнить:
На место параметров, передаваемых

по ссылке можно подставлять только переменные, нельзя – числа и константы.
Если список формальных параметров отсутствует, то список фактических параметров (в том числе круглые скобки) не указывается.
Слайд 27

Перегрузка процедур и функций Рассмотрим подпрограммы, выполняющие одинаковые действия, но над

Перегрузка процедур и функций

Рассмотрим подпрограммы, выполняющие одинаковые действия, но над переменными

разных типов данных
Дадим этим процедурам (функциям) одинаковые имена
Отличаться они будут списком параметров (количеством параметров или типом параметров)‏
Такая возможность называется перегрузкой.
Для этого применяется директива overload.
Слайд 28

Перегрузка процедур и функций ПР: procedure Increment (var Value: Integer); overload;

Перегрузка процедур и функций

ПР: procedure Increment (var Value: Integer); overload;
//

процедура 1
procedure Increment (var Value: Real); overload;
// процедура 2
Какую именно процедуру использовать в том или ином случае компилятор будет определять по типам фактических аргументов, передаваемых при вызове.
Var X: Integer; Y: Real;
Begin X:=1; Y:=2.0;
Increment(X); // Вызывается процедура 1
Increment(Y); // Вызывается процедура 2
end.
Слайд 29

Рекурсивные подпрограммы Если в теле подпрограммы происходит вызов этой же подпрограммы,

Рекурсивные подпрограммы

Если в теле подпрограммы происходит вызов этой же подпрограммы, такая

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

Рекурсивные подпрограммы ПР: Функция Factorial для вычисления факториала X! = 1

Рекурсивные подпрограммы

ПР: Функция Factorial для вычисления факториала
X! = 1

* 2 * ... * (X – 1) * X
Заметим, что X! = (X – 1)! * X, где 0! = 1
function Factorial (X: Integer) : Longint;
begin
if X = 0 then
// Условие завершения рекурсии
Factorial := 1
else Factorial := Factorial(X - 1) * X;
end;