Глава
6. Процедуры и функции
Часто, работая над
программой, программист замечает, что некоторая последовательность инструкций
встречается в разных частях программы несколько раз. Например, в листинге 6.1
приведена программа пересчета веса из фунтов в килограммы. Обратите внимание,
что инструкции, обеспечивающие ввод исходных данных из полей редактирования,
расчет и вывод результата (в листинге они выделены фоном), есть как в процедуре
обработки события на кнопке Вычислить, так и в процедуре обработки события
OnKeyPress В поле Editl.
Листинг 6.1.
Пересчет веса из фунтов в килограммы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1
= class(TForm)
Label1:
TLabel; // пояснительный текст
Edit1:
TEdit; // поле ввода веса в фунтах
Button1:
TButton; // кнопка Вычислить
Label2:
TLabel; // поле вывода результата
procedure
ButtonlClick(Sender: TObject);
procedure EditlKeyPress(Sender: TObject;
var
Key: Char); private
{ Private declarations } public
{
Public declarations }
end;
var
Form1:
TForm1 ;
implementation
{$R
*.dfm}
//
щелчок на кнопке Вычислить
procedure
TForml.Button1Click(Sender: TObject);
var
f
: real; // вес в фунтах
kg : real; // вес в килограммах
begin
f
:= StrToFloat(Edit1.Text);
kg
:= f; * 0.4059;
Label2.Caption
:= Edit1.Text + ' ф. — это ' +
FloatToStrF(kg,
ffGeneral, 4, 2} + 'кг.'; end;
//
нажатие клавиши в поле ввода исходных данных
procedure
TForml.Edit1KeyPress(Sender: TObject; var Key: Char);
var
f : real; // вес в фунтах kg : real; // вес в килограммах
begin
if Key = Char(VK_RETURN) then
begin
f:
= . StrToFloat(Editl.Text) ;
kg
:= f * 0.4059;
Label2.Caption
:= Editl.Text + ' ф. - это ' +
FloatToStrF(kg, ffGeneral, 4, 2) + 'кг.'1.;
end;
end;
end.
Можно избежать дублирования
кода в программе. Для этого надо оформить инструкции, которые встречаются в
программе несколько раз, как подпрограмму,
и заменить инструкции, оформленные в виде подпрограммы, инструкцией вызова подпрограммы.
В листинге 6.2 приведена
программа пересчета веса из фунтов в килограммы, в которой ввод исходных данных,
вычисления и вывод результата объединены в подпрограмму, реализованную как функция.
Листинг 6.2. Пересчет
веса из фунтов в килограммы (использование процедуры)
unit
Onit1; interface
uses
Windows, Messages, SysUtils, Variants,
Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1=
class(TForm)
Label1:
TLabel; // пояснительный текст
Edit1:
TEdit; // поле ввода веса в фунтах
Button1:
TButton; // кнопка Вычислить
Label2:
TLabel; // поле вывела результата
procedure
Button1Click(Sender: TObject);
procedure EditlKeyPress(Sender: TObject;
var
Key: Char); private
{ Private declarations } public
{ Public declarations } end;
var
Form1:
TForm1;
implementation
{$R
*.dfm}
// процедура программиста
procedure
FuntToKg;
var
f
: real; // вес в фунтах
kg : real; // вес в килограммах
begin
f
:= StrToFloat(Form1.Edit1.Text);
kg
:= f * 0.4059;
Forml.Label2.Caption
:= Forml.Edit1.Text + ' ф. — это ' +
FloatToStrF(kg, ffGeneral, 4, 2) + 'кг.';
end;
//
щелчок на кнопке Вычислить
procedure
TForml.ButtonlClick(Sender: TObject);
begin
FuntToKg;
// вызов процедуры FuntToKg end;
//
нажатие клавиши в поле ввода исходных данных
procedure TForm1.EditlKeyPress(Sender: TObject;
var
Key: Char);
begin
if
Key = Char(VK_RETURN)
then
FuntToKg; // вызов процедуры FuntToKg end;
end.
Преимущества использования
подпрограмм очевидны. Во-первых, в программе нет дублирования кода, что сокращает
трудоемкость создания программы, делает более удобным процесс отладки и внесения
изменений. Представьте, что нужно изменить пояснительный текст, выводимый программой
пересчета веса из фунтов в килограммы. В программе, не использующей подпрограмму,
нужно просмотреть весь текст и сделать необходимые изменения. Если программа
использует подпрограмму, то изменения надо внести только в текст подпрограммы.
Во-вторых, значительно повышается надежность программы. Следует обратить внимание,
что подпрограммы используют не только тогда, когда нужно избежать дублирования
кода. Удобно большую задачу разделить на несколько подзадач и оформить каждую
задачу как подпрограмму. В этом случае значительно улучшается "читаемость"
программы и, как следствие, существенно облегчается процесс отладки.
Подпрограмма — это
небольшая программа, которая решает часть общей задачи. В языке Delphi есть
два вида подпрограмм — процедура и функция.
У каждой подпрограммы
есть имя, которое используется в программе для вызова подпрограммы (процедуры).
Отличие функции от
процедуры состоит в том, что с именем функции связано значение, поэтому функцию
можно использовать в качестве операнда выражения, например, инструкции присваивания.
Как правило, подпрограмма
имеет параметры. Различают формальные и фактические параметры.
Параметры, которые
указываются в объявлении функции, называются формальными. Параметры, которые
указываются в инструкции вызова процедуры, называются фактическими.
Параметры используются:
В общем случае в качестве
фактического параметра процедуры можно использовать выражение, тип которого
должен совпадать с типом соответствующего формального параметра.