Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KNIGA.DOC
Скачиваний:
37
Добавлен:
09.02.2015
Размер:
162.82 Кб
Скачать

§ 11.4 Безусловный переход.

Бывают ситуации, когда в программе требуется пережать управление в другое место программы независимо от каких-либо условий. Это осуществляется с помощью оператора безусловного перехода GOTO.

ОБЩИЙ ВИД:

GOTO метка

где МЕТКА — это набор символов, начинающийся с буквы может содержать любое количество символов (букв и цифр) и заканчивающийся двоеточием.

Задача 1.

Выводить на экран квадраты чисел, вводимых с клавиатуры.

Примечание: Чтобы не произошло зацикливания, необходимо оговорить условие, при котором ввод чисел прекращается.

Решение.

CLS

PRINT “При вводе числа 0 программа закончит работу “

Met1:

INPUT “Введите число: “; A

IF A< >0 THEN PRINT A^2 ELSE END

GOTO Мet1

Если мы введем последовательно числа 7, -2, 0.4, 0, то получим следующий результат:

При вводе числа 0 программа закончит работу

Введите число: 7¿

49

Введите число: -2¿

4

Введите число: 0.4¿

0.16

Введите число: 0¿

ОК

Задача 2.

Выводить на экран строковую константу “QBASIC” до нажатия клавиши.

CLS

MET 1: PRINT ‘QBASIC”

IF INKEY$=“” THEN GOTO MET1

END

ПРИМЕЧАНИЕ:

Как уже было сказано выше, с помощью INKEY$ удобно создавать задержку в программе до нажатия клавиши. Например:

PRINT “Нажмите любую клавишу “

met: IF INKEY$=“” THEN GOTO met

В этом случае на экран будет выведена надпись “Нажмите любую клавишу “ и до нажатия какой-либо клавиши оператор IF “зацикливает “ сам себя, проверяя содержимое буфера клавиатуры.

С этой же целью можно использовать и цикл WHILE...WEND:

WHILE INKEY$=“”

WEND

§ 12 Подпрограммы.

В некоторых задачах возникает необходимость многократного использования одного и того же блока команд. Многократное повторение одного и того же блока команд в разных местах программы делает ее громоздкой и занимающей значительный объем памяти.

Создание программных модулей очень облегчает составление сложных программ. Очень удобно из разных точек программы обращаться к одному и тому же модулю с последующим возвратом в точку обращения.

Программный модуль, к которому происходит обращение, называют подпрограммой.

В QBASICE’е для организации подпрограмм существуют два оператора — GOSUB и RETURN.

ОБЩИЙ ВИД:

GOSUB метка

где метка — это первая строка подпрограммы.

Назначение оператора GOSUB — передача управления на выполнение подпрограммы.

В отличие от оператора GOТО, оператор GOSUB не только осуществляет безусловный переход на выполнение программной строки с меткой, но и запоминает адрес точки, из которой произошел переход, в специальном участке памяти — стеке возврата.

После выполнения подпрограммы, компьютер возвращает управление по адресу, хранящемуся в стеке возврата, и следующей будет выполняться команда, стоящая после оператора GOSUB.

Окончанием подпрограммы служит оператор

RETURN

То есть, в любой подпрограмме последней командой является оператор RETURN.

Основная программа обязательно должна заканчиваться оператором END.

В начале записывают основную программу, а потом подпрограмму. В одной программе могут быть обращения к нескольким подпрограммам.

Задача 1.

Найти значения функции Y=3X3+4X2для X=1; -3; 5; -4.

ПРИМЕЧАНИЕ:В этом случае придется 4 раза выполнять рассчеты по одной и той же формуле и выводить результаты на печать. Поэтому эти действия рационально будет выделить в подпрограмму.

CLS Результат:

X=1: GOSUB met

Х=1 Y=7

X=-3 Y=-45

X=5 Y=475

X=-4 Y=-192

X=-3: GOSUB met

X=5: GOSUB met

X=-4: GOSUB met

END

met: REM ПОДПРОГРАММА

Y=3*X^3+4*X^2

PRINT “X=“;X, “Y=“;Y

RETURN

Задача 2.

Написать программу рисования N вишенок. N вводит пользователь.

....................

N

SCREEN 9: COLOR 2, 7: CLS

INPUT “N= “; N

WHILE N<=0

PRINT “ОШИБКА! ПОВТОРИТЕ ВВОД!”

WEND

CLS

X= 30

Y= 50

WHILE Y<300

FOR I=1 TO N STEP 1

GOSUB СHERRY

X=X+50

IF X>600 THEN Y=Y+ 50: X= 30 : REM Если х превысит 600, то переходим

END IF : REM на новую строку

NEXT I

WEND

END

CHERRY:

CIRCLE(X,Y),20,4 :REM ягода

PAINT(X,Y),4

LINE (X, Y-20)-(X,Y-40),2 :REM веточка

CIRCLE (X+10, Y-30), 10, 2,,,1/3 :REM листочек

PAINT (X+10, Y-30),2

RETURN

ПРИМЕЧАНИЕ: В начале программы стоит защита от неверного ввода. Если пользователь введет число, которое меньше или равно нулю, то программа выдаст сообщение об ошибке и попросит повторить ввод.

В цикле по номерам вишенок задается координата Х центра окружности и происходит обращение к подпрограмме CHERRY, в которой рисуется вишенка. Если координата Х превысит 600, то увеличиваем значение координаты У, а Х присваивает начальное значение. Таким образом рисование вишенок перейдет на следующую строку.

Задача 3.

Нарисовать елочку:

30

10

20

30

Пусть высота каждого фрагмента елочки будет равна 10 пикселей, а длины будут равны 20, 40, 60.

Вынесем в подпрограмму рисование одного треугольника:

x,y

x-l/2,y+h x+l/2,y+h

РЕШЕНИЕ:

SCREEN 9:cls

H=10:X=30

L=20: Y=10: GOSUB EL

L=40: Y=20: GOSUB EL

L=60: Y=30: GOSUB EL

END

EL:

LINE(X,Y)-(X+L/2,Y+H),2

LINE-(X-L/2,Y+H),2

LINE-(X,Y),2

PAINT (X, Y+2),2

RETURN

Задача 4.

Нарисовать N елочек. N - вводит пользователь с клавиатуры.

Решение:

COLOR 2, 7: CLS

VVOD:

INPUT “N= “; N

IF (N<=0) OR (N>5) THEN

PRINT “ОШИБКА! ПОВТОРИТЕ ВВОД!” : GOTO VVOD

END IF

SCREEN 9: CLS: X=30

FOR I=1 TO N STEP 1

GOSUB FOREST

X=X+70

NEXT I

END

FOREST:

H=10

L=20: Y=10: GOSUB EL

L=40: Y=20: GOSUB EL

L=60: Y=30: GOSUB EL

RETURN

EL:

LINE(X,Y)-(X+L/2,Y+H),2

LINE-(X-L/2,Y+H),2

LINE-(X,Y),2

PAINT (X, Y+2),2

RETURN

Пояснение: В защите от неправильного ввода число N ограничено от 1 до 5, так как при наших размерах елочек помещается на экран не более пяти.

Подпрограмма FOREST рисует на экране всю елочку целиком, обращаясь к подпрограммеELдля рисования отдельных треугольников.

Любая программа в разное время может служить как основной программой, так и подпрограммой.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]