Процедура — это разновидность подпрограммы. Обычно подпрограмма реализуется как процедура в двух случаях:
- когда подпрограмма не возвращает в основную программу никаких данных. Например, вычерчивает график в диалоговом окне;
- когда подпрограмма возвращает в вызвавшую ее программу больше чем одно значение. Например, подпрограмма, которая решает квадратное уравнение, должна вернуть в вызвавшую ее программу два дробных числа — корни уравнения.
Объявление процедуры
В общем виде объявление процедуры выглядит так:
1.
procedure
Имя{
var
параметр
1
: тип
1
; ...
var
параметр К :тип К);
2.
var
3.
// здесь объявление локальных переменных
4.
begin
5.
// здесь инструкции процедуры
6.
end
;
где:
- procedure — зарезервированное слово языка Delphi, обозначающее, что далее следует объявление процедуры;
- Имя — имя процедуры, которое используется для вызова процедуры;
- параметр К:— формальный параметр, переменная, которая используется в инструкциях процедуры. Слово var перед именем параметра не является обязательным. Однако если оно стоит, то это означает, что в инструкции вызова процедуры фактическим параметром обязательно должна быть переменная.
Параметры процедуры используются для передачи данных в процедуру, а также для возврата данных из процедуры в вызвавшую ее программу. В качестве примера в листинге 6.5 приведена процедура решения квадратного уравнения (которое в общем виде записывается так: ах2+ Ьх+ с—О).
У процедуры шесть параметров: первые три предназначены для передачи в процедуру исходных данных — коэффициентов уравнения; параметры x1 и х2 используются для возврата результата — корней уравнения; параметр ok служит для передачи информации о том, что решение существует.
Листинг 6.5. Процедура SqRoot
01.
// решает квадратное уравнение
02.
procedure
SqRoot(a,b,c :
real
;
var
xl,x2 :
real
;
var
ok :
boolean
);
03.
/ a,ib,c — коэффициенты уравнения
04.
xl,x2 — корни уравнения
05.
ok = True — решение есть
06.
ok = False — решения нет )
07.
var
08.
d :
real
;
// дискриминант
09.
begin
10.
d:= Sqr(b) -
4
*a*c;
11.
if
d <
0
12.
than
13.
ok := False
// уравнение не имеет решения
14.
else
15.
begin
16.
ok := True;
17.
xl := (-b + Sqrt(d)) / ;
18.
x2 := (b + Sqrt(d)! / (
2
*a>;
19.
end
;
20.
end
;
Использование процедуры
Разработанную процедуру нужно поместить в раздел implementation, перед подпрограммой, которая использует эту процедуру.
Инструкция вызова процедуры в общем виде выглядит так:
Имя(СписокПараметров);
где:
- имя — имя вызываемой процедуры;
- Список параметров — разделенные запятыми фактические параметры.
Фактическим параметром, в зависимости от описания формального параметра в объявлении процедуры, может быть переменная, выражение или константа соответствующего типа.
Например, инструкция вызова приведенной выше процедуры решения квадратного уравнения может выглядеть следующим образом:
SqRoot(StrToFloat[Editl
.
Text), StrToFloat(Edit2
.
Text),
StrToFloat(Edit3
.
Text), kl,k2,rez);
Если в описании процедуры перед именем параметра стоит слово var, то при вызове процедуры на месте соответствующего параметра должна стоять переменная основной программы. Использование константы или выражения считается ошибкой, и компилятор в этом случае выведет сообщение: Types of actual and formal var parameters must be identical (ТИП фактического параметра должен соответствовать типу формального параметра).
В листинге 6.6 приведена программа решения квадратного уравнения, в которой используется процедура SqRoot. Окно программы представлено на рис. 6.2.
Листинг 6.6. Решение квадратного уравнения (использование процедуры)
02.
unit
SqRoot_;
03.
interface
04.
uses
05.
Windows, Messages, SysUtils, Variants, Classes, Graphics/ Controls,
06.
Forms, Dialogs, StdCtrls;
07.
type
08.
TForml =
class
(TForm)
09.
Editl; TEdit;
10.
Edit2: TEdit;
11.
Edit3: TEdit;
12.
Labell: TLabel;
13.
Label2: TLabel;
14.
Label3 : TLabel;
15.
Label4r TLabel;
16.
Buttonl ; TButton;
17.
Label5 : TLabel;
18.
procedure
ButtonlClicklSender: TObject);
19.
private
20.
{ Private declarations }
21.
public
22.
I Public declarations }
23.
end
;
24.
Var
25.
Forml: TForml;
26.
27.
implementation
28.
(SR *.dfm}
29.
// решает квадратное
30.
procedure
3qRoot(a,b,c :
real
;
var
xl, x2 :
real
; vai ok :
boolean
)
31.
{ a,b,c — коэффициенты уравнения
32.
xl,x2 - корни уравнения
33.
ok=
true
- решение есть
34.
35.
ok = False — решения нет /
36.
var
37.
d :
real
;
// дискриминант
38.
begin
39.
d:= Sqr(b) -
4
*a*c;
40.
if
d <
0
41.
then
42.
ok := False
// уравнение не имеет решения
43.
else
44.
begin
45.
ok ;= True;
46.
xl := (-b + Sqrt(d)) / <
2
*a) ;
47.
x2 := (h + Sqrt(d)] / (
2
*a);
48.
end
;
49.
end
;
50.
51.
procedure
TForml
.
ButtonlClick(Sender: TObject)i
52.
kl,k2:
real
;
// корни уравнения
53.
rez:
boolean
;
// True —решение есть, False —решения нет
54.
rues:
string
;
// сообщение
55.
begin
56.
SqRoot(StrToFloat(Editl
.
Text), StrToFloat(Edit2
.
Text),
57.
StrToFloat(Edit3
.
Text), kl,k2,rez);
58.
if
rez
then
59.
mes ;= 'Корни уравнения
1
+ #
13
+
60.
'xl='
+FloatToStrF(kl,ffGeneral,
4
,
2
)-t-#
13
+
61.
'x2='
+FloatTo3trF(k2,ffGeneral,
4
,
2
)-«-tl3
62.
else
63.
mes:=
'Уравнение не имеет решения'
;
64.
labels
.
Caption := mes;
65.
end
;
66.
end
.