[an error occurred while processing this directive]

.сс

.шп6

16 Условный цикл

.шп0

В этой главе мы узнаем как использовать цикл REPEAT UNTIL... и познакомимся с TRUE и FALSE (истинный и ложный).

В главе 6 мы познакомились с циклом FOR... NEXT... , который выполняет несколько указаний точное количество раз.

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

В такой ситуации необходим условный цикл. Цикл будет выполняться снова и снова пока (UNTIL) условие не будет удовлетворено. В качестве примера давайте напечатем случайные номера от 1 до 6, пока мы не получим 6. Мы не знаем сколько раз мы будем печатать, мы знаем только, что по крайней мере один раз.

.шп14

16.1  REPEAT

.шп1

REPEAT - это ключевое слово для начала условного цикла с проверкой в конце цикла. Тест производится после ключевого слова UNTIL. Слово REPEAT должно быть на своей собственной строке.

.шп0

Введите new, А затем

   10 mode := 6
   20 repeat
   30 x := rnd(6) // note :=
   40 print x
   50 until x = 6 // no colon

В строке 50 имеется проверка "равен ли х 6". х не присваивается числу 6.

Просмотрите программу.

.шп1

Операторы между REPEAT и UNTIL выделены.

.шп0

Запустите программу несколько раз.

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

.шп2

По крайней мере один раз

.шп1

Цикл REPEAT UNTIL... выполняется по крайней мере один раз.

.шп0

Условие, которое заканчивает цикл, не встречается, пока цикл не будет пройден первый раз. Все происходит совсем иначе в цикле FOR... NEXT... , который вообще не будет выполняться, если команда FOR устанавливает невыполнение цикла.

.шп14

16.2  Условные окончания

.шп0

Добавьте строки

  5 total := 0

и

 35 total :+ x // insrease by x

Измените 40 на

 40 PRINT x,total

и 50 на

 50 UNTIL total > 50

что должно показать

   5 total := 0
  10 MODE := 6
  20 REPEAT
  30   x := RND( 6) // note :=
  40   total :+ x // increase by x
  50   PRINT x,total
  60 UNTIL total > 50

Запустите прогрмму несколько раз.

Мы даже можем сделать TIME (время) условием окончания цикла. Добавьте

  15 TIME := 0

и измените 50 на

  50 UNTIL TIME > 50

Просмотрите, а затем запустите программу несколько раз.

Введите new, а затем следующую программу.

   10 mode := 5
   20 repeat
   30 numwer := rnd(3)
   40 colour numwer
   50 across := rnd(0,19)
   60 down := nd(0,29)
   70 print tab(across,down);"*"
   80 until across + down

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

Запустите ее несколько раз.

.шп1

Всякое условие, которое не является ложным, заканчивает цикл UNTIL... .

.шп14

16.3  Истинное и ложное (TRUE & FALSE)

Цикл REPEAT UNTIL... продолжается до тех пор, пока не удовлетворяется конечное усовие. Другими словами, пока конечное условие остается ложным, цикл будет продолжаться.

Давайте рассмотрим концепцию компьютера в отношении истинного и ложного.

.шп2

Числовые величины истинного и ложного

.шп0

Компьютер расматривает истинные и ложные условия, представленные чилсами. Мы можем заставить компьютер сказать нам, какие это числа.

Измените режим на 6 и введите

print false

и

print true

.шп1

TRUE и FALSE являются системными функциями, которые возвращают величины -1 для верного и 0 для ложного. Они будут показаны заглавными буквами.

.шп14

16.4  Числа, которые заканчивают циклы

Введите new, а затем

   10 enough := false
   20 mode := 6
   30 repeat
   40 print "Hear ";
   50 until enough

Запустите программу.

Когда вам нужно остановить ее, нажмите клавишу РЕД.

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

Измените строку 10 на

   10 enough := true

и запустите программу снова.

В этот раз цикл заканчивается, потому что условие истинное (TRUE), т.е. не ложное.

А сейчас измените строку 50 на

   50 until 0

Уничтожьте строку 10 и запустите программу снова.

Вам опять понадобится клавиша РЕД.

Просмотрите программу.

Компьютер воспринимает целые, как представителей условий ложных и истинных.

Измените строку 50 на

   50 until -1

и опять запустите программу.

Цикл заканчивается, потому что -1 представляет истинное условие.

Измените строку 50 на

   50 until 42

