

Подпрограммы
и функции пользователя

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

Операторы организации подпрограмм
•Оператор GOSUB-RETURN
•Формат:
GOSUB номер_строки
RETURN номер_строки
• Оператор GOSUB передает управление из основной программы в подпрограмму на первый оператор указанной в нем строки. Затем подпрограмма
выполняется в естественном порядке до оператора RETURN. Если в операторе RETURN параметр "номер строки" не указан, то управление передается на оператор, следующий за оператором GOSUB. Если параметр "номер строки" указан, то оператор GOSUB выполняет возврат из подпрограммы на
указанную строку

Операторы организации подпрограмм
•Оператор ON GOSUB – RETURN
•Вычисляемый переход к подпрограмме
•Формат оператора:
ON выражение GOSUB номер_строки[, номер_строки…]
…
RETURN
• ПРИМЕР:
ON A GOSUB 10, 20, 30
…
RETURN
Если A=1, то GOSUB 10 Если А=2, то GOSUB 20 Если А=3, то GOSUB 30 Иначе ничего не происходит


Подпрограмма: вычисление факториала
Задача: рассчитать число сочетаний по формуле
Cmn m!/(n!*(m n)!)
Три раза используется вычисление факториала: n!, m! и (m - n)!
Поэтому целесообразно расчет факториала оформить в виде подпрограммы.

ПРОГРАММА |
|
Переменные: |
|
|
n, m – фактические переменные |
||
CLS |
|
||
|
L – формальная переменная |
||
INPUT «Введите n»; n |
P – факториал |
||
INPUT «Введите m»; m |
С1 – результат вычисления |
||
L=n |
|
факториала n! |
|
GOSUB 10 |
|
С2 – результат вычисления |
|
|
факториала m! |
||
C1= P |
|
||
|
С3 – результат вычисления |
||
L= m |
|
||
|
факториала (m-n)! |
||
GOSUB 10 |
|
||
|
С – число сочетаний |
||
C2= P |
|
|
|
L= m-n |
10 REM Начало подпрограммы |
|
|
GOSUB 10 |
Р=1 |
|
|
C3= P |
FOR i=1 TO L |
|
|
C= C1/ (C2*C3) |
P= P*i |
|
|
PRINT “C=“;C |
NEXT i |
|
|
END |
RETURN |
|
|
|
|
|
|

|
Блок-схема |
|
|
начало |
1 |
Блок-схема |
|
Ввод |
|
||
C2=P |
подпрограммы |
||
n,m |
|
вход |
|
L = n |
L = m-n |
||
P = 1 |
|||
|
|
||
10 |
10 |
i = 1,L |
|
|
|
||
C1=P |
C3=P |
P=P*i |
|
|
|||
|
C=(C1*C2)/C3 |
||
L = m |
|
||
|
|
||
10 |
Вывод |
выход |
|
С |
|||
|
|||
1 |
конец |
|
|
|
|


Рекомендации по
организации подпрограмм
• Четко обозначить начало и конец каждой подпрограммы с помощью оператора REM.
• Каждую подпрограмму нужно рассматривать как независимый логически завершенный модуль.
• Не использовать оператор GOTO для входа и выхода из подпрограмм.
• Недопустимо изменять в подпрограмме
переменные – счетчики циклов вызывающей программы.
• Используйте в подпрограмме переменные отличные от переменных вызывающей программы.
• Подпрограммы записывать после оператора END, завершающего вызывающую программу.

Функции пользователя
• Однострочная функция пользователя
• Блочная функция пользователя
•
Если в программе имеются повторяющиеся
действия, которые можно выразить в виде одного выражения, то для их выполнения можно определить однострочную
функцию пользователя

Однострочная функция пользователя
•Определение функции пользователя – в начале программы оператором DEF FN
•Формат оператора:
DEF FNимя_функции(формальная_переменная, формальная_переменная…) = =выражение
•Вызов функции пользователя внутри программы с помощью
FNимя_функции(фактическая_переменная, фактическая_переменная…)