Глава 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 есть
два вида подпрограмм — процедура и функция.
У каждой
подпрограммы есть имя, которое используется в программе для вызова подпрограммы
(процедуры).
Отличие функции
от процедуры состоит в том, что с именем функции связано значение, поэтому
функцию можно использовать в качестве операнда выражения, например, инструкции
присваивания.
Как правило,
подпрограмма имеет параметры. Различают формальные и фактические
параметры.
Параметры,
которые указываются в объявлении функции, называются формальными. Параметры,
которые указываются в инструкции вызова процедуры, называются фактическими.
Параметры
используются:
- для передачи данных в
подпрограмму;
- для получения из
результата подпрограммы.
В общем случае
в качестве фактического параметра процедуры можно использовать выражение, тип
которого должен совпадать с типом соответствующего формального
параметра.