Пользовательские функции в программах

Разделы: Информатика

Классы: 10, 11


Все вы знакомы с детской игрушкой-головоломкой, которую принято называть “паззлом”. Эта игрушка представляет собой набор маленьких фрагментов причудливой формы, несущих на себе частичку какой-то большой картины. Задача заключается в том, чтобы сложить эти фрагменты и получить картину. Оказывается, маленькие пластинки не только являются частями картины, но и соединяются со своими соседями только вполне определенным образом.

Вот так и большие программы, как из кусочков, собираются из отдельных частей, которые называются подпрограммами и модулями. Эти “кусочки”, как мы увидим, могут взаимодействовать между собой только вполне определенным образом.

Следовательно, забавная головоломка “puzzle” может научить нас важнейшему принципу программирования – принципу модульности программ.

В модульной программе отдельные ее части, предназначенные для решения каких-то частных задач, организованы в подпрограммы. В такой организации два преимущества:

  • это дает возможность записать повторяющуюся часть алгоритма только один раз, а затем использовать ее в нужном месте.
  • это позволяет сделать сложную программу более понятной, удобной и вести ее разработку коллективу программистов.

Подпрограмма очень похожа на программу.

Каждая подпрограмма представляет собой независимый алгоритм решения определенной небольшой задачи.

Обычно подпрограмма имеет один или несколько входных параметров, для которых нужно решить задачу. После выполнения подпрограммы получается определенный результат. Это может быть один или несколько выходных параметров.

Подпрограмма отличается от программы тем, что она не может выполняться самостоятельно (вызывается в программе для выполнения при необходимости).

Чтобы подпрограмма при обращении к ней выполнялась каждый раз с новыми данными, ее нужно составить в общем виде, а исходные данные для работы передавать в переменные подпрограммы перед обращением к ней.

Различают два типа подпрограмм: процедуры и функции.

Процедуры и функции описываются после переменных перед телом основной программы.

Функции.

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

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

Функция описывается в разделе описаний по следующей форме:

Function <имя> (<аргументы>:<тип >) : <тип функции>;

{Раздел описания локальных переменных}

Begin

<тело функции>

<имя> : = <выражение>; {обязательный оператор}

End;

<имя> - идентификатор функции, по которому можно к ней обращаться;

<аргументы> - аргументы функции (входные параметры);

<тип > - тип аргументов функции;

<тип функции> - тип значения функции;

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

Аргументы, указанные в описании функции называются формальными, чтобы подчеркнуть, что они получают смысл только после задания фактических аргументов при использовании (обращении) к функции.

Для использования функции в программе нужно указать имя функции и фактические аргументы в круглых скобках через запятую.

Пример:

Вычислить периметр треугольника по координатам его вершин (xa,ya), (xb, Yb), (xc,yc).

program perimetr;

Var xa,ya,xb,yb,xc,yc,r1,r2,r3,p: real;

Function rast(x1,y1,x2,y2 : real) : real;

Begin

Rast := sqrt(sqr(x1-x2) + sqr(y1-y2));

End;

Begin

Write(‘Введите координаты точек’);

Readln(xa,ya,xb,yb,xc,yc);

R1:= rast(xa,ya,xb,yb);

R2:= rast(xb,yb,xc,yc);

R3:= rast(xa,ya,xc,yc);

P:= r1 + r2 + r3;

Writeln(‘Периметр=’, p:7:2);

Readln;

End.

Особенности функций:

  • результатом работы функции всегда является одно значение;
  • функция не может выполняться самостоятельно, а обязательно в составе какого-либо оператора.

Практическое задание:

Задание 1.

Найти наибольшее из четырех чисел.

Begin

Write(‘Введите четыре числа’);

Readln(a, b, c, d);

M1:= maxim(a,b);

M2 := maxim(d,c);

M3 := maxim(M1,M2);

Writeln(‘’, M3:10 : 5); Readln;

End.

Program largest;

Var a, b, c, d,m1,m2,m3 : Real;

Function maxim(x,y : real) : real;

Begin

If x>y then maxim := x Else maxim := y ;

End;

Задание 2. Составить программу для вычисления площадей трех трапеций по известным основаниям и высоте. Данные вводятся в основной программе. Нахождение площади реализовать в виде функции. Задание 3. Вычислите сумму площадей трех колец. Радиусы внешней и внутренней окружностей вводятся в основной программе. Вычисление площади кольца организуйте в виде функции.
Задание4. Составить алгоритм и программу для определения количества комбинаций в игре “Спортлото” 6 из 45. Число комбинаций из N по М определяется по следующей формуле:

