[an error occurred while processing this directive]

25.2 Формат CASE

Между END и CASE должен быть пробел.

Операторы внутри WHEN (когда) и OTHERWISE (иначе) выделяются двумя позициями.

За WHEN должны следовать:

- Ряд точных величин, разделенных запятыми.
  Пример: WHEN 0,1,2 или WHEN "A","B","C"
- Одиночное выражение. Пример: WHEN 2*x-3
- Условие. Пример: WHEN IN "YyNn"

или

- Комбинация точных величин и условий.
  Пример:
  WHEN 5, < -5

или

  WHEN >5, <-5, 99

Только один случай удовлетворяется

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

OTHERWISE (иначе) является общей ловушкой для действия, когда ни одно из условий не удовлетворяется. В структуре CASE не должно быть OTHERWISE, но если не требуется никакого действия, то это можно сделать ясным с помощью оператора NULL.

****************************************************************

82

26 Короткие формы

----------------------------------------------------

Там где нужно выполнить только одно указание, используются однострочные формы циклов FOR... NEXT... и WHILE ... .

Короткие формы не выделяются

26.1 Короткая форма FOR

В однострочных операторах FOR действие устанавливается после величин TO или STEP и команды DO. Пример:

FOR j := 1 TO 100 DO array(j) := RND( 999)

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

FLR j := 1 TO 100 array(j) := j

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

100 FOR k := 20 TO 15 STEP -1 PRINT k

будет показано как

100 FOR k := 20 TO 15 STEP -1 DO PRINT k

Единственным исключением является использование ? и !, когда может произойти некоторая путаница. Пример:

FOR i - 1 TO n DO ? NODE(I) = 0

DO в этом случае необходима, потому что n ? node(i) = 0 является действительным выражением.

26.2 Короткая форма WHILE

В однострочном операторе WHILE действие устанавливается после условия и ключевого слова DO.

100 WHILE INKEY(-99) = 0 PRINT ".";

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

WHILE INKEY(-99) = PRINT ".";

****************************************************************

183

Если в команде есть ошибка, то положение DO будет показано в сообщении об ошибке.

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

  100 WHILE n <= 0 INPUT "Enter a rositive number":n юудет показано как
  100 WHILE n <= 0 DO INRUT "Enter a rositive number":n

26.3 Исключения

Нельзя комбинировать короткие формы операторов FOR, IF или WHILE так, чтобы один являлся результатом другого. Например, следующая команда не разрешается.

IF reply = 5 THEN FOR j := 1 TO 10 DO a(j) :=j

****************************************************************

84

27 Многократные присваивания и размеры

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

27.1 Присваивания

Присваивания можно отделять точкой с запятой, например:

  100 red := 1; uellow := 2; white := 3 // assign colours
  110 r¤ := "Red"; a¤ := "Amber"; g¤ := "Green"
  120 temp := this; this := that; that := temp // swap

На одной строке можно присваивать и переменные различных типов, например:

  130 a3 := 1; b¤ := "two"; c := 3; MODE := 4

многократное присваивание может также быть результатом команды короткой формы, например:

  140 FOR j := 1 TO 20 DO a(j) := j; b(j) := j*Ъj

27.2 Размеры

При размещении нескольких размеров на одной строке их необходимо отделять запятыми, DIM можно ставить только один раз, например: 100 DIM thi¤ OF 5, thai¤ OF 10, other¤ OF 200

100 DIM array(5,4), name¤(10) OF 25, integer#(3,3)

****************************************************************

85

28 ELIF

-------------------------------------------

ELIF - это оператор, который производит такой же эффект, что и ELSE, сединенный с IF. Его можно использовать только внутри структуры IF, чтобы избежать последующие условия, имеющиеся внутри цикла IF.

28.1 Формат для ELIF

Формат для использования ELIF внутри цикла IF выглядит следующим образом

IF ........THEN
  .........
  .........
ELIF ......THEN
  .........
  .........
ELIF ......THEN
  .........
  .........
ELSE
  .........
END IF

Внутри структуры IF может быть более одного ELSE.

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

Удовлетворение первого теста

