Процедурой называется независимый от основной программы кусок программы. Её можно использовать в разных местах основной программы.
Процедуры и функции пользователя называют подпрограммами.
Говорят, что процедуры расширяют множество стандартных операторов, а функции пользователя – множество стандартных функций.
Процедуру можно определить как часть программы и в виде отдельного модуля программы.
Оператор GOSUB..RETURN
Основную программу можно направить на выполнение подпрограммы с помощью операторов GOSUB и ON...GOSUB .Подпрограмма возвращается в основную программу с помощью оператора RETURN, который возвращает программу туда, откуда она ушла по оператору GOSUB.
Пример:
SCREEN 12
algus:
PRINT "1. Рисуем круг"
PRINT "2. Рисуем прямоугольник"
PRINT "3. Рисуем круг и прямоугольник"
PRINT "4. Выйди из программы"
INPUT I
CLS
IF I = 1 THEN GOSUB ring 'запускаем процедуру круг
IF I = 2 THEN GOSUB kast 'запускаем процедуру прямоугольник
IF I = 3 THEN GOSUB molemad 'запускаем процедуру круг и прямоугольник
IF I = 4 THEN END 'программа закончена
GOTO algus
ring:
CIRCLE (320, 200), 100
RETURN 'возврат в основную программу
kast:
LINE (200, 200)-(300, 250), , B
RETURN ' возврат в основную программу
molemad:
GOSUB ring ''запускаем процедуру круг
GOSUB kast ''запускаем процедуру прямоугольник
RETURN ''' возврат в основную программу
|
Заметим, что оператор GOSUB не может быть без RETURN. Иначе будет ошибка. Отметим также, что одна процедура может вызывать другую. Например в процедуре- molemad).
Используем в последней программе оператор ON...GOSUB:
SCREEN 12
algus:
PRINT "1. Рисуем круг"
PRINT "2. Рисуем прямоугольник"
PRINT "3. Рисуем круг и прямоугольник"
PRINT "4. Выход из программы"
INPUT I
CLS
'процедура выбирается в зависимости от значения I
ON I GOSUB ring, kast, molemad, lopp
GOTO algus
ring:
CIRCLE (320, 200), 100
RETURN 'возврат в основную программу
kast:
LINE (200, 200)-(300, 250), , B
RETURN ''возврат в основную программу
molemad:
GOSUB ring
GOSUB kast
RETURN ''возврат в основную программу
lopp:
END
RETURN
|
Значения переменной I могут быть 1, 2, 3 или 4.
Оператор SUB...END SUB
Удобнее создавать процедуру в виде отдельного модуля. В этом случае надо:
-
Взять из меню EDIT команду New Sub...
-
Напечатать имя процедуры (без пробелов и других особых символов, используя только английские буквы и цифры)
-
Между SUB и END SUB пишем операторы процедуры.
-
Для возврата в основную программу выбираем из меню View команду Subs... и выбираем имя своей программы.
Общий вид процедуры:
SUB имя [(параметры)] [STATIC]
[операторы]
END SUB
|
То есть такой же, как и у функции пользователя.
Приведём пример процедуры BANG, которая очищает экран и печатает зелёным цветом в центр экрана слово "BANG" и ждёт нажатия клавиши:
SUB bang
CLS
LOCATE 12, 40 'помещаем курсор в центр экрана
COLOR 2 'выбираем зелёный цвет
PRINT "BANG" 'пишем слово bang
COLOR 7 'выбираем снова серый цвет
'ждём нажатия клавиши...
DO
LOOP UNTIL INKEY$ <> ""
'очищаем экран...
CLS
END SUB
|
Эту программу можно использовать следующим образом:
PRINT " Hello World!"
SLEEP 2 'спим 2 секунды
'вызываем подпрограмму оператором CALL
CALL bang
PRINT "Tere Maailm!"
SLEEP 2 'спим ещё 2 сек
CALL bang
|
Изменим предыдущую процедуру, сделав её зависимой от параметра:
SUB bang(tekst$)
CLS 'очищаем экран
LOCATE 12, 40
COLOR 2
PRINT tekst$ 'печатаем значение переменной tekst$
COLOR 7
DO
LOOP UNTIL INKEY$ <> ""
CLS
END SUB
|
Основная программа, использующая эту процедуру может выглядеть следующим образом:
CALL bang("TÖÖ")
CALL bang("TEGI")
CALL bang("AHVIST")
CALL bang("INIMESE")
|
Следующая процедура рисует концентрические окружности с заданным центром, радиусом, густотой и цветом. Это параметры процедуры.
SUB konring (x, y, raadius, tihedus, varv)
FOR i = 1 TO raadius STEP tihedus
CIRCLE (x, y), i, varv
NEXT i
END SUB
|
Используем эту процедуру в следующей программе:
SCREEN 12
CALL konring(320, 240, 100, 30, 2)
CALL konring(100, 150, 40, 2, 4)
|
Используя следующую основную программу и процедуру konring, создадим рисунок обоев:
SCREEN 12
FOR x = 0 TO 640 STEP 40
FOR y = 0 TO 480 STEP 40
CALL konring(x, y, 40, 10, 9)
NEXT y
NEXT x
|
Рассмотрим ещё одну программу:
DECLARE SUB ScreenSaver1 ()
DECLARE SUB ScreenSaver2 ()
DECLARE SUB ScreenSaver3 ()
DO
SCREEN 0 'текстовый экран
CLS
PRINT " Выбери screensaver? [1-3]"
PRINT " (для прерывания введи другую цифру)"
INPUT Valik$
SELECT CASE Valik$
CASE "1"
ScreenSaver1
CASE "2"
ScreenSaver2
CASE "3"
ScreenSaver3
CASE ELSE
END
END SELECT
LOOP
SUB ScreenSaver1
SCREEN 12 'Включаем графический экран
DO
x = INT(RND * 639) 'Генерируем координату x.
y = INT(RND * 479) 'Генерируем координату y
rad = INT(RND * 150) + 10 ' Генерируем радиус
col = INT(RND * 15) + 1 'Генерируем цвет
CIRCLE (x, y), rad, col 'Рисуем круг
LOOP UNTIL INKEY$ <> ""
END SUB
SUB ScreenSaver2
SCREEN 12 'Включаем графический экран
DO
x = INT(RND * 639) 'Генерируем координату x.
y = INT(RND * 479) 'Генерируем координату y
rad = INT(RND * 150) + 10 'Генерируем радиус
FOR r = 1 TO rad
col = INT(RND * 15) + 1 'Генерируем цвет
CIRCLE (x, y), r, col 'Рисуем круг
NEXT
LOOP UNTIL INKEY$ <> ""
END SUB
SUB ScreenSaver3
SCREEN 12
DO
x = INT(RND * 639)
y = INT(RND * 479)
rad = INT(RND * 150) + 10
col = INT(RND * 15) + 1
FOR r = rad TO rad - 10 STEP -2
CIRCLE (x, y), r, col
NEXT
LOOP UNTIL INKEY$ <> ""
END SUB
|
Достарыңызбен бөлісу: |