Вычисление факториала оформить в виде функции.

Задание 5. Вычислить площадь четырехугольника, если известны все стороны и одна из диагоналей (вводятся в основной программе). Вычисление площадей составляющих треугольников осуществляется по формуле Герона (оформить в виде функции).

,

где P - полупериметр треугольника.

Тематический учет знаний “Простейшие функции” (Приложение 1)

Решение задач практического характера.

Задача 1 . Найти все локальные максимумы функции

на отрезке [ 0.1, 2p ].

Определение: говорят, что в точке х функция достигает максимума, если в окрестности этой точки будут выполняться неравенства

f( x-e ) < f(x) > f(x+e ) , где e - некоторое число.

Выберем шаг исследования H и будем сравнивать три значения функции, отстоящие друг от друга на величину Н (т.е. в точках х, х+Н, х+2Н ). Если среднее значение функции будет больше крайних, следовательно, это локальный максимум. Тогда на экран дисплея будем выдавать сообщение “ при х= ... мах=...”.

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

Программу разобрать на доске:

program lok_max;

function y(a1,t:real):real;

begin

y:=1/(2*a1)*(sin(a1*t)+a1*t*cos(a1*t));

end;

var a,h,x,no,ko,z1,z2,z3:real;

begin

write('Введите а'); readln(a);

write('Введите шаг исследования h');

readln(h);

write('Введите начало и конец отрезка');

readln(no,ko);

x:=no;

repeat

z1:=y(a,x); z2:=y(a,x+h); z3:=y(a,x+2*h);

If (z2>z1) and (z2>z3) then

writeln('при х=' ,x:8:6, 'лок.максимум=',z2:8:6);

x:=x+h;

until x>(ko-2*h);

readln;

end.

Результат работы программы:

при а=10, h=0.01

X=0.1

Лок.максимум = 0,069508

X=0.65

Лок.максимум = 0,329154

X=1,26

Лок.максимум = 0,636000

X=1,89

Лок.максимум = 0,946763

X=2,51

Лок.максимум = 1,260512

X=3,14

Лок.максимум = 1,573636

X=3,77

Лок.максимум = 1,885425

X=4,39

Лок.максимум = 2,200540

X=5,02

Лок.максимум = 2,515227

X=5,65

Лок.максимум = 2,828838

Задача 2. Имеется квадратный лист бумаги со стороной А. Из листа делается коробка следующим образом: по углам вырезают 4 квадрата и коробка склеивается по швам. Какова должна быть сторона вырезаемого квадрата, чтобы коробка имела наибольшую вместимость? Решить при а=6 см, а= 18 см.

Если за Х обозначить сторону вырезаемых квадратов, то коробка будет иметь основание (а - 2х ) и высоту х.

Вместимость(объем)=х(а-2х)2=4х3-4ах22х, а причем

Требуется найти максимум функции.

a 1.gif (661 bytes)
      Х

Ответ:

  • а=6, х=1

  • а=18, х=2,99

Решение обсудить. Программирование на ПК

Задача 3. В степи, в 9 км к северу от шоссе, идущего с запада на восток, находится поисковая партия. В 15 км к востоку на шоссе находится райцентр. Каков должен быть маршрут следования курьера, чтобы он прибыл в райценктр в кратчайший срок, если известно, что по степи он едет со скоростью 8км/ч, а по шоссе - 10 км/ч.

Р (поисковая партия) РА = 9 км, АВ = 15 км

РМВ - маршрут следования

Обозначим АМ за х;

Требуется найти наименьшее значение времени движения (т.е. оптимальную величину).

Предположим, что движение равномерное.

T1=

T2=

Tобщ=+

Ответ:

  • x=12 км,
  • tmin= 2,175 часа

Решение обсудить.

Программирование на ПК.

Контрольная работа “Использование функций в программах” (Приложение 2)

Рекурсивные функции

Рекурсией называется ситуации, когда функция обращается к себе самой.

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

Пример 1. Классический пример - определение факториала. С одной стороны, факториал определяется так: n! = 1*2*3*…*n.

С другой стороны, факториал можно определить следующим образом:

Program pr1_rec;

var f: longint: n: integer;

function factorial(m: integer):longint;

begin

if (m=0) or (m=1)

then factorial:=1

else factorial:= factorial(m-1)*m;

end;

begin

write(‘n=’); readln(n);

