ГЛАВА 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, а символьные переменные указываются индивидуально признаком $. Задание всех числовых переменных как целых значительно сокращает время вычислений,а также умень- шает размер памяти, необходимый для хранения значений этих переменных.