Читайте также: |
|
Отличие функции от процедуры состоит в том, что
- в заголовке функции после списка параметров необходимо указать тип функции (то есть тип вычисляемого ею результата) - имя ранее объявленного или стандартного типа,
- в вызывающей программе обращение к функции можно записывать в правой части оператора присваивания и в выражениях, если тип результата простой (но присваивать значение имени функции в вызывающей программе запрещено),
- в объявлении функции её имя (а не обращение к ней, делающее подпрограмму рекурсивной) не должно встречаться в правой части операторов присваивания или в выражениях,
- в объявлении функции должен быть хотя бы один оператор, присваивающий её имени, или объявленной по умолчанию локальной (известной только внутри функции) переменной Result того же типа, что и тип функции, результат вычислений,
- в отличие от имени функции, переменную Result можно использовать в правых частях операторов присваивания и в выражениях как дополнительную переменную, представляющую результат вычислений.
Обращение к функции можно так же, как и обращение к процедуре, записывать как отдельный оператор в режиме расширенного синтаксиса, используемом в Delphi по умолчанию. Обращение к функции отдельным оператором может иметь смысл, когда интересующий нас результат представлен параметрами, а не именем функции. Отключить режим расширенного синтаксиса можно директивой {$X-} или {$EXTENDEDSYNTAX OFF}, но тогда не будет объявлена по умолчанию локальная переменная Result, и при попытке её использования компилятор сообщит об ошибке.
Пример 1. Составить и использовать функцию, возвращающую максимальный из первых N элементов массива X(N), N≤100.
type
tMas=array[1..100] of Real;
.....
function MaxMas(N:Integer; const X:tMas):Real;
var
i:Integer;
begin
Result:=X[i];
for i:=2 to N do
if X[i]>Result then
Result:=X[i];
end;
.....
var
Y:tMas;
begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
.....
//Вызов функции в операторе вывода
WriteLn('Максимальный из сорока элементов массива Y = '
,MaxMas(40, Y));
.....
end.
Если отключить режим расширенного синтаксиса, то в объявлении функции пришлось бы отказаться от использования переменной Result и объявить дополнительную переменную для поиска максимального значения в массиве. В результате получили бы следующее объявление функции.
function MaxMas(N:Integer; const X:tMas):Real;
var
i:Integer;
R:Real;//Дополнительная переменная
begin
R:=X[1];
for i:=2 to N do
if X[i]>R then
R:=X[i];
//Чтобы функция возвратила вычисленное значение,
//оно должно быть присвоено её имени
MaxMas:=R;
end;
Использование функций позволяет не только сделать текст программы более удобным для понимания её алгоритма, но и уменьшить его при необходимости повторных вычислений в разных частях программы.
Пример 2. Составить программу поиска приближенных значений корней уравнения
и их уточнённых значений методом половинного деления.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
//Функция, вычисляющая выражение, входящее в уравнение
function F_PX(const P,X:Real):Real;
var
PX:Real;
begin
PX:=P*X;
F_PX:=X*Cos(3*PX)/P/12-Sin(3*PX)/Sqr(P)/36
-3*X*Cos(PX)/P/4 +3*Sin(PX)/Sqr(P)/4;
end;
//функция, уточняющая значение корня
function KorenF_PX(P,X0,X1,Eps:Real):Real;
var
F0,F,F1,X:Real;
begin
F0:=F_PX(P,X0);
repeat
X:=(X0+X1)/2;
F:=F_PX(P,X);
if F0*F>0 then
X0:=X
else
X1:=X;
until Abs(X1-X0)<Eps;
KorenF_PX:=X;
end;
var
P,X, A, B, dX, F0, F1,Eps,Koren:Real;
begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
Write('Введите границы интервала и шаг аргумента:');
ReadLn(A,B,dX);
Write('Введите параметр выражения P: ');ReadLn(P);
Write('Введите требуемую точность корня: ');ReadLn(Eps);
F0:=F_PX(P,A);
dX:=0.01;
X:=A+dX;
while X<B+0.005 do
begin
F1:=F_PX(P,X);
if F0*F1<0 then
begin
//Найдены приближенные значения корня
//X-dX - приближение, меньшее корня
//X - приближение, большее корня
WriteLn(X-dX,' = левое приближение корня');
//Поиск приближения с точностью Eps
Koren:= KorenF_PX(P,X-dX,X,Eps);
//Вывод результатов
WriteLn(Koren,' = корень с точностью ',Eps);
WriteLn(F_PX(P,Koren),' = значение функции в корне');
WriteLn;
end;
F0:=F1;
X:=X+dX;
end;
ReadLn;
end.
Дата добавления: 2015-07-26; просмотров: 83 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задания 5.1 для самостоятельной проработки | | | Пример 5.2 выполнения задания |