Подпрограммы_м.pptx
- Количество слайдов: 54
Подпрограммы
Подпрограммы • Подпрограммы представляют собой важный инструмент языка программирования, позволяющий писать хорошо структурированные программы. • Языки, в которых предусмотрены механизмы структурирования называются процедурно-ориентированными.
Подпрограммы Подпрограмма – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение: Применение • выполнение одинаковых действий в разных местах программы • разбивка программы (подпрограммы) на подзадачи для лучшего восприятия Задача Подзадача 1 1. 2 Подзадача 2 1. 3 2. 1 2. 2 Подзадача 3 2. 3 3. 1 3. 2 3. 3
Подпрограммы Особенности: Особенности • Если программа предназначена для решения задачи в целом, то подпрограмма используется для выполнения логически завершенной последовательности действий. Существует 2 вида подпрограмм: процедуры и функции • Принципиальное отличие между подпрограммами заключается в их оформлении и способе передачи данных в подпрограмму и обратно.
Назначение подпрограмм 1. Основа для реализации структурного подхода 2. Средство для уменьшения сложности структуры программы 3. Средство для экономии памяти: Ø рациональная запись кода и его использование при вызовах подпрограмм (подпрограмма существует в единичных экземплярах, а вызываться может многократно); Ø динамическое выделение памяти под хранение значений объектов данных, описанных в подпрограмме (как только подпрограмма начинает работу – память выделяется, как заканчивает освобождается) 5
Подпрограммы Отличия: Отличия • Отличие функции от процедуры заключатся в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое значение. • Каждая подпрограмма имеет уникальное имя. Упоминание этого имени в тексте программы называется вызовом процедуры/функции • Вызов функции может быть составной частью выражения (при согласовании типов) • Вызов процедуры осуществляется отдельным оператором с помощью ее имени
Структура подпрограмм • Структура подпрограмм очень похожа на структуру программы и в самом общем случае состоит из следующих частей: – Заголовок подпрограммы – Раздел объявлений меток – label – Раздел объявлений констант – const – Раздел объявлений типов – type – Раздел объявлений переменных – var – Раздел объявлений процедур и функций – procedure| function – Тела подпрограммы – begin … end;
Структура подпрограмм • Структура подпрограмм Заголовок процедуры: Procedure Имя[(Список формальных параметров)]; Заголовок функции: function Имя[(Список формальных параметров)]: тип_результата; тип_результата
Структура подпрограмм • Процедуры Procedure Имя[(Список формальных параметров)]; {Раздел локальных описаний} Label … Const … Type … Var … Procedure | function … begin {Тело процедуры} end;
Структура подпрограмм • Функции Function Имя[(Список формальных параметров)]: тип_результата; {Раздел локальных описаний} Label … Const … Type … Var … Procedure | function … begin {Тело функции} … Имя : = результат; … end;
Подпрограммы • Задача 1: Вывести строку, содержащую K символов «*» , M символов «+» и D символов «!» • Особенность: – общее: Вывод на экран – отличия: количество повторений, вид символа ( «*» , «+» , «!» )
Алгоритм задачи начало ввод K, M, D Вывод K «*» Вывод M «+» Вывод D «!» конец
Программа задачи 1 program Program 1; var K, M, D, i : byte; begin Write('Введите K, M, D: ’); Read. Ln(K, M, D); for i : = 1 to K do вывод K «*» write(’*’); for i : = 1 to M do write(’+’); вывод M «+» for i : = 1 to D do write(’!’); вывод D «!» Read. Ln; end.
Программа задачи 1 program Program 1; var K, M, D : byte; procedure Write_zv; Write_zv var i: byte; begin for i : = 1 to K do write(’*’); end; {of Write_zv} procedure Write_plus; Write_plus var i: byte; begin for i : = 1 to M do write(’+’); end; {of Write_plus} procedure Write_znak; Write_znak var i: byte; begin for i : = 1 to D do write(’!’); end; {of Write_znak}
Алгоритм задачи начало ввод K, M, D Вывод K «*» Вывод M «+» Вывод D «!» конец //Тело основной программы begin {of Main} Write('Введите K, M, D: ’); Read. Ln(K, M, D); Write_zv; Write_plus; Write_znak; Read. Ln; end. ? Что плохо?
Область действия (видимости) Блок (подпрограмма) в общем случае обеспечивает выполнение двух основных функции: 1. резервирование области памяти для создания в ней основных объектов данных; 2. введение новой области видимости (действия) идентификаторов описанных объектов данных. Область видимости (действия) – это часть программы, на которую распространяются сделанные описания, т. е. это где видны, а следовательно, могут быть использованы идентификаторы объектов описания. 16
Область действия (видимости) Областью действия описания любого программного объекта (переменной, типа, константы и т. д. ) является тот блок, в котором расположено это описание. Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют локальными только в пределах внутреннего блока. Описания сделанные во внешнем блоке видны в любом внутреннем блоке и их область видимости глобальна (по отношению к внутреннему блоку). 17
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; 18
Время жизни объектов данных • При передачи управления в данный блок создаются все описанные в нем объекты данных, а затем выполняются последовательность его операторов. • При выходе из блока созданные объекты данных уничтожаются. • Создание и уничтожение объектов данных – это резервирование и освобождение области памяти по размеру соответствующее типу объекта данных. Этим и определяется время жизни объектов данных, то есть время от его создания до данных уничтожения. 19
Область действия (видимости) • Если имена глобальных и локальных идентификаторов совпадают, то внутри подпрограммы локальные идентификаторы перекрывают глобальные. • При этом значение глобального идентификатора сохраняется в специальной области памяти, называемой стек • После исполнения подпрограммы глобальные идентификаторы восстанавливаются, а локальные исчезают.
PROGRAM Prog; Var v 1: integer; Имена локальной и глобальной переменной совпадают Procedure A; Var v 1: integer; begin … v 1 : = 10; Write. Ln(‘В процедуре v 1 = ’, v 1); end; BEGIN v 1 : = 5; A; Write. Ln(‘В программе v 1 = ’, v 1); END. Результат работы программы: В процедуре v 1 = 10 В программе v 1 = 5 21
Подпрограммы Формальные и фактические параметры • Исходные данные для работы подпрограммы можно передавать через глобальные параметры, а также через переменные. • Параметры в заголовке подпрограммы называются формальными • Параметры при вызове подпрограммы называются фактическими
Программа задачи 1 с процедурами без параметров program Program 1; var K, M, D : byte; procedure Write_zv; Write_zv var i: byte; begin for i : = 1 to K do write(’*’); end; {of Write_zv} //Тело основной программы begin {of Main} Write('Введите K, M, D: ’); Read. Ln(K, M, D); Write_zv; Write_plus; Write_znak; procedure Write_plus; Write_plus var i: byte; begin Read. Ln; for i : = 1 to M do write(’+’); end; {of Write_plus} procedure Write_znak; Write_znak var i: byte; begin for i : = 1 to D do write(’!’); end; {of Write_znak}
Программа задачи 1 с процедурой с параметрами program Program 1; var K, M, D : byte; procedure Write_znak(c: char; N: byte) var i: byte; Формальные begin параметры for i : = 1 to N do write(c); end; {of Write_znak} begin {of Main} Write('Введите K, M, D: ’); Read. Ln(K, M, D); Write_znak(’*’, K); Write_znak(’+’, M); Фактические Write_znak(’!’, D); параметры Read. Ln; end.
Подпрограммы Формальные и фактические параметры При подстановке фактических параметров на место формальных должны соблюдаться следующие правила их соответствия: • по количеству указываемых параметров; • по порядку их перечисления; • по типу; • функциональному соответствию.
ФУНКЦИИ
Структура подпрограмм • Функции Function Имя[(Список формальных параметров)]: тип_результата; {Раздел локальных описаний} Label … Const … Type … Var … Procedure | function … begin {Тело функции} … Имя : = результат; … end;
Структура подпрограмм • Отличия функций от процедур 1. В заголовке функции обязательно указывается тип возвращаемого значения (все, кроме типа file) 2. В теле функции обязательно присутствует оператор присваивания имени функции результирующего значения 3. Вызов функции осуществляется внутри выражений, а не отдельным оператором, как процедура 4. Возвращаемое значение в теле функции может присваиваться или имени функции или специальной предопределенной системной переменной Result
Функции • Переменная Result 1. Каждая функция имеет назначенную неявным образом локальную переменную Result, имеющую тот же тип, что и тип результата функции. 2. Присваивание значения этой переменной соответствует присваиванию значения имени функции 3. Использование Result в функциях предпочтительнее, т. к. переменная Result может использоваться в правой части выражения без выполнения рекурсивного вызова
Функции • Задача 2: Вычислить сумму: .
Программа задачи 2 program Program 2; function Summa_1(N: byte): integer; integer var i: byte; begin Result : = 0; for i : = 1 to N do Result : = Result + sqr(i); end; {of Summa_1} function Summa_2(M: byte): single; Summa_2(M: byte): single var i: byte; begin Result : = 0; for i : = 1 to M do Result : = Result + 1/(i+10); end; {of Summa_2}
Программа задачи 2 (продолжение) function Proizv(K: byte): integer; integer var i: byte; begin Result : = 1; for i : = 1 to N do Result : = Result * i; end; {of Proizv} var N, M, K: byte; //Глобальные объявления S : real; BEGIN //Тело основной программы Write(‘Введите N, M, K: ’); Read. Ln(N, M, K); S : = Summa_1(N) + Summa_2(M)- Proizv(K); Write. Ln(‘S = ’, S: 6: 3 ); Read. Ln; END.
Функции Задача 3: • Дана последовательность целых чисел, за которой следует 0. • Определить количество простых и совершенных чисел последовательности.
Алгоритм задачи 3 начало ввод x Count_pr: = 0; Count_sov : =0; да x <> 0? да x простое? нет Count_pr Count_sov Count_pr : = count_pr + 1; да x cоверш? Count_sov : = count_sov + 1; конец нет ввод x
Алгоритм начало ввод N Ввод N S : = 0; i =2, N div 2 i= 1, N div 2 нет N mod i = 0? да да S : = S + i i Сост. конец нет S=0? S=0 да Прост. i Несов. конец нет S=N? да Совер.
Функции • Подзадачи 3: 1. Определение, число X простое или нет 1. 1 Найти сумму делителей проверяемого числа в диапазоне от 2 до X div 2 1. 2 Сравнить сумму с 0 2. Определение, число X совершенное или нет 2. 1 Найти сумму делителей проверяемого числа в диапазоне от 1 до X div 2 2. 2 Сравнить сумму с N
Программа задачи 3 program Program 3; function Summa_Del(N: byte): word; Summa_Del(N: byte): word var i: byte; begin Result : = 0; for i : = 2 to N div 2 do if N mod i = 0 then Result : = Result + i; end; {of Summa_Del} function Prost(N: byte): boolean; Prost(N: byte): boolean begin Result : = Summa_Del(N)=0; end; {of Prost} function Sover(N: byte): boolean; Sover(N: byte): boolean begin Result : = Summa_Del(N) = N-1; end; {of Sover}
Программа задачи 2 (продолжение) var X: byte; count_pr, count_sov: byte; //Тело основной программы begin {of Main} Read. Ln(X); While x <> 0 do begin if Prost(x) then inc(count_pr); if Sover(x) then inc(count_sov); Read. Ln(X); end; Write(‘Простых = ’, count_pr, ‘Совершенных = ’ count_sov); Read. Ln; end.
ФОРМАЛЬНЫЕ ПАРАМЕТРЫ
Формальные параметры • По способу передачи формальные параметры делятся на 4 типа: 1. Параметры-значения 2. Параметры-переменные (var) 3. Параметры-константы (const) 4. Выходные параметры (out)
Формальные параметры Параметры значения определяют исходные данные для работы процедур и функций. В списке формальных параметров они описываются в следующем виде: procedure my 1(q 1: T 1; q 2: T 2) или procedure my 2(q 1, q 2: T) При вызове подпрограммы фактический параметр, может быть любым выражением, результат вычисления которого принадлежит тому же типу, что и формальный параметр.
Передача по значению При обращении к подпрограмме выражение вычисляется. В памяти создаются временные переменные с именами q 1 и q 2, и в них копируется результат вычислений. Изменение значений переменных q 1 и q 2 в теле подпрограммы никак не влияет на значения переменных из основной программы. При выходе из подпрограммы формальные переменные q 1 и q 2 уничтожаются. 42
Передача по значению Пример1: Параметрprogram Program 4; значение procedure Sq_1(x: real); begin x : = Sqr(x); Write. Ln(‘В процедуре - ’, x); end; var y: real; Begin {of Main} y : = 0. 5; Sq_1(y); Write. Ln(‘В программе - ’, y); Readln; end. Результат работы программы: В процедуре - 0. 25 В программе – 0. 5 43
Передача по значению Таким образом, в примере 1, переменная y не изменила своего значения в программе. При работе с параметром-значением в подпрограмму передается не сама переменная, а ее копия (т. е. ее значение), и все действия выполняются над копией. После чего копия теряет свое значение! 44
Передача по значению y : = 0. 5; Sq_1(y); Write. Ln(‘В программе -’, y); 0. 5 0. 25 0. 5 y x Результат работы программы: В процедуре - 0. 25 В программе – 0. 5 45
Передача по значению Пример2: program Program 5; function Chet_kr 5(N: word): boolean; begin Result : = (N mod 5 = 0) and (N mod 2 = 0); end; var X: byte; Begin {of Main} Read(x); Writeln(Chet_kr 5(sqr(x)+x)); sqr(x)+x Readln; end. Фактический параметр – как выражение 46
Передача параметров как переменных Параметры-переменные позволяют передавать в основную программу измененные значения. Параметры переменные в списке формальных параметров описываются с помощью указания перед ними ключевого слова var. Например: procedure my 3 (var q 1, q 2: t 1; var q 3: t 2) ; 47
Передача параметров как переменных При обращении к подпрограмме фактические параметры должны быть обязательно переменными, того же типа, что и формальные параметры. В подпрограмму передается адрес переменной (ссылка) и операторы процедуры непосредственно используют данную переменную. В данном случае любые изменения параметра q 1, произведенные в подпрограмме, в действительности относятся к той переменной, которая будет указана при вызове подпрограммы на месте q 1. 48
Передача параметров как переменных Пример1: Параметрprogram Program 6; переменная procedure Sq_2(var x: real); begin x : = Sqr(x); Write. Ln(‘В процедуре - ’, x); end; var y: real; Begin {of Main} y : = 0. 5; Sq_2(y); Write. Ln(‘В программе - ’, y); Readln; end. Результат работы программы: В процедуре – 0. 25 В программе – 0. 25 49
Передача параметров как переменных y : = 0. 5; Sq_2(y); Write. Ln(‘В программе -’, y); 0. 25 0. 5 y x Результат работы программы: В процедуре - 0. 25 В программе – 0. 25 50
Передача параметров как переменных Пример2: program Program 7; function Chet_kr 5(var N: word): boolean; begin Result : = (N mod 5 = 0) and (N mod 2 = 0); end; var X: byte; Begin {of Main} Read(x); Writeln(Chet_kr 5(sqr(x)+x)); sqr(x)+x Readln; end. ОШИБКА! Фактический параметр – должен быть переменной 51
Передача параметров как констант Передача параметра как константы осуществляется заданием перед его описанием ключевого слова const. procedure my 4 (const q 1: t 1); Параметры константы по механизму передачи похожи на параметры-значения, но их значения нельзя изменять в теле подпрограммы. В качестве аргументов могут использоваться константы, выражения и переменные. В подпрограмму передаются адреса фактических параметров. 52
Передача параметров как выходных параметров Выходные параметры описываются с помощью зарезервированного слова out. procedure my 5(out q 1: t 1); Выходные параметры по механизму передачи похожи на параметры-переменные, но при этом в подпрограмму не передается начальное значение этого параметра, т. е. память, занимаемая соответствующей переменной, указанной при вызове подпрограмме на месте q 1, будет очищена при вызове подпрограммы. 53
Передача параметров как выходных параметров Пример1: program Program 6; procedure Sq_2(x: real; out Z: real); begin Выходной x : = Sqr(x); Z : = x – Sqr(x); параметр end; var y, S: real; Begin {of Main} Переменной S значение не y : = 0. 5; присвоено Sq_2(y, S); Write. Ln(‘S = ’, S); Readln; end. Результат работы программы: S = 0. 1875 54
Подпрограммы_м.pptx