Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lab_rab_Pascal_OZO / Lab_08_Функции

.doc
Скачиваний:
26
Добавлен:
21.03.2015
Размер:
108.54 Кб
Скачать

Лабораторная работа № 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. функцию;

  2. рекурсивную функцию.

Содержание отчета по каждому заданию:

  • исходные данные (условие задачи);

  • алгоритм (блок-схема) решения задачи;

  • текст программы (или основной фрагмент программы);

  • результаты выполнения программы

  • тестовый вариант в форме с фиксированной точкой.

Контрольные вопросы:

  1. Что называется функцией?

  2. Назовите основные отличия в описании процедур и функций.

  3. Каким образом производится вызов функции в программе?

  4. Что лучше процедура или функция?

  5. Что называется рекурсией?

Приложение: (ваш номер по журналу соответствует номеру варианта)

Задание 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.

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

  2. Составить программу вычисления суммы: (n<=15).

  3. Составьте программу вычисления суммы:

x^1 x^2 x^3 x^n

1 + --- + --- + --- + ... + ---

1! 2! 3! n!

  1. Составьте программу вычисления суммы:

x^1 x^3 x^5 x^7 x^n

--- - --- + --- - ---- + ... -(-1)^n ---

1! 3! 5! 7! n!

  1. Написать программу с рекурсивной функцией, вычисляющей: .

  2. Составить программу вычисления суммы: (n<=16, n - четное).

  3. Рекурсивно описать функцию, вычисляющую двойной факториал n!! (n>=0), где .

  4. Составить программу для вычисления значения .

  5. Составить программу вычисления суммы: (n<=15, n -нечетное).

  6. Пусть n и m - целые неотрицательные числа. Написать рекурсивную программу, вычисляющую классическую в теории рекурсии функцию Аккермана:

  1. Составить программу вычисления суммы: (n<=16, n -четное).

  2. Составьте программу вычисления суммы: для заданного числа n.

  3. Составьте программу вычисления суммы: для заданного числа n.

  4. Написать программу с рекурсивной функцией, вычисляющей: , используется n корней.

  5. Написать рекурсивную функцию, определяющую, является ли заданное натуральное число простым.