Статья «Пользовательские функции в программах».
Предпросмотр материала:
Выберите файл для просмотра:
Всего файлов: 4
Тематический учет знаний «Простейшие функции».
Вариант 1
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) a = 6; b = 5; б) a = 5; b = 5. |
var a, b: integer; functuion func (c, d: integer): integer; begin if c > d then func:= c + d else func:= c * d end; begin readln(a, b); writeln(func(a, b): 5) end. |
|
2. Составьте программу с использованием функции, которая будет проверять, является ли число четным. Результатом работы функции является «1», если введенное число четное, и – «0», если число нечетное. В качестве параметра функции передается целое число.
|
|
Вариант 2
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) x = 4; y = 3; б) x = 5; y = -2. |
var x: real; y: integer; function s (a: real; b: integer): real; var r: real; c: integer; begin r:= 1; for c:= 1 to abs(b) do r:= r * a; if b < 0 then r:= 1 / r; s:= r; end; begin readln(x, y); writeln(s(x, y): 4); end. |
|
2. Напишите функцию нахождения модуля числа, не используя стандартную функцию abs. Результатом выполнения функции должно быть число с плавающей точкой (действительное число). В качестве параметров в функцию передается также действительное число. |
|
Вариант 3
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) x = 14; y = 31; б) x = 15; y = -2. |
var x,y: real; function mf (a,b: real): real; begin if a > b then mf:= b else mf:= a; end; begin readln(x, y); writeln(mf(x, y): 7:2) end. |
|
2. Составьте программу с использованием функции, которая будет проверять, является ли число кратным 5. Результатом работы функции является «да», если введенное число делится на 5 без остатка, и – «нет», в противном случае. В качестве параметра функции передается целое число. Функция будет иметь тип STRING. |
|
Вариант 4
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) a = 5; b = 5; б) a = 9; b = 5. |
var a, b: integer; functuion fn (c, d: integer): integer; begin if c > d then fn:= sqr(c) else fn:= sqr(d); end; begin readln(a, b); writeln(fn(a, b): 5) end. |
|
2. Составьте программу с использованием функции, которая будет проверять, является ли число нечетным. Результатом работы функции является «1», если введенное число нечетное, и – «0», если число нечетное. В качестве параметра функции передается целое число. |
|
Вариант 5
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) x = 2; y = 3; б) x = 10; y = -2. |
var x, y: integer; function pr (a, b: integer): integer; var r,c: integer; begin r:= 1; for c:= 1 to b do r:= r * a; s:= r; end; begin readln(x, y); if y < 0 then writeln(‘Не подходит’) else writeln(pr(x, y): 4); end. |
|
2. Напишите функцию нахождения знака числа. В качестве параметров в функцию передается также действительное число. Результатом работы функции является «+», если введенное число положительное, «-», если число отрицательное, «ноль»- если число равно 0. Функция будет иметь тип STRING. |
|
Вариант 6
|
1. Что делает описанная в данной программе функция? Определить результат выполнения программы для следующих значений исходных данных: а) x = 62; y = 31; б) x = 15; y = -2. |
var x,y: real; function mf (a,b: real): string; begin if a mod b = 0 then mf:= ‘да’ else mf:= ‘нет’; end; begin readln(x, y); writeln(mf(x, y): 7:2) end. |
|
2. Составьте программу с использованием функции, которая будет проверять, являются ли числа взаимообратными (a*b=1). Результатом работы функции является «1», если числа взаимообратные, и – «0», в противном случае. В качестве параметра функции передаются два целых числа. |
|
Контрольная работа
«Использование функций в программах»
|
Пояснения: Þ Значение переменной X задается в основной программе, а для вычисления элемента суммы передается в качестве фактического параметра функции. Þ Результат вычисления функции используется в основной программе.
|
|
Пояснения: Þ Значения очередной пары точек вводятся в основной программе и передаются в функцию в качестве фактических параметров. Þ Результат вычисления функции используется в основной программе.
|
|
·
Пять орудий делают
залп из одной точки. Определить, на каком расстоянии от места стрельбы
снаряды упадут на землю, если Пояснения: Начальная скорость каждого снаряда (V0) и угол стрельбы (L) задаются с клавиатуры в основной программе и передаются в функцию в качестве фактических параметров. Результат вычисления функции используется в основной программе для выдачи соответствующего сообщения.
|
|
·
Составить программу
вычисления произведения 10 элементов последовательности, если каждый элемент
вычисляется по формуле:
Пояснения: Þ Значение переменной X задается в основной программе, а для вычисления элемента произведения передается в качестве фактического параметра функции. Þ Результат вычисления функции используется в основной программе.
|
|
·
Футболист ударом ноги
посылает мяч вертикально вверх. Движение мяча описывается уравнением Пояснения: Þ Значения переменных g и t задаются в основной программе и передаются в функцию в качестве фактических параметров. Результат вычисления функции используется в основной программе для выдачи соответствующего сообщения.
|
|
·
Два автобуса выезжают
одновременно навстречу друг другу. Первоначальное расстояние между автобусами
200 км. Движения автобусов описываются формулами: · Вычисление расстояния между автобусами за прошедшее время оформить в виде функции. Пояснения: Þ Значение времени вычисляется в основной программе и передается в функцию в качестве фактического параметра. Результат вычисления функции используется в основной программе для выдачи соответствующего сообщения.
|
Пользовательские функции в программах.
Все вы знакомы с детской игрушкой-головоломкой, которую принято называть «паззлом». Эта игрушка представляет собой набор маленьких фрагментов причудливой формы, несущих на себе частичку какой-то большой картины. Задача заключается в том, чтобы сложить эти фрагменты и получить картину. Оказывается, маленькие пластинки не только являются частями картины, но и соединяются со своими соседями только вполне определенным образом.
Вот так и большие программы, как из кусочков, собираются из отдельных частей, которые называются подпрограммами и модулями. Эти «кусочки», как мы увидим, могут взаимодействовать между собой только вполне определенным образом.
Следовательно, забавная головоломка «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 ]. (рисунок 5)
Определение: говорят, что в точке х функция достигает максимума, если в окрестности этой точки будут выполняться неравенства
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
|
Задача 2. Имеется
квадратный лист бумаги со стороной А. Из листа делается коробка следующим
образом: по углам вырезают 4 квадрата и коробка склеивается по швам. Какова
должна быть сторона вырезаемого квадрата, чтобы коробка имела наибольшую вместимость?
Решить при а=6 см, а= 18 см.
Если за Х обозначить сторону вырезаемых квадратов, то коробка будет иметь основание (а - 2х ) и высоту х.
Ответ: а=6, х=1 а=18,
х=2,99
Вместимость(объем)=х(а-2х)2=4х3-4ах2+а2х,
а
причем
(рисунок6)
Требуется найти максимум функции. Х (рисунок1)
Решение обсудить. Программирование на ПК
Задача 3. В степи, в 9 км к северу от шоссе, идущего с запада на восток, находится поисковая партия. В 15 км к востоку на шоссе находится райцентр. Каков должен быть маршрут следования курьера, чтобы он прибыл в райценктр в кратчайший срок, если известно, что по степи он едет со скоростью 8км/ч, а по шоссе - 10 км/ч.
Р (поисковая партия) РА = 9 км, АВ = 15 км
РМВ - маршрут следования
Обозначим
АМ за х; ![]()
Требуется найти наименьшее значение времени движения (т.е. оптимальную величину).
А М
В
(рисунок 2)
Предположим, что движение равномерное.
T1=
T2=
Tобщ=
+
(рисунок7)
Решение обсудить.
Программирование на ПК.
Контрольная работа
«Использование функций в программах» (Приложение 2).
Рекурсивные функции
Рекурсией называется ситуации, когда функция обращается к себе самой.
В рекурсивном определении должно присутствовать ограничение, граничное условие, при выходе на которое дальнейшая инициация рекурсивных обращений прекращается.
|
Пример 1. Классический пример - определение факториала. С одной стороны, факториал определяется так: n! = 1*2*3*…*n. С другой стороны, факториал можно определить следующим образом:
(рисунок12) 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.
(рисунок13) 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. |
|
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):
(рисунок9) Перепишем эту формул для числа (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-го члена последовательности Фибоначчи:
(рисунок11) 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.
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, i); writeln(‘Cумма =’, s); readln; end.
|
Литература
Евграфова О.В., учитель информатики гимназии №8 г.о. Коломна Московской области.
«Пользовательские функции в программах».
При решении многих задач и выполнении сложных математические вычислений можно использовать различные элементарные функции языка программирования Паскаль. Однако, в некоторых задачах нужно вычислить функцию, не входящую в число стандартных функций. Для этого есть возможность определить такую функцию в программе.
В статье излагается теоретический материал, приводятся примеры составления программ с применением пользовательских функций, задачи для самостоятельного решения, предлагаются варианты для проведения тематического учета знаний и контрольной работы, рассматриваются задачи практического характера.
Профессия: Учитель математики и информатики
Профессия: Учитель информатики в начальной школе
В каталоге 7 708 курсов по разным направлениям