Процедура

Процедура — это разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух случаях:

  • когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
  • когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.

Объявление процедуры

В общем виде объявление процедуры выглядит так: 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.