8. Символы операций в языке бейсик В языке Бейсик различают следующие операции: - арифметические операции - операции сравнения - логические операции - операции со строками знаков Арифметические операции представлены в следующей таблице: Символ операции I Значение I Пример ----------------------I-----------------I-------------- I I + I Сложение I A%+B% I I - I Вычитание I A%-B% I I * I Умножение I A%*B% I I / I Деление I A%/B% I I \ I Целочисленное I A%\B% I деление I I I ^ I Возведение в I A%^2 I степень I I I - I Знак минус I -A% I I MOD I Вычисление I A! MOD B! Дает целочисленный I модуля I остаток Результат арифметической операции приводится в соответствие с типом параметра результата. Пример: 10 а%=19/8 20 PRINT A% RUN 2 OK Примечания. При целочисленном делении операнды преобразуются в INTEGER-числа и по этой причине могут быть только из диапазона от -32768 до 32767. Результат INTEGER-деления является целочисленной частью частного обеих операндов. Примеры: 10\4=2 36.99\6.99=6 Операция вычисления модуля в качестве результата дает INTEGER-число, которое соответствует остатку целочисленного деления. Примеры: 10 MOD4=2 36.99 MOD 6.=0 Операторы сравнения представлены в следующей таблице: Символ операции I Значение I Пример ------------------------I----------------------I----------------- I I = I Равно I A%=B% I I <> I Не равно I A%<>B% I I < I Меньше I A% I Больше I A%>B% I I <= I Меньше или равно I A%<=B% I I >= I Больше или равно I A%>=B% Если операция выполнена, вырабатывается -1, в противном случае 0. Численные значения, возникающие при операциях сравнения, могут быть интересно использованы. Это видно из следующего примера, в котором определяется какое число из двух переменных больше или меньше. 10Z!=5.1 20 X!=3.5 30 MINWERT!=-(Z! > X!)*X!-(Z! <= X!)*Z! 40 MAXWERT!=-(Z! < X!)*X!-(Z! >= X!)*Z! 50 PRINT MINWERT!; MAXWERT! 60 END RUN 3.5 5.1 Логические операции представлены в следующей таблице: Символ операции I Значение I Пример -------------------------I---------------------------I------------------- I I NOT I Отрицание I NOT A I I AND I Логическое умножение I A AND B I I OR I Логическое сложение I A OR B I I XOR I Исключающее или I A XOR B I I IMP I Импликация I A IMP B I I EQV I Эквивалентность I A EQV B Значение логической функции "истина" представляется набором битов, не равных нулю, а значение логической функции "ложь"- нулем. Пример: 20 IF NOT EOF(I) GOTO 80 90 IF BE% > 70 AND HA! < 80 GOTO 100 Логические операции могут производится с двухбайтными величинами (INTEGER-значения в двоичном представлении), при этом производится побитная обработка. Это происходит по следующим правилам: Операция I 1 операнд I 2 операнд I Результат ----------------I---------------I---------------I------------- I 1 I 1 I 1 END I 1 I 0 I 0 I 0 I 1 I 0 I 0 I 0 I 0 ----------------I---------------I---------------I------------- I 1 I 1 I 1 OR I 1 I 0 I 1 I 0 I 1 I 1 I 0 I 0 I 0 ----------------I---------------I---------------I------------- I 1 I 1 I 0 XOR I 1 I 0 I 1 I 0 I 1 I 1 I 0 I 0 I 0 ----------------I---------------I---------------I------------- I 1 I 1 I 1 IMP I 1 I 0 I 0 I 0 I 1 I 1 I 0 I 0 I 1 ----------------I---------------I---------------I------------- I 1 I 1 I 1 EQV I 1 I 0 I 0 I 0 I 1 I 0 I 0 I 0 I 1 ----------------I---------------I---------------I------------- NOT I 1 I I 0 I 0 I I 1 ----------------I---------------I---------------I------------- Пример: A%=63 AND 16 A% равно 16 т.к. 63 В двоичном представлении: 111111 16 В двоичном представлении: 010000 ------- A% В двоичном представлении: 010000 А%=4 OR 2 A% равно 6 т.К. 4 В двоичном представлении: 0100 2 В двоичном представлении: 0010 ------ A% В двоичном представлении 0110 Вариант использования показан в следующем примере, в котором INTEGER-число в побитном представлении ( 1: бит установлен, 0: бит не установлен) подготовлено в виде строки знаков. 10 BF$=" " 20 INPUT "INTEGERZAHL"; IZ% 30 FOR I%=15 TO 0 STEP -1 40 BF$=BF$+STR$(ABS((IZ% AND 2^I%) -2^I%)) 50 NEXT I% 60 PRINT BF$ 70 END RUN INTEGERZAHL:? (EINGEGEBEN WIRD 143) * 0000000010001111 * вводится 143 Для строковых переменных действительна операция конкатенации т.е. соединения строк знаков. Она обозначается знаком операции "+". Сформированная таким образом строка знаков не должна быть длинее 255 знаков. Пример: 10 А$="об'единение " 20 B$="строк " 30 C$="символов" 40 D$=A$+B$+C$ 50 PRINT D$ RUN Об'единение строк символов ОК Для строк знаков действительны также операции сравнения. Сравнение происходит позначно, на базе представления в коде ASCII. Примеры: "AA" меньше, чем "AB" "строка" равна "строке" "DB" больше, чем "CB" "PS" больше, чем "P#" 9. Массивы (ARRAY) в языке Бейсик 9.1. Оператор описания DIM для массивов С помощью оператора описания DIM описываются массивы, имеющие одно или несколько измерений. Формат: DIM <обозначение переменной массива" (<верхние границы индекса>) [,<обозначение переменной массива> (<верхние границы индекса>)]... Могут описываться массивы различных типов, соответственно выбранному обозначению переменной. Число различных индексов может составлять максимум 255, т.е. теоретически могут быть описаны максимум 255-размерные массивы. Наименьший индекс каждого диапазона индексов по умолчанию равен нулю. С помощью варианта BASE1 (см. раздел 9.2.) Нижняя граница индекса может быть установлена равной 1. Пример: 10 DIM SI$(12), A%(5,5) 20 DIM X5#(5,3,3,5) Примечание: в языке Бейсик имеется возможность использовать массивы любой размерности с диапазоном индексов от 0 до 9 без этого неявного описания массива, т.к. оно приводит к трудночитаемым программам и противоречит современной методике программирования. Описание размерности массива должно происходить перед первым обращением к любому элементу массива. При этом, можно задавать верхнюю границу с помощью арифметического выражения, которое вычисляется к моменту описания массива. При работе Бейсик-компилятора, в качестве верхних границ нельзя использовать переменные или выражения. Это могут быть только константы. 9.2 Оператор OPTION BASE для произвольного задания нижней границы индекса при описании массива. С помощью оператора OPTION BASE нижняя граница индекса при определении размерности массива может быть задана равной 0 или 1. Формат: OPTION BASE N величина N может принимать значения 0 или 1. Пример: 10 FOR I%=0 TO 4 20 A(I%)=2*I% 30 PRINT A(I%) 40 NEXT RUN 0 2 4 6 8 OK 5 OPTION BASE 1 10 FOR I%=0 TO 4 20 A(I%)=2*I% 30 PRINT A(I%) 40 NEXT RUN SUBSCRIPT OUT OF RANGE IN 20 OK Примечание: По умолчанию OPTION BASE устанавливается равной 0. Этот оператор прежде всего служит для упрощенного перемещения Бейсик-программ, т.к. для других Бейсик-интерпретаторов (более старых) в качестве нижней границы индексной области по умолчанию задавалась 1. 9.3. Оператор ERASE для стирания областей памяти, занятых массивами. С помощью оператора ERASE могут быть изменены характеристики массива или очищена память, занятая уже ненужным массивом. Формат: ERASE <обозначение переменной массива> [,<обозначение переменной массива>]... Пример: 10 DIM A! (20,20,20) . . . 80 ERASE A! . . 100 DIM A!(40,5) Указание: в Бейсик-компиляторе этот оператор не выполняется. 10. Операторы цикла в языке Бейсик 10.1. Операторы FOR, TO, STEP и NEXT для образования цикла с фиксированным числом прохождений. С помощью операторов FOR, TO, STEP и NEXT программируются циклы с фиксированным числом прохождений. Формат: FOR <индекс цикла>=<начальное значение> TO <конечное значение> [] . . <Операторы> . NEXT [<индекс цикла>] [,<индекс цикла>]... <Индекс цикла> это простая числовая переменная типа INTEGER или REAL с простой точностью. <Начальное значение>,<конечное значение> и <шаг> могут быть числовой константой, числовой переменной или значением числового выражения типа INTEGER или REAL с простой точностью. Если шаг не задан, то по умолчанию используется значение 1. Все величины перед выполнением цикла вычисляются и во время выполнения цикла больше не могут быть изменены. Следствием этого является то, что нельзя осуществлять переход в тело цикла (тело цикла - последовательность операторов, которая начинается с первого оператора, идущего после оператора FOR и заканчивается оператором NEXT, имеющим тот же индекс цикла, что и FOR). Конец последовательности операторов тела цикла обозначается с помощью оператора NEXT. Могут встречаться циклы, вложенные друг в друга. При этом должно соблюдаться следующее условие: внутренний цикл должен полностью укладываться в границы внешнего цикла. Несколько вложенных друг в друга циклов могут заканчиваться, если это необходимо, одним оператором NEXT. В этом случае индексы цикла в операторе NEXT должны стоять в определенной последовательности, а именно, первым должен стоять индекс самого внутреннего цикла, а последним - самого внешнего. Выполнение тела цикла происходит таким образом, что все операторы внутри цикла обрабатываются несколько раз, для каждого допустимого значения индекса цикла. Первый проход происходит с начальным значением индекса цикла. Затем значение индекса цикла изменяется на величину шага. При положительном шаге индекс цикла увеличивается на величину шага, при отрицательном шаге - соответственно уменьшается. Следующий проход цикла происходит в том случае, если новое значение цикла еще не превысило (при положительном шаге), или не стало меньше (при отрицательном шаге) конечного значения. Пример: 10 FOR I%=10 TO 0 STEP -1 20 PRINT I% 30 NEXT 40 NED RUN 10 9 8 7 6 5 4 3 2 1 0 OK 10 J%=6 20 FOR I%=1 TO J%+4 30 PRINT I% 40 NEXT 50 END RUN 1 2 3 4 5 6 7 8 9 10 OK Примечания: Следует стремиться к тому, чтобы всегда описывать переменные цикла как INTEGER-переменные. За счет этого существенно ускоряется выполнение программы. Также следует избегать преждевременного выхода из тела цикла с помощью оператора перехода, т.к. из-за этого цикл остается активным и блокирует дополнительное место в памяти. Частое обращение к циклу может в этом случае привести к недостатку места в памяти и к прерыванию программы по ошибке. В этом случае, если FOR-NEXT-цикл должен быть обязательно преждевременно покинут, в зависимости от условия преждевременного прерывания индекс цикла должен быть изменен таким образом, чтобы за счет этого цикл планомерно закончился. Например, если из файла должны быть считаны не более 100 блоков. Фрагмент программы в этом случае может выглядеть так: . . . 110 OPEN "I", 1, "BEISPIEL" 120 FOR I%=1 TO 100 130 INPUT# 1, Z%, X1%, Y2! 140 IF EOF(1) THEN I%=101 . . . 180 NEXT I% . . Указание: При использовании переменных цикла и числовых выражений с нецелочисленными значениями, следует обращать внимание на точность округления, которая может привести к досрочному прерыванию цикла (условие окончания из-за погрешности округления не будет опознано). При использовании компилятора языка Бейсик, в качестве индекса цикла допустимы также переменные типа REAL с двойной точностью. 10.2. Операторы WHILE и WEND для образования циклов с переменным числом прохождений (итерационные циклы). С помощью операторов WHILE и WEND программируются циклы с переменным числом прохождений. Формат: WHILE <выражение> . .<Операторы> . WEND Цикл длится до тех пор, пока <выражение>, представляющее собой числовое выражеие, отличается от 0, или является "истиной" в качестве логического выражения. Цикл заканчивается, если <выражение> соответственно равно 0 или является "ложью". Операторы WHILE и WEND внутри программы могут встречаться только в виде пары. Внутри WHILE-цикла могут встречаться только выполняемые операторы, в частности, может быть вновь запрограммирован WHILE-цикл. Пример: 5 REM EINFACHSTES SORTIEREN 10 DBL%=9