Часто, работая над программой, программист замечает, что некоторая последовательность инструкций встречается в разных частях программы несколько раз. Например, в листинге 6.1 приведена программа пересчета весаиз фунтов в килограммы. Обратите внимание, что инструкции, обеспечивающие ввод исходных данных из полей редактирования, расчет и вывод результата (в листинге они выделены фоном), есть как в процедуре обработки события на кнопке Вычислить, так и в процедуре обработки события onkeypress В поле Edit1.
Листинг: Пересчет веса из фунтов в килограммы.
01.unit Dnitl;02.interface03.uses04.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,05.Forms, Dialogs, StdCtrls;06.type07.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.private15.( Private declarations )16.public17.{ Public declarations }18.end;19.vac20.Forml: TForml;21.iinpl emen ta t i on22.{SR *.dfm(23.// щелчок на кнопке Вычислить24.procedure TForml.ButtonlClickfSender: TObject);25.vat26.f : real; // вес в фунтах27.kg : real; // вес в килограммах28.begin29.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.var36.f ; real; // вес в фунтах37.kg : real,- // вес в килограммах38.begin39.if Key = Char(VK_RETU8H) then40.begin41.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.interface03.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,04.Forms, Dialogs, StdCtrls;05.type06.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.private14.{ Private declarations i15.public16.( Public declarations }17.end;18.var19.Forml: TForml;20.implementation21.($R *.dfm}22.// процедура23.procedure FuntToKg;24.var25.f : real; // вес в фунтах26.kg : real; // вес в килограммах27.begin28.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.begin36.FuntToKg; // вызов процедуры FuntToKg37.end;38.// нажатие клавиши в поле ввода исходных данных39.procedure TForml.EditlKeyPress(Sender: TObject; var Key: Char);40.begin41.if Key = Char(VK_RETURN)42.then FuntToKg; // вызов процедуры FuntToKg43.end;44.end.
Преимущества использования подпрограмм очевидны. Во-первых, в программе нет дублирования кода, что сокращает трудоемкость создания программы, делает более удобным процесс отладки и внесения изменений.
Представьте, что нужно изменить пояснительный текст, выводимый программой пересчета веса из фунтов в килограммы. В программе, не использующей подпрограмму, нужно просмотреть весь текст и сделать необходимые изменения. Если программа использует подпрограмму, то изменения надо внести только в текст подпрограммы. Во-вторых, значительно повышается надежность программы. Следует обратить внимание, что подпрограммы используют не только тогда, когда нужно избежать дублирования кода. Удобно большую задачу разделить на несколько подзадач и оформить каждую задачу как подпрограмму. В этом случае значительно улучшается "читаемость" программы и, как следствие, существенно облегчается процесс отладки.
Подпрограмма — это небольшая программа, которая решает часть общей задачи. В языке Delphi есть два вида подпрограмм — процедура и функция.
У каждой подпрограммы есть имя, которое используется в программе для вызова подпрограммы (процедуры). Отличие функции от процедуры состоит в том, что с именем функции связано значение, поэтому функцию можно использовать в качестве операнда выражения, например, инструкции присваивания. Как правило, подпрограмма имеет параметры. Различают формальные и фактические параметры.
Параметры, которые указываются в объявлении функции, называются формальными.
Параметры, которые указываются в инструкции вызова процедуры, называются фактическими.
Параметры используются:
- для передачи данных в подпрограмму;
- для получения из результата подпрограммы.
В общем случае в качестве фактического параметра процедуры можно использовать выражение, тип которого должен совпадать с типом соответствующего формального параметра.
