Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект_лекций_2010_год_информатика.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

7.6.5.5. Подпрограммы и функции

В QBASIC повторяющиеся вычислительные алгоритмы могут быть организованы в основном модуле в виде многострочных функций, задаваемых оператором DEF FN, оператором-функцией типа FUNCTION, подпрограммами GOSUB и SUB. Такой подход позволяет разбить программу на логические части, каждая из которых может быть отлажена отдельно.

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

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

Основные отличия используемых в QBASIC функций и подпрограмм представлены в таблицах 7.4 и 7.5. Функция FUNCTION и подпрограмма SUB являются более мощными альтернативами, их использование лучше соответствует принципам структурного программирования и поэтому наиболее предпочтительно.

Таблица 7.4

Отличия между FUNCTION и DEF FN

FUNCTION

DEF FN

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

Все переменные по умолчанию глобальные. Ряд переменных можно объявить локальными.

Переменные передаются в процедуру по ссылке или по значению. Значение переменной, переданной по ссылке, можно изменить в процедуре.

Переменные передаются в функцию DEF FN по значению.

Может вызываться рекурсивно.

Нельзя вызывать рекурсивно.

Процедуру FUNCTION можно объявить в одном модуле, а вызывать в других модулях.

Функция DEF FN должна быть определена и вызвана в том же самом модуле.

Имя процедуры FUNCTION может быть любым, но не начинаться с FN.

Имя функции DEF FN всегда начинается с FN.

Таблица 7.5

Отличия между подпрограммами SUB и GOSUB

SUB

GOSUB

По умолчанию все переменные процедуры локальные.

Все переменные глобальные.

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

Подпрограмма должна быть определена и использована в том же модуле.

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

Подпрограмма может вызываться любое число раз. Передача параметров организуется оператором присваивания.

Определение нестандартной функции 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 есть):

1

2

3

4

Результат: (когда слово STATIC опущено):

1

1

1

1

Пример 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.