новая папка 1 / Лабораторная работа №11
.doc
ЛАБОРАТОРНАЯ РАБОТА № 11
Процедуры и функции
Процедуры и функции представляют собой относительно самостоятельные фрагменты программы, оформленные особым образом и имеющие имя. Отличие процедуры от функции заключается в том, что результат выполнения функции передается через ее имя, поэтому обращение к функции может использоваться в выражениях наряду с переменными и константами.
Приведем пример уже известных процедур и функций:
Y:=COS(x)*10; COS – функция
STR(x,y) – процедура преобразования числа в его строковую запись
Описание подпрограммы
Подпрограмма имеет следующую структуру:
Procedure <имя>[(список
формальных параметров)]; {заголовок
процедуры}
<раздел описаний>
Begin {раздел операторов} End;
Function <имя>[(список
формальных параметров)]:<тип результата>;
{заголовок ф.}
<раздел описаний>
Begin {раздел операторов} End;
Здесь <имя> - имя подпрограммы (идентификатор). Список формальных параметров является необязательным. Его структуру рассмотрим несколько позже. <раздел описаний> - необязательный блок - содержит описание меток, типов, констант, переменных а также процедур и функций, которые используются в данной подпрограмме. Раздел операторов содержит операторы подпрограммы.
При использовании функции мы должны
указать тип возвращаемого результата.
При этом в самой функции мы должны
присвоить ее имени либо переменной
Result какое-либо значение.
Это значение и будет возвращено в
качестве результата. Например, функцию
можно определить следующим образом:
Function f(x:Real):Real;
Begin
Result:=3*sqr(cos(x));
End;
Заголовок подпрограммы. Вызов подпрограммы.
Список формальных параметров необязателен и может отсутствовать. Если же он есть, то в нем должны быть перечислены имена формальных параметров с указанием их типов, например:
Procedure Pr1(a:Real; b:Integer; c:Char);
Как видно из примера, параметры в списке отделяются друг от друга точками с запятой. Несколько следующих подряд однотипных параметров можно перечислить через запятую. Например можно записать:
Procedure pr1(a:Real; b:Real);
Или аналогично:
Procedure pr1(a,b:Real);
Типом любого параметра в списке формальных параметров может быть только стандартный или ранее объявленный тип. Т.е. недопустима такая запись:
Procedure Pr2(a:Array[1..10] of integer);
В таком случае нужно до процедуры объявить тип – массив и затем его использовать.
Type
Mas=array[1..10] of integer;
Procedure Pr2(a:Mas);
Вызов подпрограммы осуществляется указанием ее имени и списком фактических параметров (если таковые присутствуют). При этом число фактических параметров должно совпадать с числом формальных параметров, и типы фактических параметров должны совпадать с типами формальных параметров.
Пример №1: Создадим процедуру, записывающую надпись объекта Label1 наоборот:
Procedure Turn_Over;
Var
s:String;
i:Integer;
Begin
s:='';
For i:=Length(form1.label1.caption) downto 1 do
s:=s+form1.label1.caption[i];
Form1.label1.caption:=s;
End;
При этом предполагается, что объект Label1 содержится в объекте Form1 (находится на форме).
Пример №2: В Object Pascal не предусмотрена операция возведения вещественного числа в произвольную степень. Тем не менее эту задачу можно решить с использованием стандартных математических функций Exp и Ln по следующему алгоритму:
![]()
С
procedure
TForm1.Button1Click(Sender: TObject);
x:Real; Function
Stepen(a,b:Real):Real; Begin
If a>0 then
Result:=Exp(B*Ln(a)) else
Result:=0; End; Begin
x:=Stepen(2,3);
Label1.caption:=FloatToStr(x);
end;Var
Следует заметить, что в общем случае
степень
при А<=0 не определена.
Типы передачи параметров
Существуют следующие типы передачи параметров:
-
Передача параметра по значению;
-
Передача параметра как константы;
-
Передача параметра по адресу;
-
Передача параметра как выходного.
Передача параметра по значению:
В предыдущем примере параметры А и В определены как параметры – значения. В этом случае в памяти создаются временные переменные А и В и в них копируются значения фактических параметров. В качестве фактического параметра может использоваться константа или переменная соответствующего типа.
Передача параметра как константы
Передача параметра как константы осуществляется заданием перед его именем ключевого слова Const. Например:
Procedure pr1(Const x:Real);
Такая передача параметра почти идентична обычной передаче по значению. Но есть одно существенное отличие: если при передаче параметра по значению вы можете в теле подпрограммы изменять значение соответствующей ему локальной переменной, то при передаче параметра как константы это невозможно. Например, следующая процедура не вызовет ошибки:
Procedure Pr1(x:Real);
Begin
X:=X+10;
ShowMessage(FloatToStr(x));
End;
Если же передача параметра происходит как передача константы, компилятор выдаст сообщение об ошибке:
Procedure Pr1(const x:Real); {Пример с ошибкой}
Begin
X:=X+10;
ShowMessage(FloatToStr(x));
End;
Передача параметра по адресу.
При передаче параметра по адресу перед его именем указывается ключевое слово Var. Например:
Procedure PR1(Var x:Real;y:Integer);
В качестве фактического параметра в этом случае может использоваться только переменная соответствующего типа. Т.е. вызов процедуры может выглядеть например так:
PR1(R,10);
В подпрограмму передается адрес фактического параметра, и формальный параметр размещается по этому адресу. Следовательно, любые изменения формального параметра приводят к изменению фактического параметра. В нашем примере изменения переменной X в процедуре PR1 приводят к изменению переменной R.
Таким образом, ключевое слово Var позволяет возвращать информацию из подпрограммы в вызвавшую ее внешнюю подпрограмму.
Передача параметра как выходного
Передача параметра как выходного осуществляется заданием перед ним ключевого слова Out. Этот способ фактически не отличается от передачи параметра по адресу.
Пример: Рассмотрим следующую процедуру при различных способах передачи параметров:
Procedure Pr2(a:Real);
Begin
a:=a*10;
End;
П
procedure
TForm1.Button1Click(Sender: TObject); Var
x:Real; Procedure
Pr2(a:Real); Begin
a:=a*10; End; Begin
x:=10;
Pr2(x);
Label1.caption:=FloatToStr(x);
end;
З
начение
переменных до выполнения процедуры:
З
начение
переменных после выполнения процедуры:
П
procedure
TForm1.Button1Click(Sender: TObject); Var
x:Real; Procedure
Pr2(var a:Real); Begin
a:=a*10; End; Begin
x:=10;
Pr2(x);
Label1.caption:=FloatToStr(x);
end;
Значение переменных до выполнения процедуры:
З
начение
переменных после выполнения процедуры:
Задание 1: Создать процедуру, которая будет менять местами заголовок формы и заголовок метки.
Задание 2: Создать процедуру, удаляющую из строки все пробелы.
Задание 3: Создать функцию, удаляющую из строки все пробелы.
Задание 4: Создать процедуру, вычисляющую количество заданных элементов в одномерном массиве.
Задание 5: Создать функцию, вычисляющую количество заданных элементов в одномерном массиве.
