Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Определение нестандартной функции DEF FN
Формат определения нестандартной однострочной функции: DEF FNимя [(список параметров)] = выражение где: имя вместе с FN задает имя функции; список параметров состоит из идентификаторов, разделенных запятыми; выражение определяет вычисляемое значение функции. В многострочных функциях для вычисления значения функции можно задать несколько операторов. Формат определения нестандартной многострочной функции: DEF FNимя [(список параметров)] блок_операторов FNимя = выражение [EXIT DEF] END DEF Для возврата из функции служит оператор EXIT DEF. До его выполнения имени функции должно быть присвоено возвращаемое значение. Если оператор EXIT DEF не задан, то возврат из функции выполнит оператор END DEF. Тип функции определяется ее именем аналогично переменной: знаком типа в конце имени или неявно операторами DEFtype. Определение функции FUNCTION FUNCTION имя [(список параметров)] [STATIC] блок операторов [EXIT FUNCTION] END FUNCTION где: FUNCTION отмечает начало функции; имя задает имя функции, которое должно быть уникально; список параметров список переменных, разделенных запятыми. Он задает число и тип аргументов, передаваемых в функцию; STATIC определяет способ размещения локальных переменных в памяти; END FUNCTION завершает определение функции; EXIT FUNCTION возвращает управление из функции; блок операторов содержит любые операторы кроме DEF FN...END DEF, FUNCTION...END FUNCTION, SUB...END SUB, COMMON, DECLARE, DIM SHARED, OPTION BASE, TYPE...END TYPE. Вызов FUNCTION производится путем задания ее имени и аргументов в выражении. Функция FUNCTION возвращает одно значение, которое подставляется вместо имени процедуры. Процедура FUNCTION также может возвращать значение, изменяя значения переменных, передаваемых в качестве аргумента. Пример 1. Использование функции. DECLARE FUNCTION TEST. RSLT $ ( ANSWER % ) Print “ В каком году Колумб открыл Америку? ” Print “ 1) 1492 “ Print “ 2) 1528 “ Print “ 3) 1544 “ Print “ Введи номер правильного ответа “ INPUT NUMBER % TXT $ = TEST.RSLT $ (NUMBER %) Print TXT $ END FUNCTION TEST.RSLT %(ANSWER %) IF ANSWER%=1 THEN TEST.RSLT$= “ПРАВИЛЬНО” ELSE TEST.RSLT$= “НЕВЕРНО” END IF END FUNCTION Пример 2. Вычисление факториала. DECLARE FUNCTION FACT (n%) INPUT NM% Print NM%; FACT(NM%) END FUNCTION FACT (n%) STATIC IF n%> 0 THEN FACT=n%*FACT(n%-1) ELSE FACT=1 END IF END FUNCTION Оператор вызова подпрограммы GOSUB Оператор вызова подпрограммы: [m1] GOSUB n где: m1 - номер строки или метка; n - номер строки заголовка подпрограммы. n REM SUB имя п/п - заголовок подпрограммы операторы п/п m RETURN m2 где m2 – номер строки (метка) возврата после выхода из подпрограммы. Одна подпрограмма может иметь несколько операторов RETURN. При этом RETURN не может использоваться для передачи управления из одной подпрограммы другой. GOSUB и RETURN должны находиться в одном модуле. Пример. Подготовка данных для подпрограммы. N=A(1, 1): M= A(2, 2) ‘ Вызов подпрограммы MAX-2 GOSUB 18 ‘ Записываем результат работы подпрограммы R=Q ‘ Готовим новые данные для подпрограммы N=R; M= A(3, 3) ‘ Вызов подпрограммы MAX-2 GOSUB 18 Y=Q PRINT “Y=“; Y: STOP 18 REM SUB MAX-2 IF N> M THEN Q=N: GOTO 19 Q=M 19 RETURN END Описание подпрограммы SUB Формат оператора: SUB имя [(список параметров)] [STATIC] блок операторов [EXIT SUB ] END SUB где: SUB отмечает начало подпрограммы; имя задает имя подпрограммы, которое должно быть уникально; список параметров список переменных, разделенных запятыми. Он задает число и тип аргументов, передаваемых в подпрограмму; STATIC определяет способ размещения локальных переменных в памяти; END SUB завершает определение подпрограммы; EXIT SUB возвращает управление из подпрограммы; блок операторов содержит любые операторы кроме DEF FN...END DEF, FUNCTION...END FUNCTION, SUB...END SUB, COMMON, DECLARE, DIM SHARED, OPTION BASE, TYPE...END TYPE. Вызов процедуры SUB выполняется двумя способами: - оператором CALL, в котором задается имя процедуры и список передаваемых аргументов, который заключается в скобки, например, CALL ProcX (A, B%); - указанием имени процедуры и ее аргументов (скобки опускаются), например, ProcX A, B% Если использовано ключевое слово STATIC, то все локальные переменные становятся статическими, т.е. при следующем вызове подпрограммы они не будут инициализироваться вновь. Пример 1. Использование ключевого слова STATIC DCL SUB NUMBER ( ) REM ИСПОЛЬЗОВАНИЕ КЛЮЧЕВОГО СЛОВА STATIC FOR TIME %=1 to 4 CALL NUMBER NEXT TIME % END SUB NUMBER STATIC NUMBER% =NUMBER% +1 PRINT NUMBER% END SUB Результат: (когда слово STATIC есть): Результат: (когда слово STATIC опущено): Пример 2. Транспонирование квадратной матрицы. DECLARE SUB TRM (A%(), B%()) DEFINT A-P INPUT n% DIM AM(n%, n%), BM(n%, n%) IM=1 FOR i=1TO n% FOR j=1TO n% AM(i, j)=IM IM= IM+ 1 NEXT j NEXT i CLS ‘Вывод исходной матрицы Print “Исходная матрица”: FOR i=TO n% FOR j= TO n% Print USING “# #”; AM(i, j); NEXT j NEXT i ‘Транспонирование матрицы CALL TRAM(A(), B()) Print “Транспонированная матрица: ” FOR i=1TO n% FOR j=TO n% Print USING “# #”; ВM(i, j); NEXT j NEXT i SUB TRM(A( ), B( ) ) IK = UBOUND (A) FOR i=1 TO IK FOR j=1 TO IK B(j, i)= A(i, j) NEXT j NEXT i END SUB Результат: (пусть n = 4) Исходная матрица:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Транспонированная матрица: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
Оператор DECLARE Оператор DECLARE (DCL) используется для проверки числа и типа аргументов при вызове процедуры. Отсутствие оператора DECLARE вызывает ошибку компиляции, если вызов процедуры в программе встретился раньше ее описания, или процедура определена в другом модуле. При сохранении программы в файл автоматически генерируется оператор DECLARE для каждой процедуры FUNCTION и SUB с ее именем и списком параметров в скобках. Передача параметров в подпрограмму Параметр (формальный параметр) — имя переменной в операторах определения функции или процедуры. Параметр может быть именем переменой любого типа или именем массива (только для процедуры). Массив задается именем, левой и правой скобками, в скобках указывается число размерностей. Аргумент (фактический параметр)— константа, переменная или выражение, передаваемые в функцию или процедуру при вызове. Аргумент может быть константой, выражением, именем переменной или именем массива. Число и тип аргументов при вызове процедуры или функции должно совпадать с числом и типом соответствующих параметров. Массив, передаваемый процедуре, должен соответствовать параметру-массиву. Массив, задаваемый в качестве аргумента, состоит из имени, левой и правой скобки. Запрещается передавать массив при вызове функции. Элемент массива, передаваемый в качестве аргумента, должен соответствовать параметру - простой переменной и задается именем массива со списком индексов, заключенных в скобки. Если в процедуру в качестве аргумента передаются границы изменения индексов массива, то используют функции LBOUND и UBOUND. Передача аргументов по ссылке По умолчанию простые переменные, массивы, элементы массивов передаются в процедуру по ссылке. Это означает следующее: — каждая переменная имеет адрес, по которому в памяти размещается ее значение; — при вызове процедуры и передаче переменной по ссылке передается адрес переменной, который становится адресом соответствующего параметра; — если процедура изменяет значение параметра, то одновременно изменяется и значение переданной переменной. Передача аргументов по значению Это означает, что передается не адрес аргумента, а его значение. Все аргументы при вызове функции передаются по значению. Для передачи переменной в процедуру по значению ее превращают в выражение, заключая в скобки. В этом случае изменение значения параметра в процедуре не изменит значения соответствующей переменной. Пример. A=5: B=8 CALL PROC1 (A, B) PRINT “A=”; A, ”B=”; B END SUB PROC1 (X, Y) X=0: Y=0 END SUB Результат: А = 0 В = 8 Популярное:
|
Последнее изменение этой страницы: 2016-04-09; Просмотров: 931; Нарушение авторского права страницы