ГЛАВА I. ОСНОВНЫЕ ОБъЕКТЫ MSX-BASIC I.1. АЛФАВИТ Величайшее литературное произведение - в принципе не что иное, как разбросанный в беспорядке алфавит. Ж. Кокто Multum in parvo. Лат. изречение Основой любого языка программирования является алфавит - набор допусти- мых литер, которые можно использовать для записи программ. Л и т е р а - это печатный знак, или, для краткости, - знак. Литерами могут быть буквы, цифры и специальные знаки. А л ф а в и т MSX-BASIC образуют: a) строчные и прописные буквы русского и латинского алфавита; имейте в виду тот факт, что буквы л а т и н с к о г о алфавита A , B , C , E , H , K , M , O , P , T , X , Y не то же самое, что и графически похожие символы - р у с с к и е буквы А , В , С , Е , Н , К , М , О , Р , Т , Х , У; для компьютера - это р а з л и ч н ы е символы; b) арабские цифры 0,1,2,3,4,5,6,7,8,9 (нуль перечеркивается: 0); c) дополнительные символы: с и м в о л д е й с т в и е пробел = знак равенства или присваивания + знак плюс или символ сцепления - знак минус * знак умножения (звездочка) / знак деления ^ знак возведения в степень ( левая скобка ) правая скобка % процент # номер $ знак доллара ! восклицательный знак [ левая квадратная скобка ] правая квадратная скобка , запятая . десятичная точка " кавычки ' апостроф (для комментария) ; точка с запятой & амперсенд (коммерческое "и") : двоеточие ? знак вопроса < меньше > больше \ обратная косая черта @ знак цены (коммерческое "at") _ подчеркивание По-видимому, символ "@" изобрели коммерсанты,которым настолько некогда, что нет времени дописать как следует палочку буквы "t". Отметим, что пробел - такой же символ алфавита, как и все другие, хотя в позиции, занятой им, на экране дисплея и в распечатках никакой графичес- кий символ не изображается (просто она остается пустой!); d) служебные слова. Назначение служебных слов будет объяснено в даль- нейшем по мере их введения. I.2. КОНСТАНТЫ. ОДИНАРНАЯ И ДВОЙНАЯ ТОЧНОСТЬ Представление данных - это сущность программирования. Ф. Брукс Величина в программировании - это объект, с которым связывается опреде- ленное множество значений. К о н с т а н т ы - это величины, значения которых не изменяются во время выполнения программы. Константы делятся на два класса: а) с т р о к о в ы е (или с и м в о л ь н ы е) (вспомните литерные константы в школьном алгоритмическом языке!); b) ч и с л о в ы е. С т р о к о в а я константа -это последовательность символов алфавита MSX-BASIC, заключеннaя в кавычки. Отметим, что только в строковых констан- тах наряду с латинскими буквами,цифрами и дополнительными символами допус- кается использование букв русского алфавита (прописных и строчных). Например: 1) "MSX-BASIC"; 2) "Я М А Х А"; 3) "αβ7?* !&". Информация, которая заключена внутри кавычек, называется з н а ч е- н и е м строковой константы, а количество символов внутри кавычек - ее д л и н о й. Так в примере 1 значение строковой константы - MSX-BASIC, ее длина - 9, а в примере 2 значение строковой константы - Я М А Х А, ее длина- 9 (учти- те наличие пробелов, а пробел " " - это символ алфавита!). Заметим,что длина строковой константы должна быть не более 255 символов! Ч и с л о в ы е константы бывают шести типов: 1) ц е л ы е д е с я т и ч н ы е; они находятся в диапазоне от -32768 до +32767. Почему выбран именно такой диапазон? Дело в том, что целые числа коди- руются последовательностями из 16 нулей и единиц. Поэтому можно закодиро- вать лишь 65536 = 2^16 (напомним, что символ "^"-символ возведения в сте- пень) различных целых чисел. Способ кодирования выбран так, что он охваты- вает целые числа от -32768 до +32767 (разумеется, включая нуль!). Целые десятичные константы не должны содержать десятичную точку; 2) д е с я т и ч н ы е с ф и к с и р о в а н н о й точкой; это положительные или отрицательные вещественные числа, содержащие деся- тичную т о ч к у. Преимущество десятичной точки может оценить каждый,ко- му случалось писать перечень десятичных дробей, разделенных запятыми! Например: 1.75 , 0.00007 (допустима также форма записи .00007), -556.1, +4.007 ; 3) д е с я т и ч н ы е с п л а в а ю щ е й точкой; десятичная константа с плавающей точкой состоит из целого десятичного чис- ла или десятичного числа с фиксированной точкой, возможно со знаком (ман- тисса), буквы E ("Exponent"-"показатель") или D ("Double"-"удвоенный") и целого числа, состоящего не более,чем из двух десятичных цифр со знаком (порядок). Порядок указывает, на сколько разрядов вправо (при положитель- ном знаке порядка) или влево (при отрицательном знаке порядка) нужно смес- тить десятичную точку в мантиссе, чтобы получить значение представляемой константы в виде целой десятичной константы или десятичной константы с фиксированной точкой. Например: 235.9888E-7 = .000023598888 235D+6 = 235000000 . Допустимый интервал констант с плавающей точкой -от 10^(-64) до 10^63. З а м е ч а н и е. Строго говоря, понятие м а н т и с с ы , введенное выше, отличается от соответствующего понятия в вычислительной математике. Напомним, что в вычислительной математике запись десятичного числа в виде p А·10 , (∗) где p - целое число, называется записью десятичного числа в форме с п л а в а ю щ е й з а - п я т о й. Если │А│<1, то А называется м а н т и с с о й , а p - п о - р я д к о м числа. При 0.1≤│А│<1 запись числа (∗) называется н о р м а - л и з о в а н н о й, при 1≤А≤10 запись называется с т а н д а р т н о й; 4) ш е с т н а д ц а т е р и ч н ы е; шестнадцатеричные константы (по основанию 16) обозначаются п р е ф и к - с о м (приставкой) &H (напомним,что знак "&" называется "амперсенд"). Для их записи используют цифры от 0 до 9 и латинские буквы А,B,C,D,E,F,обозна- чающие шестнадцатеричные цифры,соответствующие десятичным цифрам от 10 до 15. Например, &H76 , &h32F . Эти константы могут быть только ц е л ы м и, изменяющимися в диапазо- не от &H0000 до &НFFFF, причем константы в диапазоне от &Н0000 до &Н7FFF - положительные (от 0 до 32767),а константы в диапазоне от &Н8000 до &НFFFF - отрицательные (от -32768 до -1); 5) в о с ь м е р и ч н ы е; восьмеричные константы обозначаются префиксом &О (О - латинская буква). Они не должны содержать цифр 8 и 9. Например, &O000000 (&O0) , &О347 , &о17777 . Восьмеричные константы могут быть только ц е л ы м и , изменяющимися в диапазоне от &О0 до &О177777, причем константы в диапазоне от &О0 до &О077777-положительные(от 0 до 32767),а константы в диапазоне от &О100000 до &О177777 - отрицательные (от -32768 до -1); 6) д в о и ч н ы е; двоичные константы обозначаются префиксом &B; они содержат в записи толь- ко цифры 0 и 1 и могут быть только ц е л ы м и, изменяющимися в диапа- зоне от &В0 до &В1111111111111111 (16 цифр),причем константы в диапазоне от &В0 до &В0111111111111111 - положительные (от 0 до 32767), а константы в диапазоне от &В1000000000000000 до &В1111111111111111 - отрицательные (от -32768 до -1). Приведем примеры записи двоичных чисел: &B01110110 , &b11100111 . Так как целое число кодируется последовательностью из 16 нулей и еди- ниц, то следует иметь в виду, что старший бит (шестнадцатый - самый левый) является знаковым битом (бит - от "binary digit"(двоичная цифра) -это циф- ра 0 или 1). Любое двоичное число с "1" в старшем бите считается отрица- тельным и представленным в дополнительном коде, поэтому шестнадцатый раз- ряд называется з н а к о в ы м . Для представления отрицательного двоичного числа в дополнительном коде необходимо выполнить следующие преобразования: записать абсолютную величи- ну числа,инвертировать каждый бит полученного числа (т.е. заменить все 1 на 0, а все 0 на 1), затем добавить 1 к самому младшему разряду (крайнему правому) (игнорируя возможный перенос 1 из старшего бита). Однако,Вам эти преобразования самим делать не нужно, так как все подпрограммы ввода-выво- да выполняют это автоматически. Такая кодировка позволяет экономить аппа- ратуру компьютера, так как при ней положительные и отрицательные числа об- рабатываются абсолютно одинаково. Например, покажем, что двоичное число (-1) в дополнительном коде есть &B1111111111111111 . В самом деле, -1 ──▶ 0000000000000001 ──▶ 1111111111111110 ──▶ 1111111111111110 + + 0000000000000001 ──▶ 1111111111111111 . При сложении, вычитании и умножении целых двоичных чисел не учитывает- ся возможность переполнения; в случае его возникновения используются млад- шие 16 разрядов результата. Такая арифметика называется арифметикой по мо- дулю 65536 (2 в степени 16);ее основное достоинство состоит в том,что она дает одинаковые в двоичном представлении результаты независимо от того, как понимаются операнды: как числа со знаком в диапазоне от -32768 до +32767 или как числа без знака в диапазоне от 0 до 65535.Однако,при выпол- нении деления возможно возникновение ошибочной ситуации, если делитель - нуль или частное не умещается в 16 разрядов (переполнение, возникающее,на- пример,при делении целого числа -32768 на целое число -1). Легко видеть,что чем меньше основание системы счисления,тем длиннее за- писи чисел в этой системе! В свою очередь, десятичные числовые константы с фиксированной и плава- ющей точкой могут быть классифицированы на д в а т и п а : числовые кон- станты о д и н а р н о й т о ч н о с т и , содержащие не более 6 знача- щих цифр, и числовые константы д в о й н о й т о ч н о с т и , содержа- щие не более 14 значащих цифр. ┌─────────────────────────────────────────────────────────────────────┐ │ По умолчании числовая константа имеет д в о й н у ю точность ! │ └─────────────────────────────────────────────────────────────────────┘ Термином "у м о л ч а н и е" обозначается "сама собой разумеющаяся ин- формация". В общении людей ее очень много, например, вместо "Кто занял свое место в этой очереди позже всех ?" говорят просто: "Кто последний ?" Для компьютера же все операции должны быть определены не только однознач- но, но и полностью.Это неудобство отчасти смягчается возможностью действо- вать по умолчании, то есть пользоваться тем, что иногда компьютер из нес- кольких вариантов действия способен сам выбрать один,предпочитаемый. Пред- почтения закладываются в компьютер так, чтобы в большинстве случаев про- граммисту было удобно пользоваться ими, а не оговаривать какой-то другой вариант. Десятичная константа одинарной точности - это десятичная числовая кон- станта, состоящая не более, чем из 6 значащих цифр и записанная в соответ- ствии с одним из следуюших правил: 1) в виде десятичной константы с плавающей точкой с использованием в своей записи латинской буквы E; 2) в виде десятичной константы с фиксированной точкой, за которой сле- дует символ "!" (восклицательный знак); П р и м е р ы: 6.23E3 , -1.09E-6 , 22.5! , .4! ───────────── Десятичная константа двойной точности - это десятичная числовая конс- танта, состоящая не более, чем из 14 значащих цифр, записанная в одной из следующих форм: 1) в виде десятичной константы с фиксированной точкой или без нее(прин- цип умолчания!); 2) в виде десятичной константы с фиксированной точкой, за которой сле- дует символ "#";. 3) в виде десятичной константы с плавающей точкой с использованием в своей записи буквы D вместо буквы Е. П р и м е р ы: 56, -409345153489, .345#, -1.09433D-06 . ───────────── I.3. ПЕРЕМЕННЫЕ ...это, наверное, полезно тем, кто дает им названия. Иначе зачем бы их вообще давали? Л.Кэролл. Алиса в Зазеркалье Возможности вычислительной машины были бы слишком ограничены, если бы при работе с ней можно было использовать только постоянные величины (кон- станты). Поэтому в любом языке программирования есть средства,позволяющие выделить часть памяти компьютера для хранения изменяющихся значений. Каж- дое такое значение идентифицируется (определяется) уникальным и м е н е м, которое в совокупности со значением определенного т и п а называется п е р е м е н н о й . Таким образом, переменная связана с т р е м я объектами: и м е н е м, определяющим место в памяти, з н а ч е н и е м (хранимым объектом) и т и п о м . Поэтому, если мы говорим:"X имеет значение 3.45", то на самом деле име- ется в виду, что "X - это имя места памяти компьютера,где в данный момент хранится число 3.45". Подчеркнем, что в математической литературе с понятием п е р е м е н - н о й связывают некоторый именованный объект, который может принимать од- но из допустимых значений. Для программиста термин "п е р е м е н н а я" ассоциируется с участ- ком оперативной памяти, в котором хранится текущее значение объекта.Поэто- му имя переменной можно рассматривать как синоним адреса такого участка. Знание этого адреса дает пользователю возможность изменять значение пере- менной в процессе выполнения программы. С переменными мы сталкиваемся не только в информатике, но и в обиходе. Хозяйка, у которой на кухне хранятся по сосудам и сусекам, баночкам и ко- робочкам крупы и чай, варенье и масло,постоянно оперирует переменными.Над- пись "чай" на жестяной коробочке - это имя переменной;ее содержимое - зна- чение переменной. Когда коробочка пуста,то в наших терминах значение пере- менной "чай" равно нулю. Переменную можно представить себе как своеобразную коробочку, на кото- рую наклеен ярлык - и м я п е р е м е н н о й . Когда мы хотим взять зна- чение переменной, мы смотрим на содержимое коробочки. Меняя значение, мы кладем в коробочку что-то новое. Теперь, забегая вперед, можно показать,как разрешается неоднозначность при использовании имен в операторах присваивания вида: I = I + 1 . В левой части оператора символ I обозначает и м я (поскольку оно оп- ределяет место для размещения значения),в то время как в правой части опе- ратора символ I обозначает з н а ч е н и е (поскольку оно требуется для вычислений). При составлении программы программист дает имена используемым объектам. Имена выбираются им по своему усмотрению. Рекомендуется выбирать имена та- ким образом, чтобы они отражали смысл объекта и его роль в методе решения задачи (говорят, что "имена должны быть наглядными!"). И м я (и д е н т и ф и к а т о р) переменной есть последовательность, состоящая из не более чем из 252 латинских букв и арабских цифр и начинаю- щаяся с б у к в ы. Однако значащими являются лишь первые д в а символа имени. Например, для программиста имена переменных MIL1 и MI различны, а для компьютера они одинаковы! Пробелы в имени игнорируются (PI ≡ P I). Вопрос читателю: сколько различных идентификаторов можно записать? Заметим, что служебные слова MSX-BASIC, кроме слова ELSE,(например:END, PRINT, IF, THEN, MAX и т.д.) не могут служить именем или частью имени пе- ременной! Например, недопустимы имена SHIFR (содержит IF), TON (содержит TO), XOR (содержит и OR, и XOR). Значение переменной может быть явно задано программистом или получено в результате вычислений в программе.Когда переменная используется впервые, то для ее хранения выделяется область памяти компьютера, первоначально за- полненная н у л я м и . Объем этой области памяти зависит от т и п а пе- ременной (или от типа по умолчании, если он явно не задан). Т и п п е р е м е н н о й определяется типом принимаемых ею значений и может задаваться определенным символом ( у к а з а т е л е м типа),до- бавляемым к имени переменной, а именно: % - для ц е л о й переменной (переменной ц е л о г о типа), например: limit% , A1% ; ! - для переменной о д и н а р н о й точности, например: A! , mum! (но не maximum!); # или никакой символ не добавляется (по умолчании!) - - для переменной д в о й н о й точности, например: MIN , p1# , ABC ( но не ABS ! ); $ - для с т р о к о в о й ( с и м в о л ь н о й ) переменной, например: N$ , ST$ , KAPPA$ . ┌──────────────────────────────────────────────────────────────────────┐ │ По умолчании числовая переменная имеет тип д в о й н а я точность !│ └──────────────────────────────────────────────────────────────────────┘ Отметим,что переменные,имеющие одинаковое имя, но различные указатели типа, различаются! Например, A#,A!,A$,A% - разные переменные, однако, A и А# - два имени одной и той же переменной. В следующей в а ж н о й таблице указано количество байтов памяти ЭВМ YAMAHA (1 байт=8 бит), занимаемых переменной в зависимости от типа. ┌───────────────────┬───────────────────────────────────┐ │ Тип переменной │ Количество байтов │ ├───────────────────┼───────────────────────────────────┤ │ Целая │ 5 │ ├───────────────────┼───────────────────────────────────┤ │ Одинарной точности│ 7 │ ├───────────────────┼───────────────────────────────────┤ │ Двойной точности │ 11 │ ├───────────────────┼───────────────────────────────────┤ │ Строковая │ Длина области,занятой строкой + 6 │ └───────────────────┴───────────────────────────────────┘ Например,для ц е л о й числовой переменной компьютер запоминает "пас- порт", указывающий количество байтов, необходимых для хранения переменной ("паспорт" имеет имя VALTYPE, "VALue TYPE"- "тип значения"), имя перемен- ной и само ее значение. VALTYPE занимает один байт, имя переменной занимает два байта, само целое число - тоже два байта. Таким образом,для хранения целой переменной требуется 5 байтов. Один б а й т памяти ЭВМ способен хранить только один символ, поэтому можно рассматривать байты как информационные символы, хотя в памяти ком- пьютера помимо них хранится и другая информация, например, константы или команды.Более крупная единица памяти компьютера называется к и л о б а й- т о м (1 Кбайт), причем, 1 Кбайт = 1024 байтам. Отметим,что в 8 Кбайт мож- но записать примерно ч е т ы р е страницы машинописного текста. Далее, 1024 Кбайта равны 1 мегабайту (1 Мбайт) (от греч."megas" - "большой"), 1024 Мбайта равны 1 гигабайту (1 Гбайт) (от греч."gigas" - "гигантский"), 1024 Гбайта равны 1 терабайту (1 Тбайт) (от греч."teras" - "чудовище"). Заметим, что слово "byte"("байт") произошло от слова "bite"("кусок"),в котором, чтобы не путать при чтении, букву "i" заменили на букву "y"; про- изношение обоих слов осталось одинаковым. I.4. ПОНЯТИЕ ОПЕРАТОРА . ОПЕРАТОР DEF O п е р а т о р - это конструкция языка программирования,которая пред- писывает выполнять определенные действия над заданными объектами, либо ус- танавливает последовательность, в которой должны выполняться другие дейст- вия, либо описывает характеристики объектов программы. Почти все операторы начинаются специфическим с л у ж е б н ы м с л о- в о м ; кроме того, ряд служебных слов может использоваться и в самой кон- струкции оператора. Каждое служебное слово в языке программирования имеет строго определенный смысл, установленный при разработке данного языка. Смысл служебных слов будет поясняться далее по мере использования их в операторах языка. Поскольку язык программирования BASIC был разработан в США (математиками Дж.Кемени и Т.Курцем, Дартмутский колледж, 1964 г.), то естественно, что он максимально приближен к английскому языку.Поэтому Вам необходимо запомнить п р а в и л ь н о е произношение и точный перевод каждого служебного слова. Отметим, что BASIC, как и любой другой язык про- граммирования,не допускает вольного обращения с синтаксисом и пунктуацией. Каждый оператор языка должен быть записан по строго определенным синтакси- ческим и семантическим правилам. Применительно к языку программирования с и н т а к с и с - это совокупность правил,которым должна удовлетво- рять запись операторов программы, а с е м а н т и к а - это значение, смысл отдельных операторов или со- вокупности нескольких операторов ( б л о к о в операторов); семантика оп- ределяет,какие операции и в какой последовательности должен выполнять ком- пьютер, реализующий программу. Для начинающих программистов рекомендуется для удобства чтения програм- мы всегда ставить пробелы до и после служебного слова,но в н у т р и слу- жебного слова пробелы з а п р е щ е н ы! Сейчас мы познакомимся с первым о п е р а т о р о м языка программи- рования MSX-BASIC. Еще раз напомним, что если после имени переменной не следует один из специальных символов, определяющих ее тип (%,#,$,!), то по принципу умол- чания считается, что имя принадлежит числовой переменной двойной точности. Это соглашение нарушается в случае использования четырех модификаций о п е р а т о р а DEF ( "to DEFine" - "определять" ),пользуясь которыми можно задавать тип переменной одной н а ч а л ь н о й буквой ее имени. Можно также определить интервал или несколько интервалов букв для име- нования переменных (интервальные пары букв также отделяются запятыми).Ин- тервал записывается с помощью двух букв, разделенных знаком "-" (минус). Например, DEFINT A,J-M В программе, содержащей указанный оператор, любая переменная, имя кото- рой начинается с A,J,K,L,M, являются переменной ц е л о г о т и п а (не- зависимо от того, оканчивается ли ее имя знаком %). Так, переменные с име- нами AARD, J2, K, LOOP будут определяться как целые переменные. Итак, магическое служебное слово, используемое в операторе DEF для опи- сания типа ц е л о й переменной - это INT ("INTeger"-"целое число"). Аналогично с помощью операторов DEFSTR ("STRing"-"строка"), DEFSNG ("SiNGle"-"одиночный"), DEFDBL ("DouBLe"-"двойной") можно задавать начальные буквы имен с т р о к о в ы х переменных и пе- ременных о д и н а р н о й и д в о й н о й точности соответственно. Од- нако, действие оператора DEF в любой его модификации отменяется, если тип переменной указан в явном виде (символами %, #, $, ! после имени перемен- ной), то есть,говоря другими словами,действие оператора DEF не распростра- няется на переменные, после имени которых следует один из символов: % , # , $ , ! . Таким образом, при определении типа переменной происходит следующее: α) если за именем переменной следует признак типа,то тип переменной оп- ределяется в соответствии с этим признаком. Если признак отсутствует, про- веряется пункт 2; β) если в программе имеется какой-либо из операторов DEFINT, DEFSNG, DEFDBL или DEFSTR и его действие затрагивает имя переменной, то ее тип оп- ределяется в соответствии с правилами, заданными этим оператором; γ) если тип переменной остался не определенным этими двумя проверками, то переменная рассматривается как переменная двойной точности. Выполнение оператора DEF должно предшествовать первому использованию определяемых им переменных. Кроме того, этот оператор присваивает началь- ные значения всем переменным, имена которых начинаются с указанных в нем букв, а именно: ч и с л о в ы м переменным присваивается значение н у л ь , а с т р о к о в ы м - значение строки, имеющей длину 0 (такой строкой яв- ляется "пустая" строка: ""). Во многих программах используются только целые и символьные переменные. В начале таких программ обычно ставится оператор DEFINT A-Z, а символьные переменные указываются индивидуально признаком $. Задание всех числовых переменных как целых значительно сокращает время вычислений,а также умень- шает размер памяти, необходимый для хранения значений этих переменных. I.5. МАССИВЫ ПЕРЕМЕННЫХ . ОПЕРАТОР ERASE Фома идет в реку. Фома не труслив, Хоть там аллигаторов целый м а с с и в. Почти по С.Михалкову Для возможности о д н о т и п н о й обработки большой совокупности данных в программировании введено понятие м а с с и в а. М а с с и в - это конечное множество значений (числовых или строковых), обозначенных одним именем (и м е н е м м а с с и в а), причем каждый эле- мент этого множества идентифицируется с помощью одного или нескольких чис- ловых индексов. Правила образования имени массива то же, что и для имени простой пере- менной. И н д е к с ы - это своего рода числовые координаты, указывающие место- нахождение конкретного элемента как в массиве данных, так и в массиве яче- ек памяти, отведенных для хранения этих данных. Массив характеризуется р а з м е р н о с т ь ю,то есть количеством ин- дексов, необходимых для поиска элемента в массиве, а также г р а н и ц а- м и и з м е р е н и я , то есть границами изменения каждого индекса. Массив описывается (объявляется) с помощью о п и с а т е л я размерно- сти. Описатель записывается следующим образом: сразу после имени массива в круглых или квадратных скобках указывается верхняя граница изменения ин- декса. Если индексов несколько, то верхние границы изменения каждого ин- декса разделяются запятой. Нижние границы индексов всегда равны н у л ю. При обращении к элементу массива указывается и м я э л е м е н т а м а с с и в а (имя индексируемой переменной). Имя элемента массива состо- ит из имени массива и следующего(их) за ним в круглых или квадратных скоб- ках индекса(ов) (если индексов два, то они разделяются запятoй). В качестве индекса может использоваться в ы р а ж е н и е (разумеется не строковое!), частными случаями которого являются к о н с т а н т а или и м я п е р е м е н н о й (понятие в ы р а ж е н и я см. в разделе I.8). Старайтесь в качестве индексов использовать ц е л о ч и с л е н н ы е выражения (выражения,которые могут принимать только целочисленные значе- ния), так как в противном случае компьютер автоматически преобразует ве- щественные константы, представляющие значения индексов, в целые константы, на что расходуется машинное время. Например, целесообразно писать A(K%), а не A(К). П р и м е р ы: ───────────── 1) C%(100) имя массива - C тип элементов массива - целочисленный размерность - одномерный количество элементов - 100 + 1 = 101 имена элементов массива - C%(0),C%(1),...,C%(100; 2) A(5,10) имя массива - А тип элементов массива - двойная точность размерность - двумерный количество элементов - (5+1)*(10+1) = 66 имена элементов массива - А(0,0), А(0,1),..., А(0,10), А(1,0), А(1,1),..., А(1,10), ··· ··· ··· ··· А(5,0), А(5,1),..., А(5,10); 3) Е$[20] имя массива - Е тип элементов массива - строковый размерность - одномерный количество элементов - 20 + 1 = 21 имена элементов массива - Е$[0],Е$[1],...,Е$[20] . Максимальная размерность вещественного массива - 11, целого или строко- вого - 13, максимальное число элементов массива определяется размером опе- ративной памяти компьютера и типом массива. Перед использованием в Вашей программе массивов необходимо выделить для них место в памяти ("зарезервировать место"). Это осуществляется при помощи специального оператора о б ъ я в л е н и я (описания) м а с с и- в о в. Его структура: DIM α, δ, β,... , где DIM ("DIMension"- "размерность") - служебное слово; α, δ, β,...- список описателей размерности встречаемых в программе массивов; описатели отделяются друг от друга запятой. Например, DIM C%(100),A(5,10),E$(20) , здесь C%(100),A(5,10),E$(20) - описатели размерности массивов. Запомните: в любом месте программы,где имя массива встречается в п е р- в ы й раз (конечно, не в операторе DIM), используется н е я в н ы й опе- ратор DIM с верхней границей индекса(ов), равной 10. Таким образом, напри- мер, одномерный массив, содержащий м е н е е 11 элементов, можно не опи- сывать оператором DIM ! Оператор DIM может находиться в любом месте программы, но обязательно п е р е д работой с массивом, к которому он относится. При выполнении оператора DIM всем элементам объявляемых числовых масси- вов присваивается значение 0 ("нуль"), а всем элементам объявляемых стро- ковых массивов присваивается значение "" ("нуль-строка" или "пустая" строка). Если для размещения всех массивов программы объем памяти оказывается недостаточным, на экран дисплея выдается сообщение "Out of memory" ("Н е х в а т а e т п а м я т и") или "Out of string memory" ("Н е х в а т а е т с т р о к о в о й п а м я т и") для случая массива символьных строк,и оператор DIM резервирует место толь- ко для первых перечисленных в нем массивов, которые полностью уместились в памяти. Кроме очевидного использования для создания массивов требуемого типа и размера, имеет смысл применять оператор DIM для объявления всех перемен- ных. Например, DIM MIN%,AB1#,X,C[15,4],X(6),AB1#(4,8). Обратите внимание на то, что, хотя простая переменная X и массив X(6) имеют одинаковые имена, для компьютера же - это разные объекты! Если в программе уже описаны массивы, содержащие большое количество элементов, то для создания новой простой переменной потребуется несколько секунд машинного времени (оно уходит на поиск места для новой переменной в оперативной памяти), определение же всех простых переменных оператором DIM в начале программы позволяет сэкономить это время (см. пример 8 в раз- деле 7.5). Приведем очень важную таблицу, указывающую количество байтов, занима- емых элементом массива, в зависимости от типа массива. ┌────────────────┬───────────────────────────────┬──────────────────────┐ │ Тип массива │Количество байтов на один элем.│ Количество элементов │ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Целый │ 2 │MSX1:14343; MSX2:14323│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Одинарной точн.│ 4 │MSX1: 7171; MSX2: 7161│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Двойной точн. │ 8 │MSX1: 3585; MSX2: 3580│ ├────────────────┼───────────────────────────────┤──────────────────────│ │ Строковый │Длина области,занятой строкой+3│MSX1: 9562; MSX2: 9548│ └────────────────┴───────────────────────────────┴──────────────────────┘ Определив размерность некоторого массива посредством оператора DIM, ее уже нельзя изменить с помощью некоторого другого оператора DIM. Для этого необходимо сначала удалить соответствующий массив из оперативной памяти компьютера с использованием "стирающего" оператора ERASE . Оператор состоит из служебного слова ERASE ("to erase"-"вычеркивать") и следующего за ним списка имен уничтожаемых массивов. Имена массивов в этом списке перечисляются через запятую,причем скобки и максимальное зна- чение индексов массивов не указываются. Например, если массив А в программе описан как DIM A(30), то оператор ERASE A "уничтожает" одномерный массив А(30); после этого мы можем оператором DIM A(4,10) определить двумерный массив А(4,10) с тем же именем! Заметим,что если попытаться объявить заново с помощью оператора DIM массив без предварительного использования оператора ERASE, то выдается со- общение об ошибке "Redimensioned array" ("П е р е о п р е д е л е н и е м а с с и в а"). Следующий раздел при первом прочтении можно пропустить! Однако о б я з а т е л ь н о в е р н и т е с ь к нему позднее! I.6. ИМЕНА, ЗНАЧЕНИЯ И ТИПЫ Часто оказывается труднее хранить богатства, чем добывать их. Демосфен Ясно, что цель программы состоит в вычислении з н а ч е н и й . В свою очередь компьютер оперирует не со значениями,а скорее с п р е д с т а в- л е н и я м и значений,которые являются конфигурациями байтов памяти ЭВМ. Так как физические представления зависят от изображаемых объектов, то для того, чтобы оперировать со значениями, необходимо специфицировать их т и- п ы.Это кажущееся ограничение может оказаться на деле выгодным,потому что оно заставляет программиста точно определить все используемые им объекты и лучше контролировать свою программу. Итак, к а ж д ы й программный объект имеет т и п и з н а ч е н и е. Разумеется, он должен иметь также и и м я в программе, чтобы мы могли отличить его от других объектов с аналогичными типом и значением. 1. К о н с т а н т а имеет фиксированное имя,фиксированный тип и фиксированное значение. ───────────── ───────────── ───────────── Например, обозначение 134 есть и м я константы типа "целое" и фиксированного з н а ч е н и я 134 (сто тридцать четыре). Для констант тип и значение выводятся непосредственно из и м е н и. Язык MSX-BASIC, как и многие другие языки программирования позволяют про- граммисту выбрать другое имя для обозначения константы. Например, програм- мист может связать с константой 3.14159 имя PI при помощи оператора PI = 3.14159 . В таких случаях говорят, что PI есть с и м в о л и ч е с к а я к о н с- т а н т а (т.е. такая, которая обозначается некоторым символом вместо при- нятого для константы обозначения объявлением ее значения). Использование символических констант - хороший прием программирования: он исключает ситуации, при которых значения, являющиеся по существу пара- метрами выполняемой программы, используют в явной форме многократно в раз- ных местах программы. Такие ситуации осложняют модификацию и расширение программ. Значение символической константы появляется только в одном мес- те программы, в о б ъ я в л е н и и с и м в о л и ч е с к о й констан- ты, которое позволяет связать значение константы с выбранным именем; если появляется необходимость перейти к другому значению,модифицируется только это объявление.(В некоторых языках программирования строго применяется этот принцип, з а п р е щ а я использование констант, имеющих отличную от символической форму!). 2. П е р е м е н н а я имеет фиксированное имя, фиксированный тип и переменное значение. ───────────── ───────────── ────────── Имя переменной называется и д е н т и ф и к а т о р о м. Тип переменной связывается с ее именем при помощи о б ъ я в л е н и я т и п а, которое может быть неявным. В заключение определим п е р е м е н н у ю в информатике как совокуп- ность трех элементов: идентификатора, типа и значения , ────────────── ──── ──────── где только третий элемент является переменным (однако, в некоторых языках программирования (например, Рапира) тип является переменным!). Заметим, что понятие переменной в информатике о т л и ч а е т с я от понятия переменной в математике! 3. М а с с и в имеет фиксированное имя, фиксированный тип и конечное множество значений. ───────────── ───────────── ────────────────── О б ъ я в л е н и е м а с с и в а уточняет его тип (который может за- даваться неявно), число его измерений и границы каждого измерения. Отметим,что любое объявление массива определяет две категории имен:имя массива в целом и имена для обозначения каждого элемента массива(имена ин- дексируемых переменных). 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. I.7.5. Ф у н к ц и я RND . П с е в д о п е р е м е н н а я TIME Подробнее остановимся на функции RND. При п е р в о м прочтении раз- дел, касающийся описания этой функции можно (и, пожалуй, нужно!) п р о - п у с т и т ь ! Вначале отметим, что с л у ч а й н ы е и п с е в д о с л у ч а й - н ы е числа - числа, последовательность появления которых обладает теми или иными статистическими закономерностями. Различают с л у ч а й н ы е числа, генерируемые (образуемые) каким-либо стохастическим устройством, и п с е в д о с л у ч а й н ы е числа,конструируемые с помощью арифметичес- ких алгоритмов. Надо сказать, что используемые в современных компьютерах арифметичес- кие алгоритмы обладают недостатком,несовместимым с понятием случайности: последовательность выдаваемых ими чисел периодична. И хотя повторяющийся фрагмент этой последовательности может быть весьма длинным ( миллионы, миллиарды чисел ), случайной ее уже не назовешь. Поэтому и принято на- звание: д а т ч и к ( или г е н е р а т о р ) псевдослучайных чисел. Случайные и псевдослучайные числа используются на практике в теории игр, математической статистике, методе статистических испытаний для конк- ретной реализации недетерминированных алгоритмов и поведения, предсказуе- мого лишь "в среднем". Например, если очередное случайное число равно 0,то игрок выбирает пер- вую стратегию, а если 1, то - вторую. Общий вид обращения к функции RND: RND(α) , где: RND ("RaNDom"-"случайный") - имя встроенной функции; α - арифметическое выражение. Значением функции является п с е в д о с л у ч а й н о е число β. β не является полностью случайным, однако, период повторения так велик,что его можно рассматривать как случайное. В дальнейшем под и н и ц и а л и з а ц и е й переменной (аргумента) будем понимать присвоение переменной значения. Для аргумента α возможны три варианта: 1) α < 0; говорят,что при α<0 происходит"выбор случайной последователь- ности из уже имеющейся совокупности случайных последовательностей". Генератор псевдослучайных чисел выдает новое псевдослучайное число при каждом н о в о м отрицательном значении α. Последующие обращения к гене- ратору псевдослучайных чисел с помощью функции RND будут возвращать в Ва- шу программу такое же псевдослучайное число. П р и м е р 1. 10 INPUT N ───────────── 20 FOR I=1 TO 3:PRINT CSNG(RND(-ABS(N))):NEXT I run run run ? 1 ? 2 ? 3 .0438982 .943898 .843898 .0438982 .943898 .843898 .0438982 .943898 .843898 Ok Ok Ok Обратите внимание, что при выборе случайной последовательности исполь- зуется н е с л у ч а й н ы й аргумент! Чуть ниже будет указано, как вы- брать последовательность "псевдослучайно". Таким образом, если Вы хотите при каждом прогоне Вашей программы полу- чать одно и то же псевдослучайное число, поместите в начале этой програм- мы строку вида: Z = RND(отрицательное число) 2) α > 0 ; возвращается следующее псевдослучайное число из последовате- льности, заданной последней инициализацией генератора; последовательность псевдослучайных чисел одна и та же для любого положительного значения α. Говорят, что при α>0 происходит "выбор случайного числа из выбранной ра- нее случайной последовательности"; 3) α=0 ; повторяется вывод предыдущего случайного числа. Это удобно, поскольку таким образом можно сохранить последнее используемое в програм- ме псевдослучайное число. П р и м е р 2. 10 INPUT N ───────────── 20 FOR I=1 TO 3:?CSNG(RND(ABS(N))):NEXTI:?CSNG(RND(0)) run run ? 1 ? 2 .595219 .595219 .106586 .106586 .765977 .765977 .765977 .765977 Ok Ok Все генерируемые псевдослучайные числа содержат 14 значащих цифр и на- ходятся в интервале (0,1). Для генерации целого псевдослучайного числа, лежащего на отрезке [X,Y], применяется оператор присваивания вида: Z = INT((Y-X+1)*RND(1)+X) П р и м е р 3. 10 INPUT X,Y ───────────── 20 PRINT INT((Y-X+1)*RND(1)+X);:GOTO 20 run ? 1,5 3 1 4 3 4 1 2 5 4 3 5 3 Break in 20 (нажато "CTRL"+"STOP") Ok При повторном запуске программы будем иметь: run ? 1,5 3 1 4 3 4 1 2 5 4 3 5 3 Break in 20 (нажато "CTRL"+"STOP") Ok Ясно,что для получения целого псевдослучайного числа, лежащего на отре- зке [0,9], можно применить оператор присваивания: Z = INT(10*RND(1)) Обычно желательно получать "абсолютно непредсказуемые" псевдослучайные числа. Чтобы добиться этого, прежде всего необходимо инициализировать ге- нератор псевдослучайных чисел в программе также псевдослучайным числом. Для этого в начале программы используется оператор вида: X = RND(-TIME) Помните, что такая инициализация должна осуществляться только один раз! Всюду далее, в тех местах программы, где необходимо получить случайное число, пишется выражение RND(1) . П р и м е р 4. 10 INPUT X,Y:G=RND(-TIME) ───────────── 20 PRINT INT((Y-X+1)*RND(1)+X);:GOTO 20 run ? 1,5 1 2 4 3 4 4 2 2 2 2 1 2 4 Break in 20 (нажато "CTRL"+"STOP") Ok run ? 1,5 4 1 1 3 2 3 1 2 3 4 1 Break in 20 (нажато "CTRL"+"STOP") Ok Отметим, что конструкция языка программирования, которая может быть использована в контексте, предполагающем присваивание значения, называет- ся п с е в д о п е р е м е н н о й . В MSX-BASICе имеется шесть псевдопеременных: TIME, SPRITE$(), MID$(α$,m,n), VDP(), MAXFILES, BASE() . Поговорим о псевдопеременной TIME. MSX - компьютер обладает счетчиком,который называется т а й м е р о м и запускается автоматически при включении машины. Таймер принимает целые значения из диапазона [0,65535]. Дойдя до 65535, он снова начинает вести отсчет от нуля; таймер обновляется каждые 18.2 минуты. Более длительные интервалы времени можно задавать программным путем или с помощью специаль- ной аппаратуры. Очевидно,что 60 "тиков" таймера соответствуют одной секун- де времени.Показания таймера и значение псевдопеременной TIME в с е г д а с о в п а д а ю т! Поэтому Вы всегда можете узнать показания таймера при помощи оператора присваивания вида: X = TIME , где TIME ("time"-"время") - служебное слово. Более того,Вы имеете возможность устанавливать новое значение таймера, используя оператор присваивания TIME = α , где α - арифметическое выражение. В результате псевдопеременная TIME получает значение, равное целой час- ти значения арифметического выражения α (0≤INT(α)≤65535). П р и м е р 5. NEW ───────────── Ok 10 INPUT T:TIME=T 20 FOR M=1 TO 1000:NEXT 30 PRINT TIME;:GOTO 20 run ? 0 134 269 403 538 672 807 941 ... Ok run ? 64999 65132 65267 65402 0 134 269 403 ... Ok П р и м е р 6. 10 TIME=0 ───────────── 20 IF TIME=65535 THEN PRINT TIME/60;"сек" ELSE GOTO 20 run далее print 1092.25/60 1092.25 сек 18.204166666667 Ok Ok Используя псевдопеременную TIME,можно учитывать время работы программы. П р и м е р 7. NEW ───────────── Ok 10 TIME=0 20 FOR K=1 TO 10000:NEXT 30 PRINT TIME/60;"сек" Используя эту программу,получим забавные таблицы для компьютеров MSX-1! Дисплей монохроматический! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 15.3 │ 24.7 │ 27.1 │ 27.3 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 12.3 │ 21.6 │ 23.9 │ 23.9 │ └────────────────────────┴───────┴───────┴───────┴───────┘ Дисплей цветной! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 15.58 │ 25.20 │ 27.67 │ 27.87 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 12.53 │ 22.03 │ 24.42 │ 24.42 │ └────────────────────────┴───────┴───────┴───────┴───────┘ ...а теперь для компьютеров MSX-2 (сетевой вариант): Дисплей монохроматический! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 12.90 │ 22.00 │ 24.13 │ 24.18 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 10.25 │ 19.02 │ 21.08 │ 21.15 │ └────────────────────────┴───────┴───────┴───────┴───────┘ Дисплей цветной! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 14.28 │ 24.08 │ 26.60 │ 26.70 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 11.37 │ 20.77 │ 23.37 │ 23.27 │ └────────────────────────┴───────┴───────┴───────┴───────┘ ... и наконец, для компьютера MSX-2, отключенного от локальной сети: Дисплей монохроматический! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 7.98 │ 17.22 │ 19.58 │ 19.80 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 5.05 │ 14.18 │ 16.48 │ 16.48 │ └────────────────────────┴───────┴───────┴───────┴───────┘ Дисплей цветной! ┌───────┬───────┬───────┬───────┐ Время измеряется в секундах!│ К% │ К! │ К# │ К │ ┌────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXTK │ 8.37 │ 18.07 │ 20.55 │ 20.77 │ ├────────────────────────┼───────┼───────┼───────┼───────┤ │ FOR K=1 TO 10000:NEXT │ 5.28 │ 14.87 │ 17.30 │ 17.28 │ └────────────────────────┴───────┴───────┴───────┴───────┘ Запомните, что большинство операций ввода-вывода выключают таймер,и он начинает отсчет заново после окончания ввода-вывода! П р и м е р 8. NEW NEW ───────────── Ok Ok 10 DIM M(50,50) 10 DIM M(50,50),A 20 TIME=0:A=1:PRINT TIME 20 TIME=0:A=1:PRINT TIME run run 36 1 Ok Ok Приведем пример использования функции RND и псевдопеременной TIME. П р и м е р 9. NEW ───────────── Ok 5 'Нахождение числа π методом Монте-Карло 10 X=RND(-TIME):INPUT"Количество бросаний точки -";N 20 FOR I=1 TO N:X1=RND(1):X2=RND(1) 30 IF X1^2+X2^2<1 THEN IN=IN+1 40 NEXT:PRINT "π≈";4*IN/N run Количество бросаний точки - 100 π≈ 3.4 (π≈ 3.2) Ok run Количество бросаний точки - 200 π≈ 3.12 (π≈ 3.24) Ok run Количество бросаний точки - 500 π≈ 3.208 (π≈ 3.008) Ok run Количество бросаний точки - 750 π≈ 3.2213333333333 (π≈ 3.2171428571429) Ok run Количество бросаний точки - 1000 π≈ 3.204 (π≈ 3.156) Ok Справа в круглых скобках приведены результаты счета при повторном запу- ске данной программы через некоторое время с теми же значениями N. I.8. ВЫРАЖЕНИЯ Возможность использования выражений является одним из главных преиму- ществ языков программирования высокого уровня перед машинными языками. В ы р а ж е н и е - последовательность операндов, соединенных знаками операций, а при необходимости - и к р у г л ы м и скобками так,что в ре- зультате выполнения операций получается единственное значение, которое на- зывается з н а ч е н и е м в ы р а ж е н и я . Напомним, что под о п е р а н д о м мы понимаем либо константу, либо переменную (простую или индексированную), либо встроенную функцию, либо функцию пользователя (см. раздел IV.3). Заметим, что в частном случае выражение может содержать только конс- танту, имя переменной, вызов встроенной функции или функции пользователя. Итак, например, простейшими выражениями являются: 5 ; -.5Е6 ; Х1 ; "А" ; COS(Z) ; X-2>=0 . Вычисление значения выражения заключается в том, что вместо имен пере- менных и функций подставляются их значения, и выполняются заданные опера- ции. При этом учитываются п р а в и л а с т а р ш и н с т в а о п е р а- ц и й. Напомним, что вычисление значения встроенной функции или функции пользователя имеет н а и в ы с ш и й приоритет! В отличие от обычной математической записи выражения в BASICе записыва- ются в одну строку без подстрочных и надстрочных индексов. Причем,если в математике можно опустить знак умножения при записи алгебраических выраже- ний (например,2а+3b), то в BASIC это не допускается (надо писать:2*а+3*b). Нетрудно понять, чем вызвано введение такого правила:без него невозможно определить, означает ли АВ умножение А на В или это - имя переменной. Менять порядок вычислений (чтобы застраховать себя в сомнительных слу- чаях) программист может с помощью круглых скобок. Порядок работы со скоб- ками соответствует общепринятому в математике,то есть вначале вычисляется значение выражения, стоящего в скобках. Например, значение выражения A+B*COS(Z) вычисляется так же, как и зна- чение выражения A+(B*COS(Z)) . Если в выражении н е т с к о б о к , то надо внимательно следить за п о р я д к о м с т а р ш и н с т в а о п е р а ц и й . Например, многие начинающие программисты записывают для вычисления зна- чения дроби A ─── 2*B в программе выражение: A/2*B , которое равносильно выражению A ───*B , 2 ибо приоритет операций "/" и "*" одинаков! Верно записанное выражение должно иметь вид: A/2/B или A/(2*B) . Аналогично, 2^2^K означает (2^2)^K, а не 2^(2^K)! Скобки могут вкладываться одни в другие п р а к т и ч е с к и неогра- ниченно: максимальное количество вложений скобок равно 126. Если все же выражение не удовлетворяет этому ограничению, выдается со- общение: "Out of memory" ("Н е х в а т а е т п а м я т и"). I.8.1. А р и ф м е т и ч е с к и е и с т р о к о в ы е в ы р а ж е н и я А р и ф м е т и ч е с к и м выражением будем называть выражение,значе- нием которого является число. П р и м е р ы арифметических выражений : ───────────── -154.567E-1 и -154.567*10^(-1) (укажите различие!) p1 D-B^2+4*a*C SQR(A^2+B^2-2*A*B*cos(X)) (-B+ABS(D))/(2*A) T%+c%*n%-4 С т р о к о в ы м выражением будем называть выражение, значением кото- рого является строка. П р и м е р ы строковых выражений: ───────────── "А Б Б А" , AH$ s$+" "+"2" MID$(A$,3,7) I.8.2. Л о г и ч е с к и е в ы р а ж е н и я Но да будет слово ваше: да, да; нет, нет; а что сверх этого, то от лукавого. Матф.,5,37 Наряду с арифметическими и строковыми выражениями можно рассматривать л о г и ч е с к и е в ы р а ж е н и я. Разберем вначале частный случай логического выражения - о т н о ш е н и е. О т н о ш е н и е - выражение, состоящее из двух арифметических или строковых выражений, связанных знаком операции отношения. Например, X*X>=0 5<2 "А">"а" Z$+MID$(X$,2,N%)="a" Для п р о г р а м м и с т а значением о т н о ш е н и я может быть либо Т, либо F. Так, первое из приведенных выражений имеет значение Т, второе - F. Четвертое выражение принимает то или иное значение в зависимости от значе- ний строковых переменных Z$,X$ и целочисленной переменной N%. Для компьютера значением о т н о ш е н и я будет: 1) -1, если о т н о ш е н и е истинно; 2) 0, если о т н о ш е н и е ложно. Приведем пример нестандартного применения отношений. С помощью "смешан- ного" (оно содержит арифметические операции и операции отношения) выраже- ния вида: -(X>=1)*X^2-(X<1)*(X+4) программист может вычислить значение кусочно-непрерывной функции Y, описы- ваемой формулами: X² , если Х≥1, Y = { X+4 , если Х<1. Отметим, что с помощью оператора IF (см.далее раздел III.2.) вычисление значения функции Y производится следующим образом: IF X>=1 THEN Y=X^2 ELSE Y=X+4 . Л о г и ч е с к и м в ы р а ж е н и е м будем называть последователь- ность отношений,соединенных знаками л о г и ч е с к и х операций и знака- ми операций отношения. В логических выражениях, так же как в арифметических и строковых,можно (и нужно!)использовать круглые скобки. Гораздо легче запутаться в логичес- ких выражениях, чем в арифметических, поэтому если в логическое выражение входят несколько логических операций,то о б я з а т е л ь н о используй- те с к о б к и! При отсутствии скобок необходимо учитывать приоритет опе- раций. Значением логического выражения для п р о г р а м м и с т а может быть одно из двух логических значений: Т или F. Значением логического выражения д л я Э В М является либо: 1) целое число,отличное от нуля (этот случай соответствует логическому значению Т); 2) нуль (этот случай соответствует логическому значению F). Логические выражения часто называют у с л о в и я м и. Если выражение имеет значение Т, то говорят, что соответствующее условие с п р а в е д - л и в о (выполняется). В противном случае говорят,что условие не справед- ливо (не выполняется). П р и м е р ы: ───────────── 1) Z=1 AND F<4 ─▲─ ─▲─ ─▲─ │ │ │ отношение │ отношение знак логической операции 2) NOT ( A1) = (F<=41) ──▲── ▲ ───▲─── │ │ │ отношение │ отношение знак операции отношения 4) написать логическое выражение, которое имеет значение Т при выполне- нии следующего условия: a) значение переменной X находится в одном из двух интервалов (A,B) и (C,D). Ответ: (X>A AND XC AND X=0 истинно для точек, принадлежащих правой полуплоскости, а отношение Y>=0 - для точек верхней полуплоскости.Объединяя эти отношения логической операцией AND, получим искомое логическое выражение, истинное для точек, принадлежащих заданной области: X^2+Y^2<=1 AND X>=0 AND Y>=0 ; c) из отрезков длиной A, B и C можно построить треугольник. Р е ш е н и е. Как нетрудно видеть, искомое логическое выражение имеет вид: (AC)AND(C>ABS(B-A)) ; d) ближайшее к значению переменной X целое число четно и отлично от нуля. Ответ: FIX(X+.5)MOD2=0ANDFIX(X+.5)<>0; е) при делении значения целой переменной X на значение целой перемен- ной Y в остатке получается число, делящееся нацело на значение целой пере- менной Z. Ответ: (X%MODY%)MODZ%=0; 5) записать логическое выражение (A+5=0)AND(B=0)AND(K=5*B) , не прибегая к символам логических операций. Ответ: ABS(A+5)+ABS(B)+ABS(K-5*B)=0. Таким образом, логическое выражение ((A+5=0) AND (B=0) AND (K=5*B)) EQV (ABS(A+5)+ABS(B)+ABS(K-5*B)=0) имеет значение T; 6) заметим, что, вообще говоря, при записи логических выражений (усло- вий) можно обойтись без логических операций XOR, EQV, IMP,то есть логичес- кие выражения вида: ZIMPY=(NOTZ)ORY, ZXORY=(ZAND(NOTY))OR((NOTZ)ANDY), ZEQVY=NOT(ZXORY) истинны (имеют значение Т). Еще раз настойчиво рекомендуем Вам, записывая логические выражения, не жалеть скобок и не пользоваться логическими операциями, смысл которых Вам непонятен! I.9. Д о п о л н е н и е Я уверен, вы согласитесь со мной, что если стра- ница 534 застает нас только во второй главе, то первая должна быть невыносимо длинной. Конан Дойль Одним из критериев оценки производительности компьютеров является вре- мя выполнения определенных тестовых программ-"бенчмарков" ("benchmark"- "эталонный текст","benchmarking"-"определение эффективности системы (ЭВМ или программного обеспечения) посредством выполнения эталонных программ или обработки эталонных наборов данных"). В книге [21] приведено сравнение результатов выполнения одной из таких программ на ряде компьютеров и микрокалькуляторов. П р о г р а м м а - b e n c h m a r k ───────────────────────────────────── NEW Результаты эксперимента следующие: Ok персональные компьютеры: 110 PRINT "Начало";:TIME=0 IBM PC - 37 секунд, 120 K=0:DIM M(5) Apple IIe - 46 секунд, 140 K=K+1 '◀───┐ Искра 226 - 49 секунд, 150 A=K/2*3+4-5 ' │ Tandy Color - 51 секунд, 160 GOSUB 230 '───▶ ' │ Электроника НЦ-80-20 - 56 секунд, 170 FOR L=1 TO 5 ' │ Epson HX-20 - 101 секунд, 180 M(L)=A ' │ СМ-1800 - 104 секунд, 190 NEXT L ' │ калькулятор: 200 IF K<1000 THEN 140 '───▶┘ FX-702P фирмы "Casio" - >20 минут. 210 PRINT TIME/60;"сек":PRINT "Конец" 220 END 230 RETURN '──▶ ┌─────────────────────────────┐ ┌──────────────────────────────┐ │ run │ │ run Учительский │ │ Начало │ │ Начало компьютер серии │ │ 57.2 сек Компьютер серии │ │ 47.45 сек MSX-2, │ │ Конец MSX-1 │ │ Конец отключенный от │ │ Ok │ │ Ok сети │ └─────────────────────────────┘ └──────────────────────────────┘