Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Языки Бейсик

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
622 Кб
Скачать

Глава VII. Управляющие операторы языка Бейсик

41

Перем._цикла

является числовой переменной.

 

Íà÷._çíà÷. è êîí._çíà÷. могут быть числовой константой или арифметиче-

 

ским выражением.

Знач_шага_цикла

может быть как числовой константой, так и числовой

 

переменной, положительной или отрицательной. Ес-

 

ли операнд STEP опущен, то значение шага равно 1.

При обращении к оператору FOR-TO сначала вычисляется шаг, начальное и конечное значение. Если при положительном значении шага полученное значение переменной цикла меньше или равно конечному значению, то выполняется последовательность операторов, следующая за оператором FOR-TO(тело цикла). Если полученное значение переменной цикла больше конечного значения, то происходит выход из цикла и управление передается оператору, следующему за NEXT. При отрицательном значении шага значение переменной цикла уменьшается с каждым циклом. Цикл выполняется до тех пор, пока значение переменной цикла не станет меньше конечного значения. Если при входе в блок FOR-TO заданное условие не выполняется, то управление сразу передается оператору, следующему за оператором NEXT. Блоки FOR-TO могут быть вложенными друг в друга.

Пример 7.5.1.

Посчитать число счастливых билетов в катушке автобусных билетов с номерами от 000 000 до 999 999. Счастливым считается билет, у которого сумма первых трех цифр равна сумме последних трех цифр.

'Программа подсчета счастливых билетов

FOR i = 0 TO 9 'цикл на первую цифру FOR j = 0 TO 9 'цикл на вторую цифру

FOR k = 0 TO 9 'цикл на третью цифру

FOR l = 0 TO 9 'цикл на четвертую цифру

FOR m = 0 TO 9 'цикл на пятую цифру

FOR n = 0 TO 9 'цикл на шестую цифру

'если совпали, то суммируем

IF i + j + k = l + m + n THEN s = s + 1

NEXT n 'конец шестого цикла

NEXT m 'конец пятого цикла

NEXT l 'конец четвертого цикла

NEXT k 'конец третьего цикла NEXT j 'конец второго цикла

NEXT i 'конец первого цикла CLS 'очистка экрана

PRINT “число счастливых билетов=“; s 'печать числа счастливых билетов END 'конец программы

По концу работы программа напечатает число 55 252.

Цикл называется арифметическим потому, что до начала цикла переменная цикла должна быть определена, то есть цикл выполняется определенное число раз.

Если в блоке не указан оператор FOR-TO или NEXT, то выдается сообщение:

NEXT áåç FOR

èëè

FOR áåç NEXT

42

Языки Бейсик

7.6. Оператор WHILE-WEND-итерационный цикл1

Операторы WHILE(пока)-WEND(конец) используются для многократного выполнения заданной последовательности операторов, заключенных в этом блоке, если количество циклов заранее не известно.

Формат записи оператора WHILE-WEND:

WHILE условие

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

тело цикла

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

WEND

ãäå

