П р и м е р ы в л о ж е н н ы х ц и к л о в 1) Ok 2) Ok 10 FOR X=1 TO 100 10 'Инициализация диагональ 20 FOR Y=1 TO 10 ной (единичной) матрицы X(3,3) 30 ? "1000 раз" 20 FOR I=1 TO 3:FOR J=1 TO 3 40 NEXT Y 30 X(I,J)=INT(I/J)*INT(J/I) 50 ? "Tолько 100 раз" 40 NEXT J 60 NEXT X 50 NEXT I 3) 10 'Ввод двумерного массива MAS по столбцам 20 DIM MAS(30,20):FOR I=1 TO 20:FOR J=1 TO 30 30 INPUT MAS(J,I):? MAS(J,I):NEXT J,I Оператор ? MAS(J,I) позволяет осуществить контроль вводимой информации. Вопрос к читателю:что необходимо изменить в приведенном фрагменте,если Вы пожелаете ввести массив MAS по строкам? 4) Ok 5'Проверка результатов логических операций NOT,AND,OR,XOR,EQV,IMP для операндов i,j∈{-1,0}. 10 FOR I=-1 TO 0:FOR J=-1 TO 0 20 PRINT I;J;NOT(I);IANDJ;IORJ;IXORJ;IEQVJ;IIMPJ 40 NEXT:NEXT run -1 -1 0 -1 -1 0 -1 -1 -1 0 0 0 -1 -1 0 0 0 -1 -1 0 -1 -1 0 -1 0 0 -1 0 0 0 -1 -1 Ok Сравните полученные результаты с таблицей, приведенной ранее в разделе I.7.2. 5) NEW Ok 5'"Удобный" вывод на экран двумерного массива. 10 FOR I=1 TO 3:FOR J=1 TO 4:READ A(I,J):NEXTJ,I 15 FOR I=1 TO 3:FOR J=1 TO 4 20 'Обратите внимание на символ ";" в строке 25! 25 PRINT A(I,J);:NEXT J:PRINT:NEXT I 30 DATA 1,2,3,4,3,4,5,6,0,4,5,3 run 1 2 3 4 3 4 5 6 0 4 5 3 Ok Операторы FOR и NEXT,как правило,должны идти в паре и быть согласованы друг с другом. Если оператор NEXT выполняется раньше оператора FOR с тем же параметром цикла, то при выполнении такого NEXT выдается сообщение об ошибке "NEXT without FOR" ("Н е т о п е р а т о р а FOR д л я д а н н о г о NEXT"). Oператор FOR...NEXT - единственный способ в MSX-BASIC для изменения ес- тественного порядка выполнения операторов без задания номеров программных строк, на которые нужно перейти. Весьма поучительно сопоставить конструкцию FOR...NEXT с конструкцией цикла "пока" в школьном алгоритмическом языке: ──── пока у с л о в и е ──── нц ── с е р и я к о м а н д │ кц ── Oтметим, что в некоторых версиях BASIC (например, для персональных ком- фирмы IBM: IBM PC, IBM PC/XT, IBM PCjr) существует конструкция, почти до- словно повторяющая цикл "пока"; ──── ее структура ([11], с.74): WHILE у с л о в и е т е л о ц и к л а WEND здесь WHILE("while"-"пока"), WEND("конец цикла WHILE") - служебные слова. Оператор цикла WHILE повторяет выполнение операторов тела цикла до тех пор, пока выполняется требуемое условие. Если условие не истинно или ста- новится не истинным, операторы тела цикла не выполняются ни разу, и управ- ление передается первому оператору, следующему за WEND. Обратите внимание на то, что если условие оказывается л о ж н ы м (не удовлетворяется при первой же проверке),то операторы тела цикла вообще не выполняются! Как правило, условие в операторе цикла WHILE...WEND должно когда-ни- будь стать ложным, иначе повторение будет бесконечным. Впрочем, если Ваша программа вошла в бесконечный цикл или каким-нибудь другим образом вышла из-под Вашего контроля, н е п а н и к у й т е ! В MSX-BASIC предусмот- рена возможность п р е р ы в а н и я программы - одновременным нажатием на две клавиши "CTRL"+"STOP". Метод решения хорош, если с самого начала мы можем предвидеть - и далее подтвердить это, - что, следуя этому методу, мы достигнем цели. Г.В.Лейбниц Истина всегда оказывается проще,чем можно было предположить. Р.Фейнман Попытаемся циклом FOR...NEXT(!) описать цикл "пока". Следующая весьма ──── нетривиальная конструкция позволяет это сделать: · · · 10 IF NOT у с л о в и е THEN 60'Если условие ложно,то в цикл не входим! 20 FOR I=1 TO 0 STEP 1 'Оригинальный заголовок цикла, не правда ли? 30 т е л о ц и к л а 40 I = у с л о в и е 'Потрясающе! Если условие ложно, то I=0, и цикл заканчивается; если условие истинно,то I=-1, и мы продолжим выполнение тела цикла. 50 NEXT I 60 . . . 'Продолжение программы. Если в операторе IF использовать указатель шага цикла STEP 0, то цикл будет бесконечным. И н о г д а(?) это бывает полезным! П р и м е р 1. Вычислить сумму вида: ───────────── k S = ∑ n Ok n=1 5 DEFINT K,N,I,S:INPUT K:S=0:N=1 20 IF N>K THEN 70 30 FOR I=1 TO 0 STEP 1 40 S=S+N:N=N+1 'Т е л о ц и к л а 50 I=N<=K 60 NEXT I 70 PRINT S;"Тестовый пример:";K*(K+1)/2 run ? 100 5050 Тестовый пример: 5050 Оk Ясно,что в приведенной программе можно применить оператор цикла FOR... NEXT, поэтому рассмотрим пример, где использование оператора цикла FOR... NEXT не помогает. П р и м е р 2. Пусть для данного положительного числа S требуется на- ───────────── йти наибольшее натуральное K, такое, что Ok S ≥ 1² + 2² + ··· + K² . 10 DEFINT I,J:INPUT S:J=0 20 IF S<=0 THEN PRINT"S неположительно!":END 30 FOR I=1 TO 0 STEP 1 40 J=J+1:S=S-J^2 50 I=S>=0 60 NEXT I 70 PRINT J-1:END run run ? 23 ? 300 3 9 Ok Ok Из сопоставления примеров 1 и 2 ясно, что цикл "для" используется,как ─── правило,когда количество исполнений цикла известно заранее. Если же число исполнений определить нельзя, если цикл должен быть прерван не по достиже- нию параметром цикла конечного значения,а по какому-то другому условию (в примере 2: S ≤ 1²+2²+···+k²), необходим цикл "пока". ──── Прежде чем решать задачу,подумай,что делать с ее решением. Р.Хемминг В науке часто недостаточно решить какую-нибудь задачу или группу задач. После этого нужно присмотреться к этим зада- чам и заново осмыслить, какие же вы задачи решили.Нередко, решая одну задачу,мы автоматически находим ответ и на дру- гой вопрос, о котором раньше вовсе не думали. Н.Винер П р и м е р 3. Составить программу нахождения суммы возрастающей ариф- ───────────── метической прогрессии. NEW Ok 5 DEFINT I:INPUT A1,AN,D'А1-первый член арифметической прогрессии;АN-п оследний ее член;D-знаменатель (D>0!) 7 IF D<0 OR A1>AN THEN ?"Прогрессия должна быть возрастающей! Повторит е ввод!":GOTO 5 10 S=0:N=A1 20 IF N>AN THEN GOTO 70 30 FOR I=1 TO 0 STEP 1 40 S=S+N:N=N+D 'Тело цикла 50 I=N<=AN 60 NEXT I 70 ? S;"Тестовый пример:";((AN-A1)/D+1)*(A1+D/2*(AN-A1)/D) run ? 1,20,1 210 Тестовый пример: 210 Оk run ? 20,2,1 Прогрессия должна быть возрастающей! Повторите ввод! ? ... Другой способ программирования на языке программирования MSX-BASIC цик- ла WHILE...WEND предполагает использование "о п а с н о г о" оператора GOTO: 10 GOTO 100 20 операторы т е л а ц и к л а 100 IF у с л о в и е THEN GOTO 20 Если количество операторов тела цикла невелико,то допустима следующая конструкция: 10 IF у с л о в и е THEN операторы т е л а ц и к л а: GOTO 10 ELSE продолжение программы ... Если же количество операторов цикла велико, то можно операторы тела цикла поместить в подпрограмму (см. раздел IV.4), вызываемую оператором GOSUB: 10 IF условие THEN GOSUB 1000:GOTO 10 ELSE продолжение программы · · · 1000 Тело цикла · · · 1200 RETURN