Пользовательские функции и процедуры

  • pptx
  • 02.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Пользовательские функции и процедуры.pptx

Пользовательские функции и процедуры

Алгоритмизация и программирование

Цель обучения

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

Критерии оценивания

Ученики понимают и различают определения функции и процедуры в программировании.
Ученики могут решить задачи используя функции и процедуры.

Процедуры и функции

Процедуры и функции в языке Pascal являются подпрограммами. 

Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе.

Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.

Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:

Program <имя программы>; { Заголовок программы } Uses <имя 1, имя 2, … >; { Раздел описания модулей } Label <метка 1, метка 2,…>; { Раздел описания меток } Const <имя 1, имя 2,…>; { Раздел описания констант } Type { Раздел описания типов } <имя типа 1> = <определение типа 1>; <имя типа 2> = <определение типа 2>; Var <имя 1, имя 2,…>: <тип>; { Раздел описания переменных } Procedure; {Раздел описания процедур} Function; {Раздел описания функций} Begin { Тело программы } <операторы> End.

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

Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими.
Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом.
Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.

Параметры процедур и функций

Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.

Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур:

Процедура:
Procedure <имя процедуры>(<формальные параметры>: <тип данных>); Var <локальные переменные> Begin . . . End;
Вызов процедуры:
<имя процедуры>(<фактические параметры>);

А здесь рассмотрим общую форму записи функций:

Функция:
Function <имя функции>(<формальные параметры>: <тип данных>): <тип функции>; Var <локальные переменные> Begin . . . <имя функции>:=<выражение>; End;
Вызов функции:
<имя переменной>:=<имя функции>(<фактические параметры>);

Переменные

В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные. Те, которые объявляются в основной части, называются глобальными, а в процедуре или функции – локальными. Локальные переменные в отличие от глобальных могут использоваться лишь внутри подпрограммы, к которой они принадлежат.

Пользовательские процедуры

Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы.
Она начинается со служебного слова Procedure, после которого идет имя и заголовок процедуры. Остальная часть аналогична основной программе.

Напишем пример программы, показывающей принцип работы простой процедуры.

program proc; uses crt; var k, n, r: integer; {начало описания процедуры} procedure sum(pk, pn: integer; var rez: integer); var i: integer; begin rez:=0; for i:=pk to pn do rez:=rez+i; write(‘ сумма диапазона = ‘, rez:3); end; {конец описания процедуры} begin clrscr; write(‘ начальное значение = ‘); readln(k); write(‘ конечное значение = ‘); readln(n); sum(k, n, r); {вызов процедуры} end.

Объяснение примера

Программа выводит сумму целых чисел заданного диапазона.
Имя процедуры прописано после служебного слова, определяющего, что создана именно процедура. Далее идет заголовок, где первые две переменные – это формальные параметры, в которые передается значение от фактических k и n.
Переменная rez возвращает результат и называется параметром-переменной (определяются после слова Var), а k и n – параметрами-значений. Локальная переменная – i, она описана сразу после заголовка процедуры. Вызывая, в основной части программы процедуру sum, в качестве передаваемых параметров мы указали три целочисленных переменных. Заметьте, что их количество соответствует числу формальных параметров. Порядок также важен, т. е. в переменную pk передается значение переменной k, в pn значение n и т. д.
В примере было бы вполне уместным не использовать параметр-переменную rez, а определить ее локально. В этом состоит различие между процедурами и функциями в Pascal.

Пользовательские функции

В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении. Также для обращения к функции необходимо знать тип данных результата, возвращаемого ей.
Описание функций начинается со служебного слова function, вслед за которым идет ее заголовок, а дальше те же блоки, что и у процедуры.
Function <имя функции>(<формальные параметры>: <тип данных>): <тип функции>; Var <локальные переменные> Begin . . . <имя функции>:=<выражение>; End;
В вызываемую часть результат работы функции должен быть возвращен посредством имени последней. Это предусматривает хотя бы одно присвоение ей значения.

Допустим необходимо вычислить наибольший общий делитель двух целых чисел. Результатом решения данной задачи будет одно число, поэтому мы воспользуемся именно функцией.

program func; uses crt; var n, m, nod: integer; {начало описания функции} function nod_Evk(f_n, f_m: integer): integer; begin while n<>m do begin if m>n then m:=m—n else n:=n—m; end; nod_Evk:=n; end; {конец описания функции} begin clrscr; write(‘ N =: ‘); read(n); write(‘ M =: ‘); read(m); write(‘ Наибольший общий делитель ‘, n,‘ и ‘, m, ‘ = ‘); nod:=nod_Evk(n, m); write(nod); end.

Объяснение примера

В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod.
В функцию из основной части передаются только два фактических параметра (m и n), что соответствует количеству формальных параметров.
И если в заголовке процедуры после слова Var можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.

Задача 1

Написать функцию, которая возвращает среднее арифметическое двух переданных ей аргументов (параметров).

var
a, b: real;

function average(c,d: real): real;
begin
average := (c + d) / 2;
end;

begin
readln(a,b);
writeln(average(a,b):5:2);
end.

Задача 2

Описать процедуру нахождения по заданной длине стороны треугольника и величинам двух прилежащих углов длин остальных сторон треугольника и величины третьего угла.
var
K,L,M,KL,LM,KM: real;

procedure triangle(var A,B,C,AB,BC,AC: real);
var radA, radB, radC: real;
begin
C := 180 - A - B;
radA := A * PI/180;
radB := B * PI/180;
radC := C * PI/180;
BC := (sin(radA) * AB) / sin(radC);
AC := (sin(radB) * AB) / sin(radC);
end;

begin
write('A = '); readln(K);
write('B = '); readln(L);
write('AB = '); readln(KL);
triangle(K,L,M,KL,LM,KM);
writeln('C = ',M:7:2);
writeln('BC = ',LM:6:2);
writeln('AC = ',KM:6:2);

readln;
end.

Задача 3

Описать функцию вычисления f(x) по формуле: f(x)= x^2 при -2<=x<2; x^2+4x+5 при x>=2; 4 при x<-2.
Используя эту функцию для n заданных чисел, вычислить f(x). Среди вычисленных значений найти наибольшее.

const
n = 5;
var
a, max: integer;
i: byte;
arr: array[1..n] of integer;

function func(x: integer): integer;
begin
if (x >= -2) and (x < 2) then
func := x * x
else
if x >= 2 then
func := x * x + 4 * x + 5
else
func := 4;
end;

begin
max := -32768;
for i:=1 to n do begin
write('a = '); readln(a);
arr[i] := func(a);
if arr[i] > max then
max := arr[i];
end;

write('Result: ');
for i:=1 to n do
write(arr[i], ' ');
writeln;
writeln('max = ', max);

readln;
end.

ДЗ

Написать функцию для обмена значений двух переменных


Подсказка
От пользователя требуется ввод двух чисел.
Эти значения должны быть присвоены двум переменным, причем значение первой должно быть меньше второй. Конечно, можно предупредить об этом пользователя, но возможно ему удобней будет и не знать о требованиях программы.
В коде программы можно реализовать процедуру, производящую обмен значений двух переменных, и вызывать ее после каждого очередного ввода пользователя.

Рефлексия

Что вы узнали на уроке?
Что было не понятно?
Вам была интересна сегодняшняя тема?