УРОК 14. Подпрограммы, процедуры, функции пользователя
В некоторых случаях, когда выполняются одинаковые действия, лучше воспользоваться подпрограммой. Приведем пример.
SCREEN 9
‘ вывод больших квадратов
FOR i1% = 1 TO 600 STEP 30
FOR i2% = 1 TO 270 STEP 30
i3% = 28: i4% = 0
GOSUB m1
NEXT i2%
NEXT i1%
‘ вывод средних квадратов
FOR i1% = 1 TO 600 STEP 30
FOR i2% = 1 TO 270 STEP 30
i3% = 18: i4% = 5
GOSUB m1
NEXT i2%
NEXT i1%
вывод маленьких квадратов
FOR i1% = 1 TO 600 STEP 30
FOR i2% = 1 TO 270 STEP 30
i3% = 10: i4% = 8
GOSUB m1
NEXT i2%
NEXT i1%
a$ = INPUT$(1)
STOP
m1:
LINE (i1% + i4%, i2% + i4%)-(i1% + i3%, i2% + i3%),, B
RETURN
В результате
работы программы на экране будет выведен узор, показанный на рисунке
ниже. Сам узор представляет собой квадраты, где находятся квадраты
меньшего размера, в которых также присутствуют квадраты еще меньшего
размера. В самом начале работы программы происходит прорисовка
квадратов из расчета 20 квадратов в строке (цикл «FOR i1% = 1 TO 600 STEP 30») , всего 9 строк ( цикл «FOR i2% = 1 TO 270 STEP 30»). Внутри цикла вызывается подпрограмма M1, при помощи оператора GOSUB, прорисовывающая квадраты.
Вначале область экрана делится на квадраты размеров 30х30 точек. Переменная i3% содержит смещение начальных координат выводимых квадратов, а i4% - смещение конечных координат выводимых квадратов относительно этой области. Длина стороны выводимого квадрата будет равна i4%-i3% = 28 пикселов. Далее следует вызов подпрограммы, в которой непосредственно выводится квадрат («GOSUB m1»). Сама подпрограмма находится в конце текста, после метки «m1:», а оканчивается она оператором «RETURN», при помощи которого происходит возврат управления на следующий оператор, который находится за GOSUB.
Следующие операторы выводят квадрат внутри квадрата, длина стороны которого равна i4%-i3% = 18 - 5 = 13 пикселов. В данных строчках так же имеется вызов подпрограммы GOSUB, и в ней используются те же переменные i3% и i4%, но с другими значениями.
В конце программы происходит вывод самых маленьких квадратов, длина стороны которых равна i4%-i3% = 10 - 8 = 2 пиксела. В данных строчках так же имеется вызов подпрограммы GOSUB, и в ней используются те же переменные i3% и i4%.
Заканчивается программа оператором STOP,
которая прекращает работу программы. Если такого оператора не
поставить, то следующая за ним подпрограмма будет выполнена еще один
раз, что нам не требуется. На экране изображение не задерживается,
поэтому перед оператором STOP находится строка «a$ = INPUT$(1)», при помощи которого происходит более медленная прорисовка изображения на экране.
Если
бы мы не использовали подпрограмму, то ее содержание пришлось бы писать
три раза в тексте программы. В случае, когда количество операторов в
подпрограмме внушительно, имеет смысл не включать их в программу каждый
раз заново, а написать один раз. Кроме того, в случае корректировки
подпрограммы, проще заменить один оператор, чем менять их несколько раз
в теле программы.
Данную
программу можно оптимизировать, заметив, что операторы цикла для
прорисовки квадратов одинаковы в разных подпрограммах. В результате
программа получится в следующем виде:
SCREEN 9
‘ вывод больших квадратов
i3% = 28: i4% = 0: GOSUB m1
‘ вывод средних квадратов
i3% = 18: i4% = 5: GOSUB m1
‘ вывод маленьких квадратов
i3% = 10: i4% = 8: GOSUB m1
a$ = INPUT$(1)
STOP
m1:
FOR i1% = 1 TO 600 STEP 30
FOR i2% = 1 TO 270 STEP 30
LINE (i1% + i4%, i2% + i4%)-(i1% + i3%, i2% + i3%),, B
NEXT i2%
NEXT i1%
RETURN
Для вывода не квадратов, а окружностей, требуется незначительные изменения, как это показано ниже.
SCREEN 9
‘ вывод больших квадратов
i3% = 28: i4% = 0: GOSUB m1
‘ вывод средних квадратов
i3% = 18: i4% = 5: GOSUB m1
‘ вывод маленьких квадратов
i3% = 10: i4% = 8: GOSUB m1
a$ = INPUT$(1)
STOP
m1:
FOR i1% = 1 TO 600 STEP 30
FOR i2% = 1 TO 270 STEP 30
i5% = (i3% - i4%) / 2
CIRCLE (i1% + i5%, i2% + i5%), i5%
NEXT i2%
NEXT i1%
RETURN
Как
видно, в программе изменен только текст подпрограммы, что сделать
проще, чем заменять несколько раз один и тот же текст в программе.
Иногда
вместо подпрограммы используется процедура. В чем их разница? В
подпрограмме на языке Бейсик переменные, которые используются в
программе и подпрограмме имеют общие значения. То есть, если в тексте
основной программы имеется переменная i1%,
то ее можно использовать и в подпрограмме. В процедуре это будут разные
переменные, несмотря на то, что они имеют одно и тоже имя, поэтому в
процедуру общие переменные нужно передавать.
Третьим
вариантом является использование функции. Одна из них – это функция
синуса. Данная функция является встроенной в язык, то есть разработана
и выполнена компанией-разработчиком. Однако и пользователь имеет
возможность создать свою функцию. Как работает функция? Если написать
строчку в программе: «x=SIN(y)», то в ней имеется имя функции (SIN), аргумент функции (y) и переменная, которая получает результат работы (х). Аналогично применяется запись пользовательской функции.
Для
знакомства с языком Бейсик достаточно использовать подпрограммы, однако
в справочной системе имеется несколько примеров для применения процедур
и функций (см. описание операторов COMMON, DECLARE, FUNCTION, ON…GOSUB, SUB).
Задачи.
1. Напишите программу для создания рисунков обоев, которые хотелось бы иметь в своей комнате.
2. Создайте рисунок для ткани, из которой бы имело смысл сшить себе одежду.
|