Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по QBasic.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
535.04 Кб
Скачать

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