Функция выглядит почти так же, как и процедура. Отличительные особенности функции: она имеет только один результат вычисления (но может иметь несколько входных параметров); результат обозначается именем функции и передается в основную программу. Заголовок функции начинается с ключевого слова Function и заканчивается типом возвращаемого данной функцией значения.
Function имя функции (список параметров): тип результата;
раздел описаний
begin
операторы
имя функции:=результат;
end;
Примеры:
Function pl (a:real):real;
Function sum (a,b,c:integer):real;В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой — ее значение. Иначе значение функции не будет определено.
Вызывается функция по ее имени с указанием фактических параметров. Вызов функции можно делать непосредственно внутри выражения.
Примеры:
s:=pl(f)+pl(k);
a:=sum(3,6,8)-sum(a,h,k);
Задание 1. Найти площадь фигуры, которая получена вырезанием из квадрата со стороной а квадрата со стороной b (a>b).
Program z1;
Var a,b,s:real;
Function pl (a:real):real;
Begin
Pl:=a*a;
End;
Begin
Readln(a,b);
S:=pl(a)-pl(b);
Writeln(s);
End.
Задание 2. Найти значение выражения: 56 – 310 + 412.
Указание: Описать функцию для нахождения аn, как произведение n множителей, равных а.
Program z2;
Var s:longint;
Function st (a,n:integer):longint;
Var p:longint; i:integer;
Begin
P:=1;
For i:=1 to n do
P:=p*a;
St:=p;
End;
Begin
S:=st(5,6)-st(3,10)+st(4,12);
Writeln(s);
End.
1. Дано действительное число x. Вычислить х+х3+х5+х7.
2. Дано действительное число x. Вычислить х+х3+х5+х7+…+хn, где n – нечетное число.
Задание 3. Найти сумму цифр всех целых чисел от n до m (n,m – целые числа).
Указание: Написать функцию, которая находит сумму цифр одного числа.
Program z2;
Var n,m,I,s:integer;
Function sum(a:integer):integer;
Var s:integer;
Begin
S:=0;
While a<>0 do
Begin
s:=s+a mod 10;
a:=a div 10;
End;
Sum:=s;
End;
Begin
Readln(n,m); s:=0;
For i:=n to m do
S:=s+sum(i);
Writeln(s);
End.
1. Дан массив целых чисел. Найти число (или несколько) с максимальной суммой цифр.
2. Удалить из массива целых чисел числа, сумма цифр которых меньшеt 9.
Задание 4. Найти сумму всех делителей чисел от n до m (n, m – натуральные числа).
Указание: Написать функцию, которая находит сумму делителей одного числа.
program z4;
var n,m,i:integer; s1:longint;
function del(a:integer):integer;
var s,i:integer;
begin
s:=1+a;
for i:=2 to a div 2+1 do
if a mod i=0 then s:= s+i ;
del:=s;
end;
begin
readln(n,m);
s1:=0;
for i:=n to m do
s1:=s1+del(i);
writeln(s1);
end.
1. Найти все совершенные числа на промежутке от n до m (совершенное число равно сумме всех своих делителей, кроме него самого).
2. Дан массив из целых чисел. Необходимо удалить из него все совершенные числа.
ПРИМЕРЫ РЕШЕННЫХ ЗАДАЧ
Задание 1. Составьте программу, которая: запрашивает значение переменной х и шага n; выводит значение функции
в точках x, x+n, x–n.
Протокол работы программы:
x= 2.2
n= 0.6
f(2.2)= 6.113
f(2.8)= 5.426
f(1.6)= 4.159
var x,n:real;
function F(x:real):real;
begin
F:=x*x*sin(x)+x;
end;
BEGIN
write('x='); readln(x);
write('n='); readln(n);
writeln('f(',x,')=',F(x):6:3);
writeln('f(',x+n,')=',F(x+n):6:3);
writeln('f(',x-n,')=',F(x-n):6:3);
END.
Вызов функции происходит внутри оператора Writeln.
Задание 2. Определите результат выполнения программы:
Var a,b,c,p:real;
Function dlina(x1,y1,x2,y2:real):real;
begin
dlina:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
Begin
a:=dlina(0,0,1,1);
b:=dlina(1,1,3,3);
c:=dlina(3,3,0,0);
P:=a+b+c;
writeln(P);
End.
Функция находит длину отрезка между двумя точками с заданными координатами.
В основной программе функция вызывается три раза от разных координат. Вызов осуществляется в правой части оператора присваивания.
Таким образом, вычисляются длины сторон треугольника, а затем его периметр.
Задание 3. Составьте программу, вычисляющую разность двух дробей
(a,b,c,d - натуральные числа). Результат представить в виде простой несократимой дроби
Оформим вычисление НОД двух чисел в виде функции.
var a,b,c,d,e,f:integer;
function NOD(m,n:integer):integer;
begin
while m<>n do if m>n then m:=m-n
else n:=n-m;
NOD:=m;
end;
BEGIN
writeln('введите числитель и знаменатель первой дроби');
readln(a,b);
writeln('введите числитель и знаменатель второй дроби');
readln(c,d);
x:=a*d-b*c;
y:=b*d;
if x=0 then writeln('0')
else begin
e:=x div NOD(abs(x),y);
f:=y div NOD(abs(x),y);
writeln('ответ: ', e, '/', f);
end;
END.
Задание 4. Составьте программу для решения следующей задачи: Задано N треугольников координатами своих вершин на плоскости. Напечатать номер треугольника с наибольшей площадью. Вычисление сторон и площадей организовать с помощью функций.
Var
A:array[1..100,1..6] of real;
i, j, n, nom: integer;
x, y, z, max, S: real;
Function dlina(x1,y1,x2,y2:real):real;
begin
dlina:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
Function Plosh(a,b,c:real):real;
var P: real;
begin
P:=(a+b+c)/2;
plosh:=sqrt(p*(p-a)*(p-b)*(p-c));
end;
BEGIN
writeln('введите количество треугольников');
readln(n);
writeln('введите координаты вершин треугольников в порядке x1,y1,x2,y2,x3,y3');
for i:=1 to n do
for j:=1 to 6 do readln(A[i, j]);
max:=0;
for i:=1 to n do begin
x:=dlina(A[i,1], A[i,2], A[i,3], A[i,4]);
y:=dlina(A[i,3], A[i,4], A[i,5], A[i,6]);
z:=dlina(A[i,1], A[i,2], A[i,5], A[i,6]);
if (x+y>z) and (x+z>y) and (y+z>x) then begin
S:=plosh(x,y,z);
if S>max then begin
max:=S;
nom:=i;
end;
end;
end;
if max<>0 then writeln('наибольшая площадь = ', max, ' для треугольника под номером', nom)
else writeln('треугольников не существует');
END.
Матрица A хранит координаты точек треугольников.
n - количество треугольников
nom - номер треугольника с наибольшей площадью
x, y, z, S - длины сторон и площадь текущего треугольника
max - наибольшая площадь
Функция dlina находит длину отрезка между двумя точками с заданными координатами.
Функция plosh находит площадь треугольника по трем сторонам.
В основной программе функция dlina вызывается три раза от разных координат для каждого треугольника.
Затем, если треугольник существует, то вызывается функция plosh для каждого треугольника.
Находится максимальная площадь и номер треугольника.