Функции, определяемые пользователем
Кроме встроенных арифметических функций типа 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!