
Лекция 27.pptx
- Количество слайдов: 41
Лекция 27 Тема № 6 АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Подпрограммы 2 Подпрограммой в Паскале называется особым образом оформленный фрагмент программы, имеющий собственное имя. Подпрограмма — это некоторый вспомогательный алгоритм, многократно использующийся в основном алгоритме с различными значениями некоторых входящих величин, называемых параметрами. Упоминание этого имени приводит к активизации подпрограммы и называется ее вызовом. Сразу после активизации подпрограммы начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу и выполняются операторы, стоящие непосредственно за оператором вызова подпрограммы.
Подпрограммы 3 Подпрограмма – это одно из базовых средств описания действий, которое позволяет реализовывать вспомогательные алгоритмы. Выделяют два вида подпрограмм: 1. процедуры 2. функции В файле программы (или модуля) может быть только один основной блок, а в разделе описания могут определятся дополнительные блоки (подпрограммы).
Назначение подпрограмм 4 Основа для реализации структурного подхода Средство для уменьшения сложности структуры программы 3. Средство для экономии памяти: рациональная запись кода и его использование при вызовах подпрограмм (подпрограмма существует в единичных экземплярах, а вызываться может многократно); динамическое выделение памяти под хранение значений объектов данных, описанных в подпрограмме (как только подпрограмма начинает работу – память выделяется, как заканчивает освобождается) 1. 2.
Область действия (видимости) 5 Блок в общем случае обеспечивает выполнение двух основных функции: 1. резервирование области памяти для создания в ней основных объектов данных; 2. введение новой области видимости (действия) идентификаторов описанных объектов данных. Область видимости (действия) – это часть программы, на которую распространяются сделанные описания, т. е. это где видны, а следовательно, могут быть использованы идентификаторы объектов описания.
Область действия (видимости) 6 Областью действия описания любого программного объекта (переменной, типа, константы и т. д. ) является тот блок, в котором расположено это описание. Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока. Описания сделанные во внешнем блоке видны в любом внутреннем блоке и их область видимости глобальна (по отношению к внутреннему блоку).
Время жизни объектов данных 7 При передачи управления в данный блок создаются все описанные в нем объекты данных, а затем выполняются последовательность его операторов. При выходе из блока созданные объекты данных уничтожаются. Создание и уничтожение объектов данных – это резервирование и освобождение области памяти по размеру соответствующее типу объекта данных. Этим и определяется время жизни объектов данных, то есть время от его создания до уничтожения.
Виды переменных 8 Глобальными называются переменные, которые описаны в главной программе. Время жизни глобальных переменных — с начала программы и до ее завершения. Располагаются в сегменте данных. В подпрограммах описываются локальные переменные. Они располагаются в сегменте стека, причем распределение памяти происходит в момент вызова подпрограммы, а ее освобождение — по завершении подпрограммы. Локальные переменные автоматически не обнуляются.
Структура программы Главная 9 Глобальные переменные Подпрограмма А Локальные переменные begin. . . end Подпрограмма В Подпрограмма С begin Вызов А. . . Вызов В. . . end
10 PROGRAM Prog; Var V 1: integer; Procedure A; Var V 2: integer; Begin … end; Procedure B; Var V 3: integer; Procedure B 1; Var V 4: integer; Begin … end; Var V 5: integer; BEGIN … END. PROGRAM Prog; Var V 1: integer; Procedure A; Var V 2: integer; Procedure B; Var V 3: integer; Procedure B 1; Var V 4: integer; Var V 5: integer;
Вызов 11 Для того чтобы подпрограмма выполнилась, ее надо вызвать. Вызов подпрограммы записывается в том месте программы, где требуется получить результаты работы. Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например: inc(i); writeln(a, b, c); { вызовы процедур } y : = sin(x) + 1; { вызов функции } Павловская Т. А. (СПб. ГУИТМО)
Функции 12 Функции представляют собой группу операторов, в результате выполнения которых вычисляется одно значение, присваиваемое имени функции. Описание функции включает в себя следующие разделы: заголовок функции; разделы описаний, являющихся локальными по отношению к описываемой функции; тело функции.
Формат описания функции: 13 Function F (q 1: T 1; q 2: T 2; …) : T; <объявления локальных переменных, типов, констант, описания вложенных процедур и функций>; Begin <операторы тела функции>; F: =<вычисленное значение>; End; F- имя функции; qi- имена формальных параметров; Ti- типы параметров; Т – тип, возвращаемого функцией значения
Функции 14 Параметры, фигурирующие в описании подпрограммы называются формальными. Они задают форму вычислений. В дальнейшем они заменяются конкретным значением от которого мы хотим вычислить функцию. Например, в математике: f(x): =3 x-5 x - формальный параметр Величину, для которой необходимо вычислить значение функции будем называть фактическим параметром. F(5) a=7; F(a) 5 и a – фактические параметры.
Функции 15 Список параметров и локальных описаний не обязательны. Если список параметров отсутствует, то скобки после имени функции не ставятся. Возвращаемое значение в теле функции может присваиваться или имени функции или специальной предопределенной системной переменной Result, которую не нужно описывать, но которой можно пользоваться в теле функции.
Функции 16 Использование переменной Result имеет одно принципиальное отличие от имени функции. Имя функции – это не переменная. Оно может фигурировать только в левой части оператора присваивания, и не может входить ни в какие выражения. А Result – это переменная.
Вызов функции 17 Обращение к функции обычно осуществляется в правой части оператора присваивания, указывая имя функции и фактические параметры в виде A: =f(b 1, b 2, …); где bi – фактические параметры. При этом, возвращаемое функцией значение, замещает в операторе имя вызванной функции.
18 Function Max (x, y: real): Real; Begin If x>y Then max: =x Else max: =y; End; или Function Max (x, y: real): Real; Begin If x>y Then Result: =x Else Result: =y; End;
Процедуры 19 Процедуры используются в тех случаях, когда в подпрограмме необходимо получить несколько результатов, либо не одного. Описание процедуры включает в себя: заголовок процедуры раздел описаний тело процедуры.
Формат описания процедуры: 20 Procedure H (q 1: t 1; var q 2: t 2; …); <объявления локальных переменных, типов, констант, описания вложенных процедур и функций>; Begin <операторы тела процедуры>; End; H – имя процедуры; qi- имена формальных параметров; Ti- типы параметров;
Вызов процедуры 21 Вызов процедуры осуществляется с помощью указания имени процедуры и списка фактических параметров. H(b 1, b 2, …); Если процедура и основная программа связаны с помощью глобальных переменных, то процедура может быть организована и без параметров.
Примеры 22 Program my 1; Var p 1, p 2, p 5: real; p 3: char; p 4: integer; Procedure SP(a: Real; b: Integer; с: Char); Begin if c=‘/’ then writeln(a/b) else writeln(a-b) End; Function F(a: Real; b: Real): Real; Begin if a>b then f: =a else f: =b End; BEGIN readln(p 1, p 2, p 3, p 4); SP(p 1, p 4, p 3); p 5: =f (p 1, p 2) SP(p 5, p 4, p 3); END.
Перекрытие идентификаторов 23 Имена локальных переменных могут перекрывать область видимости одноименных глобальных переменных. При этом все операции с объектом данных под данным именем будут осуществляться со значением локальной переменной.
Опережающее описание подпрограмм 24 Разделы описаний в блоке могут произвольно располагаться много раз открываться. Но при этом в вышележащих описаниях нельзя использовать или ссылаться на описания сделанные ниже. При описании процедур и функций иногда возникает необходимость в закольцованных вызовах. При этом как минимум две подпрограммы в своем теле могут вызывать друга. Для развязки подобных вызовов можно использовать опережающее описание заголовка одной из этих подпрограмм при помощи ключевого слова (директивы) FORWARD.
Пример опережающего описания 25 Procedure B: forward; Procedure A; Begin B End; Procedure B; Begin A End;
Виды параметров 26 При вызове подпрограммы ей можно передавать и из нее можно получать значения через параметры-аргументы. Параметры, указываемые в заголовке подпрограммы называются формальными параметрами. Параметры, указываемые при вызове подпрограммы, называются фактическими параметрами.
27 При подстановки фактических параметров на место формальных должны соблюдаться следующие правила их соответствия: по количеству указываемых параметров; по порядку их перечисления; по типу; функциональному соответствию.
Классификация параметров 28 По механизму передачи: передача по значению (value); передача по адресу (addr). 2. По функциональному предназначению только как входной параметр (in); только как выходной параметр (out); и как входной и как выходной параметр (inout). 1.
Способы передачи параметров 29 Теоретически возможны 6 способов передачи параметров: value in value out value inout addr in addr out addr inout
Способы передачи параметров 30 В Object Pascal поддерживаются четыре способа передачи параметров: value in (передача по значению) addr out (передача параметров как выходных параметров) addr inout (передача параметров как переменных) addr in (передача параметров как констант)
1. Передача по значению. 31 Параметры значения определяют исходные данные для работы процедур и функций. В списке формальных параметров они описываются в следующем виде: procedure my 1(q 1: T 1; q 2: T 2) или procedure my 2(q 1, q 2: T) При вызове подпрограммы фактический параметр, может быть любым выражением, результат вычисления которого принадлежит тому же типу, что и формальный параметр.
Передача по значению 32 При обращении к подпрограмме выражение вычисляется. В памяти создаются временные переменные с именами q 1 и q 2, и в них копируется результат вычислений. Изменение значений переменных q 1 и q 2 в теле подпрограммы никак не влияет на значения переменных из основной программы. При выходе из подпрограммы формальные переменные q 1 и q 2 уничтожаются.
2. Передача параметров как переменных 33 Параметры переменные позволяют передавать в основную программу измененные значения. Параметры переменные в списке формальных параметров описываются с помощью указания перед ними ключевого слова var. Например: procedure my 3 (var q 1, q 2: t 1; var q 3: t 2) ;
Передача параметров как переменных 34 При обращении к подпрограмме фактические параметры должны быть обязательно переменными, того же типа, что и формальные параметры. В подпрограмму передается адрес переменной (ссылка) и операторы процедуры непосредственно используют данную переменную. В данном случае любые изменения параметра q 1, произведенные в подпрограмме, в действительности относятся к той переменной, которая будет указана при вызове подпрограммы на месте q 1.
3. Передача параметров как констант 35 Передача параметра как константы осуществляется заданием перед его описанием ключевого слова const. procedure my 4 (const q 1: t 1); Параметры константы по механизму передачи похожи на параметры значения, но их значения нельзя изменять в теле подпрограммы. В качестве аргументов могут использоваться константы, выражения и переменные. В подпрограмму передаются адреса фактических параметров.
4. Передача параметров как выходных параметров 36 Выходные параметры описываются с помощью зарезервированного слова out. procedure my 5(out q 1: t 1); Выходные параметры по механизму передачи похожи на параметры переменные, но при этом в подпрограмму не передается начальное значение этого параметра, т. е. память, занимаемая соответствующей переменной, указанной при вызове подпрограмме на месте q 1, будет очищена при вызове подпрограммы.
Перегрузка подпрограмм 37 Можно определить в одной и той же области видимости несколько подпрограмм с одинаковыми именами, но различными по числу и типу параметрами. Для этого в описании заголовка каждой из этих подпрограмм необходимо указать директиву (ключевое слово) OVERLOAD. При вызове компилятор проанализирует передаваемые параметры, их число и тип и вызовет ту из них, которая подойдет по данным параметрам. procedure my_1 (i: integer); overload;
Пример использования функции 38 program Podpr 1; uses Sys. Utils; var x, y, z, max 3: integer; Function Max 2(a, b: integer): integer; begin if a>b then max 2: =a else max 2: =b; end;
39 begin writeln ('POISK max in 3 numbers'); writeln ('Your 3 numbers, please: '); readln (x, y, z); max 3: =max 2(x, y), z); writeln ('the max is ', max 3); readln; end.
Пример использования процедуры 40 program Podpr 2; uses Sys. Utils; var x, y, z: integer; procedure Sort 2(var a, b: integer); var c: integer; begin if a>b then begin c: =a; a: =b; b: =c; end; begin writeln ('Sortirovka 3 numbers'); writeln ('Your 3 numbers, please: '); readln (x, y, z); sort 2 (x, y); sort 2 (y, z); sort 2 (x, y); writeln ('Result of sort is ', x: 10, y: 10, z: 10); readln; end.
Процедуры передачи управления 41 break — завершает выполнение цикла, внутри которого записана; continue — выполняет переход к следующей итерации цикла; exit — выходит из программы или подпрограммы, внутри которой записана; halt — немедленно завершает выполнение программы.