Процедуры и функции Тема урока: понятие подпрограмм. Механизм реализации подпрограмм с помощью процедур и функций I. • • • • • • Повторение материала Какова структура программы? Обязателен ли заголовок программы? Какие разделы описаний вы знаете? С чего начинается раздел констант? Как описать переменные? С чего начинается основная часть программы? Как ее закончить? Подпрограммы решают три важные задачи, значительно облегчающие программирование: избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты, т.е. сократить объем программы; улучшают структуру программы, облегчая понимание при разборе; уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования . Подпрограмма — это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени. Общие принципы выделения подпрограмм: Если в программе необходимо переписывать одни и те же последовательности команд, то стоит эту последовательность команд оформить в виде подпрограммы; Стоит перенести в подпрограмму подробности, заслоняющие основной смысл программы; Слишком длинную программу полезно разбить на составные части – подобно тому, как книгу разбивают на главы. При этом основная программа становиться похожей на оглавление; При решении задачи могут возникать слишком сложные подзадачи. Целесообразней отладить их отдельно в небольших программах. Добавление этих программ в основную задачу будет легким, если они оформлены как подпрограммы. Все, что вы сделали хорошо в одной программе, вам захочется перенести в новые программы. Для повторного использования частей кода лучше сразу выделять в программе полезные вам подзадачи в виде отдельных подпрограмм. Подпрограммы располагаются в разделе описаний основой программы Подпрограмма оформляется подобно основной программе, т.е. состоит из заголовка, раздела описаний и раздела операторов. Все имена, представленные в разделе описаний основной программы, называются глобальными. Они действуют как в разделе операторов основной программы, так и в любой подпрограмме. Имена, представленные в разделе описаний подпрограммы, называются локальными. Они действуют только в рамках подпрограммы и недоступны операторам основной программы. В языке Паскаль имеется два вида подпрограмм: Процедура и Функция. Процедура (Procedure) Любая процедура начинается с заголовка. Он состоит из служебного слова Procedure , за которым следует имя процедуры, а в круглых скобках — список формальных параметров. После заголовка могут идти те же разделы, что и в программе. Таким образом, общий вид будет следующим: Procedure<имя>[(формальные параметры)]; {Список формальных параметров может отсутствовать. } Объявление переменных Раздел описаний Begin тело процедуры Раздел операторов End; Вызывается процедура по имени: Имя (фактические параметры) Задача Необходимо многократно вычислить площадь квадрата S1=a*a и площадь прямоугольника S2=a*b при различных значениях сторон a,b Procedure place (x,y:real; var sk,sp:real); begin sk:=x*x; sp:=x*y End; Вызвать эту процедуру, можно, используя фактические параметры: Place (A,B,S1,S2),где А и В передаются в процедуру параметрам X и Y , а результаты ее выполнения SK и SP возвращаются параметрам S1и S2. При вызове процедуры вместо переменных А и В можно указать конкретные значения Place (2.5,4,S1,S2) Program pl; Var A,B,S1,S2:REAL; Procedure place (x,y:real; var sk,sp:real); begin sk:=x*x; sp:=x*y End; Begin Write (‘Введите значения А,В:’); Read (А,В); Place (A,B,S1,S2); {Вызов процедуры} Write(‘S1=’,S1:5:2,’ ‘:6, ‘S2=‘,S2:5:2) end. Параметры значения могут быть только входными для процедуры, а параметры-переменные (перед ними ставится слово Var) как входными, так и выходными Задача: Определить максимальную и минимальную оценки данные судьями. Program MinMax; Const n=9; {число судей} Type Massiv=array[1..N]of real; Var A: Massiv; {массив оценок} I:integer; {параметр цикла} Max,Min:real; {максимальная, минимальная оценка} Procedure MaxMin(k:integer; var X:massiv; Var Max,Min:real); Var J:integer; Begin Max:=X[1]; Min:=X[1]; For J:=1 to k Do Begin If X[J]>Max Then max:=X[J]; If X[J]<Min then Min:=X[J] end End; {Основная программа} Begin Writeln(‘Какие оценки дали судьи?’); For I:=1 to N do Read (A[I]); MaxMin(N,A,Max,Min) ; {Вызов процедуры} Writeln(‘Максимальная оценка=’,Max:4:1); Write(‘Минимальная оценка=’,Min:4:1) end. Описание функции Функции предназначены для того, чтобы вычислять только одно значение, поэтому ее первое отличие состоит в том, что процедура может иметь новые значения у нескольких параметров, а функция только одно (оно и будет ее результатом). Второе отличие заключается в заголовке функции. Он состоит из слова Function, за которым идет имя функции, затем в круглых скобках идет список формальных параметров, после чего через двоеточие записывается тип результата функции. Остальное как в процедуре. В теле функции обязательно должен быть хотя бы один оператор присвоения, где в левой части стоит имя функции, а в правой — ее значение. Иначе, значение не будет определено. Таким образом, общий вид такой: Описание функции Function <имя>[(<список форм.параметров>)]: <тип результата> Описательная часть Begin Тело функции <имя>:=<значение>; End; Составьте программу нахождения максимального элемента и его индекса в одномерном целочисленном массиве. Для решения задачи в процедуре задаем начальный максимум и его индекс. Например, первый элемент массива. Затем сравниваем максимум с каждым элементом массива и если найдем элемент, больший максимума, то перезапоминаем максимум и идем далее. Program Maximum; Var line:array [1..10] of integer Function maxim :integer; var imax,i:integer; begin imax:=1; for i:=2 to 10 do if line[imax]<=line[i] then imax:=i; maxim:=line[imax] end; begin Randomize For i:=1 to 10 do Line[i]:=random(100); M:=maxim; Writeln(‘максимальный элемент в массиве=‘,M:5); Readln End. Домашнее задание. Ответить на вопросы: - Чем отличаются друг от друга глобальные и локальные параметры? - Как описывается функция? - Каковы отличия функции от процедуры? - Чем отличаются друг от друга формальные и фактические параметры? - Что такое область действия переменной? Procedure Maxim(var x,y:integer); Begin If x>y then y:=x Else x:=y End; Program … X:=2; Y:=3; Maxim(y,x) Каковы будут значения переменных X и Y ? X=3; Y=3: Procedure Mult(var x:integer; y:integer; Begin x:=y*2; End; Program … X:=2; Mult(x,2*x); Каково будет значение переменной X ? X=8 Решение задач Найти разность двух факториалов F=m!-n! Дан массив целых чисел (М=15 число элементов в массиве). Вычислить сумму элементов с 1 по 12 и с 8-го по 15. Затем найти произведение этих сумм