Под функцией понимается поименованная совокупность операторов, обеспечивающая вычисление единственного результата. Функция отличается от процедуры тем, что у нее нет выходных параметров. Входные параметры функции называются аргументами.
Заголовок функции записывается в соответствии со следующим синтаксисом:
Function <имя функции> [(<список формальных параметров>)]:
<тип результата>;
Конструкция <имя функции> определяет уникальный идентификатор функции, используемый для ее вызова.
Конструкция <список формальных параметров> задает переменные, которые являются входными параметрами.
Конструкция <тип результата> определяет тип результатного значения функции.
Функция может включать любое количество выполняемых операторов. Однако в состав выполняемых операторов обязательно должен включаться оператор, пересылающий результатное значение в точку вызова функции. Данный оператор записывается в соответствии со следующим форматом:
<имя функции>:= <результатное значение>;
|
|
Вызов функции обеспечивается включением имени функции в состав выражения.
Пример.
Программный код обеспечивает вычисление индекса массы тела и определение недостающего или избыточного веса.
Программный код включает две функции.
Функция "IndexMas" определяет индекс массы тела, который вычисляется как вес в килограммах, деленный на квадрат роста в метрах.
Функция "Wmaxmin" определяет максимально допустимый либо минимально допустимый вес, соответствующий заданному росту.
Program PrjFuncMas;
{$APPTYPE CONSOLE}
Uses
SysUtils;
Var
Height,Weight,Wmax,Wmin, Wdif,IndexM:Real;
FL: Boolean;
// Функция определения индекса массы тела
Function IndexMas(Height:Real; Weight:Real): Real;
Begin
IndexMas:= Weight / (Height * Height);
End; {Function}
// Функция определения максимально
// (минимально) допустимого веса
Function Wmaxmin(Height: Real; FL: Boolean): Real;
Begin
If FL = True Then
Wmaxmin:= 24.9 * (Height * Height)
Else
Wmaxmin:= 18.5 * (Height * Height);
End; {Function}
Begin
Writeln ('Ykazite rost(metr)');
Readln (Height);
Writeln ('Ykazite ves');
Readln (Weight);
IndexM:= IndexMas(Height, Weight);
Writeln ('Index massi =', IndexM:6:2);
If IndexM < 18.5 Then
Begin
FL:= False;
Wmin:= Wmaxmin(Height, FL);
Wdif:= Wmin - Weight;
Writeln ('Nedostatok vesa=', Wdif:6:2)
End;
If (IndexM > 18.5) And (IndexM < 24.9) Then
Writeln ('Normalnii ves');
If IndexM > 24.9 Then
Begin
FL:= True;
Wmax:= Wmaxmin(Height, FL);
Wdif:= Weight - Wmax;
Writeln ('Izbitochnii ves =', Wdif:6:2);
End;
Readln;
End.
При использовании функций, для обработки экономической информации, в качестве входных параметров могут использоваться массивы записей.
Пример.
Имеется документ, который содержит информацию об остатках предметов. Документ содержит следующие реквизиты:
Во-первых, "дата". Реквизит представлен в виде символьной строки длиной 6 символов (два символа определяют месяц, четыре символа определяют год);
|
|
Во-вторых, "код цеха". Реквизит представлен в виде символьной строки длиной 10 символов;
В-третьих, "название предмета". Реквизит представлен в виде символьной строки длиной 20 символов;
В-четвертых, "цена предмета". Реквизит представлен в виде числа, имеющего дробную часть;
В-пятых, "количество на конец периода". Реквизит представлен в виде числа, не имеющего дробной части;
В-шестых, "сумма на конец периода". Реквизит представлен в виде числа, имеющего дробную часть.
Программный код, включает функцию, которая обеспечивает определение статистической характеристики дисперсия для реквизита "Сумма на конец периода". Для расчета дисперсии используется следующая зависимость:
S (X – )
D = ——————————
N
, где
X - текущее значение реквизита “сумма на конец периода”;
- среднее арифметическое значение реквизита “сумма на конец периода”;
N - количество строк документа.
Program PrjFuncDisp;
{$APPTYPE CONSOLE}
Uses
SysUtils;
Type
TRest = Record
Date:String[6];
CodC:String[10];
Name:String[20];
Price:Real;
Quant:Integer;
Sum:Real;
End;
TARest=Array [1..40] Of TRest;
Var
Rest:TARest;
I,N:Integer;
Disp:Real;
Function StatDisp(Rest:TArest; N:Integer): Real;
Var
I:Integer;
S, D, SR: Real;
Begin
S:=0;
For I:= 1 To N Do
S:= S + Rest[I].Sum;
SR:= S / N;
D:= 0;
For I:= 1 To N Do
D:= D + (Rest[I].Sum - SR)*(Rest[I].Sum - SR);
StatDisp:= D / N;
End; {Function}
Begin
Writeln('Vvedite chislo zapisei');
Readln(N);
For I:= 1 To N Do
Begin
Writeln ('Data');
Readln(Rest[I].Date);
Writeln ('Kod cexa');
Readln(Rest[I].CodC);
Writeln ('Nazvanie predmeta');
Readln(Rest[I].Name);
Writeln ('Cena predmeta');
Readln(Rest[I].Price);
Writeln ('Kolichestvo');
Readln(Rest[I].Quant);
Writeln ('Symma');
Readln(Rest[I].Sum);
End;
Disp:= StatDisp(Rest, N);
Writeln('Dispersia =',Disp:7:2);
Readln;
End.