f:=factorial(n); writeln (n,’! = ‘, f); readln;

end.

Пример 2. Определим функцию K(n), которая возвращает количество цифр в заданном натуральном числе n.

Program pr1_rec;

var n: longint: f: integer;

function Kol(m: longint):byte;

begin

if m<10

then Kol:=1

else Kol:=Kol(m div 10) +1;

end;

begin

write(‘n=’); readln(n); f:=kol(n);

writeln (‘количество цифр в числе ’,n,’ = ‘, f);

readln;

end.

Пример 3. Определение степени любого числа с целочисленным показателем.

Program pr3_rec;

var a,s:real; (рисунок8)

k:integer;

function step(b:real; n:integer):real;

begin

if n=0 then step:=1

else

if n>0 then step:=step(b,n-1)*b

else step:=step(b,n+1)/b;

end;

begin

write('a,k'); readln(a,k);

s:=step(a,k);

writeln('s=',s:7:2);

readln

end.

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

Примечание: Вспомним формулу квадрата суммы и запишем ее для числа (m+1):

Перепишем эту формул для числа (m-1):

(рисунок10)

Program pr4_rec;

var f: longint: n: integer;

Function kvadrat( m: Word ): Word;

Begin

If m=1 then kvadrat:=1

Else kvadrat:=kvadrat(m-1)+m+m-1; End;

begin

write(‘n=’); readln(n);

f:=kvadrat(n); writeln (’f = ‘, f); readln;

end.

Пример 5. Определение n-го члена последовательности Фибоначчи:

Program pr5_rec;

var n:integer;

s:longint;

function fib(x:integer):integer;

begin

if (x=1) or (x=2) then fib:=1

else fib:=fib(x-1)+fib(x-2);

end;

begin

write('n'); readln(n);

s:=fib(n);

writeln('s=',s);

readln

end.

Пример 6. Нахождение НОД (наибольшего общего делителя) двух натуральных чисел, используя алгоритм Евклида:

Пусть есть два целых числа а и b.

Если а=b, то НОД(а,b)=а.

Если а>b, то НОД(а,b)=НОД( а-b, b ).

Если а<b, то НОД(а,b)=НОД( а, b-а ).

Program pr6_rec;

var rez,a,b:longint;

function nod(x,y:longint): longint;

begin

if x = y then nod:=x else

if x>y then nod:=nod(x - y,y)

else nod:=nod (x, y – x);

end;

begin

writeln('a,b'); readln(a,b); rez:=nod(a,b); writeln('nod= ',rez);

readln;

end.

Самостоятельная работа парами с взаимопроверкой.

Вариант 1

Определение суммы членов арифметической прогрессии.

Program var1_rec;

var a1,d,s: real: n, i: integer;

Function xn( x1,d1: real; m:integer ): real;

Begin

If m=1 then xn:=x1

Else xn:=xn(x1,d1,m-1)+d1;

End;

begin

write(‘n=’); readln(n); write(‘a1=’); readln(a1);

write(‘d=’); readln(d);

s:=0;

for i:=1 to n do

s:=s + xn(a1,d,i);

writeln(‘Cумма =’, s);

readln;

end.

Самостоятельная работа парами с взаимопроверкой.

Вариант 2

Определение суммы членов геометрической прогрессии.

Program var2_rec;

var a1,q,s: real: n, i: integer;

Function xn( x1,q1: real; m:integer ): real;

Begin

If m=1 then xn:=x1

Else xn:=xn(x1,d1,m-1)* q1;

End;

begin

write(‘n=’); readln(n); write(‘a1=’); readln(a1);

write(‘q=’); readln(q);

s:=0;

for i:=1 to n do

s:=s + xn(a1,q, );

writeln(‘Cумма =’, s);

readln;

end.

Литература

  1. Окулов С.М. Основы программирования. – 2-е изд., испр. – М.: БИНОМ. Лаборатория знаний, 2005.
  2. Немнюгин С., Перколаб Л. Изучаем Turbo Pascal.– СПб.: Питер, 2004.
  3. Знатнов С.Ю. Введение в программирование: Начнем изучать Паскаль?: Учебное пособие для учащихся старших классов.- Коломна: КГПИ, 2004.
  4. Фалина И.Н., Богомолова Т.С. и др.Алгоритмизация и программирование: Сборник контрольных работ с решениями (9-11 класс). – М.: КУДИЦ-ПРЕСС, 2007.
  5. Материалы сайта https://urok.1sept.ru