и опять запустите программу.

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

Компьютер рассматривает любое целое число, которое не равно 0 (т.е. не ложное), как конец цикла.

.шп2

Усечение

.шп0

Измените строку 50 на

   50 until 0.5

и запустите программу.

В этот раз нам понадобится клавиша РЕД.

Eсли за UNTIL следует действительное число (т.е. число, которое может иметь десятичную часть), то оно усекается (т.е. ее десятичная часть удаляется) а остающаяся целая часть проверяется, представляет ли она истинное или ложное условие.

-0.5 усекается до -0 (или 0), представляя ложное условие

+1.5 усекается до 1, представляя не ложное, т.е. истинное условие

-1.5 усекается до -1, представляя истинное условие

.шп14

16.5  Использование GET¤ и IN

.шп0

В качестве примера давайте попробудем вводить с клавиатуры буквы, пока мы не нажмем Y,y,N,n.

Мы можем использовать GET¤ для ввода символа клавиши, которая нажата и функцию IN для проверки находится ли буква в данном наборе.

Введите new и следующую программу.

   10 mode := 6
   20 print ''"Press Y or N"
   30 repeat
   40 reply¤ := get¤
   50 until reply¤ in "YyNn" <>0
   60 print "You pressed ";reply¤

Просмотрите программу, особенно строку 50.

Не ложное (Not FALSE)

Если нажимается клавиша Y или N, строка reply¤ in "YyNn" даст 1, 2, 3 или 4, в зависимости от того, нажата или нет РЕГ.

1, 2, 3 и 4 не равны нулю, а следовательно вызовут окончание цикла REPEAT UNTIL ... .

Запустите программу.

Попытайтесь нажимать любые клавиши кроме Y и N.

И хотя нажатие клавиш прослеживается, GET¤ не печатает эти символы.

А сейчас нажмите Y.

Повторите программу с y, N и n.

.шп14

16.6  Итоговые упражнения

.шп0

1. Выведите в печать случайные числа от 1 до 26, пока не напечатается 26.

2. Измените программу в вопросе 1 так, чтобы вывести на печать случайные числа от 65 до 90, пока не получится 90.

3. Измените программу в вопросе 2 так, чтобы вывести на печать случайные буквы, пока не напечатается Z.

4. Составьте прогрмму для печати случайных букв алфавита в случайных позициях на экране, пока не напечатается буква Z.

5. Измените программу со звездочками в секции 16.2 так, чтобы она работала в семи цветах в режиме 2.

6. Измените вопрос 5 так, чтобы вместо звездочек напечатать случайные буквы алфавита. Затем внесите дальнейшие поправки, чтобы напечатать случайные символы, чьи коды ASCII находятся в пределах от 32 до 126.

7. Напишите программу, чтобы задать вопрос, который требует ответ Да/Нет, принимает ввод Y или Nи печатает полностью Yes или No.

8. Напишите программу для проверки результата умножения двух случайных целых чисел (каждое от 2 до 9), которая позволяет задать любое количество вопросов, на которые нужно ответить за 30 секунд, а затем показать счет.

Ответы даны в главе 43.

.шп0

16.7  Выводы

1. REPEAT, которое находится на отдельной строке, является ключевым словом для начала выполнения комплекта команд до тех пор, пока условие становится не ложным (т.е. истинным).

2. Операторы, которые должны быть повторены, помещаются на следующих строках. При выводе для просмотра они выделяются.

3. Условие, заканчивающее цикл, помещается после ключевого слова UNTIL.

4. Цикл REPEAT UNTIL... выполняется по крайней мере один раз.

5. TRUE и FALSE являются системными функциями, соответственно возвращающими величины -1 и 0.

6. Цикл продолжаетмя до тех пор, пока условие после UNTIL остается FALSE.

7. При проверке условия после UNTIL, любая величина, которая после усечения до целой не равна нулю, воспринимается как не ложная, и цикл заканчивается. Следует заметить, что усечение означает, что, например, 0.1 и -0.1 будут восприняты как 0, давая ложное условие, а -1.1 будет усечена до -1, что представляет истинное условие.

.сс

.шп6

17 Хранение информации в программе

.шп0

В этой секции мы узнаем, как пользоваться операторами READ (читать), DATA (данные) и EOD (конец данных).

