I.7. ОПЕРАЦИИ О п е р а ц и я в языке программирования - это совокупность действий, вырабатывающая некоторое значение, называемое р е з у л ь т а т о м опе- рации. Исходными данными для операции являются ее о п е р а н д ы (переменные, константы, функции), причем могут использоваться один или два операнда.Со- ответственно операции называются о д н о м е с т н ы м и и д в у х- м е с т н ы м и (у н а р н ы м и и б и н а р н ы м и). Операции в зависимости от типов операндов и результата делятся на сле- дующие группы: арифметические, отношения, логические, строковые, операции- функции. I.7.1. А р и ф м е т и ч е с к и е о п е р а ц и и В таблице в порядке уменьшения приоритета перечислены 8 арифметических oпeраций. ┌─────────────────┬──────────────────────────────────────┬─────────────┐ │ О п е р а ц и я │ Д е й с т в и я │П р и м е р ы│ ├─────────────────┼──────────────────────────────────────┼─────────────┤ │ ^ │ Возведение в степень │ X^Y │ │ - │ Изменение знака (унарный минус) │ -U │ │ *,/ │ Умножение, деление │ X*Y, X/Y │ │ \ │ Деление нацело │ X\Y │ │ MOD │ Нахождение остатка │ XMODY │ │ +,- │ Сложение, вычитание (бинарный минус) │ X+Y, X-Y │ └─────────────────┴──────────────────────────────────────┴─────────────┘ Следовательно, при отсутствии скобок вначале выполняется операция "^", затем "-"(унарный минус) и т.д. При прочих равных условиях операции одина- кового приоритета выполняются слева направо. Существует фраза: "my dear aunt Sally", ─ ─ ─ ─ которая помогает запомнить,что для получения правильных результатов надо сначала умножать("multiply") и делить("divide"),а затем складывать ("add") и вычитать("subtract"). Отметим, что операнд X операции "^" должен быть неотрицательным (X≥0) (однако, если операнд Y принимает целые значения, то операнд X может быть и отрицательным!). Поэтому,например,выражение ⁿ√X для целого нечетного n следует представ- лять в виде SGN(X)*ABS(X)^(1/n) (Х≠0). Теперь рассмотрим подробно операции: а) д е л е н и е н а ц е л о ; перед выполнением деления операнды преобразуются к целому типу путем от- брасывания дробных частей(операнды должны находиться в интервале от -32768 до +32767), полученное после деления частное преобразуется к целому типу путем отбрасывания дробной части. П р и м е р ы : 10\4 возвращает 2 , ───────────── 25.68\6.99 возвращает 4 ; b) н а х о ж д е н и е о с т а т к а (вычисление остатка); перед выполнением операции XMODY операнды X и Y преобразуются к целому ти- пу путем отбрасывания дробных частей; результатом операции является целое число, равное остатку от деления полученных целых чисел (остаток имеет знак делимого). П р и м е р ы : 10.4 MOD 4 возвращает 2 (10/4=2 и остаток 2), ───────────── 25.68 MOD 6.99 возвращает 1 (25/6=4 и остаток 1), 33567 MOD 2 возвращает сообщение "Overflow" ("П е р е п о л н е н и е")(подумайте, почему?), -7 MOD 8 возвращает -7. Заметим,что если при вычислениях встретилось деление на нуль, то фикси- руется ошибка "Division by zero" ("Д е л е н и е н а н у л ь"), и выполнение программы прекращается. При переполнении фиксируется ошибка "Overflow" ("П е р е п о л н е н и е"), и выполнение программы также прекращается. Переполнение возникает оттого, что в ячейку памяти компьютера программист пытается поместить "очень длин- ное" число. Слишком большая (по модулю) константа может не уместиться в отведенную для нее ячейку! При попытке работать с числом, большим, чем максимальное, компьютер вы- ведет на экран сообщение об ошибке "Overflow"(переполнение диапазона пред- ставимых в компьютере чисел). Попытка представления чисел, меньших, чем минимальное, не вызывает со- общения об ошибке, но само число будет округлено до нуля, что подразумева- ет невозможность его использования в качестве делителя. I.7.2. О п е р а ц и и о т н о ш е н и я. Л о г и ч е с к и е о п е р а ц и и Tertium non datur. Лат. изречение В операциях отношения используются следующие символы(знаки операций от- ношения): о п е р а ц и я проверяемое у с л о в и е п р и м е р ы = равенство X=Y <> или >< неравeнство X<>Y,X> больше X>Y <= или =< меньше или равно X<=Y,X== или => больше или равно X>=Y,X=>Y Операции отношения обладают равным приоритетом. Они применяются для сравнения двух величин, например: PT<=23 , K%(7,J)=-4 , A$>"КГПИ" . Результатом операции отношения для п р о г р а м м и с т а может быть одно из двух логических значений: T (первая буква английского слова "true" - "истина"), если соответствующее отношение истинно, и F (первая буква английского слова "false" - "ложь"), если соответствующее отношение ложно. Результатом операции отношения для Э В М является: 1) &В1111111111111111 = -1 , если соответствующее отношение и с т и н н о; 2) &В0000000000000000 = 0 , если соответствующее отношение л о ж н о. Результат операции отношения может быть использован для принятия реше- ния о дальнейшем ходе выполнения программы (см. раздел III.2.). По приоритету операции отношения следуют за арифметическими операция- ми и операцией конкатенации (см.далее). К логическим операциям относятся: логическое о т р и ц а н и е (инверсия) - символ "NOT", логическое у м н о ж е н и е (конъюнкция) - символ "AND", логическое с л о ж е н и е (дизъюнкция) - символ "OR", исключающее "и л и" (симметрическая разность) - символ "XOR", э к в и в а л е н т н о с т ь - символ "EQV", и м п л и к а ц и я (следование) - символ "IMP", (XOR - "eXclusive OR" ; EQV - "EQuiValence или exclusive or negation"; IMP - "IMPlication"). Логические операции выполняются над 16-б и т н ы м и ц е л ы м и опе- рандами со знаком, которые принадлежат отрезку [-32768,32767],в противном случае фиксируется ошибка: "Overflow" ("П е р е п о л н е н и е"). Логические операции выполняются над к а ж д о й п а р о й с о о т - в е т с т в у ю щ и х б и т о в операндов, т.е.каждый бит результата оп- ределяется значениями соответствующих битов в операндах. Операции над соответствующими битами выполняются по правилам, приведен- ным в следующей таблице истинности (диаграмма Вейча). ┌───┬───┬─────┬───────┬──────┬───────┬───────┬───────┐ │ X │ Y │NOT X│X AND Y│X OR Y│X XOR Y│X EQV Y│X IMP Y│ ├───┼───┼─────┼───────┼──────┼───────┼───────┼───────┤ │ 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 │ └───┴───┴─────┴───────┴──────┴───────┴───────┴───────┘ Операции в таблице перечислены в порядке убывания приоритетов. Следующие примеры демонстрируют выполнение логических операций.Символы () указывают на то, что число в круглых скобках записано в двоичной сис- ² теме счисления. П р и м е р ы: ───────────── 1) 15 AND 14 ──▶ 14 , т.к. 15=(1111) , 14=(1110) , далее ² ² 15 = (1111) = 1 1 1 1 ² │ │ │ │ AND AND AND AND = (1110) = 14 │ │ │ │ ² 14 = (1110) = 1 1 1 0 ² 2) 63 AND 16 ──▶ 16 ,т.к. 63=(111111) , 16=(10000) , далее ² ² 63 = (11111) = 1 1 1 1 1 1 ² │ │ │ │ │ │ AND AND AND AND AND AND = (10000) =16 │ │ │ │ │ │ ² 16 = (10000) = 0 1 0 0 0 0 ² 3) (-1)AND 8 ──▶ 8 ,т.к. -1=(1111111111111111) 8=(1000) ² ² 4) 4 OR 2 ──▶ 6 , т.к. 4=(100) , а 2=(10) ² ² 5) (-1)OR(-2) ──▶(-1) , т.к. -1=(1111111111111111) , ² а -2=-(10) =(1111111111111101 + 0000000000000001) = ² ² =(1111111111111110) ² 6) NOT(-1) ──▶ 0 ; NOT(2) ──▶ -3 7) &H0F AND &H08 ──▶ &H08 При выполнении операции AND над аргументами &H0F и &H08 из &H0F выделя- ется четвертый бит, начиная с младшего бита, а все остальные биты маскиру- ются (зануляются). Подобная операция, при выполнении которой для какого- либо байта производится маскирование одного или нескольких битов,называет- ся м а с к и р о в а н и е м битов. Оно позволяет указать компьютеру,ка- кие органы управления должны быть включены (состояние 1), а какие - выклю- чены (состояние 0). Если значения операндов принадлежат числовому множеству, состоящему из двух элементов: 0 и (-1), то в результате логической операции будет полу- чен л и б о 0, л и б о (-1). Таким образом, можно составить таблицу: ┌──┬──┬─────┬─────────┬────────┬─────────┬─────────┬─────────┐ │ X│ Y│NOT X│ X AND Y │ X OR Y │ X XOR Y │ X EQV Y │ X IMP Y │ ├──┼──┼─────┼─────────┼────────┼─────────┼─────────┼─────────┤ │-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 │ └──┴──┴─────┴─────────┴────────┴─────────┴─────────┴─────────┘ Результатом логической операции для п р о г р а м м и с т а может быть одно из двух логических значений: T (первая буква английского слова true - "истина") или F (первая буква английского слова false - "ложь"). Результатом логической операции для к о м п ь ю т е р а является либо: 1) целое число, отличное от нуля (этот случай соответствует логическо- му значению Т); 2) нуль (этот случай соответствует логическому значению F). По приоритету логические операции следуют за арифметическими операция- ми и операциями отношения.Так же,как и операции отношения, логические опе- рации могут быть использованы для принятия решения о дальнейшем ходе вы- полнения программы (см. раздел III.2.). I.7.3. С т р о к о в ы е о п е р а ц и и 1. Значения строковых переменных могут объединяться с помощью знака "+" - операция к о н к а т е н а ц и и или с ц е п л е н и я ("concatenation"-"сцепление");отметим,что иногда(!)в операторе PRINT знак "+" можно опускать. П р и м е р: в результате выполнения операции конкатенации вида ─────────── "NEW" + "-YORK" получим строковую константу "NEW-YORK". 2. Строковые переменные могут сравниваться с помощью тех же операций отношения, что и числовые: = , < , > , <> , <= , >= . С т р о к о в у ю переменную можно сравнивать т о л ь к о со с т р о- к о в ы м и переменными ! Для компьютера значением символа является его к о д (цифровое представ- ление символа), т.к. вычислительная машина работает только с числами. При вводе в компьютер символы преобразуются в к о д в соответствии с Амери- канским стандартным 8-разрядным кодом для обмена информацией ASCII ("Ame- rican Standard Code for Information Interchange"). Например, прописная латинская буква А имеет код 65, а строчная - 97. Забегая вперед, заметим,что код любого символа может быть получен при помощи функции преобразования ASC ("символ"); так значением ASC(" ") явля- ется 32. При выполнении операции отношения две строки сравниваются посимвольно до выявления двух первых несовпадающих символов. Затем сравниваются (как обычные целые числа) коды ASCII этих несовпадающих символов и определяет- ся наибольший код; соответствующая строка считается большей. Если первая строка короче второй, и все ее символы совпадают с соответствующими симво- лами второй строки, то большей считается вторая,более длинная строка. Две строки одинаковой длины с совпадающими в одинаковых позициях символами считаются равными;в частности, равными считаются две "пустые" строки (""). Отметим,что пробелы в начале и конце строки з н а ч и м ы. П р и м е р ы: "AA"<>"AB" , ───────────── "ABC"="ABC" , "SM">"S" , "KQ">"KG" , "1AAA"<"2aaa" , " "<"1" (код символа "1" равен 49). Заметим, что результатом всех приведенных операций отношения в данных примерах является (-1) для ЭВМ и Т ("истина") для программиста. Напомним, что компьютер различает строчные и прописные буквы в значени- ях строковых переменных по величине кода ASCII ! Ясно, что строковые операции могут быть эффективно использованы для с о р т и р о в к и строк (расположения их в алфавитном порядке (см.при- мер 5 в разделе IV.4.1.). Однако, будьте очень осторожными, используя выражения с н е с к о л ь- к и м и операциями отношения в случае строковых операндов. Например, за- пись в программе выражения типа A$=B$=C$ вызовет сообщение об ошибке: "Type mismatch" ("Н е с о о т в е т с т в и е т и п о в"), поскольку результатом выполнения первой операции отношения А$=В$ являет- ся целое число (0 или -1), которое нельзя сравнивать со значением строко- вой переменной C$! Однако, конструкция вида (A$=B$)=(C$=D$) д о п у с т и м а! По приоритету операции отношения следуют за операцией конкатенации, а операция конкатенации - за арифметическими операциями. I.7.4. О п е р а ц и и - ф у н к ц и и Многие функции,часто встречающиеся при программировании на языке MSX- BASIC представлены в виде составной части языка и получили название о п е р а ц и и - ф у н к ц и и (или в с т р о е н н ы е ф у н к ц и и). Они обеспечивают выполнение различных стандартных операций обработки чис- ловых и символьных данных. В таблице приведены наиболее часто употребляемые ч и с л о в ы е встроенные функции. ┌─────────────────────────────┬───────────────────────────┐ │ Имя встроенной функции │ Значение функции │ ├─────────────────────────────┼───────────────────────────┤ │ ABS(X) │ │ X │ │ ├─────────────────────────────┼───────────────────────────┤ │ LOG(X) │ ln X , X>0 │ ├─────────────────────────────┼───────────────────────────┤ │ EXP(X) │ exp(X) │ │ │ -147.366 < X < 145.063 │ ├─────────────────────────────┼───────────────────────────┤ │ SQR(X) │ √X , X≥0 │ ├─────────────────────────────┼───────────────────────────┤ │ SIN(X) │ sin X , X в радианах │ ├─────────────────────────────┼───────────────────────────┤ │ COS(X) │ cos X , X в радианах │ └─────────────────────────────┴───────────────────────────┘ ┌─────────────────────────────┬───────────────────────────┐ │ TAN(X) │ tg X , X в радианах │ ├─────────────────────────────┼───────────────────────────┤ │ ATN(X) │ arctg X , X в радианах │ │ │ arctg X ∈ [-π/2,π/2] │ ├─────────────────────────────┼───────────────────────────┤ │ │ 1, если X>0, │ │ SGN(X) │ sign X={ 0, если X=0, │ │ │ -1, если X<0 │ ├─────────────────────────────┼───────────────────────────┤ │ │ [X] (целая часть X) │ │ │Определение наибольшего це-│ │ INT(X) │лого числа, не превосходя- │ │ │щего значения X. │ ├─────────────────────────────┼───────────────────────────┤ │ │ У значения X отбрасывается│ │ FIX(X) │ десятичная точка и все ци-│ │ │ фры,следующие за ней. │ ├─────────────────────────────┼───────────────────────────┤ │ │ Генерируется псевдослучай-│ │ RND(X) │ ное число из интервала │ │ │ (0,1). │ ├─────────────────────────────┼───────────────────────────┤ │ │ Значение Х преобразуется к│ │ CINT(X) │ целому типу │ │ │("Convert to INTeger type")│ ├─────────────────────────────┼───────────────────────────┤ │ │ Значение X преобразуется к│ │ CDBL(X) │ типу двойная точность │ │ │ ("Convert to DouBLe preci-│ │ │ sion type"). │ ├─────────────────────────────┼───────────────────────────┤ │ │ Значение X преобразуется к│ │ CSNG(X) │ типу одинарная точность │ │ │("Convert to SiNGle preci- │ │ │ sion type"). │ └─────────────────────────────┴───────────────────────────┘ Перечисленные в таблице числовые функции составляют тот"джентльменский набор", которым наделена каждая ЭВМ,"обученная" языку программирования вы- сокого уровня. Эти функции называются в с т р о е н н ы м и,поскольку ал- горитмы вычисления их значений записаны, "встроены" в MSX-BASIC. В качестве аргументa X числовых встроенных функций может быть исполь- зовано а р и ф м е т и ч е с к о е в ы р а ж е н и е (данное понятие рассмотрено в разделе I.8.). Числовые функции, которые не входят в MSX-BASIC, вычисляются следующим образом: десятичный логарифм : LG(X) = LOG(X)/LOG(10) ───────────────────── секанс : SEC(X) = 1/COS(X) ────── косеканс : CSC(X) = 1/SIN(X) ──────── котангенс : COT(X) = 1/TAN(X) ───────── арксинус : ARCSIN(X) = ATN(X/SQR(-X*X+1)) ──────── aрккосинус : ARCCOS(X) = -ATN(X/SQR(-X*X+1))+2*ATN(1) ────────── арккотангенс : ARCCOT(X) = ATN(X) + 2*ATN(1) ──────────── гиперболический синус : SINH(X)=(EXP(X)-EXP(-X))/2 ────────────────────── гиперболический косинус: COSH(X)=(EXP(X)+EXP(-X))/2 ──────────────────────── гиперболический тангенс: TANH(X)=(EXP(X)-EXP(-X))/(EXP(X)+EXP(-X)) ─────────────────────── Помните, что указанные формулы справедливы лишь при тех значениях ар- гумента, при которых все используемые выражения имеют смысл! Заметим, что людольфово число π (так иногда называют число π в честь голландского математика Людольфа ван Цойтена (1540-1610)) можно получить следующим обращением к встроенной функции ATN(X): 4*ATN(1) = 3.1415926535898 (π с 14 знаками) или ATN(9.9999999999999E62)*2 = 3.1415926535898 , a неперово число е: EXP(1) = 2.7182818284588 . Обратите внимание, что из-за особенностей машинной арифметики в послед- них двух цифрах результата - ошибка: мы должны были бы иметь 80 вместо 88! Имейте ввиду, что EXP(X)={ 0, если -149.668≤X≤-147.366 (потеря всех значащих цифр!); { "Overflow"("Переполнение"),если Х≥145.063 или-297.033≤Х<-149.668. В ы з о в встроенной функции осуществляется путем указания в нужном месте программы и м е н и функции (ABS,LOG,EXP и т.д.) и ее аргумента, за- ключенного в круглые скобки. После вычисления значения встроенной функции вызов функции заменяется вычисленным значением и затем продолжается вычис- ление выражения, содержащего вызов функции. Поговорим теперь о функциях CSNG(X), CINT(X) и CDBL(X). Ф у н к ц и я CSNG(X) вычисляет значение выражения Х. Результат ок- ругляется до 6 значащих цифр, при округлении проверяется седьмая значащая цифра (счет идет слева направо), если она больше или равна 5, то к шестой цифре прибавляется 1. Если аргумент отсутствует,является строкой или имеет значение экспонен- ты от недопустимого аргумента, то выдается сообщение об ошибке "Type mismatch" ("Н e с о о т в е т с т в и е т и п о в") или "Overflow" ("П е р е п о л н е н и е"). Эта функция позволяет округлить результат вычислений, т.е. избавиться от "лишних" цифр результата. Например, CSNG(5.1234567890) дает 5.12346 . Ф у н к ц и я CINT(X) вычисляет значение выражения X и отбрасывает дробную часть результата.Если значение выражения Х выходит за границы диа- пазона представления целых чисел (от -32768 до 32767), то будет сообщение об ошибке "Overflow ". Например, CINT(5.123) дает 5 , CINT(-4.56) дает -4 , CINT(400012.4) дает "Overflow". Ф у н к ц и я CDBL(X) вычисляет значение выражения X и преобразует его в формат двойнaя точность: четырнадцать десятичных цифр. Например, CDBL(5.456456456456456456) дает 5.4564564564565 . Если значение выражения Х слишком велико (≥ EXP(145.063)), то выдается сообщение "Overflow". Однако, на практике функция CDBL() не применяется, т.к.эта функция н е- я в н о выполняется всякий раз, когда происходит присвоение значения пе- ременной двойной точности. Основное ее назначение -обеспечить с о в м е с- т и м о с т ь версии MSX-BASIC с другими версиями языка BASIC.