Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.pdf
Скачиваний:
37
Добавлен:
07.06.2015
Размер:
672.16 Кб
Скачать

4.2. Функции

Функция предназначена для того, чтобы вычислить только одно значение.

Отличия функций от процедур:

1)результатом функции является только одно значение, тогда как процедура присваивает новые значения нескольким параметрам.

2)в синтаксисе заголовка и тела функции.

Заголовок функции:

Function Имя(Список формальных параметров) :Тип.

эта часть заголовка может отсутствовать.

Пример заголовка Function S(x,y:Integer):Longint.

В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой – ее значение. Иначе значение не будет определено.

Пример. Составить программу, подсчитывающую число сочетаний без повторений из N элементов по k элементов.

Число сочетаний без повторений считают по формуле:

Сnk =

n!

 

k!(n k)!

 

n, k – переменные для хранения введенных чисел, С – переменная для хранения результата.

Для вычисления n! , (nk)! , k! применим функцию факториала.

Function Factorial(n:integer):longint; { заголовок функции } var i : integer; { описательная часть }

rez : longint;

 

begin

{ тело функции }

rez:=1;

 

for i:=1 to n do rez:=rez*i;

Factorial:=rez;

{ присваивание значения имени функции }

end;

 

39

В тексте программы описание функции всегда следует за описанием переменных и до описания основной части, как и описание процедур. После того, как функция описана, ее можно использовать в программе.

Составим программу:

Program PR2; var n,k : integer;

a1,a2,a3,c : longint;

Function Factorial(n : integer) : longint; var i : integer;

rez : longint; begin

rez:=1;

for i:=1 to n do rez:=rez*i; Factorial:=rez;

end; begin

writeln(‘Введите n и k’); { ввод значений } readln(n,k);

a1:=Factorial(n); { вычисление n! } a2:=Factorial(k); { вычисление k! } a3:=Factorial(n-k); { вычисление (nk)!} c:=a1*div(a2*a3); { результат } writeln(‘Результат’,c); { вывод значения Ckn } readln;

end.

Фактическими параметрами могут быть не только константы или переменные, но и выражения.

Пусть n=5, k=3. Когда в программе встретится оператор a1:=Factorial(n), выполняются следующие действия:

1) Выделяется память для переменных, описанных в функции

Factorial.

40

2)Формальным параметрам присваиваются значения фактических параметров n:=n (n=5).

3)Выполняется программа функции, то есть будет найден 5!

4)Полученное значение факториала передается в место обращения функции, т.е. присваивается значение переменной a1 и осуществляется переход к следующим операторам.

На рис. 3 показано распределение памяти между переменными, используемыми в функции и в основной программе. Прямоугольники соответствуют ячейкам памяти, стрелками показаны направления пересылок значений между ячейками. Для переменных функции выделена автономная часть памяти, не принадлежащая области памяти основной программы, например, переменной n (в функции) отведена отдельная ячейка памяти, отличная от переменной n из основной части программы.

При выполнении оператора a1:=Factorial(n) в ячейку n функции заносится n=5. Вычисляется значение переменной rez, его присваиваем имени функции и передаем (по последнему End) в точку вызова.

При этом переменная a1 получает значение, равное n!, то есть 120, а программа переходит к следующему оператору.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3

 

Аналогично выполняются операторы a2:=Factorial(k)

и

a3:=Factorial(n-k).

 

41

Пример.

Найти корень уравнения F(x) = 0 с точностью ε = 10-6 .

Будем решать данное уравнение итерационным методом Ньютона с использованием рекуррентного соотношения:

 

 

 

 

 

xi

= xi1

F(xi1 )

, xo = 0 .

 

 

 

 

 

 

 

 

 

 

 

 

 

F (xi1 )

 

 

 

 

 

Условием

окончания итерационного процесса является

 

xi xi1

 

< ε

 

 

или

 

F(xi1 )

 

< ε . Пусть

F (x) = e−0.3 x

0.7 x = 0.

 

 

 

 

 

F(x

)'

 

 

 

 

 

 

 

 

 

 

 

 

i1

 

 

 

 

 

 

 

 

 

 

 

Ниже приведена программа, реализующая численное решение нелинейного уравнения, с использованием функций F и F1.

program Mn1; {решение нелинейного уравнения методом Ньютона} const eps=1e-6;

var x,x0 : real;

function f(x : real) : real; begin

f:=exp(-0.3*x)-0.7*x

end;

function f1(x : real):real; begin

f1:=-0.3*exp(-0.3*x)-0.7

end; begin

writeln;

writeln(‘решение нелинейного уравнения f(x) = 0’); writeln;

write(’x0=’);

read(x0); { ввод начальной точки } writeln;

x:=x0; repeat

x:=x-f(x)/f1(x);

42