Basic - вводный курс

         

Подпрограммы

Иногда в определенных местах программы приходится выполнять практически одни и те же последовательности действий с разными исходными данными. Такие последовательности действий можно оформить в виде так называемых подпрограмм (от англ. "subroutine"). Подпрограммы сокращают текст программы, существенно уменьшают время их исполнения, облегчают жизнь программистам, которые могут создавать программы модульно, т. е. собирая сложную программу из законченных кусочков более простых составляющих. Это позволяет создавать большие программы группой программистов, разрабатывать и реализовать группе школьников какие-либо глобальные проекты.
Для примера использования процедуры приведем программу вычисления следующего выражения:

Z=N!/M!*(N-M)!

Переменные N и М, а также выражение (N—М) снабжены восклицательным знаком, который в математике означает не что иное, как факториал (например, N-факториал). Факториал — это произведение натуральных чисел от 1 до N включительно. Например, 3!=1х2хЗ=6, а, например, 6! — это уже 1x2x3x4x5x6=720.
В выражении нам три раза придется вычислять факториал, производя при этом одни и те же действия с разными числами. Нам облегчит работу подпрофамма, которую мы разместим в конце основной профаммы и назовем, например, fact. В подпрофам-ме мы опишем, как вычислить факториал вообще, а затем из основной программы обратимся к подпрофамме три раза с различными параметрами. Вот как будет выглядеть проuhамма:

CLS
1 : INPUT "Введите значения N и М"; N, М
K=N
GOSUB FACT
Х1=Р
К=М
GOSUB FACT
Х2=Р


K=(N-M)
GOSUB FACT
Z=X1/(X2*P)
PRINT "Искомое выражение равно"; Z
PRINT "Еще одно выражение?(Y/N): INPUT а$
IF UCASE$(a$)="Y" THEN 1 ELSE PRINT "До новых встреч
у монитора..." END
' Описание подпрограммы FACT для вычисления факториала
FACT:
Р=1
FOR i=l TO К
P=P*i NEXT i RETURN

Рассмотрим работу программы. Начало стандартное: очистка экрана, запрос с клавиатуры исходных данных. Самое интересное начинается потом. Подпрограмма fact описана после слова end основной профаммы, что обусловлено простым желанием, чтобы профамма все же не зациклилась, а когда-нибудь все-
таки завершилась. Параметром подпрограммы является переменная к, для которой и вычисляется факториал.
В основной программе мы присваиваем переменной к значение переменной n, для которой мы хотим вычислить первый факториал из трех. После чего необходимо обратиться к подпрограмме. Для этого существует специальное слово gosub, после которого указывается имя подпрограммы (в нашем случае fact). Управление переходит на первый оператор, содержащийся в подпрограмме, затем выполняются все операторы подпрограммы, вплоть до ключевого слова return. Это означает, что подпрограмма закончилась, и управление передается в основную программу.

Предупреждение
Ключевое слово RETURN передает управление в основную программу на оператор, следующий за обращением к подпрограмме GOSUB.

Результатом выполнения подпрограммы в нашем случае является переменная р, в которой сохраняется значение факториала. Запомним первое полученное значение (фактически N-факто-риал) в переменной xi. Это необходимо сделать, т. к. подпрограмма будет выполняться несколько раз, и значение переменной р будет меняться.
Затем мы повторяем действия для переменных м и (n-m) , соответственно. Причем, в последнем случае уже не надо запоминать полученное значение факториала в новой переменной, т. к. больше обращений к подпрограмме не будет. Осталось вывести на экран полученное значение и запросить пользователя, будет ли он работать с программой еще.
Если непонятно, запустите пошаговый режим исполнения этой программы, разберитесь, как она работает (клавиша <F8>).

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

Итак, если все ясно, то надо бы выполнить ряд упражнений с использованием подпрограмм.
287. Для каждого двумерного массива Х(3, 4), Y(5, 3), Z(4. 6) определите номер строки с максимальной суммой положительных элементов.
288. Напишите программу, предлагающую пользователю меню из десяти функций, и строящую по ним графики этих функций в зависимости от выбора пользователя.
289. Напишите программу для младших школьников, проверяющую знание ими таблицы умножения от 2 до 12. Учащемуся задаются 5 примеров перемножения случайных чисел в заданном интервале. Оценкой является количество правильных ответов. Используйте подпрограмму для печати замечаний в ответ на каждый результат, вводимый пользователем. За правильный ответ— замечание должно быть поощрительным, за неправильный — сожалеющим. Чтобы сделать опрос более интересным, необходимо заготовить по десять замечаний для правильных и неправильных ответов и выбирать их случайным образом, обращаясь при этом к пользователю по имени, запрошенному в начале программы. Сделайте красочную заставку, легкое музыкальное сопровождение тоже не будет лишним.
290. Напишите программу, отображающую цветное кольцо. Используя ее в качестве подпрограммы, нарисуйте олимпийский флаг.
291. Напишите программы, находящие минимальное и максимальное значения из трех чисел X, Y и Z, введенных с клавиатуры. Используя их в качестве подпрограмм, напишите программу, вычисляющую значение следующей функции:

292. Даны два одномерных массива из 20 элементов каждый. Элементом является случайное целое двузначное число. Напишите программу с использованием подпрограммы, которая изменяет исходный массив путем деления четных чи сел на их индексы. Используя эту подпрограмму, определите, в каком из массивов было произведено больше замен.
В заключение несколько слов о подпрограммах в Russian Quick Basic. Мы привели самый простой способ написания и использования подпрограмм. Но если вы чувствуете в себе силы, то попробуйте самостоятельно разобраться с такими мощными инструментами Бейсика по написанию подпрограмм, как declare sub и call sub. He пожалеете!


Содержание раздела