Информатика |
Глава 10. Описание языка Basic | назад оглавление вперед |
10.8. Подпрограммы
Когда некоторая совокупность действий должна выполняться в нескольких различных местах программы, то обычно нежелательно каждый раз повторять группу операторов, реализующих эти действия. Чтобы избежать повторений, указанную группу операторов можно записать в программе один раз и обращаться к ней, когда в этом возникает необходимость. Обособленную группу операторов, которую можно выполнять многократно, обращаясь к ней из различных мест программы, называют подпрограммой.
Чтобы подпрограмма при обращении к ней выполнялась каждый раз с новыми данными, ее нужно составить в общем виде, а исходные данные для работы передавать в переменные подпрограммы перед обращением к ней. Если, например, в программе требуется, решить три квадратных уравнения с различными коэффициентами, то алгоритм нахождения корней квадратного уравнения целесообразно оформить в виде подпрограммы, используя для обозначения коэффициентов переменные. Перед каждым обращением к подпрограмме нужно задать этим переменным числовые значения, соответствующие коэффициентам решаемых уравнений.
Использование подпрограмм уменьшает общее количество операторов в программе, и, следовательно, для размещения программы требуется меньше памяти. Время на выполнение программы при этом практически не изменяется.
Подпрограммы обладают также некоторыми другими преимуществами. Использование подпрограмм улучшает структуру программы. Кроме того, облегчается отладка программы, так как работа каждой подпрограммы может быть проверена по отдельности. Многие подпрограммы имеют дополнительную ценность, поскольку ими может воспользоваться не только тот, кто написал подпрограмму, но и другие лица.
Большинство машин располагает обширными библиотеками стандартных подпрограмм, которые существенно облегчают программирование реальных задач.
В языке Basic подпрограммы могут быть оформлены как процедуры и функции.
10.8.1. Оператор DEF FN
Помимо стандартных функций в программе можно определить и далее использовать другие (нестандартные) функции. Они особенно полезны, если повторяющиеся действия можно выразить в виде одного оператора, результатом исполнения которого является единственное значение. Такую однострочную функцию можно определить оператором DEF FN. Общий вид оператора
DEF FNv(список_формальных_параметров)=арифметическое_выражение
где v — заданное пользователем имя функции;
список_формальных_параметров – последовательность идентификаторов, разделяемых запятыми. Значения формальных параметров передаются функции при ее вызове.
арифметическое_выражение — формула, по которой вычисляется функция.
Оператор DEF FN должен располагаться в программе до первого использования определяемой им функции.
Вычисление функции, описанной оператором DEF FN, осуществляется при обращении к ней при помощи записи указателя функции:
FNv(список_фактических_ параметров)
где список_фактических_ параметров — арифметические выражения, заменяющие формальные параметры в арифметическом выражении правой части оператора DEF FN перед вычислением.
Использование функции, заданной оператором DEF FN, аналогично использованию стандартных функций. Обращение к нестандартной функции (указатель функции) можно записать в арифметическом выражении, в списке вывода оператора PRINT и т. д., вообще везде, где требуется значение этой функции.
Пример 10.13
DEF FNT(X)=
X*X+A
A=5
………………..
P=FNT(3)
Перед вычислением значения функции FNT формальный аргумент Х заменяется на фактический аргумент 3, указанный в обращении к функции, и с этим значением Х (Х=3) будет вычислено значение выражения Х*Х+А. В результате переменной Р будет присвоено значение 14.
Пример 10.14
DEF FNV(X,
Y)=X*X+Y*Y+A*A
A=2: T=3.1:
Z=8.6
……………….
P=0.5*SQR (FNV
(SIN (T/PI), 2*Z))
В арифметическом выражении правой части оператора, вычисляющего значение переменной P, имеется обращение к функции FNV, используемой в качестве аргумента стандартной функции SQR. При вычислении функции FNV сначала будут вычислены арифметические выражения SIN(Т/РI) и 2*Z, значения которых заменят формальные аргументы Х и Y в арифметическом выражении, определяющем функцию FNV(X,Y), а затем вычислено значение этого арифметического выражения, т. е. значение функции FNV, которое заменит обращение к ней в выражении, являющемся аргументом функции SQR, т. е. фактически при вычислении значения Р будет выполнена следующая последовательность действий:
X=SIN
(T/PI)
Y=2*Z
V=X*X+Y*Y+A*A
P=0.5*SQR (V)
10.8.2. Блочные функции
Кроме однострочных функций Basic позволяет использовать функции, тело которых может быть образовано группой операторов. Ниже приведен формат описания блочной функции.
FUNCTION
name(список_формальных_ параметров)
блок операторов
name = выражение
END FUNCTION
где name — имя функции;
список_формальных_параметров – последовательность имен переменных, разделяемых запятыми. Значения формальных параметров передаются функции при ее вызове. Список имеет следующий вид:
переменная1 AS тип, переменная2 AS тип, …, переменнаяN AS тип
выражение — формула, вычисляющая значение, возвращаемое функцией.
Блочная функция возвращает только одно значение через имя функции. Вызов блочной функции осуществляется при помощи записи указателя функции в соответствии со следующим форматом:
name(список_фактических_ параметров)
где name — имя функции;
список_фактических_ параметров - последовательность арифметических выражений, заменяющие формальные параметры при вызове функции.
К спискам формальных и фактических параметров предъявляются следующие требования:
Пример 10.15. Составить программу для вычисления числа сочетаний по формуле:
Вычисление факториала оформить в виде функции (см. программу 10.13).
Список переменных, используемых
в главной программе.
Исходные данные: n,
m — целые неотрицательные числа, nm.
Результат: Amount
— число сочетаний из n по m.
Вспомогательные переменные:
a=n!, b=m!, c=(n-m)!
Переменные в подпрограмме:
k — переменная, факториал
которой вычисляется в подпрограмме,
f=k! вычисляется в
подпрограмме, i — управляющая переменная цикла.
Программа 10.13
DECLARE FUNCTION
fct! (n AS INTEGER)
DIM n AS INTEGER,
a AS INTEGER, b AS INTEGER
DIM m AS INTEGER,
c AS INTEGER, amount AS INTEGER
INPUT "Введите
N, M"; n, m
PRINT "N=";
n, "M="; m
a = fct(n)
PRINT "N!=";
a
b = fct(m)
PRINT "M!=";
bc = fct(n
- m)
PRINT "(N-M)!=";
c
amount = a
/ (b * c)
PRINT Число
сочетаний="; amount
END
FUNCTION fct
(k AS INTEGER)
DIM
i AS INTEGER, f AS INTEGER
f
= 1
FOR
i = 1 TO k
f
= f * i
NEXT
fct
= f
END
FUNCTION
Пояснения к
программе.
Оператор DECLARE вводить не нужно, поскольку Basic генерирует его автоматически при сохранении программы.
Функция fct вызывается три раза в операторах присваивания. Перед обращением к функции в переменную k, используемую в подпрограмме, передаются соответственно значения n, m, n - m, для которых вычисляется факториал. Переменные a, b и с служат для запоминания вычисленных значений n!, m! и (n-m)!.
Пример 10.16. Сформировать с помощью функции RND двумерный массив А(5,6) и определить значения минимальных элементов каждой строки массива. Значения минимальных элементов определить с помощью функции (см. программу 10.14).
Программа 10.14
DECLARE FUNCTION
MinMatr! (a(), k AS INTEGER, m AS INTEGER)
' Использование
функции
CLS
DIM m AS INTEGER,
i AS INTEGER
n = 5: m =
6
DIM a(n, m)
' Формирование исходной матрицы
RANDOMIZE TIMER
FOR i = 1 TO
n
FOR
j = 1 TO m
a(i,
j) = INT(RND * 10)
NEXT
j
NEXT i
' Вывод исходной матрицы
PRINT "Исходная
матрица A"
FOR i = 1 TO
n
FOR
j = 1 TO m
PRINT
a(i, j);
NEXT
j
PRINT
NEXT i
' Определение минимальных элементов строк матрицы
FOR i = 1 TO
n
mina
= MinMatr(a(), i, m)
PRINT
"Строка="; i, "Min="; mina
NEXT i
END
FUNCTION MinMatr
(a(), k AS INTEGER, m AS INTEGER)
'Функция возвращает минимальный элемент в k-й строке'
DIM min AS
INTEGER, j AS INTEGER
min = a(k,
1)
FOR j = 1 TO
m
IF
a(k, j) < min THEN min = a(k, j)
NEXT j
MinMatr = min
END FUNCTION
Пояснения к программе.
Оператор DECLARE вводить не нужно, поскольку Basic генерирует его автоматически при сохранении программы.
Функция MinMatr имеет три формальных параметра. Первый параметр используется для передачи в функцию значений исходного массива. Параметр k передает в функцию номер строки, в которой нужно определить минимальный элемент. В третьем параметре передается количество столбцов массива. Результат работы функции возвращается как значение указателя функции MinMatr.
В основной программе функция MinMatr вызывается в цикле, параметром которого служит номер строки массива.
10.8.3. Процедуры
В то время как функции возвращают только одно значение через имя функции, процедуры способны возвращать любое число значений. Они обладают возможностью использовать и модифицировать любую переменную или любой массив, которые доступны программе.
Ниже приведен формат описания процедуры.
SUB name(список_формальных_ параметров)
блок операторов
END SUB
где name — имя процедуры;
список_формальных_параметров – последовательность имен переменных, разделяемых запятыми. Значения формальных параметров передаются процедуре при ее вызове. Список имеет следующий вид:
переменная1 AS тип, переменная2 AS тип, …, переменнаяN AS тип
Вызов процедуры осуществляется при помощи оператора CALL в соответствии со следующим форматом:
CALL name(список_фактических_ параметров)
где
name — имя процедуры;
список_фактических_ параметров - последовательность арифметических выражений, заменяющие формальные параметры при вызове процедуры.
К спискам формальных и фактических параметров предъявляются следующие требования:
Пример 10.17. Составить программу для вычисления числа сочетаний по формуле:
Вычисление факториала оформить в виде процедуры (см. программу 10.15).
Список переменных,
используемых в главной программе.
Исходные данные: n,
m — целые неотрицательные числа, nm.
Результат: Amount
— число сочетаний из n по m.
Вспомогательные переменные:
a=n!, b=m!, c=(n-m)!
Переменные в процедуре:
k — переменная,
факториал которой вычисляется в процедуре,
f=k! вычисляется в
процедуре, i — управляющая переменная цикла.
Программа
10.15
DECLARE SUB
fct (k AS INTEGER, f AS INTEGER)
DIM n AS INTEGER,
a AS INTEGER, b AS INTEGER
DIM m AS INTEGER,
c AS INTEGER, amount AS INTEGER
INPUT "Введите
N, M"; n, m
PRINT "N=";
n, "M="; m
CALL fct(n,
a)
PRINT "N!=";
a
CALL fct(m,
b)
PRINT "M!=";
b
CALL fct(n
- m, c)
PRINT "(N-M)!=";
c
amount = a
/ (b * c)
PRINT "Число
сочетаний="; amount
END
SUB fct (k
AS INTEGER, f AS INTEGER)
DIM
i AS INTEGER
f
= 1
FOR
i = 1 TO k
f
= f * i
NEXT
END SUB
Пояснения к программе.
Оператор DECLARE вводить не нужно, поскольку Basic генерирует его автоматически при сохранении программы.
Процедура fct вызывается три раза с помощью оператора CALL. При вызове процедуре с помощью первого формального параметра передаются значения n, m, n - m, для которых вычисляется факториал. Второй формальный параметр процедуры используется для передачи результата работы процедуры в главную программу.
Пример 10.18. Сформировать с помощью функции RND двумерный массив А(5,6) и определить значения минимальных элементов каждой строки массива. Значения минимальных элементов определить с помощью процедуры (см. программу 3.8).
Программа 10.16
DECLARE SUB MinMatr (a(),
k AS INTEGER, m AS INTEGER, min AS INTEGER)
' Использование процедуры
CLS
RANDOMIZE TIMER
DIM i AS INTEGER, m AS INTEGER, Mina AS INTEGER
n = 5: m = 6
DIM a(n, m)
' Формирование исходной матрицы
FOR i = 1 TO n
FOR j = 1 TO m
a(i, j) = INT(RND * 10)
NEXT j
NEXT i
' Вывод исходной матрицы
PRINT "Исходная матрица A"
FOR i = 1 TO n
FOR j = 1 TO
m
PRINT a(i,
j);
NEXT j
PRINT
NEXT i
' Определение минимальных элементов строк матрицы
FOR i = 1 TO n
CALL MinMatr(a(),
i, m, Mina)
PRINT "Строка=";
i, "Min="; Mina
NEXT i
END
SUB MinMatr
(a(), k AS INTEGER, m AS INTEGER, min AS INTEGER)
'Процедура вычисляет минимальный элемент в k строке'
DIM j AS INTEGER
min = a(k,
1)
FOR j = 1 TO
m
IF a(k, j)
< min THEN min = a(k, j)
NEXT j
END SUB
Пояснения к
программе.
Оператор DECLARE вводить не нужно, поскольку Basic генерирует его автоматически при сохранении программы.
Процедура MinMatr имеет четыре формальных параметра. Первый параметр используется для передачи в функцию значений исходного массива. Параметр k передает в функцию номер строки, в которой нужно определить минимальный элемент. В третьем параметре передается количество столбцов массива. Результат работы функции возвращается с помощью четвертого параметра Min.
В основной программе процедура MinMatr вызывается оператором CALL в цикле, параметром которого служит номер строки массива.