Часто, работая над программой, программист замечает, что некоторая последовательность инструкций встречается в разных частях программы несколько раз. Например, в листинге 6.1 приведена программа пересчета весаиз фунтов в килограммы. Обратите внимание, что инструкции, обеспечивающие ввод исходных данных из полей редактирования, расчет и вывод результата (в листинге они выделены фоном), есть как в процедуре обработки события на кнопке Вычислить, так и в процедуре обработки события onkeypress В поле Edit1.
Листинг: Пересчет веса из фунтов в килограммы.
01.
unit
Dnitl;
02.
interface
03.
uses
04.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
05.
Forms, Dialogs, StdCtrls;
06.
type
07.
TForml =
class
(TForm)
08.
Labell: TLabel;
// пояснительный текст
09.
Editl: TEdit;
// поле ввела веса в фунтах
10.
Buttonl: TButton;
// кнопка Вычислить
11.
Label2: TLabel;
// поле вывода результата
12.
procedure
ButtonlClick(Sender: TObject);
13.
procedure
EditlKeyPress(Sender: TObject;
var
Key: Char);
14.
private
15.
( Private declarations )
16.
public
17.
{ Public declarations }
18.
end
;
19.
vac
20.
Forml: TForml;
21.
iinpl emen ta t i
on
22.
{SR *.dfm(
23.
// щелчок на кнопке Вычислить
24.
procedure
TForml
.
ButtonlClickfSender: TObject);
25.
vat
26.
f :
real
;
// вес в фунтах
27.
kg :
real
;
// вес в килограммах
28.
begin
29.
f := StrTqFloat(Editl
.
Text);
30.
kg := f *
0.4059
;
31.
Label2
.
Caption := Editl
.
Text +
' ф. — это '
+FloatToStrF(kg, ffGeneral,
4
,
2
) +
'KP'
;
32.
end
;
33.
// нажатие клавиши в поле ввода исходных манных
34.
procedure
TForml
.
EditlKeyPress(Sender: TObject; таг Key: Char];
35.
var
36.
f ;
real
;
// вес в фунтах
37.
kg :
real
,-
// вес в килограммах
38.
begin
39.
if
Key = Char(VK_RETU8H)
then
40.
begin
41.
f := StrToFloat(Editl
.
Text);
42.
kg := f *
0.4059
;
43.
Labe12
.
Caption := Editl
.
Text +
' ф. — это '
+ FloatToStrFfkg, ffGeneral,
4
,
2
) + 'кг.
1
;
44.
end
;
45.
end
;
46.
end
.
Можно избежать дублирования кода в программе. Для этого надо оформить инструкции, которые встречаются в программе несколько раз, как подпрограмму, и заменить инструкции, оформленные в виде подпрограммы, инструкцией вызова подпрограммы. В листинге 6.2 приведена программа пересчета веса из фунтов в килограммы, в которой ввод исходных данных, вычисления и вывод результата объединены в подпрограмму, реализованную как функция.
Листинг 6.2. Пересчет веса из фунтов в килограммы (использование процедуры)
01.
unit
Unitl;
02.
interface
03.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
04.
Forms, Dialogs, StdCtrls;
05.
type
06.
TForml =
class
(TForm)
07.
Labell: TLabel;
// пояснительный текст
08.
Editl: TEdit;
// поле ввода веса в фунтах
09.
Buttonl: TButton;
// кнопка Вычислить
10.
Label2: TLabel;
// поле вывода результата
11.
procedure
ButtonlClick(Sender: TQbject) ;
12.
procedure
EditlKeyPress (Sender: TObject;
var
Key: Char);
13.
private
14.
{ Private declarations i
15.
public
16.
( Public declarations }
17.
end
;
18.
var
19.
Forml: TForml;
20.
implementation
21.
(
$R
*.dfm}
22.
// процедура
23.
procedure
FuntToKg;
24.
var
25.
f :
real
;
// вес в фунтах
26.
kg :
real
;
// вес в килограммах
27.
begin
28.
f := StrToFloat(Forml
.
Editl
.
Text);
29.
kg := f '
0.4059
;
30.
Forml
.
Label2
.
Caption := Forml
.
Editl
.
Text +
' ф. - это '
+
31.
FloatToStrFlkg, ffGeneral,
4
,
2
) +
'кг.'
;
32.
end
;
33.
// щелчок на кнопке Вычислить
34.
procedure
TForml,ButtonlClickfSender: TObject];
35.
begin
36.
FuntToKg;
// вызов процедуры FuntToKg
37.
end
;
38.
// нажатие клавиши в поле ввода исходных данных
39.
procedure
TForml
.
EditlKeyPress(Sender: TObject;
var
Key: Char);
40.
begin
41.
if
Key = Char(VK_RETURN)
42.
then
FuntToKg;
// вызов процедуры FuntToKg
43.
end
;
44.
end
.
Преимущества использования подпрограмм очевидны. Во-первых, в программе нет дублирования кода, что сокращает трудоемкость создания программы, делает более удобным процесс отладки и внесения изменений.
Представьте, что нужно изменить пояснительный текст, выводимый программой пересчета веса из фунтов в килограммы. В программе, не использующей подпрограмму, нужно просмотреть весь текст и сделать необходимые изменения. Если программа использует подпрограмму, то изменения надо внести только в текст подпрограммы. Во-вторых, значительно повышается надежность программы. Следует обратить внимание, что подпрограммы используют не только тогда, когда нужно избежать дублирования кода. Удобно большую задачу разделить на несколько подзадач и оформить каждую задачу как подпрограмму. В этом случае значительно улучшается "читаемость" программы и, как следствие, существенно облегчается процесс отладки.
Подпрограмма — это небольшая программа, которая решает часть общей задачи. В языке Delphi есть два вида подпрограмм — процедура и функция.
У каждой подпрограммы есть имя, которое используется в программе для вызова подпрограммы (процедуры). Отличие функции от процедуры состоит в том, что с именем функции связано значение, поэтому функцию можно использовать в качестве операнда выражения, например, инструкции присваивания. Как правило, подпрограмма имеет параметры. Различают формальные и фактические параметры.
Параметры, которые указываются в объявлении функции, называются формальными.
Параметры, которые указываются в инструкции вызова процедуры, называются фактическими.
Параметры используются:
- для передачи данных в подпрограмму;
- для получения из результата подпрограммы.
В общем случае в качестве фактического параметра процедуры можно использовать выражение, тип которого должен совпадать с типом соответствующего формального параметра.