Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

новая папка 1 / Лабораторная работа №11

.doc
Скачиваний:
36
Добавлен:
25.02.2016
Размер:
51.2 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 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);

Var

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;

оздадим функцию с двумя вещественными параметрами A и B, которая будет возвращать результат возведения А в степень В. Алгоритм запишем в обработчике события onClick объекта Button1. Результат выведем на экран с использованием метки Label1.

Следует заметить, что в общем случае степень при А<=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: Создать функцию, вычисляющую количество заданных элементов в одномерном массиве.