Скачиваний:
61
Добавлен:
15.06.2014
Размер:
1.18 Mб
Скачать

Var I:Integer;

Begin

Result:=1; // Вначале полагаем произведение равным единицеFor i:=1 to n do // Организуем цикл умноженийResult:=Result*i; End;

Function C(n,m:Integer):Extended; // Расчет числа сочетаний Begin C:=F(n)/F(m)/F(n-m); End;

Function Sum(n:Integer;x:Extended):Extended; // Расчет суммы

Var I:Integer;

Begin

Result:=0; // Сумму полагаем равной нулю For i:=1 to n do // Организуем цикл сложений Result:=Result+C(2*i,x)*Cos(i*x); End;

Begin // Тело обработчика нажатия клавиши «Выполнить»

N:=strtoint(Edit1.Text); // Определяем начальные значения переменных a:=strtofloat(Edit2.Text); b:=strtofloat(Edit3.Text); h:=(b-a)/10; // Расчет шага по X

x:=a; // X полагаем равным начальному значению

While x<b do Begin // Организуем цикл по XY:=Sqr(sin(Sum(n,x)/Sum(n+1,2*x))); // РассчитываемY // Выводим результаты

Memo1.Lines.Add('x='+Floattostr(x)+' y='+Floattostr(y)); x:=x+h; // Наращиваем X

end; end;

A =

Рассмотрим еще один пример уже с использованием процедур. Необходимо написать программу по возведению квадратной матрицы в любую степень, т.е. B=Am, где A - заданная квадратная матрица размерностиn:

a11 ... a1n

Для решения этой задачи нужно написать подпрограмму

an1 ... ann

умножения двух матриц, т.е. C=AB или ciJ- = ^aik bkj-

k:=1

Размерность матрицы n и степень m будем задавать в компонентахTEdit. Начальную матрицу Абудем определять случайным образом и помещать в компонентStringGrid1, а результат возведения в степень разместим в компонентеStringGrid2. Обработчик нажатия клавиши «Вычислить» будет иметь следующий вид:

Procedure TForm1.Button1Click(Sender: TObject); Const nmax=20; //Объявление констант, типов и переменных Type Ta=Array[1..nmax,1..nmax] of extended; Var i,j:integer;

A,B,C:Ta; // Процедура перемножения матриц

Procedure UM(n:integer; var A,B,C:Ta);

Var i,j,k:Integer; s:Extended; // Внутренние переменные процедуры Begin For i:=1 to n do For j:=1 to n do Begin S:=0;

For k:=1 to n do s:=s+A[i,k]*B[k,j]; C[i,j]:=s; End; End; Begin

n:=StrtoInt(Edit1.Text); // Определение размерности матриц

m=StrtoInt(Edit2.Text); // Определение степени возведения матрицы

With StringGrid1 do Begin // Подготовка визуальных компонентов RowCount:=n; ColCount:=n; FixedRows:=0; FixedCols:=0; End;

With StringGrid2 do Begin RowCount:=n; ColCount:=n; FixedRows:=0; FixedCols:=0; End;

Randomize; //Инициализация датчика случайных чисел

For i:=1 to n do // Заполнение матрицы А случайными числами

For j:=1 to n do Begin A[i,j]:=random; B[i,j]:=A[i,j];

StringGrid1.Cells[j-1,i-1]:=FloattoStrF(A[i,j], ffGeneral, 10,5); End;

For k:=1 to m-1 do Begin // Организация цикла возведения в степень А

UM(n,A,B,C);

For i:=1 to n do // Запоминание текущего результата умножения матриц

For j:=1 to n do B[i,j]:=C[i,j];

End;

For i:=1 to n do // Вывод результатов вычислений

For j:=1 to n do

StringGrid2.Cells[j-1,i-1]:=FloattoStrF(C[i,j], ffGeneral, 10,5);

End;

Процедуры и функции, которые прямо или косвенно вызывают сами себя, называют рекурсивными.

Приведем пример такой функции для расчета факториала: Function F(n:Integer):Extended; Begin

If n>1 then F:=F(n-1)*n else F:=1;

End;

Расчет большинства полиномов осуществляется по рекуррентным формулам, когда каждый последующий полином рассчитывается через предыдущие полиномы. Например, B0=1, B1=X, Bk=2-X-Bk-1-Bk-2. Для расчета таких полиномов можно тоже использовать рекурсивную функцию вида:Function B(n:Integer; x:Extended):Extended; Begin

If n>1 then B:=2*X*B(n-1,x)-B(n-2,x) else

If n=1 then B:=x else B:=1;

End;

Как видно из этих примеров, рекурсивные функции получаются очень компактными, но они требуют большой аккуратности при их написании - небольшая ошибка в программе может приводить к переполнению стека из-за бесконечного вызова функции самой себя.