Функции, определяемые пользователем



 

Кроме встроенных арифметических функций типа sin(x) или sqr(x), ТБ позволяет создавать свои собственные функции и использовать их в программах. Для этого используется специальный оператор описания (объявления) def fn… . В ТБ различают однострочный и многострочный варианты описания пользовательских функций.

 

Формат однострочного варианта задания функции

def fn<имя>[(список аргументов)]=<выр.>

Здесь:

fn<имя> - имя (идентификатор) функции, которая задается пользователем, две первые буквы – ключевые, зарезервированные самим ТБ, последующие символы – произвольные

<список аргументов> - идентификаторы простых переменных и массивов через запятую, являющиеся параметрами (аргументами), от которых зависит функция fn<имя>, является необязательным параметром, может отсутствовать в def;

<выр.> - арифметическое выражение (формула), по которому вычисляется значение функции fn<имя>;

В тексте программы вызов функции происходит по ее имени fn<имя> и если в операторе описания функции def были аргументы, то в скобках указываются конкретные их значения (разрешаются как числовые константы, так и идентификаторы переменных, значения которых определены до обращения к функции), например

 

def fncotan(x)=1/tan(x)                                  ‘ объявляется функция fncotan

  ‘ (котангенс), зависит от аргумента х,

‘ в формуле вычисления используется

‘ встроенная функция вычисления тангенса (tan(x))

y=sqr(abs(fncotan(5)))                            ‘ вычисление параметра y с

‘ помощью пользовательской функции

    ‘ fncotan при конкретном значении аргумента – 5

print “y=”y

stop

Формат многострочного варианта объявления пользовательской функции

 

def fn<имя>[(список аргументов)]

[local<список переменных>]

[static<список переменных>]

[shared<список переменных>]

[exit def]

fn<имя>=<выр.>

end def

 

Операторы local, static, shared являются операторами области действия имен переменных внутри тела функции, определяемого пользователем оператором def. Оператор exit – дополнительная точка выхода из функции. Действия этих операторов аналогичны их работе в процедуре (глава 1.5).

Войти в тело функции нельзя операторами goto или gosub, выйти нельзя оператором return.

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

Рассмотрим пример построения программы с использованием функции, заданной пользователем. В декартовой системе координат заданы несколько окружностей – n, n выбрасывается случайным образом в диапазоне от 5 до 12. окружности задаются координатами центров и радиусами, чтобы было максимальное количество пересечений окружностей между собой. Определена прямоугольная область по оси OX от а до b, а по оси OY от с до d, внутри которой выбрасываются координаты центров окружностей. Параметры a, b, c, d, вводит пользователь с клавиатуры. А радиусы лежат в диапазоне половин сторон прямоугольной области от min до max, где min={(b-a)/2,(d-c)/2}, max={(b-a)/2,(d-c)/2}. Требуется составить программу определения номеров окружностей, пересекающихся между собой, при этом расстояние между центрами окружностей, а так же расстояние, равное сумме радиусов двух сравниваемых окружностей, описать в виде пользовательской функции fnd и fnr соответственно.

rem функции, определяемой пользователем

cls

def fnd(z,y)=sqr(z^2+y^2)                           ‘ объявление функции fnd

def fnr(q+w)=q+w                                   ‘ объявление функции fnк

randomize int(timer)

n=int((12-5)*rnd(1)+5)      ‘ определение количества окружностей

dim x(n),y(n),r(n)

input a,b,c,d                             ‘ ввод границ прямоугольной области,

‘ внутри которой задаются окружности

min=(b-a)/2

max=(d-c)/2

if min>max then                            ‘ определение значений max и min

                                          ‘ из двух половин сторон прямоугольной

‘ области abcd

max=(b-a)/2

min=(d-c)/2

end if

for i=1 to n                                                     ‘ задание случайным образом

‘ окружностей внутри abcd

x(i)=(b-a)*rnd(2)+a

y(i)=(d-c)*rnd(3)+c

r(i)+(max-min)*rnd(4)+min

next i

for i=1to n-1                                              ‘ внешний цикл – перебор

‘ номеров 1-й окружности

   ‘ которой будут сравниваться другие)

for j=i+1 to n                                           ‘ внутренний цикл – перебор

‘ номеров 2-й окружности,

‘ с которой сравнивается 1-я

z1=x(j)-x(i)                       ‘ расстояние по оси OX между центрами

y1=y(j)-y(i)                        ‘ расстояние по оси OY между центрами

if find(z1,y1)<=fnr(r(j),r(i)) then               ‘ условие пересечения двух

                                                                             ‘ окружностей

print “пересекается”;j;”-я окружность с”;i;”-й окружностью”

end if

next j

next i

stop

 

 


Дата добавления: 2021-11-30; просмотров: 17; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!