Процедура
Процедура — это
разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух
случаях:
- когда подпрограмма не
возвращает в основную программу никаких данных. Например, вычерчивает график в
диалоговом окне;
- когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.
Объявление процедуры
В общем виде
объявление процедуры выглядит так: procedure Имя (var параметр1: тип1; ...
var параметрК: типК) ; var
// здесь объявление локальных переменных
begin
// здесь инструкции процедуры
end;
где:
- procedure —
зарезервированное слово языка Delphi, обозначающее, что далее следует объявление
процедуры;
- имя — имя процедуры,
которое используется для вызова процедуры;
- параметр K — формальный
параметр, переменная, которая используется в инструкциях процедуры. Слово var
перед именем параметра не является обязательным. Однако если оно стоит, то это
означает, что в инструкции вызова процедуры фактическим параметром обязательно
должна быть переменная.
Параметры
процедуры используются для передачи данных в процедуру, а также для возврата
данных из процедуры в вызвавшую ее программу.
В качестве
примера в листинге 6.5 приведена процедура решения квадратного уравнения
(которое в общем виде записывается так: ах2 + Ьх+ с = 0). У процедуры
шесть параметров: первые три предназначены для передачи в процедуру исходных
данных — коэффициентов уравнения; параметры xi и х2 используются для возврата
результата — корней уравнения; параметр ok служит для передачи информации о том,
что решение существует.
Листинг 6.5.
Процедура SgRoot
// решает квадратное
уравнение
procedure SqRoot(a,b,c : real;
var xl,x2 : real;
var ok : boolean);
{ a,b,c — коэффициенты уравнения x1,x2 — корни уравнения ok = True — решение есть ok = False — решения нет }
var
d : real; // дискриминант
begin
d:= Sqr(b) - 4*a*c; if d
< 0 then
ok := False // уравнение не имеет решения
else
begin
ok := True;
x1 := (-b + Sqrt(d)) / (2*a) ; x2 := (b + Sqrt(d)) / (2*a);
end;
end;
Использование процедуры
Разработанную
процедуру нужно поместить в раздел implementation, перед подпрограммой, которая
использует эту процедуру.
Инструкция
вызова процедуры в общем виде выглядит так:
Имя(СписокПараметров);
где:
П имя — имя
вызываемой процедуры;
- списокПараметров —
разделенные запятыми фактические параметры.
Фактическим
параметром, в зависимости от описания формального параметра в объявлении
процедуры, может быть переменная, выражение или константа соответствующего
типа.
Например,
инструкция вызова приведенной выше процедуры решения квадратного уравнения может
выглядеть следующим образом:
SqRoot(StrToFloat(Edit1.Text),
StrToFloat(Edit2.Text),
StrToFloat(Edit3.Text),
k1,k2,rez);
Если в описании
процедуры перед именем параметра стоит слово var, то при вызове процедуры на
месте соответствующего параметра должна стоять переменная основной программы.
Использование константы или выражения считается ошибкой, и компилятор в этом
случае выведет сообщение: Types of actual and formal var parameters must be
identical (ТИП фактического параметра должен соответствовать типу формального
параметра).
В листинге 6.6
приведена программа решения квадратного уравнения, в которой используется
процедура SqRoot. Окно программы представлено на рис. 6.2.
Рис. 6.2.
Окно программы Квадратное уравнение
Листинг
6.6. Решение квадратного уравнения (использование процедуры)
unit SqRoot_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForml =
class(TForm)
Editl:
TEdit;
Edit2:
TEdit;
Edit3:
TEdit;
Label1:
TLabe1;
Label2:
TLabe1;
Label3:
TLabe1;
Label4:
TLabe1;
Button1:
TButton;
Label5:
TLabel;
procedure
ButtonlClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R *.dfm}
// решает квадратное
уравнение
procedure SqRoot(a,b,c : real; var xl, x2 : real; var ok : boolean);
{ a,b,c — коэффициенты
уравнения x1,x2 — корни уравнения
ok = True — решение есть ok = False — решения нет }
var
d : real; // дискриминант
begin
d:= Sqr(b) - 4*a*c; if d
< 0 then
ok := False // уравнение не имеет решения
else
begin
ok := True;
xl := (-b + Sqrt(d)) / (2*a); x2 := (b + Sqrt(d)) / (2*a) ;
end;
end;
procedure TForml.ButtonlClick(Sender: TObject);
var
k1,k2: real; // корни
уравнения
rez: boolean; // True —решение есть, False —решения нет mes:
string; //
сообщение begin
SqRoot(StrToFloat(Editl.Text),
StrToFloat(Edit2.Text) ,
StrToFloat(Edit3.Text) , k1,k2,rez);
if rez
then
mes := 'Корни уравнения' +
#13 +
'x1='+FloatToStrF(kl,ffGeneral,
4,2)+#13+
'x2='+FloatToStrF(k2,ffGeneral,4,2)+#13 else
mes := 'Уравнение не имеет решения'; labels.Caption := mes;
end;
end.