Lab_rab_Pascal_OZO / Lab_08_Функции
.docЛабораторная работа № 8.
Функции.
Цель: изучение и приобретение навыков использования функций в программах и получение дальнейших навыков по отладке и тестированию программ.
Оборудование и программное обеспечение: компьютер, Turbo Pascal 7.0.
Место проведения:
Время:
Теоретические сведения:
Функция аналогична процедуре, но имеются два отличия: во-первых, функция передает в точку вызова скалярное (одиночное) значение, во-вторых, имя функции может входить в выражение как операнд.
Отличие процедур от функций состоит в том, что процедуры служат для задания совокупности действий, направленных на изменение программной обстановки, а функции, являясь частным случаем процедур, отличаются от них тем, что обязательно возвращают в точку вызова основной программы результат, причем единственный. Структура функции почти повторяет структуру программы, и выглядит следующим образом:
Function <имя функции>[(формальные параметры)]:<тип результата>;
Uses <имена модулей>;
Label <имена меток>;
Const <имена констант>;
Type <имена типов пользователя>;
Var <имена локальных переменных>;
<раздел объявления подпрограмм>;
Begin
<операторы>;
End;
Например: function Chr (X: Byte): Char;
function Odd (X: Longint): Boolean;
function GetX: Integer;
function KeyPressed: Boolean;
Функция предполагает обязательную передачу информации из подпрограммы в программу через имя функции. Поэтому раздел операторов обязательно должен содержать хотя бы один оператор, в котором имени функции присваивается значение результата. В противном случае функция не возвратит результат (вернее возвратит произвольный результат).
Вызов функции производится: 1. в различных выражениях;
2. только справа от знака присваивания;
3. как элемент вывода в операторе вывода информации.
Оформлять некоторую программу как функцию целесообразно только в том случае, если ожидается некоторый результат её работы. Если же последовательность команд ориентирована только на выполнение некоторой последовательности действий (вывод на экран, рисование и т.д.), лучше оформить её как процедуру.
Пример 1: Вычислить наименьшее общее кратное двух целых чисел, используя функцию нахождения наибольшего общего делителя с помощью алгоритма Евклида.
Program Count_NOK;
var var1,var2:integer;
(***********************************************************************************
Функция возвращает наибольший общий делитель двух заданных целых чисел, используя алгоритм Евклида. Если одно или оба числа равны 0, возвращает 0
************************************************************************************)
function NOD_Evklid (a, b : integer) : integer;
var r:integer;
begin
{если хотя бы одно из чисел равно 0, НОД также равен 0}
if ((a=0)or(b=0)) then begin
NOD_Evklid:=0;
exit;
end;
{оба числа ненулевые}
r:=a-b*(a div b);
while r<>0 do begin
a:=b;
b:=r;
r:=a-b*(a div b);
end;
NOD_Evklid:=b;
end;
(***********************************************************************************
Функция возвращает наименьшее общее кратное двух заданных целых чисел, используя функцию NOD_Evklid
************************************************************************************)
function NOK_Evklid (a, b : integer) : integer;
begin
NOK_Evklid:=(a*b) div NOD_Evklid(a,b);
end;
begin
writeln;
writeln('Программа находит НОК двух целых чисел, используя');
writeln('алгоритм Евклида для нахождения НОД.');
writeln('Введите два целых числа');
readln(var1, var2);
writeln('НОД чисел ',var1,' и ',var2,' = ',NOD_Evklid(var1,var2));
writeln('НОК чисел ',var1,' и ',var2,' = ',NOK_Evklid(var1,var2));
end.
Рекурсия – это описание функций или процессов через самих себя. Само слово «рекурсия» означает «возвращение».
Программа, обращающаяся сама к себе как подпрограмме (непосредственно или через цепочку подпрограмм), называется рекурсивной.
Пример 2: Вычислить факториал числа n.
Определение факториала, в котором n! выражается чрез предыдущий (n-1)!, т.е. используется рекуррентная формула:
0! = 1
для любого n>0 n! = n*(n-1)!
Наличие рекуррентного соотношения позволяет использовать рекурсию. Например, программа, использующая рекурсивную функцию для вычисления факториала n! имеет следующий вид:
program Factorial;
var n: integer;
function Fact(i: integer): longint;
begin
if i=0 then Fact:=1
else Fact:=i*Fact(i-1);
end;
begin
write('Введите число n: '); readln(n);
writeln('Факториал n! = ', Fact(n));
end.
Порядок выполнения работы:
Задание: Создать и отладить программу для решения следующую задачу (см. Приложение), используя
-
функцию;
-
рекурсивную функцию.
Содержание отчета по каждому заданию:
-
исходные данные (условие задачи);
-
алгоритм (блок-схема) решения задачи;
-
текст программы (или основной фрагмент программы);
-
результаты выполнения программы
-
тестовый вариант в форме с фиксированной точкой.
Контрольные вопросы:
-
Что называется функцией?
-
Назовите основные отличия в описании процедур и функций.
-
Каким образом производится вызов функции в программе?
-
Что лучше процедура или функция?
-
Что называется рекурсией?
Приложение: (ваш номер по журналу соответствует номеру варианта)
Задание 1.
1. Определить значение выражения m(a,b,c)+m(b,c,d)+m(c,d,a) для вещественных a,b,c,d где m(x,y,z) - функция определения минимального из трёх чисел.
2. Даны действительные x,y. Определить u = min(x,y), v = min(xy,x+y), z = min(u+v^2, 3.14).
3. Даны действительные a, b, c.
max(a,a+b) + max(a,b+c)
Получить ----------------------------
1 + max(a+bc,1.15)
4. Даны действительные числа s,t.
Получить g(1.2,-s) + g(t,s) - g(2s-1,st)
a^2 + b^2
где g(a,b) = -------------------------.
a^2 + 3ab + 3b^2 + 4
5. Даны действительные s,t. Получить f(t,-2s,1.7) + f(2.2,t,s-t),
2a - b - sin(c)
где f(a,b,c) = ---------------.
5 + |c|
6. Даны действительные a,b,c.
g(a,b) cos(x+y) cos(x-y)
Получить g(a,c) * ------, где g(x,y) = -------- * --------
g(b,c) sin(x+y) sin(x-y)
7. Определить значение z=max(a,2b)* max(2a-b,b), где max(x,y) есть максимальное из чисел x, y.
8. Определить значение z=min(a,3b)* min(2a-b,2b), где min(x,y) есть минимальное из чисел x, y.
9. Рассчитать значение х, определив и использовав функцию, вычисляющую значение
.
10. Рассчитать значение y, определив и использовав функцию, вычисляющую значение
.
11. Определив функцию, составить программу для вычисления значений
.
12. Вычислите выражение z=(sign(x)+sign(y))*sign(x+y). При решении задачи определите, и используйте функцию sign: .
13. Написать программу, содержащую нестандартную функцию step(x,y)=x^y, используемую для вычисления выражения .
14. Напишите функцию преобразования градусной меры в радианную.
15. Напишите функцию преобразования времени выраженного в сутках, часах, минутах и секундах просто в секунды.
Задание 2.
-
Найти значение выражения , определив функцию расчета факториала натурального числа.
-
Составить программу вычисления суммы: (n<=15).
-
Составьте программу вычисления суммы:
x^1 x^2 x^3 x^n
1 + --- + --- + --- + ... + ---
1! 2! 3! n!
-
Составьте программу вычисления суммы:
x^1 x^3 x^5 x^7 x^n
--- - --- + --- - ---- + ... -(-1)^n ---
1! 3! 5! 7! n!
-
Написать программу с рекурсивной функцией, вычисляющей: .
-
Составить программу вычисления суммы: (n<=16, n - четное).
-
Рекурсивно описать функцию, вычисляющую двойной факториал n!! (n>=0), где .
-
Составить программу для вычисления значения .
-
Составить программу вычисления суммы: (n<=15, n -нечетное).
-
Пусть n и m - целые неотрицательные числа. Написать рекурсивную программу, вычисляющую классическую в теории рекурсии функцию Аккермана:
-
Составить программу вычисления суммы: (n<=16, n -четное).
-
Составьте программу вычисления суммы: для заданного числа n.
-
Составьте программу вычисления суммы: для заданного числа n.
-
Написать программу с рекурсивной функцией, вычисляющей: , используется n корней.
-
Написать рекурсивную функцию, определяющую, является ли заданное натуральное число простым.