В этом параграфе мы покажем, как оформляются на языке Бейсик разветвляющиеся программы. Простейшей командой, изменяющей естественный порядок выполнения программы, является команда GOTO (GO TO - "перейти к..."). Эта команда имеет вид
GOTO N
где N - номер строки программы. По этой команде ЭВМ переходит к выполнению команды с номером N.
Вы знакомы с двумя способами записи ветвлений - неполной и полной. Ветвление в неполной форме записывалось так:
Если Q, то:
Р
Конец ветвления
(здесь Q - условие, а Р - последовательность команд, которую надо выполнять в случае, когда условие верно).
Можно по-разному перевести на язык Бейсик эту форму записи. Если Р состоит из одного действия, то перевод такой:
IF Q THEN P
(слово IF означает "если", а слово THEN - "то"). Например:
10 IF X>0 THEN Y = LOG (X)
20 ...
Если значение переменной х>0, то ЭВМ вычислит ln x и присвоит результат переменной у, а затем будет выполняться команда с номером 20. Если же значение x не превосходит нуля, то сразу будет выполняться команда с номером 20.
Допустим теперь, что последовательность Р состоит из нескольких действий. Тогда сокращенная форма ветвления будет записываться сложнее. Пусть, например, в Р содержится 6 действий P1, ..., Р6, ветвление должно начинаться со 120-й строки, а следующая после ветвления команда имеет номер 150. Это означает, что в случае невыполнения условия Q надо перейти к команде 150. Поэтому запись будет такой:
120 IF NOT (Q) THEN GOTO 150
121 P1
122 P2
. . . . . . . . . .
126 P6
150 ...
Здесь NOT (Q) означает отрицание условия Q (NOT - "не"). Например, NOT (X<Y) означает Х> = Y, a NOT (X = Y) означает X<>Y.
Отметим еще, что в строках вида
IF ... THEN GOTO К
где К - номер строки, одно из слов, GOTO или THEN, можно не писать, т. е. три команды
IF ... THEN К
IF ... GOTO К
IF ... THEN GOTO К
означают одно и то же.
Например, алгоритм нахождения максимума из двух чисел:
Запросить А, В.
Присвоить М значение А.
Если М<В, то:
Присвоить М значение В.
Конец ветвления.
Сообщить М.
На языке Бейсик можно записать так:
10 INPUT А,В
20 М = А
30 IF M<B THEN М=В
40 PRINT M
50 END
Тот же алгоритм можно перевести на язык Бейсик и иначе:
10 INPUT А,В
20 М = А
30 IF N0T(M<B) THEN 50
40 М = В
50 PRINT M
60 END
Покажем теперь, как записать на языке Бейсик команду ветвления в полной форме:
Если Q, то:
Р
Иначе:
Т
Конец ветвления.
Аналогично предыдущему, если Р и Т состоят из одного действия, то удобно переводить так:
IF Q THEN P ELSE T
(ELSE - иначе).
Если же Р или Т состоят из нескольких действий, то удобнее переводить следующим образом (для примера: пусть Р состоит из трех, Т - из четырех команд, ветвление начинается с 530-й строки, следующая за ветвлением строка имеет номер 600):
Проверьте, что, исполняя этот фрагмент, ЭВМ выполнит команды P1, Р2, Р3, если условие Q выполняется, и команды Т1, T2, Т3, Т4, если Q не имеет места. А затем, после выполнения соответствующей серии команд, ЭВМ перейдет к выполнению команды, записанной в строке 600.
Рассмотрим пример программы для вычисления значения функции по следующему правилу:
10 INPUT X
20 IF Х>=2 THEN Y=SQR(X) ELSE Y=ABS(X)
30 PRINT"Y="Y
40 END
Можно было эту программу записать и так:
10 INPUT X
20 IF X>=2 THEN 50
30 Y=ABS(X)
40 GOTO 60
50 Y=SQR(X)
60 END
Составим теперь математическую модель и программу решения следующей "артиллерийской" задачи.
Задача. На заданном расстоянии от пушки находится стена. Известен угол наклона пушки и начальная скорость снаряда. Попадет ли снаряд в стену?
Стрельба из пушки
Сначала, как обычно, выскажем упрощающие предположения. Снаряд считаем материальной точкой, сопротивлением воздуха и размерами пушки пренебрегаем. Разумеется, мы считаем также, что выполняются законы Ньютона. Из условия задачи видно, каковы в ней исходные данные: это угол а, начальная скорость v, расстояние до стены S и высота стены h. Результатом является одно из сообщений "попал" или "не попал". Начальные данные подчиняются естественным ограничениям: 0<α<π/2, S>0, h>0, 0<v<1000 м/с (подумайте, как можно обосновать эти ограничения). Теперь нам надо записать на языке математики тот факт, что снаряд попал в стену. Для этого надо найти высоту L снаряда на расстоянии S от пушки: ведь попадание снаряда в стену означает, что L находится в пределах от 0 до h.
Значит, нам надо вывести формулу для определения L. Как вы знаете из курса физики, перемещения снаряда по горизонтали и вертикали за время t равны, соответственно:
x = (v cos α) t; y = (v sin α) t-gt2/2,
где g - ускорение свободного падения (9,8 м/с2). Определим, сколько времени понадобится снаряду, чтобы преодолеть расстояние S:
t = S/(v cos α).
Подставив это значение t в выражение для у, получим значение L:
Конечно, значение L, вычисленное по этой формуле, может оказаться и отрицательным. Это означает, что снаряд до стены не долетит. Если же L окажется больше h, то снаряд перелетит через стену. Вот математическая модель и построена.
Составим алгоритм для ВЫЧИСЛИТЕЛЯ:
Сообщить "Введите начальную скорость снаряда, расстояние до стены, высоту стены".
Запросить v, S, h.
Сообщить "Введите угол наклона ствола пушки".
Запросить А.
Если Vν≤0, то:
Сообщить "Скорость должна быть положительной".
Стоп.
Конец ветвления.
Если vν≥1000, то:
Сообщить "Скорость слишком велика".
Стоп.
Конец ветвления.
Если S≥0, то:
Сообщить "Расстояние должно быть положительным".
Стоп.
Конец ветвления.
Если h≤0, то:
Сообщить "Высота стены должна быть положительной".
Стоп.
Конец ветвления.
Если A≤0, то:
Сообщить "Пушка не должна стрелять в землю".
Стоп.
Конец ветвления.
Если А≥3,14/2, то:
Сообщить "Пушка направлена не в сторону стены".
Стоп.
Конец ветвления.
Присвоить L значение
Если L>h, то:
Сообщить "Снаряд не попал в стену...".
Стоп.
Конец ветвления.
Если L<0, то:
Сообщить "Снаряд не попал в стену...".
Иначе:
Сообщить "Попал!!!"
Конец ветвления.
Стоп.
А теперь переведите этот алгоритм на язык Бейсик (мы и так сделали большую часть работы).
Вопросы
1. По какой команде можно заставить ЭВМ, не проверяя никаких условий, изменить порядок выполнения действий?
2. Как в языке Бейсик оформляется ветвление:
а) в неполной форме;
б) в полной форме?
3. Для чего нужны первые 28 строк в алгоритме решения "артиллерийской" задачи?
Задания для самостоятельного выполнения
1. Переведите на Бейсик алгоритмы решения задач 5-7 из § 8 и 1-7 из § 9.
2. Найдите и исправьте ошибки в следующей программе нахождения квадратного корня из числа:
10 INPUT X
20 IF X> = 0 THEN 30
30 PRINT SQR(X)
40 GOTO 60
50 PRINT. "Корень вычислить невозможно"
60 END
3. Злоумышленник стер команду 100 в следующей программе нахождения корней квадратного уравнения:
10 INPUT А,Б,С
20 IF А <> 0 THEN 50
30 PRINT "Это уравнение не квадратное"
40 STOP
50 D=B^2 - 4∗A∗C
60 IF D<0 THEN 110
70 X1 = (-B + SQR (D) )/(2∗A)
80 X2 = (-B - SQR (D) )/(2∗A)
90 PRINT "Корни уравнения "X1,X2
100 ...
110 PRINT "Уравнение корней не имеет"
120 END
4. Составьте математическую модель, алгоритм и программу на Бейсике решения следующей задачи.
Задача. Пушка стреляет в направлении движения градового облака в тот момент, когда оно проплывает над пушкой. Известен угол наклона ствола, скорость снаряда, длина и скорость облака, высота, на которой движется облако. Попадет ли снаряд в облако?