В предыдущих секциях мы узнали, как вводить величины с клавиатуры с помощью ключевых слов INPUT и GET. Они были практически полезны, когда мы хотели контролировать некоторую часть программы, напр. используемый цвет. Однако оператор INPUT может быть очень неэффективным: каждый раз при работе программы мы должны вводить информацию. Имеется и иной способ, с помощью которого мы можем вводить в компьютер информацию, используя операторы для данных.

.шп14

17.1  DATA (данные)

.шп0

Данными можно считать "ряд величин, к которым можно обратиться".Компоненты данных можно хранить в строке программы.

.шп1

DATA является ключевым словом, которое может быть поставлено в начале строки программы. Оно указывает на то, что последующие компоненты можно использовать в программе, напр. 1000 DATA 2,3,4,5,6,7,8,9,10,Jack,Queen,King,Ace

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

.шп14

17.2  READ (читать)

.шп1

Оператор READ используется каждый раз, когда нам необходимо взять величину из списка DATA и присваивает ее переменной, напр. READ number or READ name¤.

.шп0

Введите new и следующую программу:

   10 mode :-= 6
   20 repeat
   30 read number
   40 print number
   50 until number < 0
   60 data 5,4,3,2,-999

Запустите пограмму.

Измените 60 на

   60 DATA 5,4,3,2,1

и запустите программу снова.

А что означает EOD в конце сообщения об ошибке?

.шп14

17.3  EOD

.шп0

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

В Комале имеется маркер, указывающий когда мы подошли к концу данных (End of data - EOD).

.шп1

EOD - системная функция, которая возвращает одну из двух величин, TRUE (истинная), -1, или FALSE (ложная), 0. До тех пор, пока для чтения еще есть данные, EOD устанавливается на ложную. Когда все данные прочитаны, EOD устанавливается на истинную.

.шп0

Измените строку 50 на

   50 UNTIL eod

и опять запустите программу.

В этот раз программа закончится без сообщения об ошибке.

Введите

   5 data 10,9,8,7,6

просмотрите и запустите программу.

Чтение данных в последовательности

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

.шп14

17.4  RESTORE (восстановить)

.шп0

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

.шп1

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

.шп0

Измените строки 20 и 50

   20 for item := 1 to 7
   50 next item

и добавьте

   70 restore
   80 read number
   90 print number

При просмотре получим

    5 DATA 10,9,8,7,6
   10 MODE :=6
   20 FOR item := 1 TO 7
   30   READ number
   40   PRINT number
   50 NEXT item
   60 DATA 5,4,3,2,1
   70 RESTORE
   80 READ number
   90 PRINT number

Запустите программу.

Как только первые семь элементов были прочитаны и напечатаны, RESTORE переводит указатель данных на первый элемент. И следующим прочитывается и печатается этот пункт.

.шп2

Метки

В программе можно хранить несколько комплектов различных данных.Если нам нужно обратиться к определенному комплекту, мы должны иметь возможность переставить указатель на начало этого комплектаданных. Для этого мы можем использовать "метки", которые обозначают начало комплекта данных.

.шп1

"Метку" можно установить в любом месте программы, но на отдельной строке. Метка обозначается двоеточием :, поставленным сразу после названия. Название метки должно подчиняться тем же правилам, что и переменные.

.шп2

RESTORE с меткой

.шп0

Введите

   55 second_set:

Измените 70 на

   70 RESTORE second_set

.шп1

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

.шп0

Запустите программу.

Просмотрите программу и проверьте как работали RESTORE и метка.

.шп14

17.5  Чтение строковых данных

.шп0

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

.шп14

17.6  Чтение сразу нескольких элементов.

.шп0

Такие команды как

READ x<y<z

или

READ a¤,b¤,c¤

или

READ name¤,code,tel_number

позволяют присвоить одной строке несколько переменных.

Введите new.

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

   10 MODE := 6
   20 REPEAT
   30   READ name¤,address1¤,address2¤,town¤,code¤
   40   CLS
   50   PRINT ''name¤'address1¤'address2¤'town¤'code¤
   60   PRINT TAB( 5,20);"Press Space Bar"
   70   space¤ := GET¤
   80 UNTIL EOD
   90 DATA "Mr J.R. Smith","123, Parkside"
  100 DATA "Newton St. Thomas",SOMETOWN,S011 1CE
  110 DATA "Sir Edwin Drood, M.P.",The Manor
  120 DATA Littleton,Nr ROCHESTER,RO1 5TE