Условие — это выражение Бейсика, которое может быть оценено как истинное или ложное. Операторы тела цикла выполняются до тех пор, пока условие истинно(#0). Выход из блока следует, если условие ложно(равно 0).

Åñëè условие является условием равенства, например А=В, то при выполнения цикла WHILE-WEND сначала проверяется условие, а затем в зависимости от результата проверки выполняется или не выполняется тело цикла.

Åñëè условие является условием неравенства, например А<>B, то при выполнении цикла WHILE-WEND сначала выполняется тело цикла, а затем проверяется условие, заданное в операторе WHILE.

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

Если в блоке не указаны операторы WHILE или WEND, то система выдает сообщение об ошибке

WHILE áåç WEND

èëè

WEND áåç WHILE

Пример 7.6.1.

Вычислить значение квадратного корня y = x по итерационной формуле Ньютона:

ó(i+1)=y(i)+1/2(x/y(i)-y(i)) ãäå i={0,1,2,...}

а y(i+1) и y(i) — два последовательных приближения к искомому корню. Нача- льное приближение корня вводится с клавиатуры.

Итерационный процесс для х>1 ведется до тех пор, пока относительная погрешность при нахождении очередного приближения по абсолютному значе- нию не станет меньше заданного значения h. Можно отметить, что хотя в программе в условии оператора WHILE используется переменная у1, которая не определена вне цикла, это не приводит к каким-либо неприятностям в силу то-

Глава VII. Управляющие операторы языка Бейсик

43

го, что сначала выполняется тело цикла(УСЛОВИЕ является неравенством), где переменной у1 присваивается числовое значение и только затем проверяется условие (у1-у)>=h.

'Вычисление квадратного корня по итерационной формуле Ньютона DIM x AS DOUBLE 'определение переменных

DIM y AS DOUBLE 'с двойной точностью

DIM h AS DOUBLE

INPUT “Введите число, из которого необходимо извлечь корень.

Õ=“; x

INPUT “Введите начальное приближение. У=“; y0

INPUT “Введите точность вычисления. h=“; h y= y0 'присвоить начальное значение у

WHILE ABS(y1 — y) >= h 'начало итерационного цикла

y2 = y + 1 / 2 * (x / y — y) 'вычисление очередного приближения y1 = y: y = y2 'переназначения

WEND 'конец цикла

PRINT “значение корня равно “; y 'Вывод на экран значения корня END

7.7. Оператор DO-LOOP-безусловный цикл

Оператор DO-LOOP повторяет блок операторов до тех пор, пока не выполнится оператор EXIT DO.

Формат оператора DO-LOOP:

DO

[блок_операторов]

LOOP

Оператор DO-LOOP является частным случаем оператора DO-WHILE(UN- TIL)-LOOP (см.п.7.8), но настолько специфическим, что о нем стоит поговорить отдельно. По сути ключевое слово DO является меткой, на которую LOOP постоянно передает управление. Организуя такой безусловный цикл, необходимо позаботиться о том, чтобы в какой-то момент управление попало на оператор EXIT DO, который и обеспечит корректный выход из цикла, то есть на оператор, следующий за ключевым словом LOOP. Рассматривая этот оператор с точки зрения теории структурного программирования, можно найти только одно объяснение тому, что он до сих пор определен в Бейсике. Это преемственность языка, то есть программы, написанные на ранних версиях языка Бейсик, должны выполняться и на более поздних версиях языка, что конечно же является достоинством языка программирования. Но автор не рекомендует использовать данный оператор в программировании, поскольку при небольшом усилии всегда можно приспособить для решения возникшей задачи операторы арифметического или итерационного циклов или структуры SELECT CASE. При всем своем довольно богатом опыте программирования автор не смог придумать или найти такую задачу, которая решалась бы только с применение оператора безусловного цикла.

44

Языки Бейсик

В качестве примера использования оператора DO-LOOP рассмотрим программу, которая вычисляет факториал числа n(обозначается n!)-произведение чисел ряда 1,2,3,...n-1,n.

Пример 7.7.1.

'Программа, вычисляющая факториал числа n!=1*2*3*...*(n-1)*n

CLS 'очистка экрана дисплея

vvod: INPUT “введите число, факториал которого нужно вычислить”, n

IF n = 0 THEN 'проверка введенного числа на 0

PRINT “Хорошая шутка. попробуем еще раз?”

GOTO vvod 'переход на начало программы END IF

nn = n 'запоминаем введенное число

DIM nf AS DOUBLE 'отводим для результата переменную nf = n 'с двойной точностью

DO 'безусловный цикл

n = n — 1 'с выходом по EXIT DO

IF n > 0 THEN nf = nf * n ELSE EXIT DO

'вычисляем факториал числа

LOOP 'конец цикла

PRINT nn; “!=“; nf 'печать результата

INPUT “будете еще вычислять? (0-нет)”, n

IF n <> 0 GOTO vvod

END

7.8. Оператор DO-WHILE(UNTIL)-LOOP-итерационный цикл2

Оператор DO-WHILE(UNTIL)-LOOP повторяет блок операторов, пока условие верно, или до тех пор, пока условие не станет верным.

Формат оператора DO-WHILE(UNTIL)-LOOP:

DO [{WHILE,UNTIL} условие] [блок_операторов]

LOOP

èëè

DO [блок_операторов]

LOOP [{WHILE,UNTIL} условие]

ãäå

Условие — любое выражение Бейсика, которое может быть оценено, как истинное(не ноль) или ложное(ноль)

Блок_операторов — одна или несколько строк операторов Бейсика. Если несколько операторов записаны в одной строке, то они должны быть разделены двоеточием.

Если в операторе применяется ключевое слово WHILE, то цикл выполняется до тех пор, пока условие истинно.

Глава VII. Управляющие операторы языка Бейсик

45

Если в операторе применяется ключевое слово UNTIL, то цикл выполняется до тех пор, пока условие не станет истинным.

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

Пример 7.8.1.

'программа, вычисляющая сумму первых n членов ряда 1+1/2+1/3+....1/n. CLS 'очистка экрана дисплея

INPUT “введите число членов ряда”; n

a1: S = 1: j = 1 'S-сумма ряда; j-переменная цикла DO WHILE j < n 'начало цикла, делать, пока J < n

S = S + 1 / (j + 1) 'накапливаем сумму ряда j = j + 1 'изменяем переменную цикла

LOOP 'конец цикла

PRINT “сумма ряда равна “; S 'печать результата

INPUT “закончить работу(0-да,число членов ряда — нет)”; n IF n <> 0 GOTO a1

END

Условие выполнения цикла DO-WHILE(UNTIL)-LOOP проверяется перед выполнением блока_операторов. Очевидно, что внутри цикла переменные, присутствующие в записи условия, должны меняться, иначе произойдет зацикливание программы. Также очевидно, что в случае, если условие цикла перед входом в цикл ложно, то блок операторов не выполняется ни разу.

7.9. Оператор DO-LOOP-WHILE(UNTIL)-итерационный цикл3

Оператор DO-LOOP-WHILE(UNTIL) повторяет блок операторов, пока условие верно, или до тех пор, пока условие не станет верным.

Формат оператора DO-LOOP-WHILE(UNTIL):

DO [блок_операторов]

LOOP [{WHILE,UNTIL} условие]

ãäå

Условие — любое выражение Бейсика, которое может быть оценено, как истинное (не ноль) или ложное (ноль)

Блок_операторов — одна или несколько строк операторов Бейсика. Если несколько операторов записаны в одной строке, то они должны быть разделены двоеточием.

Если в операторе применяется ключевое слово WHILE, то цикл выполняется до тех пор, пока условие истинно.

Если в операторе применяется ключевое слово UNTIL, то цикл выполняется до тех пор, пока условие не станет истинным.

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

46

Языки Бейсик

Условие выполнения цикла DO-LOOP-WHILE(UNTIL) проверяется после выполнения блока операторов. Очевидно, что внутри цикла переменные, присутствующие в записи условия, должны меняться, иначе произойдет зацикливание программы. Также очевидно, что в любом случае блок операторов выполняется хотя бы один раз.

Пример 7.9.1.

Пример программного блока, который останавливает выполнение программы до тех пор, пока не будет нажата какая-либо клавиша.

PRINT “для продолжения нажмите любую клавишу”

DO: LOOP WHILE INKEY$ = ““ 'Цикл, пока функция INKEY$ 'не сняла с клавиатуры какой либо символ

7.10. Оператор SELECT-CASE-ENDSELECT — структура с условием

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

Формат записи оператора SELECT-CASE-ENDCASE:

SELECT CASE тест_выражение

CASE список_выражений_1 [блок_операторов_1]

[CASE список_выражений_2 [блок_операторов_2]]

.......

[CASE ELSE [блок_операторов_N]]

END SELECT

 

ãäå

 

Тест_выражение

— любое числовое или символьное выражение

Список_выражений_1 — одно или несколько выражений для сравнения с

Список_выражений_2

тест_выражением. В выражении ключевое слово IS

 

должно стоять перед любым знаком отношения.

Блок_операторов_1 — один или несколько операторов в одной или

Блок_операторов_N

нескольких строках

Аргументы из списка выражений могут принимать любую из следующих форм или их комбинаций и должны разделяться запятыми:

выражение[,выражение]...

выражение TO выражение

IS знак_отношения выражение

ãäå

Выражение — любое числовое или символьное выражение, совместимое с тест_выражением

Знак_отношения — один из следующих знаков отношения <,<=,>,>=,<>,=.

Глава VII. Управляющие операторы языка Бейсик

47

Какой список_выражений совпал с тест_выражением, тот блок операторов и выполняется, после чего управление передается оператору, следующему за ENDCASE. Если присутствует структура CASE ELSE, то блок соответствующих операторов выполняется, если ни один список выражений не совпал с тест_выражением.

Пример 7.10.1.

'Пример использования оператора SELECT CASE PRINT “выберите один из вариантов ответа” vvod: LOCATE 25, 20

INPUT “введите число, соответствующее ответу-1,2,3 или 4”; otvet

SELECT CASE otvet CASE 1

PRINT “Правильно” CASE 2

PRINT “почти правильно”

CASE 3

PRINT “очень приближенно” CASE 4

PRINT “Вы неправы”

CASE ELSE

BEEP: PRINT “будте внимательны:”: GOTO vvod: END SELECT: END

7.11. Оператор GOSUB-RETURN-выполнить подпрограмму

Операторы GOSUB (Go to SUBroutine-перейти к подпрограмме) и RETURN (возврат) позволяют выделить группу операторов программы в подпрограмму. К такой подпрограмме можно обратиться, начиная с любого ее оператора. Такая группа операторов всегда должна заканчиваться оператором RETURN. Операторы подпрограммы выполняются в той последовательности, в которой они записаны, за исключением случаев, когда в нее включены управляющие операторы.

Формат записи оператора GOSUB:

GOSUB метка_оператора

ãäå

Метка_оператора — это метка оператора подпрограммы, которому передается управление.

RETURN оператор, заканчивающий подпрограмму. Он передает управление оператору, следующему за оператором GOSUB.

Формат записи оператора RETURN:

RETURN

Параметры в операторе отсутствуют.

Пример 7.11.1.

Составить программу вычисления выражения

48

Языки Бейсик

у=х в степени a

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

GOSUB m1 'Обращение к подпрограмме

PRINT “y=“;x^a 'вывод на экран результата END 'конец программы

'Ï Î Ä Ï Ð Î Ã Ð À Ì Ì À

m1: CLS 'очистка экрана

PRINT “Введите данные”

INPUT “x=“;x 'ввод основания

INPUT “a=“;a 'ввод показателя степени

RETURN

Особенностью использования оператора GOSUB является “плавающее” начало. Подпрограмма может быть помещена в любое место основной программы. Подпрограмму можно вызвать из любой точки программы или другой подпрограммы. Вложенность подпрограмм друг в друга ограничена только оперативной памятью. Если в программе много циклов GOSUB, то выдается сообщение:

НЕ ХВАТАЕТ ПАМЯТИ

Если в программе выполняется оператор RETURN, а GOSUB не выполнялось, то выдается сообщение

RETURN áåç GOSUB

7.12. Оператор ON-GOTO — выбрать безусловный переход

Оператор ON-GOTO используется для передачи управления по списку меток.

Формат оператора ON-GOTO:

ON выражение% GOTO список-меток

ãäå

Выражение% имеет числовое значение в диапазоне от 0 до 255; Список-меток — набор меток программы, которые перечисляются через запя-

тую и именуют операторы программы. Числовое значение выражения указывает, какая по порядку метка выбирается из списка_меток для выполнения. Если числовое значение выражения равно 0 или не соответствует имеющимся порядковым номерам меток в списке_меток, то передача управления не выполняется и управление передается оператору, следующему за оператором ON-GOTO.

Пример передачи управления с помощью оператора

ON-GOTO:

ON K% GOTO a,b,c

Если К% равно 1, то управление будет передано оператору с меткой а; При К%=2 управление будет передано оператору с меткой b;

Глава VII. Управляющие операторы языка Бейсик

49

При К%=3 управление будет передано оператору с меткой c;

Во всех остальных случаях будет выполняться оператор, следующий за ON-GOTO.

7.13. Оператор ON-GOSUB-выбрать подпрограмму

Оператор ON-GOSUB выполняет переход на одну из нескольких меток, в зависимости от некоторого выражения.

Формат оператора ON-GOSUB:

ON выражение% GOSUB список-меток

ãäå

Выражение% — имеет числовое значение в диапазоне от 0 до 255; Список-метокнабор меток программы, которые перечисляются через запя-

тую и именуют подпрограммы GOSUB, каждая из которых заканчивается оператором RETURN. По окончании выполнения подпрограммы управление передается первому оператору, следующему за оператором ON-GOSUB. Если числовое значение выражения равно 0 или не соответствует имеющимся порядковым номерам, то никакая подпрограмма не выполняется и управление передается оператору, следующему за оператором ON-GOSUB. Если значение выражения% равно 1, то осуществляется переход на первую метку списка_меток, если значение выражения% равно 2, то осуществляется переход на вторую метку списка_меток è ò. ä.

Пример 7.13.1.

Выполнение двух подпрограмм с помощью оператора ON-GOSUB

 

INPUT

“Введите цифру 0, 1 или 2:”; F%

 

ON F%

GOSUB A1, A2

 

END

 

A1:

'Подпрограмма один

 

PRINT

“Вход в подпрограмму 1”

 

PRINT

“Выход из подпрограммы 1”

 

RETURN

 

A2:

'Подпрограмма два

 

PRINT

“Вход в подпрограмму 2”

 

PRINT

“Выход из подпрограммы 2”

 

RETURN

 

7.14.Оператор ON-ERROR-выполнить подпрограмму обработки ошибок

Оператор ON-ERROR включает обработку ошибок при обнаружении ошибки во время выполнения программы, передавая управление на подпрограмму обработки ошибок или возобновляя выполнение программы. При работе программы могут возникать не только ошибки программиста, которые конечно же должны

50

Языки Бейсик

быть исправлены во время отладки программы, и не только ошибки разработчи- ка или постановщика задачи, которые должны быть устранены во время опытной эксплуатации программы. Но такие ошибки, как сбой техники или оператора, который будет эксплуатировать вашу программу, к сожалению, программа и вы исключить не можете. И если ваша программа будет каждый раз заканчивать свою работу только потому, что оператор вставил не тот диск в дисковод или вообще выпустил из виду, что диск не вставлен в дисковод ( в просторечии: программа слетела), то вряд ли вы с гордостью признаетесь, что это ваше творение так “невоспитанно” себя ведет. Поэтому, надеясь на лучшее, предполагайте худшее. Конечно, очень важен опыт, который приобретается со временем, но предусмотреть, что дисковод или принтер может быть не готов к работе, вы просто обязаны, если надеетесь, что кроме вас вашей программой будет еще кто-нибудь пользоваться. Именно для этих целей существует оператор ON ERROR GOTO.

Формат оператора ON-ERROR:

ON ERROR GOTO метка

ãäå

метка — метка оператора подпрограммы обработки ошибок.

Для выключения обработки ошибок необходимо задать GOTO 0.

Если оператор ON-ERROR не используется, то любая ошибка выполнения завершает работу вашей программы.

Подпрограмма обработки ошибки должна содержать оператор RESUME, который продолжает выполнение программы после подпрограммы обработки ошибки.

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

Пример 7.14.1.

'программа демонстрирует работу операторов ON ERROR GOTO и

RESUME

cont: INPUT “введите имя файла:-”; file$ 'ввести имя файла

ON ERROR GOTO problem 'к подпрограмме обработки ошибки диска OPEN file$ FOR APPEND AS #1 'открыть файл как обновляемый INPUT “Что записать в файл?-”; zap$

PRINT #1, zap$ 'запись в файл CLOSE #1 'закрыть файл

INPUT “будете делать контрольное чтение(0-да)? — “; fl% SELECT CASE fl% 'проверка ответа

CASE 0 'åñëè äà-òî

ON ERROR GOTO problem1 'еще одна подпрограмма обработки 'ошибки при контрольном чтении файла

OPEN file$ FOR INPUT AS #1 'открытие файла для чтения DO 'цикл на чтение всех записей

INPUT #1, fzap$ 'чтение файла

PRINT fzap$ 'печать прочитанной записи

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