Выполняется только один из рядов операторов. Как только тест удовлетворяется, выполняются следующие за ним операторы. Программа затем переходит на строку, следующую за END IF.

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

   10 INPUT "Enter the number of a year > ":year
   20 //
   30 IF year MOD 4 <> 0 THEN
   40    // year doesn't divide by 4
   50    leap := FALSE
   60 ELIF year MOD 100 <> 0 THEN
   70    //year /4, not centuri

****************************************************************

186

   80    leap := TRUE
   90 ELIF year MOD 400 <> 0 THEN
  100    //year/100 not by 400
  110    leap := FALSE
  120 ELSE
  130    leap := TRUE
  140 END IF
  150 //
  160 PRINT year;" is";
  170 IF NOT leap THEN PRINT " not";
  180 PRINT " a leap year"

Каждое условие ELIF достигается, только если не удовлетворяются все предшествующие условия.

.сс

Она обозначается двоеточием, поставленным сразу же после любого имени, которое отвечает требованиям названия числовой переменной, например: here: или prices:. При обращении к метке дветочие не используется, например: RESTORE here.

Массивы.

Действительные, целые и строчные массивы могут иметь до восьми размеров. Размеры массива должны быть заданы до его использования, например:

DIM this¤(3,,4,5)

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

DIM this¤(1:3,-4,4:5)

Если нижняя граница не задается, то она принимается равной 0.

Пример: DIM whole#(7) дает whole#(0) to whole#(7).

При задании размеров строчного массива для каждого элемента резервируется 40 позиций, если с помощью OF не было зарезервировано больше или меньше. Например: DIM a¤(3,4) OF 5 создаст строчный массив от a¤(0,,0) до a¤(3,4), для каждого элемента которого зарезервировано 5 позиций.

****************************************************************

173

Имена файлов

При загрузке, сохранении, уничтожении или прогоне имя файла в кавычки не заключается.

Данные

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

Указатель данных можно вернуть на первый элемент данных командой RESTORE.

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

Функции и операторы.

IN - это бинарный оператор, который возвращает первую позицию, на которой одна строка встречается в другой.

ORD - это функция, которая возвращает код ASCII первого символа стоки. Это эквивалент ASC( ) в Бейсике, например: PRINT ORD ("A") или PRINT ORD (a¤).

RND (n), где n целое число больше, чем 1, производит случайное целое число от 1 до n.

RND ( a,b), где a и b целые числа, производит случайное целое число от а до b включительно.

RND (1) возвращает случайную десятичную величину между 0 и 1.

VAL возвращает величину, которую призвел бы аргумент, если бы он был числовым выражением.

:+ является командой для приращения переменной слева от знака на такое же количество справа. Например: price_of_fish :+ change имеет такой же эффект, что и более длинный оператор price_of_fish = price_of_fish + change. Она особенно полезна, когда включаются длинные названия переменных.

:+ можно также использовать со строками, напр. если a¤ := "BRAIN", тогда a¤ :+ "STORM" делает a¤ "BRAINSTORM".

:- является инструкцией для отрицательног приращения переменной слева от знака на такое же количество справа. Например, total :- discount имеет такой же эффект, что и более длинный оператор total := total - discount.

****************************************************************

174

:- нельзя использовать со строками.

Системные переменные могут быть переприсвоены с помощью :+ или :-.

Необходимо быть осторожным в отношении эффекта :+ и :-. Смотрите секцию по операторам присваивания в Части III.

Синтаксис

Операторы печати (,или ' или ;) необходимо ставить между всеми элементами в перечне PRINT.

Например: PRINT TAB(9);"here"

или: PRINT this¤,that#'other

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

****************************************************************

75

23 Вывод на принтеры и команда PRINT USING

----------------------------------------------

Результаты программы и ее листинг могут быть выведены на экран и, если требуется, на принтер.

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

Модуль последовательного интерфейса, который не входит в стандартную конфигурацию Агата (RS232), обеспечивает последовательный вывод. Параллельный принтерный порт обычно находится на пятом разъеме.

23.1 SELECT OUTPUT (выбор вывода)

Команда SELECT OUTPUT S вызываетпоявление листинга или материала для печати на экране и их передачу через последовательный вывод.

Команда SELECT OUTPUT P вызывает появление листинга или материала для печати на экране и их предачу через параллельный вывод.

Команда SELEKT OUTPUT D вызывает вывод только на экран.

За командой SELECT OUTPUT может следовать любой символ. Вывод определяет начальный символ. Любой другой символ, кроме S или Р направит вывод только на экран.

23.2 Форматы печати.

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

****************************************************************

176

23.3 ZONE

ZONE обычно присваивается шеснадцатиричная (база 16) величина, выстроенная тремя частями. Например ZONE := &020309 устанавливает печать во втором формате (который имеет фиксированное количество десятичных позиций), о3 указывает на три десятичные позиции и 09 указывает на ширину зоны в девять символов. Знак & указывает на базу 16.

23.4

Мы можем найти текущую величину ZONE с помощью указания напечатать эту величину. Сначала найдите символ ~ , это один из регистров Ч. Этот знак ставится перед числовой переменной, чтобы обратить вывод из десятичного числа в строку, содержащую шестнацетиричное представление. В машине без маленьких букв этот знак будет отображаться как ^.

Введите

PRINT ~ZONE

23.5 PRINT USING

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

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

PRINT USING "###.##":number

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

Строку можно печатать как часть команды PRINT USING.

Пример:

PRINT USING "#####.##":"Price iz ";price

что напечатает величину price с пятью позициями перед десятичной точкой и двумя после нее.

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

****************************************************************

177

Пример:

PRINT USING "1234.123":length

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

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

Допуск на знак минус.

Если предполагается, что величина будет отрицательная, для знака - необходимо оставить позицию. Напимер -99.99 является наибольшим отрицательным числом, которое может быть правильно помещено с помощью PRINT USING "###.##". PRINT USING осбенно помогает при печати правильно расставленных колонок цифр.

Пример:

PRINT USING "#####.###": .3'34.5'345.6' -345.6789

производит

    0.300
   34.500
  345.600
 -345.679

****************************************************************

78

24 WHILE (пока)

---------------------------------------------

WHILE используется как оператор-введения цикла.

24.1 Возможно не цикл.

Вот циклы, которые мы уже встречали:

- FOR... NEXT..., который выполняется точное количество раз;

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

Цикл WHILE используется, когда мы хотим выполнять ряд операторов неопределенное количество раз , или по возможности, вообще не выполнять. Перед тем, как перейти к этим операторам, производится тест.

Формат цикла WHILE имеет следующий вид:

WHILE ... DO
  Command1
  Command2
END WHILE

Посе WHILE дается условие. Если это условие удовлетворяется (т.е. имеет истинный результат), то операторы внутри цикла выполняются. Цикл продолжается, пока условие не становится ложным.

При вводе можно опустить ключевое слово DO. Оно будет вставлено автоматически.

Операторы внутри цикла выделяются двумя позициями.

END WHILE должны быть разделены пробелом.

24.2 Примеры

   10 WHILE NOT EOD
   20   READ text¤
   30   PRINT text¤
   40 END WHILE
   50 PRINT "That'all folks."
   60 DATA What's up Doc?

****************************************************************

179

  210 INPUT "Enter a number of pence ":amount
  220 INPUT "Enter scost of an apple in pence ":cost
  230 number := 0
  240 WHILE amount >= cost DO
  250   amount :- cost
  260   number :+ 1
  270 END WHILE
  280 PRINT "You have enough for";
  290 PRINT ;number;" apples"

  810 space_bar = -99
  820 PRINT "Print Space Bar to Continue"
  830 WHILE NOT INKEY (space_bar) DO
  840   NULL // pause until Space Bar Pressed
  850 END WHILE

  900 DIM a(1:1000)
  910 shift := -1
  920 FOR j := 1 TO 1000
  930   PRINT j,a(j)
  940   WHILE INKEY (shift) DO
  950     NULL // pause if shift pressed
  960   END WHILE
  970 NEXT j

*********

[an error occurred while processing this directive]