Программирование на языке qbasic



бет11/13
Дата28.06.2016
өлшемі479.5 Kb.
#163119
1   ...   5   6   7   8   9   10   11   12   13

16. Процедуры

Процедурой называется независимый от основной программы кусок программы. Её можно использовать в разных местах основной программы.

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

Говорят, что процедуры расширяют множество стандартных операторов, а функции пользователя – множество стандартных функций.

Процедуру можно определить как часть программы и в виде отдельного модуля программы.

Оператор 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

Удобнее создавать процедуру в виде отдельного модуля. В этом случае надо:



  1. Взять из меню EDIT команду New Sub...

  2. Напечатать имя процедуры (без пробелов и других особых символов, используя только английские буквы и цифры)

  3. Между SUB и END SUB пишем операторы процедуры.

  4. Для возврата в основную программу выбираем из меню 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




Достарыңызбен бөлісу:
1   ...   5   6   7   8   9   10   11   12   13




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет