460 likes | 759 Views
Процедуры и функции. Все процедуры и функции делятся на стандартные встроенные определенные пользователем . Встроенные и стандартные вызываются без предварительного описания. Стандартные процедуры и функции. Арифметические : abs(x); cos(x); sqrt(x); и др. Скалярные :
E N D
Процедуры и функции Все процедуры и функции делятся на • стандартные • встроенные • определенные пользователем. Встроенные и стандартные вызываются без предварительного описания.
Стандартные процедуры и функции Арифметические : abs(x); cos(x); sqrt(x); и др. Скалярные: dec(x,n); inc(x,n); pred(s); suss(s); odd(x); Функции и процедуры преобразования типов: chr(i); round(x); trunc(x); val(s,x,code); str(n,s);
Встроенные процедуры и функции Встроенные процедуры и функциивыделены в группы, которые размещаются в отдельных модулях. Модуль имеет имя. Подключается через слово Uses. По умолчанию подключается модуль System.
Пользовательские процедуры и функции • Нередко в программах встречаются повторяющиеся или похожие фрагменты. Имеется возможность оформлять такие фрагменты специальным образом — выделять их в подпрограммы. • Подпрограмме дается имя, по которому можно обращаться к ней (вызывать подпрограмму). • В Паскале имеется два вида подпрограмм — процедуры и функции. Их структура очень похожа на структуру основной программы.
Пользовательские процедуры и функцииПрименяются • Для структурирования программы • Когда одну и туже группу операций необходимо повторить без изменений в нескольких других местах программы • Когда одну и туже группу операций необходимо выполнить с разными параметрами
Описание процедуры • Пользовательские процедуры и функции организуются самим программистом. • Их предварительное описание обязательно. • Процедура и функции описывается в разделе описания программы (между Program иBegin) • Описание процедуры – это локальный блок, по структуре аналогичен программе.
Описание процедуры • Описание процедуры начинается с заголовка, который является обязательным, в отличие от заголовка программы. • Заголовок состоит из служебного слова Procedure, за которым следуют имя процедуры и, в круглых скобках, список формальных параметров. (Список формальных параметров может отсутствовать) • Имя процедуры уникально в пределах программы. • Общий вид описания процедуры Procedure Имя (Список формальных параметров); описательная часть Begin тело процедуры End;
Функции Описание включает в себя имя и тело. Заголовок состоит из служебного слова function, имени и списка формальных параметров с указанием их типа, заключенного в круглые скобки.После скобки ставится двоеточие и указывается тип возвращаемого функцией значения. В теле функции должен быть оператор присваивания, в левой части которого стоит имя функции, а в правой – ее значение. Function имя (список формальных параметров): тип результата; <раздел описания>; begin <тело процедуры>; имя функции : = значение; end; Имя функции уникально в пределах программы, тело функции – это локальный блок, по структуре аналогичен программе. Оператор вызова функции – это имя функции и список фактических параметров. При вызове функции ее формальные параметры заменяются на фактические.
Параметрыв круглых скобках после имени процедуры Формальные параметры – это параметры, которые используются для описания процедуры. Они определяют тип и место подстановки фактических параметров. Фактические параметры – это параметры, которые передаются при вызове. Количество, типы и порядок формальных и фактических параметров должны совпадать. Т.о. параметры обеспечивают механизм замены, позволяющий выполнить процедуру с различными данными.
Процедуры Формальные параметры делятся на параметры-значения и параметры-переменные. Параметры-переменные – это результат, возвращаемый из процедуры в программу, перед ними ставят var. Параметры-значения – это аргументы процедуры.
Вызов процедуры Процедура и функция вызываются по имени процедуры или функции, в круглых скобках записываются фактические параметры. Имя (Список фактических параметров) При вызове процедуры или функции формальные параметры заменяются на фактические.
Локальные и Глобальныепеременные • Все переменные программы делятся на глобальные и локальные. • Глобальныепеременные объявляются в разделе описаний основной программы. • Локальные переменные объявляются в процедурах и функциях. Таким образом, локальные переменные «живут» только во время работы подпрограммы.
Процедуры и функции В общем виде программа представляет собой следующее: Program <имя>; Uses <модуль>; Label <список меток> Const <список констант>; Type <описание типов>; Var <описание глобальных переменных>; Procedure <имя>; <тело процедуры>; Function <имя>; <тело функции>; Begin <тело программы>; end.
Пример1_1. • Составить программу , которая Вычисляет an, где а и n – целые числа (n>=0), вводятся с клавиатуры
Процедура вычисления степени числа: Procedure stepen (x,y:integer; var st:longint);{формальные параметры} {x,yпараметры-значения , st -параметры-переменные} Var i:integer; Begin st:=1; for i:=1 to y do st:=st*x; end;
program pr1_1; var a,n:integer; s:longint; procedure stepen (x,y:integer; var st:longint); var i:integer; begin st:=1; for i:=1 to y do st:=st*x; end; begin readln(a,n); stepen(a,n,s);{вызов процедуры, фактические параметры } writeln(s); end.
Пример1_2. Составить программу для вычисления an, где а и n – целые числа (n>=0) вводятся с клавиатуры. • функция вычисления степени числа: Function stepen (x,y:integer):longint; var i:integer; st:longint; begin st:=1; for i:=1 to y do st:=st*x; stepen:=st; end;
program pr1_2; var a,n:integer; s:longint; function stepen (x,y:integer):longint; var i:integer; st:longint; begin st:=1; for i:=1 to y do st:=st*x; stepen:=st; end; begin readln(a,n); s:=stepen(a,n); writeln(s); end.
Пример 2: • Составить программу, подсчитывающую число сочетаний без повторения из n элементов по k. Число сочетаний без повторения вычисляется по формуле: n! • С:=------------- k! (n-k)!
Опишем процедуру для вычисления факториала числа n (n!=1*2*3*…*n) Procedure factorial (n: Integer;Var R: Longint); {заголовокпроцедуры} Var i: Integer; Begin R:=1; For i:=1 to n do R:=R*i; End;
Programpr2_1 ; Var n, k: Integer; a1, a2, a3: Longint; C: Real; Procedure factorial (n: Integer;Var R: Longint); {заголовокпроцедуры} Var i: Integer; Begin R:=1; For i:=1 to n do R:=R*i; End; Begin Writeln (‘Ввод n и k’); Readln (n, k); factorial (n,a1); {вычисление n!} factorial (k,a2); {вычисление k!} factorial (n-k,a3); {вычисление (n-k)!} C:=a1 / (a2*a3); {результат} Writeln (‘Результат равен’, C:5:2); End
Опишем функцию для вычисления факториала числа n (n!=1*2*3*…*n) Function factorial (n: Integer): Longint; {заголовокфункции} Var i: Integer; rez: Longint; Begin rez:=1; For i:=1 to n do rez:=rez*i; factorial:=rez; {присваивание значения имени функции} End;
Programpr2_2; Var n, k: Integer; a1, a2, a3: Longint; C:real; Function factorial (n: Integer): Longint; {заголовокфункции} Var i: Integer; rez: Longint; Begin rez:=1; For i:=1 to n do rez:=rez*i; factorial:=rez; {присваивание значения имени функции} End; Begin Writeln (‘Ввод n и k’); Readln (n, k); C:=factorial (n)/ (factorial (k)*factorial (n-k)); {результат} Writeln (‘Результат равен’, C:5:2); End.
Передача массивов в процедуры и функции Типом параметра в списке формальных параметров может быть любой стандартный тип или ранее объявленный тип. При использовании массива в качестве параметра –значения весь массив дублируется, хранится в стеке. При использовании массива в качестве параметра – переменной передается адрес массива. (Адресом массива является адрес первого элемента массива. ) При использовании одного массива использование массива в качестве параметра не рекомендуется.
Передача массивов в процедуры и функции При работе с одним массивом • Описать массив как глобальные переменные, т.е. в разделе Var перед описанием процедуры • Ввод массива в основной программе • Использоватьмассив в теле процедуры или функции • Вывод массива в основной программе • При необходимости в качестве параметров можно передавать индексы элементов массива или отдельные элементы массива.
Пример 2.1 Дан одномерный массив. Создать процедуру вычисления минимального значения среди элементов массива. Вычислить Y= 2* MIN/(MIN+1)
Var a: array[1..100] of integer; I,n,j,m,min:integer; y:real; Procedure s( var f,k:integer); Begin F:=a[1]; k:=1; For i:=2 to n do If a[i]<f then begin F:=a[i]; k:=i; end; End; Begin Readln(n); For i:=1 to n do read (a[i]); S(min,m); Y:=(2*min)/(min+1); Writeln(y); End.
Пример 2.1 Дан двумерный массив. Создать процедуру вычисления минимального значения среди элементов к-строки массива. Вычислить Y= (MIN(1)+MIN(3))/MIN(1)
Var a: array[1..10,1..10] of integer; I,n,j,m,min1,min2,min3:integer; y:real; Procedure s( k:integer; var f:integer); Begin F:=a[k,1]; For j:=2 to m do If a[k,j]<f thenF:=a[k,j]; End; Begin Readln(n,m); For i:=1 to n do For j:=1 to m do read (a[i,j]); S(1,min1); S(4,min2); S(3,min3); Y:=(min1+min2)/min3; Writeln(y:5:2); End.
Var a: array[1..10,1..10] of integer; I,n,j,m:integer; y:real; Function s( k:integer): integer; Var f:integer; Begin F:=a[k,1]; For j:=2 to m do If a[k,j]<f thenF:=a[k,j]; S:=f; End; Begin Readln(n,m); For i:=1 to n do For j:=1 to m do read (a[i,j]); y:=(s(1)+s(4))/(s(3)); Writeln(y:5:2); End.
Параметры-массивы и параметры строки • При использовании нескольких массивов, массив является параметром. • Типом массива-параметра в списке формальных параметров должен быть ранее объявленный тип. • Например. type ar=array[1..10] of integer; var a:ar;… procedure ss (v:ar); begin … end; Begin … ss(a); end.
Даны 3 массива a,b,c размерностью na,nb,nc. Вычислить • y=(min(a)+min(b))/min(c)
Type ar=array[1..100] of integer; Var a,b,c:ar; I,na,nb,nc,j,m,min1,min2,min3:integer; y:real; Procedure s( x:ar; nx:integer; var f:integer); Begin F:=x[1]; For i:=2 to nx do If x[i]<f thenF:=x[i]; End; Begin Readln(na,nb,nc); For i:=1 to na do read (a[i]); For i:=1 to nb do read( b[i]); For i:=1 to nc do read( c[i]); S(a,na,min1); s(b,nb,min2);s(c,nc,min3); Y:=(min1+min2)/min3; Writeln(y); End.
Type ar=array[1..100] of integer; Var a,b,c:ar; I,na,nb,nc,j,m:integer; y:real; Function s( x:ar; nx:integer):integer; Var F:integer; Begin F:=x[1]; For i:=2 to nx do If x[i]<f thenF:=x[i]; S:=f; End; Begin Readln(na,nb,nc); For i:=1 to na do read (a[i]); For i:=1 to nb do read( b[i]); For i:=1 to nc do read( c[i]); Y:=(S(a,na)+s(b,nb))/s(c,nc); Writeln(y:5:2); End.
Пример 3. Даны три одномерных массива целых чисел a[1:n], b[1:m], c[1:l]. Получить min(b)+ min(c), если | min(a)|>10 G= (1+min(c))/2 в противном случае Использовать процедуру нахождения минимального элемента в массиве.
program pr3; type mm=array [1..10] of integer; var a,b,c:mm; amin, bmin, bmin,i,g,n,m,l:integer; procedure minm (y:integer; d:mm; var x:integer); begin x:=d[1]; for i:=2 to y do if d[i]<x then x:=d[i]; end; Begin readln(n,m,l); for i:=1 to n do read(a[i]); for i:=1 to m do read(b[i]); for i:=1 to l do read(c[i]); minm(n,a,amin); minm(m,b,bmin); minm(l,c,cmin); If abs(amin)>10 then g:=bmin+cmin else g:=1+sqr(cmin); writeln(‘g=‘,g); end.
Пример 4. Составить процедуру, которая меняет местами максимальный и первый элементы массива. Применить эту процедуру для двух данных массивов.
program pr5; type mm=array [1..10] of integer; var a,b:mm; i,n,m:integer; procedure per (y:integer; var d:mm); var max,nmax:integer; begin max:=d[1]; nmax:=1; for i:=2 to y do if d[i]>max then begin max:=d[i]; nmax:=i;end; d[nmax]:=d[1]; d[1]:=max; end; Begin readln(n,m); for i:=1 to n do read(a[i]); for i:=1 to m do read(b[i]); per(n,a); per(m,b); for i:=1 to n do write(a[i],’ ‘); for i:=1 to m do write(b[i],’ ‘); end.
Пример 5. Написать процедуру циклического сдвига элементов одномерного массива влево. Использовать ее для каждой строки двумерного массива.
type d=array [1..10] of integer; var a:d; n,m,i,j:integer; b:array [1..10,1..10] of integer; procedure per (y:integer;var c:d); var f,x:integer; beginx:=c[1]; for f:=2 to y do c[f-1]:=c[f]; c[y]:=x; end; beginreadln(n,m); for i:=1 to n do for J:= 1 to m doread(b[i,j]); for i:=1 to n do begin for j:= 1 to m doa[j]:=b[i,j]; per(m,a); for j:= 1 to m dob[i,j]:=a[j]; end; for i:=1 to n do begin for j:= 1 to m dowrite(b[i,j],' '); writeln; end; end.