Добавьте свои собственные строки с данными и запустите программу.

.шп14

17.7  Кавычки и пробелы внутри строковых данных

.шп0

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

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

Если первый символ строки не является кавычками, то строка будет прочитана точно так, как она появляется в списке данных, включая кавычки, вводные пробелы (кроме первого пункта в списке данных), конечные пробелы (кроме последнего пункта в списке данных).

Например:

 2200 DATA The "Boss","""Equality"""
 2210 DATA "2, Par's Avenue",NOWHERE
 2220 DATA NO1 4US

Строки данных в приведенной программе дадут

The "Boss"
"Equality"
2, Par's Avenue
NOWHERE
NO1 4US

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

.шп14

17.8  Демонстрационная программа

.шп0

В этом примере будут прочитаны цифровые и строчные данные. Введите new, а затем:

  100 MODE :=6
  110 //
  120 REPEAT
  130   READ x,y,good¤,bad¤
  140   PRINT "What is ";x;" times ";y'
  150   INPUT "Your answer is > ":answer
  160   IF answer = x * y THEN
  170     PRINT ',good¤'
  180   ELSE
  190     PRINT ',bad¤'
  200   END IF
  210 UNTIL EOD
  220 // 
  230 DATA 7,9,Good,Sorry
  240 DATA 12,8,Splendid,Incorrect
  250 DATA 23,76, Exellent,Not quite
  260 DAIA 2,2,Well done,Oh dear !

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

.шп14

17.9  Данные, которые могут быть численными или строковыми

.шп0

Если цифры даны, как элемент данных, то они могут быть прочитаны или как строка, или как число (если только не поставлены кавычки). Введите new, а затем:

   10 mode := 6
   20 print '"x¤","x¤ in ""12345"""
   30 repeat
   40 read x¤
   50 print 'x¤,x¤ in "12345"
   50 until eod
   70 data 3,4,5,1,2,6

Введите программу. Данные воспринимаются как строковые, если команда READ должна считывать строку.

Измените 20 на

   20 PRINT '"Numeric x"

40 на

   40 READ x

и 50 на

   50 PRINT x

и снова запустите программу. В этот раз данные воспринимаются как числа, потому что указание READ показывает, что предполагается чтение численных данных.

.шп14

17.10 Итоговые упражнения

.шп0

Ответы находятся в главе 43.

Что неправильно в следующих частях программы?

1.

  100 here
  110 DATA 1,2,3,4,5,6
  130 READ x
  140 PRINT x
  150 RESTORE here

2.

  100 DATA 9,10,Jack,Queen,King,Ace
  110 FOR card = 1 TO 3
  120   READ number
  130   PRINT number
  140 NEXT card

3.

  100 DATA 2 3 4 5 6 7 8 9
  110 REPEAT
  120   READ number
  130   PRINT number
  140 UNTIL EOD

4.

  100 suit:
  110 DATA Clubs,Diamonds,Hearts,Spades
  120 FOR choice := 1 TO RND( 4)
  130   READ suit¤
  140   RESTORE suit
  150 NEXT choice
  160 PRINT suit¤

5. Напишите программу, чтобы прочитать вопрос с многократным выбором, четыре варианта ответа и номер правильного ответа. Выведите вопрос и предлагаемые ответы на экран, затем введите ответ и оцените выбор как правильный, или неправильный.

6. Внесите поправки в программу 5 так, чтобы она принимала ответы до тех пор, пока не будет выбран правильный ответ.

7. Внесите поправки в программу 6 так, чтобы она принимала вопросы и ответы до тех пор, пока не кончатся данные.

.шп14

17.11 Выводы

.шп0

1. Строчные и цифровые данные можно хранить в строке программы, которая начинается с ключевого слова DATA.

2. Переменным можно присваивать величины с помощью ключевого слова READ.

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

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

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

6. Указатель можно вернуть на начало данных с помощью команды RESTORE.

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

8. Указатель можно поставить в определенное место командой RESTORE, за которой следует название меики. Пример: RESTORE here, где here: является ярлыком в данной программе.

9. EOD - это системная функция, которая возвращает или -1, истиннная или 0, ложная в зависимости от того, был ли достигнут End Of Data - конец данных или нет. EOD может быть использована как условие для окончания цикла REPEAT UNTIL....

.ст комал9

[an error occurred while processing this directive]