Лекция по теме "Процедуры и функции"
Оценка 4.7

Лекция по теме "Процедуры и функции"

Оценка 4.7
docx
математика
19.02.2020
Лекция по теме "Процедуры и функции"
Процедуры и функции в Delphi.docx

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

Мы уже познакомились с процедурным программированием теоретически. Сейчас нам предстоит узнать, как это выглядит на практике.

Процедуры и функции — это некий участок кода, который выделен в отдельный блок.

Листинг . Пример процедуры

Procedure Exampl(); var

i: Integer;//Объявление локальной переменной begin

i:=10;//Присваивай переменной значение end;

 

Любая процедура начинается с ключевого слова Procedure. После этого слова идет ее имя. В нашем примере она называется Exampl. После имени идут скобки, в которых можно указывать параметры, передаваемые в про¬цедуру. Что такое параметры, мы узнаем чуть позже, а пока мы должны знать, что если параметров нет, то нужно ставить пустые скобки или вообще ничего не ставить.

Внутри процедуры после слова var идет объявление локальных переменных. Здесь объявляется одна переменная i типа integer (целое число). Мы уже знакомы с глобальными переменными, которые появляются при старте программы и уничтожаются после выхода, i — это локальная переменная, и ее можно использовать только внутри процедуры. После выхода из нее пе-ременная автоматически уничтожается.

Код процедуры начинается после слова begin и заканчивается после слова end. Внутри блока begin ... end процедуры переменной i присваивается значение 10. В принципе, ничего не происходит, потому что после присваи¬вания числа процедура заканчивается и переменная i уничтожается.

Для вызова процедуры достаточно указать ее имя Ехатр.;..

Если процедура относится к объекту (т. е. является его методом), то нужно написать в объявлении имя объекта, а после точки имя процедуры. Вот пример процедуры, относящейся к объекту формы Forml.

 

Листинг , Метод объекта в виде процедуры

Procedure ТForml.Examp2; begin

Exampi; //Вызываем процедуру Exampi, написанную ранее, end;

i

В процедуре вызывается написанная ранее Exampi. Все имена про-

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

могут начинаться с цифр.

Если процедура относится к объекту (является его методом), то не имеет значения, где она написана и где вызывается, т. к. объекты имеют область описания (которую мы уже рассматривали) и она доступна компилятору.

 

Листинг. Описание методов объекта

type

TFormI = class(TForm) private:

procedure Exampl;

procedure Exairp2 ; public:

procedure ЕхаюрЗ;

procedure Exampl; end;

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

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

 

Листинг Пример функции

function Exampi:Integer;

var

i: Integer;/'/Объявление локальной переменной begin

i:---10; //Присваиваю переменной значение Result;=i; // Возвращаю значение i end;

Я объявил функцию, которая будет возвращать значение типа integer (целое число) function Exampi: integer. Тип возвращаемого функцией значения указывается после имени и двоеточия. Для возврата значения его нужно присвоить переменной Result, как это делается в примере.

Вызов функции осуществляется следующим образом.

Листинг 5.24. Вызов функции

Procedure TFontil. Examp2 ; var x:Integer;

begin

x:-Exampi; //Вызываем функцию Exampi, написанную ранее, end;

В этом примере переменной х присваивается значение, возвращаемое функ¬цией Exampi.

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

функций.

Листинг 5.25. Передача значения в функции

Function Exampl(index:Integer):Integer;

begin

Result:=index*2; // Возвращаю переданное значение index, // умноженное на 2

end;

Как показано в листинге 5.25, после имени функции в скобках указывается тип переменной, который можно передать внутрь ее или процедуры. В данном случае это переменная index типа integer. После скобок указывается двоеточие и тип возвращаемого значения. Здесь возвращается значение так¬же типа Integer.

Что же будет возвращать наша функция? Результат ее выполнения можно записывать в Result или присваивать самому имени функции. В приведенном примере переменной Result присваивается результат вычисления выражения index*2. Эта переменная нигде не описана, но она зарезервирована как переменная, возвращающая значения из функции.

Результат можно присваивать и имени функции. Вот как это будет выглядеть на примере.

Листинг 5.26. Возврат результата через имя функции

Function Exampl(index:Integer):Integer; begin

Exampl :=index*2; // Возвращаю переданное значение index, // умноженное на 2

end;

Вызов функции, определенной в предыдущем примере, будет осуществляться следующим образом.

Листинг 5.27. Вызов функции

procedure Т Form1.Examp2; var х:Integer;

begin

х:-Exampl(20); //Вызываем процедуру Exampl, написанную ранее, end;

Здесь в функцию Exampi передается значение 20, а она вернет 20, умножен¬ное на 2, т. е. 40 (см. листинг 5.26).

Все рассмотренные примеры оперировали функциями. Однако точно так же можно поступать и с процедурами.

