HHIDE_DUMP
Гость
H
HHIDE_DUMP
Гость
В этом уроке я расскажу вам об устройстве и применении процедур и функций в языке программирования Pascal/Delphi.
Процедуры — это конструкции программного кода, которые позволяют создавать в программном коде некоторые подпрограммы, которые выполняют определенные операции независимо от остального программного кода. Разберем несложный пример:
1 procedure shownumbers(n:integer);
2 var i:integer;
3 begin
4 for i:=1 to n do
5 showmessage(inttostr(i));
6 end;
7 procedure showsimplemessages;
8 begin
9 showmessage('This is a simple message 1!');
10 showmessage('This is a simple message 2!');
11 end;
12 procedure TForm1.OnCreate(Sender:TObject);
13 begin
14 shownumbers(5);
15 showsimplemessages;
16 end;
Пока не будем изучать синтаксис, сначала разберемся с принципом работы процедур. Как вы уже наверное заметили, все события (например тот же OnCreate) представлены процедурами. Сначала изучим содержимое обработчика события создания формы Form1 (или точнее уже можно говорить — содержимое процедуры «procedure TForm1.OnCreate(Sender:TObject)»). Внутри этой процедуры мы видим «shownumbers(5);» и «showsimplemessages;» — это и есть вызов процедур, находящихся выше чем «procedure TForm1.OnCreate(Sender:TObject)». Как вы уже наверняка поняли, для того чтобы вызвать существующую процедуру, необходимо сначала указать ее название, а затем в скобках перечислить ее параметры. Если параметр один, то достаточно просто указать его значение. Также, процедуры могут не иметь параметров. В таком случае скобки можно опустить. Указывать сами параметры нужно в соответствующем им типе. Например строковые переменные «string» нужно указывать в кавычках ‘ ‘.
Теперь разберем синтаксис самой процедуры. В самом начале процедуры идет ключевое слово «procedure». Затем указывается имя процедуры, а после имени указываются параметры в скобках. Указываются они перечислением через «точку с запятой». Несколько однотипных переменных подряд можно указывать через запятую. На словах это понять достаточно трудно, поэтому приведу пример:
1 procedure example(a,b,c:integer; d:string; e:real; x1,y1:string);
Затем, после объявления параметров процедуры, указывается программный код процедуры между ключевыми словами «begin» и «end» также, как это показано на первом примере. Перед «begin» можно также указать локальные переменные, создав новый раздел var. Эти переменные могут использоваться и обрабатываться только внутри самой процедурой, внутри которой они объявлены. Также внутри программного кода процедуры можно использовать параметры процедуры как обычные переменные указанного в процедуре типа. Только во время вызова процедуры, всем параметрам процедуры будет уже переданы соответствующие значения, указанные в вызове процедуры.
Очень важно при написании кода учитывать то, что сама процедура должна находиться выше в коде, чем то место где происходит ее вызов! Иначе может произойти ошибка, связанная с тем, что процедура попросту не будет найдена.
Любая процедура может вызвать любую другую процедуру, но только если вызываемая процедура стоит выше вызывающей ее процедуры.
Внутри процедур можно обращаться к глобальным переменным и изменять их значения.
Надеюсь, что принцип работы процедур я достаточно вам объяснил. Теперь рассмотрим функции. Функции — это по сути те же процедуры, но только функции могут возвращать результат, т.е. какое-либо значение. Принцип устройства процедур можно очень легко понять на простом примере:
1 function calc(a,b,c:integer; d:string): integer;
2 begin
3 result:=length(d);
4 inc(a,5);
5 dec(b,2);
6 inc(result, a+b-c);
7 end;
8 procedure TForm1.OnCreate(Sender:TObject);
9 var a:integer;
10 begin
11 a:=calc(1,2,3,'testing');
12 showmessage('Результат функции равен '+inttostr(a));
13 end;
Кстати, в этом примере мы также разберем две новые процедуры и одну новую для вас функцию, уже предусмотренные в Pascal/Delphi. Эти процедуры — «inc(a;integer;b:integer)» и «dec(a:integer;b:integer)». Первая называется инкрементом, и увеличивает целочисленное число «a» на «б» единиц. Вторая процедура называется декрементом, и делает совершенно обратную операцию инкременту, а именно уменьшает целочисленное число «a» на «b» единиц. Если переменной «b» не указать значение, то вместо числа «b» автоматически будет использоваться единица. Таким образом «inc(a);» — тоже самое что и «inc(a,1);». В качестве «b» могут выступать и отрицательные числа, что приведет к инверсии операции, т.е. «inc(a,-3);» — тоже самое что и «dec(a,3);». Процедуры инкремента и декремента использовать несколько удобнее и работают они относительно быстрее чем присвоение «a:=a+1;».
Функция «length(s:string):integer» подсчитывает количество символов в строке s и возвращает результат в виде целочисленной переменной.
В дальнейших уроках, когда я буду вам показывать новые функции или процедуры, мне будет достаточно указать ее заголовок, в котором описаны все имена, типы переменных и конечно же название самой функции или процедуры, т.к. синтаксис этих заголовков мы уже разобрали с вами в этом уроке.
Во всех функциях присутствует зарезервированная переменная под названием «result», которая хранит в себе результат функции, т.е. ее значение. Внутри программного кода функции нужно произвести присвоение переменной «result» значения, которое должна возвращать функция. Тип переменной «result» указывается после перечисления параметров (после закрывающей скобки и двоеточия), как это показано на примере. Внутри программного кода функции мы также как и в процедуре можем производить любые операции над параметрами, а также и над переменной «result». Также как и в процедуре, в функции необязательны параметры. Тогда она может выглядеть так:
1 function example: string;
2 begin
3 result:='simple function';
4 end;
Вызов функции осуществляется через присвоение, так как это показано в примере. Параметры функции указываются точно так же как и у процедуры.
Процедуры — это конструкции программного кода, которые позволяют создавать в программном коде некоторые подпрограммы, которые выполняют определенные операции независимо от остального программного кода. Разберем несложный пример:
1 procedure shownumbers(n:integer);
2 var i:integer;
3 begin
4 for i:=1 to n do
5 showmessage(inttostr(i));
6 end;
7 procedure showsimplemessages;
8 begin
9 showmessage('This is a simple message 1!');
10 showmessage('This is a simple message 2!');
11 end;
12 procedure TForm1.OnCreate(Sender:TObject);
13 begin
14 shownumbers(5);
15 showsimplemessages;
16 end;
Пока не будем изучать синтаксис, сначала разберемся с принципом работы процедур. Как вы уже наверное заметили, все события (например тот же OnCreate) представлены процедурами. Сначала изучим содержимое обработчика события создания формы Form1 (или точнее уже можно говорить — содержимое процедуры «procedure TForm1.OnCreate(Sender:TObject)»). Внутри этой процедуры мы видим «shownumbers(5);» и «showsimplemessages;» — это и есть вызов процедур, находящихся выше чем «procedure TForm1.OnCreate(Sender:TObject)». Как вы уже наверняка поняли, для того чтобы вызвать существующую процедуру, необходимо сначала указать ее название, а затем в скобках перечислить ее параметры. Если параметр один, то достаточно просто указать его значение. Также, процедуры могут не иметь параметров. В таком случае скобки можно опустить. Указывать сами параметры нужно в соответствующем им типе. Например строковые переменные «string» нужно указывать в кавычках ‘ ‘.
Теперь разберем синтаксис самой процедуры. В самом начале процедуры идет ключевое слово «procedure». Затем указывается имя процедуры, а после имени указываются параметры в скобках. Указываются они перечислением через «точку с запятой». Несколько однотипных переменных подряд можно указывать через запятую. На словах это понять достаточно трудно, поэтому приведу пример:
1 procedure example(a,b,c:integer; d:string; e:real; x1,y1:string);
Затем, после объявления параметров процедуры, указывается программный код процедуры между ключевыми словами «begin» и «end» также, как это показано на первом примере. Перед «begin» можно также указать локальные переменные, создав новый раздел var. Эти переменные могут использоваться и обрабатываться только внутри самой процедурой, внутри которой они объявлены. Также внутри программного кода процедуры можно использовать параметры процедуры как обычные переменные указанного в процедуре типа. Только во время вызова процедуры, всем параметрам процедуры будет уже переданы соответствующие значения, указанные в вызове процедуры.
Очень важно при написании кода учитывать то, что сама процедура должна находиться выше в коде, чем то место где происходит ее вызов! Иначе может произойти ошибка, связанная с тем, что процедура попросту не будет найдена.
Любая процедура может вызвать любую другую процедуру, но только если вызываемая процедура стоит выше вызывающей ее процедуры.
Внутри процедур можно обращаться к глобальным переменным и изменять их значения.
Надеюсь, что принцип работы процедур я достаточно вам объяснил. Теперь рассмотрим функции. Функции — это по сути те же процедуры, но только функции могут возвращать результат, т.е. какое-либо значение. Принцип устройства процедур можно очень легко понять на простом примере:
1 function calc(a,b,c:integer; d:string): integer;
2 begin
3 result:=length(d);
4 inc(a,5);
5 dec(b,2);
6 inc(result, a+b-c);
7 end;
8 procedure TForm1.OnCreate(Sender:TObject);
9 var a:integer;
10 begin
11 a:=calc(1,2,3,'testing');
12 showmessage('Результат функции равен '+inttostr(a));
13 end;
Кстати, в этом примере мы также разберем две новые процедуры и одну новую для вас функцию, уже предусмотренные в Pascal/Delphi. Эти процедуры — «inc(a;integer;b:integer)» и «dec(a:integer;b:integer)». Первая называется инкрементом, и увеличивает целочисленное число «a» на «б» единиц. Вторая процедура называется декрементом, и делает совершенно обратную операцию инкременту, а именно уменьшает целочисленное число «a» на «b» единиц. Если переменной «b» не указать значение, то вместо числа «b» автоматически будет использоваться единица. Таким образом «inc(a);» — тоже самое что и «inc(a,1);». В качестве «b» могут выступать и отрицательные числа, что приведет к инверсии операции, т.е. «inc(a,-3);» — тоже самое что и «dec(a,3);». Процедуры инкремента и декремента использовать несколько удобнее и работают они относительно быстрее чем присвоение «a:=a+1;».
Функция «length(s:string):integer» подсчитывает количество символов в строке s и возвращает результат в виде целочисленной переменной.
В дальнейших уроках, когда я буду вам показывать новые функции или процедуры, мне будет достаточно указать ее заголовок, в котором описаны все имена, типы переменных и конечно же название самой функции или процедуры, т.к. синтаксис этих заголовков мы уже разобрали с вами в этом уроке.
Во всех функциях присутствует зарезервированная переменная под названием «result», которая хранит в себе результат функции, т.е. ее значение. Внутри программного кода функции нужно произвести присвоение переменной «result» значения, которое должна возвращать функция. Тип переменной «result» указывается после перечисления параметров (после закрывающей скобки и двоеточия), как это показано на примере. Внутри программного кода функции мы также как и в процедуре можем производить любые операции над параметрами, а также и над переменной «result». Также как и в процедуре, в функции необязательны параметры. Тогда она может выглядеть так:
1 function example: string;
2 begin
3 result:='simple function';
4 end;
Вызов функции осуществляется через присвоение, так как это показано в примере. Параметры функции указываются точно так же как и у процедуры.