Попробуйте сейчас внимательно посмотреть на следующий пример и найти в нем ошибку.

Листинг 5.28. Ошибочная процедура

Procedure TForml. Examp2 ; var

x:Integer; begin

Result:=x*20; end;

В этом примере переменной Result присваивается значение, вычисляемое из выражения — х*20. Вроде все правильно, но это же процедура, а она не может возвращать значение. Значит, компилятор выдаст ошибку на то, что переменная Result не определена.

И последнее, что необходимо здесь рассмотреть, — это досрочный выход из процедур или функций. Когда процедура выполняет заложенные внутри нее операторы и встречает среди них оператор exit, производится моментальный выход из этой процедуры. Рассмотрим эту ситуацию на примере.

Листинг 5.29. Прерывание выполнения процедуры

procedure TForml.Ехагар2; var

х:Integer; begin

x: = 20;

exit;

x:-10; // Этот код никогда не будет выполнен, end;

Здесь переменной х присваивается значение 20. Потом программа встречает оператор exit и производит мгновенный выход из процедуры, поэтому строчка с присваиванием переменной х значения 10 никогда не будет выполнена. Этот пример не совсем удачный, поэтому давайте рассмотрим функцию, которая будет возвращать результат деления двух переданных значений.

Листинг 5.30. Вызов функции с двумя параметрами

function Exampl(indexl,index2:Integer!:Peal; begin

Exampl:=indexl/index2; end;

procedure Examp2; var x: Real;

begin

x:=Exampl (2 0,13); //вызываем функцию Exampl, написанную ранее, end;

 

В этом примере функции Exampl передаются два значения. Обе переменные, indexl и index2, в которых хранятся эти значения, — целого типа. В каче¬стве результата функции возвращается частное от деления indexl на index2. В процедуре Ехатр2 показан пример вызова функции.

Какому-то параметру может быть задано значение по умолчанию. Такие параметры должны быть в конце объявления. Вот как преобразовать в этом случае код, представленный на листинге 5.30.

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

Function

begin

Exampl:=indexl/index2; end;

 

procedure Examp2; var x:Real;

begin

x:=Exaropl (20) ; //Вызываем процедуру Exampi, написанную ранее. x:=Exarapl(20, 3); //Вызываем процедуру Exampl, написанную ранее, end;

Здесь у нас объявлена функция с двумя параметрами. Второму параметру указывается значение, по умолчанию равны 2. Далее показаны два примера вызова этой функции. В первом случае указан только один параметр. В качестве второго будет значение по умолчанию. Это значит, что число 20 будет разделено на 2. Во втором случае указаны два параметра и здесь число 20 будет разделено на то число, которое мы указали в значения второго параметра.

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

Листинг 5.32. Логика функции с прерыванием выполнения

Function Exampi(indexl,index2:Integer):Real; begin

Если index2равен 0, mo exit.

Exampi:=indexl/index2; end;

procedure Examp2; var x:Real;

begin

процедуру Exampl, написанную ранее. x;=x*2; // Здесь произойдет ошибка end;

 

Здесь логика программы записана обычными словами, потому что более подробно мы будем изучать ее в следующей главе. Сейчас нам достаточно только понимать смысл записанного кода.

В этом примере, программа которого представлена в листинге 5.21, проверяется значение переменной index2 на ноль, и в случае равенства организуется выход из функции.

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

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

 

Листинг 5.33. Задание возвращаемого значения при входе в функцию

Function Exampl(indexl,index2:Integer) :Real; begin Result:=1;

Если index!равен 0, mo exit.

i

Result:=indexl/index2;

end;

В этом примере мы в первой же строке присваиваем переменной Result

значение 1. Теперь у нас результат определен с самого начала. После этого проверяется второй параметр на ноль, и если равенство верно, то произойдет выход. Однако после такого выхода у нас не будет неопределенных значений, потому что Result уже содержит значение 1.

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

Этот пример наглядно показывает, что Result работает как простая переменная, хотя она нигде не описана. Она всегда существует в функциях и имеет тип возвращаемого функцией значения.

( Совет )

Если кто-то подумал, что переменной Result надо присваивать значение только в самом конце программного кода или по ней происходит выход из функции, это не так. Result можно изменять где угодно и можно даже использовать как простую переменную. Тип у этой переменной соответствует типу возвращаемо¬го функцией значения. Помните эту особенность, когда будете использовать переменную Result.


 

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

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

Теперь разберемся с функциями

Теперь разберемся с функциями

Попробуйте сейчас внимательно посмотреть на следующий пример и найти в нем ошибку

Попробуйте сейчас внимательно посмотреть на следующий пример и найти в нем ошибку

Теперь допустим, что в index2 было передано значение 0

Теперь допустим, что в index2 было передано значение 0
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
19.02.2020