\/d ГЛАВА II. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ \/d- Приступая к лечению, врач должен делать это изящно и весело; хмурый врач никогда не пре- успеет в своем ремесле. М.Монтень Прежде чем переходить к непосредственному программированию, мы хотим дать два совета: 1) овладеть основами программирования можно лишь при условии повседнев- ной практики на вычислительной машине; 2) не рекомендуем читать описание языка программирования "просто так",в расчете на то,что "может быть, потом пригодится". Выберите задачу и начинайте составлять программу ее решения параллель- но с лекционным курсом.Тогда Вы поймете главное: зачем нужны и как исполь- зуются те или иные конструкции языка. Если по постановке Ваша задача отли- чается от задач, разобранных нами в качестве примеров, ищите аналогию в действиях. В процессе составления алгоритма и программирования учтите,что: 1. В любой сколь угодно малой программе есть, по крайней мере, одна ошибка. 2. Всякую программу можно сократить, по меньшей мере, на одну команду. 3. Начиная с некоторого уровня сложности программы, появление непред- виденной ошибки становится неизбежным. 4. Всякое непроверенное вычисление неверно. Из старинной книги "Заповеди программиста" 5. Человеку свойственно ошибаться, глупцу упорствовать (в своих ошиб- ках). Марк Туллий Цицерон 6. В программировании как в гольфе: любой может научиться за месяц, но в конце месяца программируют так же, как и играют: о ч е н ь п л о х о. J.R.Rice 7. ЭВМ многократно увеличивает некомпетентность вычислителя. Принцип некомпетентности Питера 8. Умствуй - и придет! Л.Магницкий II.1. РЕЖИМЫ РАБОТЫ После одновременного нажатия на клавиатуре компьютера клавиш "CTRL" и "STOP"(что обозначается "CTRL"+"STOP") на экран дисплея выводится "систем- ная подсказка" "Ok" ("o'kay"-"о'кей, все в порядке"). С этого момента Вы можете работать в любом из двух режимов: 1. Режим прямого, или непосредственного, выполнения команд; WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW при работе в режиме прямого выполнения команд на клавиатуре ЭВМ набирает- ся последовательность к о м а н д (указаний,предписаний), которая воспро- изводится на экране дисплея. Затем она вводится в оперативную память ком- пьютера нажатием клавиши XWWWWWWWWWWY V V V V ░WW[ V , ZWWWWWWWWWW[ которая имеет следующие названия: клавиша "RETURN", клавиша "возврата каретки-перевода строки", клавиша "ввода", "ENTER" ("to enter"-"вводить"), клавиша "CR"("Carriage Return"-"возврат каретки"), клавиша "клюшка" (шутливое название). Немедленно после этого вычислительное устройство ЭВМ выполняет данную по- следовательность команд. Сами команды после исполнения не запоминаются (теряются). XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V Важно помнить,что ввести информацию в компьютер - это значит не толькоV V набрать на клавиатуре соответствующий текст, но и нажать после этогоV V клавишу "RETURN"! V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Простейшие вычисления в режиме прямого выполнения команд производятся при помощи команд: LET и PRINT (см. разделы II.4.1. и II.4.4.). Например,вычисление значения арифметического выражения SQR(3^2+4^2) вы- полняется по команде: PRINT SQR(3^2+4^2) После набора этой команды на клавиатуре и введения ее в оперативную па- мять компьютера (нажатием клавиши "RETURN") производится вычисление зна- чения арифметического выражения,стоящего справа от служебного слова PRINT. В результате на экране дисплея остается следующая информация: Ok PRINT SQR(3^2+4^2) 5 Ok Напомним, что признаком готовности ЭВМ к работе в режиме прямого выпол- нения команд является наличие "системной подсказки" "Ok" на экране дис- плея.Пока "Оk" не выведено на экран дисплея,Вы не можете обратиться к ЭВМ: она занята своей работой и только по окончании ее выводит на экран дис- плея "системную подсказку" "Ok"! Приведем еще пример: Ok print "Стремитесь к простоте программ." Заметим, что служебное слово print при вводе можно заменять символом "?", например: Ok ? "Стремитесь к простоте программ." После набора этой команды на клавиатуре и нажатия клавиши "RETURN" эк- ран дисплея примет следующий вид: Ok ? "Стремитесь к простоте программ." Стремитесь к простоте программ. Оk Таким образом, по указанной команде компьютер вывел на экран дисплея текст, который был заключен в кавычки. Появившееся после этого сообщение "Ok" свидетельствует о готовности интерпретатора (см. II.2) "принять" новую команду. Несколько следующих друг за другом команд прямого режима можно поме- щать на одной строке,которая называется к о м а н д н о й строкой. При этом команды одной командной строки отделяются друг от друга двоеточием. Максимально допустимое число символов в одной командной строке равно 255, поэтому длинная строка может занимать до семи 40 - символьных или четырех 80-символьных дисплейных (физических) строк. При вводе командной строки клавишу "RETURN" нажимают всего лишь один раз после набора последней ко- манды данной строки.Если при вводе командной строки дисплейная строка уже заполнена, то дальнейший текст а в т о м а т и ч е с к и переносится на следующую дисплейную строку (без какого-либо символа переноса). Н е о п а с а й т е с ь э т о г о! Прямой режим полезен при о т л а д к е программ и при использовании MSX-BASIC в качестве калькулятора для проведения коротких вычислений. П р и м е р ы: WWWWWWWWWWWWW 1) Ok 2) Ok 3) Ok print (5^2-7) ? SIN(ATN(1)*4/2) ? LOG(EXP(1)) 18 1 .99999999999986 Ok Ok Ok 4) Ok 5) Ok 6) Ok ? ATN(1)*4 ? 25.68MOD6.99 ? 15AND14 3.1415926535898 1 14 Ok Ok Ok 7) Оk 8) Ok 9) Ok print 25.68\6.99 ? (-1)OR(-2) print 3>1 4 -1 -1 Ok Ok Ok 10) Ok 11) Ok 12) Ok ? "BONY"+"'M" ? "1AAA"<"2aaa" ? (4<>4)AND(9<1) BONY'M -1 0 Ok Ok Ok 13) Ok 14) Ok 15) Ok ? 1/SIN(0) ? 1/COS(2*ATN(1)) ? TAN(2*ATN(1)) Division by zero -15915494309189 -15915494309189 Ok Ok Ok 16) Ok Ok ?(-32768%)/(-1%) однако... ? (-32768)/(-1) Owerflow 32768 Ok Ok Заметим, что арифметические, логические и строковые выражения, стоящие после служебного слова PRINT, могут содержать имена переменных.Разумеется, этим переменным до вычисления значения выражения должны быть присвоены на- чальные значения. Это осуществляется при помощи команды присваивания LET. 17) Ok 18) Ok LET A#=-1/3: PRINT ABS(A#*2)+2 DIM A(78):A(45)=SIN(4*ATN(1)) 2.6666666666667 :?A(45) Ok -1.2566370614359E-13 Ok Отметим,что служебное слово LET при записи команды присваивания можно опускать. 19) Длину окружности и площадь круга радиуса R=2 можно вычислить при помощи следующей последовательности команд: Ok PI=4*ATN(1):R=2:PRINT 2*PI*R:PRINT PI*R^2 12.566370614359 12.566370614359 Ok Более того, команда PRINT в прямом режиме позволяет мгновенно перево- дить числа из двоичной, восьмеричной и шестнадцатеричной систем счисления в десятичную, например: 20) Ok 21) Ok 22) Ok ? &b11100111 print &hffff print &O4567 231 -1 2423 Ok Ok Ok 23) Ok 24) Ok 25) Ok ? &hff-&o7+&b11 ? &hffMOD&b10 ? &O3456/&HF2 251 1 7.595041322314 Ok Ok Ok 2. Режим выполнения программы (или программный режим); WWWWWWWWWWWWWWWWWWWWWWWWWW WWWWWWWWWWWWWWWWW вначале ответим на вопрос: "Что же такое п р о г р а м м а ?" В "Матема- тической энциклопедии" (т.4, с.646) читаем: "П р о г р а м м а - план действий, подлежащих выполнению некоторым исполнителем,обычно автоматичес- ким устройством, чаще всего ЭВМ; предписание,алгоритм. Программа представ- ляется в виде конечной совокупности о п е р а т о р о в (команд,инструк- ций), каждый из которых побуждает исполнителя выполнить некоторую элемен- тарную операцию над данными, хранящимися в памяти исполнителя, и имена ко- торых являются параметрами оператора. Автоматизм исполнения достигается тем, что любой текущий оператор, кроме завершающего, указывает однозначно на оператор программы, который должен выполняться после текущего...". Итак,вместо того, чтобы вводить команды в режиме непосредственного (не- медленного) исполнения, можно составить из них программу,которая будет вы- полняться позже в нужный момент.Такой способ работы с ЭВМ называется р е- ж и м о м в ы п о л н е н и я п р о г р а м м ы или п р о г р а м - м н ы м р е ж и м о м . В этом режиме команды обычно называются о п е- р а т о р а м и , хотя часто оба термина употребляются как синонимы. Это связано с тем, что большинство команд режима прямого выполнения можно ис- пользовать в качестве операторов режима выполнения программы и наоборот. Однако есть такие команды (например, AUTO, RENUM), которые целесообраз- но использовать только в режиме прямого выполнения, и такие операторы (на- пример, DATA,DEFFN), которые выполняются только в программном режиме. II.2. ИНТЕРПРЕТАТОРЫ И КОМПИЛЯТОРЫ BASIC - язык программирования высокого уровня. Это значит, что он уни- версален, не связан с конкретной вычислительной машиной. Чтобы программа, написанная на таком языке, могла быть исполнена на реальной ЭВМ, необходи- ма особая программа - т р а н с л я т о р, выполняющая роль переводчика на машинный язык.Благодаря наличию транслятора программист приобретает су- щественное удобство: ему нет нужды знать специфику конкретной машины.Напи- санная на языке высокого уровня, его программа становится,как говорят,"пе- реносимой" с одной ЭВМ на другую. Есть два основных типа трансляторов: и н т е р п р е т а т о р ы и к о м п и л я т о р ы . Для BASIC типичны первые, для многих других язы- ков программирования (например, Pascal) - вторые. И н т е р п р е т а т о р работает как синхронный переводчик: он пыта- ется понять каждое очередное предложение (оператор) программы, то есть вы- разить его "смысл" в виде цепочки команд ЭВМ и тут же выполнить их. По-другому действует к о м п и л я т о р .Если продолжить аналогию,он работает как создатель добротного литературного перевода;он переводит про- грамму,как некий связный рассказ, учитывая взаимоотношения ее частей и вы- являя не только ошибки в отдельных элементах,но и несогласованности между ними.Требования к "правильности" программы у компилятора намного выше.Ком- пиляция часто производится за несколько просмотров программы. Программа при этом не исполняется: перевод готов, но "не звучит".Одна из причин это- го состоит в том, что компилируется программа обычно по частям (м о д у - л я м), особенно если она большая и сложная. Особая программа - к о м п о- н о в щ и к собирает отдельные модули, полученные после трансляции,в еди- ное целое: окончательный, готовый к исполнению м а ш и н н ы й к о д. Уже из этих кратких характеристик понятно, что интерпретатор намного проще в обращении. Вследствие этого BASIC позволяет непосредственно ощу- тить процесс программирования. Программа может быть составлена (даже не полностью) и тут же исполнена "на пробу". Программист может вмешиваться в процесс исполнения и сразу вносить необходимые коррективы в работу про- граммы, пока она еще не свободна от ошибок, а затем быстро исправлять ее текст с учетом пробного запуска и тут же повторять все эти действия снова. Для начинающего программиста, который часто ошибается, эти свойства языка, конечно,чрезвычайно привлекательны, поскольку ошибка во многих случаях об- наруживается легко и быстро. В некоторых других языках программирования (Pascal) обнаружение ошибки в программе и ее исправление сопряжено со значительно большими затратами труда и времени. Во-первых, нужно еще дождаться, пока можно будет попробовать программу в деле. Компиляция каждого модуля может длиться несколько минут, а ведь затем надо еще собрать их воедино. Во-вторых, даже при безошибочной компиляции отдельных частей отнюдь не гарантирована правильная работа программы в целом: части могут быть плохо пригнаны друг к другу. Предположим теперь, что ошибка обнаружена.Мы не мо- жем исправить одно лишь ошибочное место программы так, как мы делаем это на BASIC. Придется перекомпилировать весь модуль, иногда из-за одной стро- ки - несколько сотен. Однако, потом оттранслированная и скомпанованная программа будет рабо- тать намного быстрее,чем подобная программа на BASIC. Ведь интерпретатор BASIC переводит каждый оператор перед каждым его выполнением, а значит - каждый раз тратит время на перевод. Как синхронный переводчик, он, сказав, тут же забывает сказанное, и в следующий раз должен будет повторить всю проделанную работу по переводу. Создатель литературного перевода держит в уме весь текст целиком; он знает, что его перевод, сделанный однажды, бу- дут потом читать тысячи читателей в течение многих лет,и работает над ним тщательнейшим образом. Компилятор выполняет свою работу, так же тщательно выверяя окончательный результат. После компиляции и сборки отлаженную про- грамму можно запускать многократно, и затраты труда на ее разработку так же, как и затраты времени на трансляцию, окупятся с лихвой. Существует еще один вид транслятора. В советском компьютере БК-0010.01 используется компилятор с элементами интерпретатора,что позволяет в какой- то мере получить достоинства и того и другого. В частности, такой необыч- ный "гибридный" транслятор по столь важному параметру, как быстродействие, ставит БК-0010.01 в ряд популярных зарубежных б ы т о в ы х компьютеров (т.е. ЭВМ для дома, для игр, развлечений, создания личного архива, карто- теки, справочника, решения сравнительно простых задач). II.3. ОФОРМЛЕНИЕ И РЕДАКТИРОВАНИЕ ПРОГРАММ При записи программы на MSX-BASIC необходимо соблюдать ряд требований, а именно: 1. Текст программы записывается п о с т р о ч н о, четкими п е ч а т- н ы м и символами;при записи служебных слов разрешается использовать как прописные, так и строчные латинские буквы в любом сочетании, причем все строчные латинские буквы после ввода преобразуются интерпретатором в про- писные (однако символы, заключенные в кавычки, всегда выводятся на экран дисплея без изменения). 2. Каждая строка программы (программная строка) начинается н о м е- р о м этой строки и заканчивается нажатием клавиши "RETURN" XWWWWWWWWWWY V V V V ░WW[ V ; ZWWWWWWWWWW[ до нажатия этой клавиши ЭВМ "не интересуется" тем, что пользователь напи- сал на экране дисплея, а после нажатия "приступает" к анализу содержимого программной строки. Интерпретатор игнорирует все пробелы между номером строки и началом оператора в этой строке(аналогично не учитывается и боль- шинство остальных пробелов (хотя и не всегда!)). 3. Программные строки нумеруются целыми числами от 0 до 65529 в возрас- тающем порядке. 4. При составлении начального варианта программы рекомендуется нумеро- вать строки с интервалом 10: 10, 20, 30,... . Нумерация программных строк через 10 позволяет дополнять программу, вставляя новые программные строки между введенными в память ранее (новые строки при этом имеют промежуточ- ные номера: 15, 17, 21, 23 и т.д. и, даже будучи введенными с клавиатуры в разное время, размещаются в памяти ЭВМ в строгом соответствии со своими номерами). 5. В каждой программной строке старайтесь размещать один з а к о н- ч е н н ы й оператор (в случае размещения в строке нескольких закончен- ных операторов операторы внутри строки отделяются друг от друга символом ":" (двоеточие), причем после последнего оператора в программной строке двоеточие не ставится); строка программы может занимать до с е м и дис- плейных строк на 40-символьном экране дисплея, так как максимальное число знаков в строке программы, включая номер строки, равно 255. Избегайте "с и н д р о м а о д н о й с т р о к и"! Данная "болезнь" начинающего программиста заключается в старательном размещении в каждой программной строке "огромного" количества операторов, в результате чего программа ста- новится совершенно "нечитабельной". 6. Последним оператором программы может быть оператор окончания про- граммы END . С другой стороны, иногда можно обойтись и без этого оператора: выполнив последнюю строку программы, ЭВМ останавливается сама - ей больше нечего делать, операторы (команды) кончились! 7. Для записи программы в память ЭВМ и для ее исполнения необходимо со- проводить программу к о м а н д а м и (разумеется,они не нумеруются!) NEW и RUN ("new"-"новый", "to run"-"бежать"), первая из которых записывается на пер- вой перед программой дисплейной строке, вторая - на свободной дисплейной строке, расположенной за последней строкой программы. Обе команды заканчи- ваются нажатием клавиши "RETURN". По команде NEW из оперативной памяти удаляются все предыдущие програм- мы пользователя и значения переменных.Обязательно используйте эту команду для уничтожения старых программ, прежде чем начать вводить новую програм- му, иначе Вы только "измените" Вашу старую программу. Отметим, что команда NEW является и оператором! Команда RUN в ее простейшей форме (в виде одного служебного слова) яв- ляется сигналом к выполнению введенной программы, начиная с программной строки с наименьшим номером. Команда RUN является также и о п е р а т о р о м. Если эта команда за- дана как строка Вашей программы,то она перезапускает Вашу программу таким образом, как будто она была сначала остановлена, а затем запущена снова. Существует, однако, модификация команды RUN, позволяющая запускать про- грамму с л ю б о й д р у г о й с т р о к и: для этого после служебного слова RUN указывается номер существующей программной строки,с которой про- граммист пожелает начать выполнение программы, например: RUN 23 . Отличительной особенностью команды (оператора) RUN n является "стира- ние" значений всех переменных. Таким образом достигается идентичное состо- яние памяти при каждом новом запуске программы. Запомните, что если Вы хотите начать выполнение программы со строки с заданным номером n, но при этом сохранить значения всех переменных, не ис- пользуйте команду RUN n , а примените в режиме прямого выполнения команду GOTO n или GOSUB n (см. разделы III.1 и IV.4). Разумеется, номер строки, указанной в операторе RUN,не должен находить- ся внутри цикла или подпрограммы! Таким образом, программы на BASIC имеют такой общий вид: NEW Ok 10 оператор 1 20 оператор 2 30 оператор 3:оператор 4 GGG NN [END] run Заметим, что здесь и всюду далее к в а д р а т н ы е с к о б к и - обозначение,указывающее,что информация внутри них не является обязательной. XWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWY V Напомним еще раз, что при вводе программы в память в концеV V каждой программной строки надо нажимать клавишу "RETURN"! V ZWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW[ Нумерация строк программы имеет целью: 1) отметить каждую программную строку индивидуальной меткой - н о м е - р о м , что позволяет обратиться к любой строке из любой другой програм- мной строки; 2) упорядочить расположение операторов в программе, которая обрабатыва- ется интерпретатором построчно ; 3) существенно облегчить процедуру р е д а к т и р о в а н и я (исправ- ления) программы, так как интерпретатор выдает сообщение об ошибке в конк- ретной программной строке, указывая ее номер, и пользователь получает воз- можность либо исключить строку из программы,либо записать в память ЭВМ от- корректированный (исправленный) текст строки. Рассмотрим несколько команд редактирования программ. II.3.1. К о м а н д а AUTO . К о м а н д а RENUM Автоматизировать процедуру присвоения номеров программным строкам мож- но командой АUTO [n1][,n2] , где: AUTO ("AUTOmatic"-"автоматический") - служебное слово; n1,n2 - целые числовые константы; 0 Ё n1,n2 Ё 65529 . По этой команде происходит задание режима автоматической нумерации про- граммных строк от строки с номером n1 и далее с шагом n2. По умолчании n1=10 и n2=10. Таким образом, команда AUTO без параметров позволяет автоматически нумеровать программные строки через 10, начиная с программной строки с номером 10. Нажатие клавиш "CTRL"+"STOP" отменяет действие команды AUTO. Если очередной номер строки, сгенерированной режимом автоматической ну- мерации,совпадает с номером уже находящейся в памяти строки (введенной ра- нее), то на экране дисплея индицируется номер этой программной строки со звездочкой "*", например: 55*. В этом случае,если мы хотим сохранить "ста- рое" значение этой программной строки, мы должны нажать клавишу "RETURN"- компьютер сохранит эту программную строку и перейдет к генерации следующе- го номера. Общий вид команды изменения нумерации программных строк: RENUM [n1][,n2][,n3] , где: RENUM("to RENUMber"-"перенумеровать") - служебное слово; n1,n2,n3 - целые константы, 0Ёn1,n2,n3Ё65529. По команде RENUM производится перенумерация (изменение нумерации) про- граммных строк, начиная со строки с номером n2 и дальше с шагом n3.Причем, n1 - это новый номер прежней строки n2. По умолчании: n1=10, n3=10, n2 - номер начальной строки программы. Параметр n2 может быть опущен, но запя- тая, относящаяся к нему, должна быть сохранена. В качестве параметров n1 и n2 может быть использован символ ".", который является ссылкой на "те- кущий" номер программной строки (имеется в виду последний, упомянутый но- мер программной строки). Команда RENUM, кроме того, проверяет, все ли программные строки, на ко- торые имелись ссылки в операторах программы, действительно существуют (не- зависимо от этого осуществляется перенумерация всех строк); если програм- мная строка с номером n не существует, а на нее имеется ссылка в строке m, то выдается сообщение: "Undefined line n in m" ("О т с у т с т в у е т с т р о к а n в m"). Перенумеровать операторы можно: 1) перед последующим слиянием программ; 2) для проверки существования строк программы, на которые имеются ссыл- ки. Для этого используйте команду RENUM с параметром n2, превышающим все существующие номера строк, например, RENUM 65000,65000 Перенумерация при этом не осуществляется, но Вы получите информацию обо всех пропущенных номерах строк. П р и м е р ы: RENUM WWWWWWWWWWWWW RENUM 200,150,5 RENUM 200,100 Обратите внимание: новый номер строки должен быть больше или равен ста- рому номеру! Куда девал сокровища убиенной тобою тещи? Отец Федор II.3.2. К о м а н д а DELETE . К о м а н д а [L]LIST Команда DELETE может быть записана в одной из следующих форм: DELETE n1-n2 DELETE . DELETE -n2 DELETE .-n2 DELETE n1 DELETE n1-. Здесь: DELETE ("to delete"-"стереть") - служебное слово; n1 и n2 - целые константы, 0Ёn1,n2Ё65529. По команде DELETE из программы удаляются программные строки с номерами от n1 до n2 включительно. Если параметр n1 отсутствует, то в качестве n1 берется номер первой строки программы. Символ ".", используемый вместо но- мера строки обозначает "текущий" (последний упомянутый) номер программной строки. П р и м е р ы: DELETE 70-100 DELETE . WWWWWWWWWWWWW DELETE -50 DELETE .-34 DELETE 23 DELETE 40-. Если строка с номером, указанным в команде DELETE, в программе отсутс- твует, то выдается сообщение об ошибке "Illegal function call" ("Н е п р а в и л ь н ы й в ы з о в ф у н к ц и и").  Формат команды [L]LIST: [L]LIST [n1][-n2] , где: [L]LIST("Line printer LIST out","list"-"список") - служебное слово; n1,n2 - целые константы (0Ёn1,n2Ё65529) или десятичная точка("."). Эта команда, которая может быть оператором программы,выводит текст про- граммы, находящейся в данный момент в памяти. Если указано служебное сло- во LIST, то вывод происходит на э к р а н дисплея; если используется слу- жебное слово LLIST, то текст отсылается на печатающее устройство (п р и н- т е р) и печатается на бумаге. Если параметры не указаны, то выводится на экран (или принтер) вся про- грамма. Если после служебного слова [L]LIST задан номер программной стро- ки, то выводится только строка с указанным номером. Тире до или после это- го номера означает, что будет выведен весь текст программы соответственно до или после строки с этим номером.Два номера программных строк, разделен- ные тире, указывают,что должны быть выведены только строки программы с но- мерами, находящимися внутри данного диапазона. Чтобы указать на "текущий" номер программной строки,Вы можете использо- вать символ "." вместо параметров n1 и n2. Клавиша "STOP" используется для организации паузы в процессе вывода текста программы на экран дисплея или принтер. Для продолжения вывода про- граммы следует нажать клавишу "STOP" вторично. П р и м е р. NEW WWWWWWWWWWW Ok 200 DEFSTR A-C 150 DEFDBL C-K 100 DEFSNG K-M LIST . 100 DEFSNG K-M Оk LIST -175 100 DEFSNG K-M 150 DEFDBL C-K Оk II.4. ЛИНЕЙНЫЕ ПРОГРАММЫ Напомним,что в школьном алгоритмическом языке л и н е й н ы м и назы- вались алгоритмы, состоящие из серии команд присваивания. Для программирования линейных алгоритмов практически необходимы знания правил употребления только трех операторов: оператора ввода данных, опера- тора присваивания, оператора вывода данных. Эти операторы,естественно,при- меняются и в более сложных программах. Л и н е й н о й будем называть программу, в которой все операторы,на- чиная с первого,выполняются последовательно один за другим,причем выполня- ется каждый оператор (притом, только о д и н раз). II.4.1. О п е р а т о р п р и с в а и в а н и я LET Чтобы выпить из чаши, нужно ее наполнить! Восточная мудрость Структура оператора присваивания: [LET] п е р е м е н н а я = в ы р а ж е н и е , где: LET ("пусть") - служебное слово; п е р е м е н н а я - имя новой или существующей переменной или имя элемента массива, или имя псевдопеременной (см. раздел I.7.5.); "=" - знак присваивания; в ы р а ж е н и е - либо строковое, либо арифметическое выражение того же типа, что и п е р е м е н н а я, либо логическое выражение. В результате выполнения оператора присваивания п е р е м е н н а я (имя которой стоит слева от знака присваивания) приобретает новое значе- ние (являющееся значением в ы р а ж е н и я, стоящего справа от знака присваивания). MSX-BASIC - язык арифметики,а не алгебры: оператор LET при- сваивает переменной слева именно ч и с л о , а никак не алгебраическое выражение, стоящее справа! П р и м е р ы: 1) NEW WWWWWWWWWWWWW Ok 10 LET A1=10.04 20 END Данная программа позволяет присвоить переменной A1 начальное значение 10.04 (инициализировать ее). Проверим это. Сначала выполним программу: run Ok А теперь... print A1 10.04 Ok 2) NEW 3) NEW 4) NEW Ok Ok Ok 10 P1=3.14159 10 LET X=5.4 10 LET Z=5>=-1 20 P2=INT(P1/0.001+.5)*0.001 20 LET Y=FIX(X+.5) 20 END run 30 END run Ok run Ok print P1 Ok print Z 3.14159 print Y -1 Ok 5 Ok print P2 Ok 3.142 Ok Обратите внимание на то, что оператор,расположенный в программной стро- ке 20 примера 2, позволил о к р у г л и т ь значение переменной X. Два следующих оператора присваивания позволят вычислить старший и млад- ший байты целого числа A%: H%=A%\256:L%=A%MOD256 Отметим, что служебное слово LET в записи оператора присваивания можно опускать, что не меняет сущности оператора присваивания; так, например, идентичны следующие фрагменты программ: 20 LET M%=A%-INT(A%/B%)*B% и 20 M%=A%-INT(A%/B%)*B% Хотелось бы отметить,что начинающих программистов часто ставит в тупик, например, оператор вида: X = X + 1 В математике такая запись бессмысленна.Но по определению оператора при- сваивания такая запись вполне законна: вначале вычисляется значение выра- жения, стоящего в правой части (значение переменной X, существовавшее до момента выполнения этого оператора ( старое значение ), увеличивается на единицу), и полученное значение присваивается той же переменной X. Еще один пример применения оператора присваивания и операции вычисле- ния остатка для организации циклических изменений значений целых числовых переменных: X%=(X%+1)MOD256 Этот оператор позволяет увеличивать X% с 0 до 255. Когда значение X% будет равно 255, оператор присваивания тут же установит значение X% рав- ным 0. Еще раз обратите внимание, что символ "=" здесь отнюдь не совпадает по смыслу с символом равенства "=" в математике,несмотря на одинаковую форму и обманчивое сходное использование! Оператор присваивания обладает следующими о с о б е н н о с т я м и . Если переменной некоторого типа присваивается значение выражения друго- го типа, то тип выражения преобразуется к типу переменной. Попытка присво- ить значение строкового выражения числовой переменной или наоборот, вызо- вет сообщение об ошибке "Type mismatch" ("Н е с о о т в е т с т в и е т и п о в"). П р и м е р ы: 1) Оk 2) Ok WWWWWWWWWWWWW А%=23.42:print A% A="нельзя!":print A 23 Type mismatch Ok Ok 3) Ok 4) Ok 5) Ok a%=123456:? a% b!=123456.78:? b! d!=123456789:?d! Overflow 123457 123457000 Ok Ok Ok Если переменной целого типа присваивается значение выражения, вычислен- ное с одинарной или двойной точностью,то у значения выражения отбрасывает- ся дробная часть. 6) Оk 7) Ok C%=55.88:print C% C%=-1.97:? C% 55 -1 Ok Ok Если переменной двойной точности присваивается значение выражения, вы- численное с одинарной точностью, то только первые 6 цифр значения выраже- ния являются точными (напомним, что одинарная точность обеспечивает 6 зна- чащих цифр результата), т.е. 8 разрядов,добавляемых к значению,всегда рав- ны нулю. Некоторые компьютеры при этом добавляют цепочку непредсказуемых разрядов,из-за чего следует быть очень осторожным,чтобы в вычислениях,тре- бующих высокой точности, не возникали абсурдные результаты! 8) Оk A!=SQR(2):B=A!:PRINT A!,B 1.41421 1.41421 Ok 9) Ok A=TAN(2*ATN(1)):B!=TAN(2*ATN(1)):C=B!:? A;B!;C -15915494309189 -15915500000000 -15915500000000 Ok Перед отбрасыванием "лишних" значащих цифр производится о к р у г л е- н и е: анализируется старшая из отбрасываемых цифр и если она больше или равна 5, то младшая из оставшихся цифр увеличивается на 1. При вычислении значения выражения все операнды во встречающихся опера- циях и результат вычислений приводятся к одной и той же степени точности - к наиболее высокой. Учтите, что наивысшая степень точности - у операндов двойной точности, далее следуют в порядке убывания степеней точности: операнды с одинарной точностью и целые операнды. П р и м е р: Оk WWWWWWWWWWW D=6/7!:print D .85714285714286 Ok Десятичная константа 6 - двойной точности, константа 7 имеет тип одина- рная точность, а переменная D по умолчанию имеет тип двойная точность, по- этому арифметическое действие было выполнено с двойной точностью, и полу- ченный результат имеет также тип двойная точность. П р и м е р: Оk WWWWWWWWWWW D!=6/7:print D! .857143 Ok Арифметическое действие было выполнено с двойной точностью (оба операн- да по умолчанию имеют двойную точность!), результат присваивается перемен- ной одинарной точности,поэтому перед присваиванием выполнено округление и выведено значение переменной D одинарной точности. Оператор присваивания -наиболее употребительный во всех языках програм- мирования. В BASIC он часто используется также в качестве оператора ввода данных. Наконец,заметим,что в языках программирования легко сказать "з а п о м- н и", но сложно говорить "з а б у д ь"! II.4.2. О п е р а т о р SWAP Оператор SWAP используется для обмена значениями двух переменных и за- писывается в виде: SWAP ═,║ или SWAP ╖,╚ где: SWAP ("swap"-"обмен") - служебное слово; ═,║ - имена числовых переменных или имена элементов числового масси- ва (числовых массивов); ╖,╚ - имена строковых переменных или имена элементов строкового мас- сива (строковых массивов). Этот оператор позволяет осуществлять обмен значениями двух переменных одинаковых типов. Обычно, не зная оператора SWAP, программисты используют для обмена значениями следующие приемы: TEMP=A:A=B:B=TEMP или A=A+B:B=A-B:A=A-B . Оператор SWAP позволяет выполнить обмен за одну операцию, т.е. со значи- тельным увеличением скорости и экономией места. Заметим, что к двум переменным можно применить оператор SWAP только в том случае, если предварительно им присвоены определенные значения! П р и м е р ы: 1) А=3:B=2:SWAP A,B:PRINT A;B WWWWWWWWWWWWW 2 3 Ok 2) C$="мама":D$="папа":SWAP C$,D$:PRINT C$;D$ папамама Ok Еще раз отметим, что переменные, заданные в качестве аргументов, долж- ны быть одного и того же типа, причем в отличие от других операторов, это требование более жесткое, так, например, нельзя обменивать значения пере- менных одинарной и двойной точности. Нарушение этого требования приводит к сообщению об ошибке: "Type mismatch" ("Н е с о о т в е т с т в и е т и п о в"). Очень эффективным является применение оператора SWAP при сортировке массивов (см. пример в разделе III.4)! II.4.3. О п е р а т о р к о м м е н т а р и я REM Оператор REM имеет следующий синтаксис: REM Т е к с т к о м м е н т а р и я После служебного слова REM и до конца данной программной строки может следовать любой текст. Оператор REM не оказывает никакого влияния на ход выполнения программы; единственное его назначение - сделать программу бо- лее ясной и понятной. Весь текст строки программы, следующий за служебным словом REM, воспринимается интерпретатором как некоторое поясняющее заме- чание. Поэтому, если комментарий является частью программной строки,содер- жащей несколько операторов, то соответствующий оператор REM должен быть п о с л е д н и м оператором данной программной строки. Например, 10 Z=10.1:REM Начальное значение присвоено! Другой способ включения в текст программы комментариев - это использо- вание а п о с т р о ф а ("'"). Все символы, стоящие в программной строке за апострофом, рассматриваются как поясняющее сообщение. Если комментарий стоит в конце строки, содержащей несколько операторов, а вместо слова REM используется апостроф,то двоеточие перед апострофом не ставится (за исклю- чением оператора DATA). Например, 95 D=P*Q 'Уточнение коэффициента D! После завершения написания и о т л а д к и программы Вы можете соз- дать вариант Вашей программы только для счета, исключив все комментарии. Это приведет к уменьшению времени выполнения Вашей программы и умeньшению объема используемой оперативной памяти. Забегая вперед, отметим, что под о т л а д к о й п р о г р а м м по- нимается обычно один из этапов решения,во время которого с помощью компью- тера происходит обнаружение и исправление ошибок, имеющихся в программе;в ходе отладки программист хочет добиться определеной степени уверенности в том, что его программа соответствует своему назначению и не делает того, для чего она не предназначена. Многие начинающие программисты обычно пренебрегают комментариями или приписывают сообщения, не содержашие полезной информации, к готовой про- грамме. Обычно они утверждают, что и без комментариев знают все,что в ней происходит. Это, конечно так, но через несколько недель обязательно что- нибудь да забудется! Начинающие программисты считают, что им никогда не придется модифицировать уже отлаженную программу. Это грубая ошибка. Необ- ходимость в неожиданных добавлениях и изменениях готовой программы может привести к хаосу и недоразумениям,когда, к примеру, забыто назначение не- которого оператора, либо неизвестно, зачем в данном месте программы обну- ляется некоторая переменная. Как же избежать подобной ситуации ? Ответ прост. Вам следует всегда очень подробно документировать текст Вашей программы еще во время ее соз- дания. В этом заключается один из способов застраховать себя от непредска- зуемых заранее неприятностей. Существует т р и у р о в н я документирования, которых следует при- держиваться. П е р в ы й у р о в е н ь - это общее описание программы в начальном блоке комментариев. Он включает в себя даты создания и последующих модифи- каций программы, номер ее версии, имя автора.Здесь же указываются аргумен- ты и результаты работы алгоритма, по которому составлена программа. Кроме того, следует описать используемый алгоритм шаг за шагом. Эта часть может быть использована в качестве введения для неискушенного пользователя,разъ- ясняющая ему, что делает Ваша программа и как ею пользоваться. Более того,многие программисты считают, что перед непосредственным про- граммированием необходимо написать инструкцию по использованию будущей программы! В т о р о й у р о в е н ь состоит в документировании каждого бло- ка программы (либо каждой подпрограммы) (см. раздел IV.4). В каждом блоке программы следует отмечать комментарием его начало, где упомянуть, что он соответствует определенным шагам, описанным ранее в алгоритме. Начало лю- бой подпрограммы следует снабжать комментариями, объясняющими,что же все- таки она делает. Наконец, т р е т и й у р о в е н ь документирования - построчный. Не- обходимо пояснять любую необычную комбинацию операторов или любой "хитро- умный" прием программирования. Комментируйте так, как будто бы Вы отвечаете на вопросы читателя.Очень эффективный метод состоит в том, чтобы сначала написать текст программы без комментариев, а затем посмотреть на него глазами читателя.Если окажет- ся, что у читателя в некоторой точке программы может возникнуть вопрос, следует вставить содержательный комментарий с ответом на него. Физически "выдвигайте" все комментарии из текста собственно программы. При печати комментарии следует смещать вправо от текста программы так,что- бы читатель мог просматривать программу, не прерываемую комментариями. Прокомментируйте все переменные. Понимание данных - ключ к пониманию программы. Каждое предложение, объявляющее некоторую переменную,должно со- провождаться комментарием, поясняющим смысл этой переменной. Если Вы будете придерживаться этих рекомендаций, то время, которое Вы потратите на написание подробных комментариев с лихвой окупится тем, что через полгода (!) Вы будете понимать свою собственную программу! Кроме того, для программиста, который первый раз видит чужую програм- му и хочет в ней разобраться, комментарии и примечания на обычном челове- ческом языке, поясняющие логику, структуру, конкретные операторы програм- мы, играют неоценимую роль. Хорошие,понятные комментарии - это элемент не только культуры программирования, но и культуры общения,показатель отноше- ния автора программы к коллегам и потенциальным потребителям программы в целом. II.4.4. О п е р а т о р в ы в о д а д а н н ы х PRINT в п р о с т е й ш е м с л у ч а е ...мало толку в программе, которая только и делает, что секретничает сама с собой. Л.Хэнкок, М.Кригер Оператор вывода данных на экран дисплея в простейшем случае состоит из служебного слова PRINT ("to print"-"печатать"), за которым следует спи- сок выражений любого типа, значения которых должны быть выведены на экран дисплея. Служебное слово PRINT для сокращения записи может быть заменено символом "?". Выражения в составе списка разделяются в простейшем случае символами- р а з д е л и т е л я м и : либо запятой,либо точкой с запятой,что опреде- ляет взаимное расположение выводимых значений на экране дисплея (впрочем, символы-разделители можно иногда опускать; см. ниже пример 11). Оператор PRINT в простейшем случае выполняет а в т о м а т и ч е с- к о е ф о р м а т и р о в а н и е , при котором распределение элемен- тов данных на экране осуществляется соответственно символам-разделителям, расположенным между ними. Если выражения в списке оператора PRINT разделены з а п я т о й , то указанный символ служит интерпретатору сигналом разделить дисплейную стро- ку на зоны, по 14 позиций каждая (ясно, что количество полных зон может быть не больше двух в случае 40-символьного экрана!) и выводить значения выражений последовательно с первой позиции каждой зоны,т.е. обеспечить вы- вод значений в з о н н о м формате (отметим,что позиции дисплейной стро- ки нумеруются, начиная с нуля!). Если на экран выводятся значения более двух выражений, то значение тре- тьего и всех последующих выражений отображаются в начале тех же зон, но с новой дисплейной строки. Если данные занимают не более 13 позиций, то сле- дующая зона располагается прямо за концом данных без вывода пробелов. П р и м е р ы: 1) NEW NEW WWWWWWWWWWWWW Оk Ok 10 X=2:Y=X^2 10 X=2 20 PRINT X,Y или 20 PRINT X,X^2 30 END 30 END run run G2GGGGGGGGGGGG▌4 G2GGGGGGGGGGGG▌4 Ok V Ok V 15-я позиция (начало второй зоны) В том месте дисплейной строки, где надо обратить Ваше внимание на нали- чие символа пробел (" "), мы будем использовать в тексте символ "G"! Если же данные занимают более 13 позиций, то следующая зона пропускает- ся. 2) PRINT 1234567.34,"TIMER" 3) ? 123456.789101124,"TIMER" G1234567.34GGGTIMER G123456.78910112 Ok ▌ TIMER ▌ V Ok V 15-я позиция 16-я позиция При наличии т о ч к и с з а п я т о й в качестве символа-разделите- ля выражений в списке оператора PRINT компьютер выводит значения в п л о т н о м формате (значения выражений отделены друг от друга о д - н и м пробелом). Оператор PRINT без параметров вызывает переход в начало первой зоны следующей дисплейной строки. 4) NEW 5) NEW Ok Ok 10 X=3 10 X=3 20 PRINT X;X^3 20 PRINT X:PRINT:PRINT X^3 25 PRINT X;-X^4 30 END 30 END run run G3 G3GG27 G3G-81 G27 Ok Ok Если в списке встречаются лишние запятые, соответствующие пустым эле- ментам данных,то пропускается соответствующее число зон печати. Например, для вывода на экран дисплея данных не с первой, а со второй зоны используйте оператор: PRINT ,A,B . Поговорим теперь о формате вывода числовых данных.Прежде всего выводит- ся знак числа. Если число отрицательное, выводится знак "-", в случае по- ложительного числа выводится пробел.Более того,пробел также помещается за каждым выведенным числовым значением. Если возможно, интерпретатор "избегает" индикации на экране всех деся- тичных позиций выводимого значения и выводит числа в форме с плавающей точкой со стандартной мантиссой (это происходит, когда целая часть выводи- мого числа содержит не менее п я т н а д ц а т и значащих цифр или ког- да число по модулю Ё 0.001), например: 6) Ok 7) Ok PRINT 12345678910112.1434 PRINT 123456789101121.434 G12345678910112 G1.2345678910112E+14 Ok Ok Заметим,что каждый оператор PRINT выводит информацию на экран дисплея, начиная с первой позиции новой строки. Однако имеется возможность продол- жить вывод с помощью оператора PRINT на той же строке, где он закончился при выполнении предшествующего оператора PRINT. Для этого достаточно по- ставить в конце списка выражений, содержащегося в предшествующем операто- ре PRINT, символ-разделитель "," или ";". 8) NEW 9) NEW 10) NEW Ok Ok Ok 10 X=3 10 X=3 10 ?"YAMAHA"; 20 PRINT X;X^3; 20 PRINT X;X^3, 20 PRINT:PRINT"!" 25 PRINT X;X^4 25 PRINT X;X^4 run 30 END 30 END YAMAHA run run ! G3GG27GG3GG81 G3GG27GGGGGGGG▌3GG81 Ok Ok Ok V 15-я позиция С помощью оператора PRINT можно (и должно),используя строковую констан- ту, (последовательность символов, заключенную в кавычки), организовать бо- лее информативный, к р а с и в ы й вывод результатов работы программы. П р и м е р 11. WWWWWWWWWWWWWW NEW или NEW Ok Ok 10 X=5.08:Y=15.5 10 X=5.08:Y=15.5 20 PRINT "РЕЗУЛЬТАТЫ" 20 PRINT "РЕЗУЛЬТАТЫ" 30 PRINT "X = ";X,"Y = ";Y 30 PRINT "X = "X"Y = "Y 40 END 40 END run run РЕЗУЛЬТАТЫ РЕЗУЛЬТАТЫ XG=GG5.08GGGGGYG=GG15.5 XG=GG5.08GYG=GG15.5 Ok ▌ Ok V 15-я позиция (начало второй зоны) Опишем интересные д о п о л н и т е л ь н ы е возможности оператора ?: а) существует возможность начать вывод значения некоторого выражения с точно указанной позиции дисплейной строки (с позиции N). Для этого доста- точно поместить в операторе PRINT перед этим выражением функцию TAB(═) , где: TAB("to TABulate"-"табулировать") - служебное слово; ═ - арифметическое выражение, целая часть значения которого лежит на отрезке [0,255]; обозначим N=INT(═). Функция TAB(═) сообщает оператору PRINT,что от текущей позиции курсора на дисплейной строке и до позиции с указанным номером N включительно надо вывести пробелы (к у р с о р - специальный знак "⌡",отмечающий одну из по- зиций ввода на экране дисплея). Если значение N м е н ь ш е номера пози- ции текущего положения курсора, то перемещения не происходит. Напомним Вам, что номера позиций курсора на дисплейной 40-символьной строке следующие: 0, 1, 2,..., 39. П р и м е р 12. NEW WWWWWWWWWWWWWW Ok 10 V=1:S=3.5 20 PRINT TAB(3);"V=";V;TAB(11);"S=";S 30 END run GG▌V=G1GGG▌S=G3.5 V V V 11-я позиция 3-я позиция Ok П р и м е р 13. NEW WWWWWWWWWWWWWW Ok 10 V=1:INPUT M,N 'Ширина экрана - 39 позиций! 20 PRINT TAB(M);"V=";V;TAB(N);"V=";V run ? 1,5 GV=G1GV=G1 Ok ... run run ? 2,6 ? 4,43 GGV=G1GV=G1 GGGGV=G1GGG...GGG Ok GGGGV=G1 ▌ run Ok V ? 1,7 ... 39-я позиция GV=G1GGV=G1 Ok Забегая вперед, отметим, что номер позиции текущего положения курсора на дисплейной строке можно получить, используя встроенную функцию POS(0) (см. раздел V.3). Кроме того, функция TAB(n) позволяет программисту получить удобное раз- мещение колонок выводимых результатов, если вывод по зонам, задаваемым за- пятой (через 14 позиций), слишком широк. П р и м е р 14. NEW WWWWWWWWWWWWWW Ok 10 INPUT X,A,B,C 20 PRINT A;TAB(X);B;TAB(2*X);C'Символы";"можно опускать! run run ? 5,2,2,2 ? 3,2,2,2 G2GG▌G2GG▌G2 G2GG2GG2 V V Ok 5-я позицияV 10-я позиция (2G5) Ok b) в операторе (команде) PRINT часто используется функция SPC(═) , где: SPC ("SPaCe"-"пространство") - служебное слово; ═ - арифметическое выражение, целая часть значения которого лежит на отрезке [0,255]. Обозначим N - целую часть значения арифметического выражения ═ (N╝ [0,255]). Тогда функция SPC(═) выведет N пробелов, начиная с текущей пози- ции курсора. П р и м е р 15. NEW WWWWWWWWWWWWWW Ok 10 INPUT Z,U,V,W 20 PRINT U;SPC(Z);V;SPC(Z);W run ? 3,2,2,2 ▌2▌GGG▌2▌GGG▌2 V V V V V пробелы для знака V V обязательные пробелы после числа Запомните, что встроенные функции TAB() и SPC() допустимы т о л ь к о в операторе (команде) PRINT!  II.4.5. О п е р а т о р ы в в о д а д а н н ы х DATA и READ. О п е р а т о р RESTORE Б л о к о м д а н н ы х будем называть последовательность констант. С блоком данных связана некоторая величина,называемая у к а з а т е л е м с ч и т ы в а н и я . Она всегда "настроена" на конкретную константу бло- ка данных. При запуске программы на счет указатель "метит" позицию первой константы блока. Оператор DATA предназначен для хранения данных в блоке данных и для ввода его в программу. Структура оператора DATA: DATA ║1[,║2][,║3]... , где: DATA ("data"-"данные") - служебное слово; ║1, ║2, ║3, ... - числовые константы или строковые константы в ка- вычках или без кавычек (но в этом случае не содержащие запятых, кавычек и двоеточий (,":)). Оператор DATA позволяет хранить "начальные" значения в теле программы и может находиться в любом ее месте. В режиме прямого выполнения команд оператор DATA игнорируется. О с н о в н о й х а р а к т е р и с т и к о й оператора DATA являет- ся его полное игнорирование и пропуск во время выполнения программы - он используется только тогда, когда в программе встречается оператор READ. Каждый оператор DATA считается частью общего "банка данных" программы. По- этому 10 разбросанных по всей программе операторов DATA,каждый из которых содержит одну константу, аналогичны одному оператору DATA,содержащему все константы из этих операторов. При чтении данные берутся из самого первого встретившегося в программе оператора DATA (в смысле номеров строк); все последующие операторы DATA выбираются по очереди. Для повторного считывания данных из блока данных следует использовать оператор RESTORE (см. данный раздел ниже). Апостроф "'" не считается признаком конца оператора DATA и началом ком- ментария: в операторе DATA такую роль играет двоеточие ":" и следующий за ним апостроф "'". Например: DATA 5,"кабан",3Е-4 :'Начальные значения! В операторе DATA допускается использование числовых констант любых ти- пов (но не выражений или имен переменных): в частности числовые константы могут содержать префиксы &H, &O, &B или могут быть записаны в экспоненци- альной форме, а также могут иметь указатель типа (!, %, #). Оператор DATA - это самый короткий способ инициализации переменных и массивов в программе. Он очень удобен при документировании программ. Оператор READ предназначен для организации выборки (чтения) данных из блока данных. Формат оператора READ: READ ═1[,═2][,═3]... , где: READ ("to read"-"читать") - служебное слово; ═1, ═2, ═3, ... - имена переменных или имена элементов массива(ов). При выполнении оператора READ из блока данных последовательно считыва- ются константы ║1, ║2,... и их значения присваиваются соответствующим пе- ременным ═1, ═2,... в операторе READ. Считывание начинается с той констан- ты, на которую "настроен" указатель считывания.При этом сам указатель при каждом считывании смещается по блоку данных на одну позицию вправо. Этот процесс повторяется до исчерпания всех переменных в списке оператора READ или до исчерпания данных в списке оператора DATA. В последнем случае выво- дится сообщение об ошибке: "Out of DATA" ("Д а н н ы е и с ч е р п а н ы"). После считывания последней константы блока значение указателя не определе- но. Типы констант в операторе DATA и типы переменных в операторе READ долж- ны совпадать! В противном случае выводится сообщение об ошибке: "Syntax error" ("С и н т а к с и ч е с к а я о ш и б к а"). П р и м е р 1. Написать программу вычисления значения функции Y WWWWWWWWWWWWW aGb╫ Y=╩WWWWWW (k-m)╫ при следующих значениях аргументов: a=5.3; b=14.7; k=1.44; m=0.508. NEW Ok 10 DATA 5.3,14.7,1.44,0.508 20 READ A,B,K,M 30 Y=SQR(A*B^2/(K-M)^2):PRINT"Y=";Y 40 END run Y= 36.311095958874 Ok В результате совместного выполнения операторов READ и DATA переменные A,B,K,M получат следующие значения: А=5.3; B=14.7; K=1.44; M=.508 (отметим, что порядок выборки констант из блока данных строго соответству- ет порядку следования имен переменных в операторе READ). После действия оператора READ соответствующие значения удаляются из блока данных. Очевидно, что подобная форма ввода данных более экономична, чем с помощью оператора присваивания и, вдобавок, она позволяет уменьшить затраты труда программиста при изменении входных данных. Действительно, при изменении значений переменных A, B, K, M достаточно переписать только одну программную строку с номером 10. П р и м е р 2. NEW WWWWWWWWWWWWW Ok 10 DATA "ДИСПЛЕЙ","DISKETTA":READ X$,Y$ 20 ?X$Y$'знак конкатенации можно опускать! run ДИСПЛЕЙDISKETTA Ok Ясно, что в результате выполнения оператора READ строковые переменные X$,Y$ получили значения: X$="ДИСПЛЕЙ" и Y$="DISKETTA". П р и м е р 3. NEW WWWWWWWWWWWWW Ok 100 DATA 34 110 READ A,B,C$,D$,E 120 DATA 234e-7,goldfish 130 DATA "testing,1..2..3!" 140 PRINT A,B,C$,D$,E 1000 DATA 22 run 34 2.34E-05 goldfish testing,1..2..3! 22 Ok Общий вид оператора RESTORE: RESTORE [n] , где: RESTORE ("to restore"-"восстанавливать") - служебное слово; n - номер программной строки, n╝[0,65529]. Этот оператор изменяет состояние указателя считывания. Напомним, что оператор READ перемещает указатель "вниз" по мере ввода данных,пока не бу- дет исчерпано "содержимое" всех операторов DATA. Оператор RESTORE без указания параметра n возвращает указатель в нача- ло блока данных,после чего все данные могут быть снова прочитаны операто- ром READ. Кроме того, в операторе RESTORE может быть задан параметр n,в этом слу- чае указатель считывания указывает на первую константу в операторе DATA в строке с номером n . Оператор RESTORE может быть использован неоднократно и в любом месте Вашей программы. П р и м е р ы: WWWWWWWWWWWWW 1) NEW 2) NEW Ok Ok 10 DATA 10,11 10 INPUT "Номер месяца (1-12)";N 20 DATA YAMAHA,12,13:DATA "MSX",14 20 IF N<1 OR N>12 THEN 10 40 READ X,Y,Z$ 30 RESTORE 100 50 PRINT X;Y;Z$:RESTORE 20 40 FOR I=1 TO N 70 READ L$,A,B,M$:PRINT L$;A;B;M$ 50 READ M$ run 60 NEXT G10GG11GYAMAHA 70 PRINT M$ YAMAHAG12GG13GMSX 80 GOTO 10 Ok 100 DATA Январь,Февраль,Март,Ап рель,Май,Июнь,Июль,Август,Сентя брь,Октябрь,Ноябрь,Декабрь  II.4.6. О п е р а т о р в ы в о д а PRINT в о б щ е м с л у ч а е Формат этого оператора: [L]PRINT[# n,][USING ф о р м а т;] с п и с о к в ы в о д а ("Line PRINT USING" - "форматная печать строки"), где: префикс L задает вывод информации на печатающее устройство (прин- тер); отсутствие данного префикса задает вывод данных на экран дисплея; ф о р м а т - строковое выражение, содержащее информацию о форме представления выводимых данных; с п и с о к в ы в о д а - список выражений любого типа, разделен- ных символами-разделителями: запятой или точкой с запятой; с п и с о к мо- жет быть пуст; n - номер любого открытого файла в диапазоне от 0 до 15 (см. раз- дел V.8); если в операторе присутствует префикс L, то задание параметра [# n,] приводит к синтаксической ошибке; (применение оператора PRINT с па- раметром [# n,] см. в разделе V.8). Кроме того, служебное слово PRINT для сокращения записи может быть за- менено знаком "?" (для оператора LPRINT это недопустимо!). МSX-BASIC допускает автоматическое форматирование (см.раздел II.4.4); кроме того, используя служебное слово USING ("using"- "применяемый, ис- пользуемый"), можно осуществлять форматирование по у с м о т р е н и ю п о л ь з о в а т е л я. Далее, символы-разделители "," и ";" в с п и с к е в ы в о д а ни- коим образом не меняют положения курсора. Несколько значений,выводимых по одному ф о р м а т у ,располагаются друг за другом без дополнительных про- белов. Некоторые символы ф о р м а т а являются управляющими и специаль- ным образом влияют на формат вывода. Другие символы ф о р м а т а "нейт- ральны" и просто переносятся в выводимые значения. Ниже перечислены основные у п р а в л я ю щ и е с и м в о л ы, и да- ны поясняющие примеры. 1. ! - вставка первого символа значения строкового выражения из с п и- с к а в ы в о д а вместо символа "!" в значении ф о р м а т а . 1) NEW Ok 10 X$="банан":Y$="ананас" 20 PRINTUSING "банан+ананас=!!нанас";x$,y$ run банан+ананас=бананас Ok 2) NEW 3) NEW Ok Ok 10 X$="шорох" 10 X$="шах":y$="кол":z$="!" 20 PRINTUSING "!аба!";X$,X$ 20 ?USING"!аба!...? !аба!.. run .!";Y$,Y$;X$;X$,Z$ шабаш run Ok кабак...? шабаш...! Ok 2. \ GGGGGGGG \- вставка первых (n+2)-х символов значения строкового ▌ выражения из с п и с к а в ы в о д а вместо символа V "\ \" в значении ф о р м а т а. n пробелов 1) NEW 2) NEW Ok Ok 10 X$="Рокер":Y$="кокон" 10 X$="баран":Y$="коран":Z$= 20 ?USING"\\\ \";X$;Y$ "метан" run 20 ?USING"\\н\\\ \";X$;Y$,Z$ Рококо run Ok банкомет Ok 3) NEW 4) A$="комар":B$="терка":C$="\ \пью Ok \ \":PRINTUSINGC$;A$,B$ 10 X$="Банан":Y$="зайка":Z$="!" компьютер 20 ?USING"\ \\ \!";X$,Y$,Z$ Ok run Банзай! Ok 3. & - вставка значения строкового выражения из с п и с к а в ы в о - д а вместо символа "&" в значении ф о р м а т а. 1) NEW 2) NEW Ok Ok 10 Y$="BASIC":A$="MSX-&" 10 Y$="BASIC":Z$="КОМПЬЮТЕР": 20 PRINTUSING A$;Y$ T$="MSX-&" run 20 PRINTUSING T$;Y$,Z$ MSX-BASIC run Ok MSX-BASIC MSX-КОМПЬЮТЕР Ok 3) NEW 4) NEW Ok Ok 10 X$="MSU":Y$="BASIC" 10 X$="MSX":y$="BASIC":Z$="не 20 ?USING "\\X-&";X$,Y$ структурен" run 20 ?USING"&-& &";X$,Y$,Z$ MSX-BASIC run Ok MSX-BASIC не структурен Ok 4. ### - примеры значений ф о р м а т а для вывода десятичных чисел ###.# с фиксированной точкой. Символ "#" указывает на тот факт, что в данном месте поля вывода должна находиться ц и ф р а, а символ "." указывает на то,что в данном месте поля вывода должна находиться десятич- ная точка. Соответствующий элемент данных из с п и с к а в ы в о д а по- мещается в поле (в случае отсутствия десятичная точка предполагается нахо- дящейся справа); отсутствующие цифры слева от десятичной точки дополняют- ся пробелами; неиспользованные позиции справа от десятичной точки заполня- ются нулями. Напомним, что максимальное количество значащих цифр в числе - 14 и что числа при необходимости округляются. 1) Ok ?USING"##.# ";25.1, 7, 69.88, -34.7, -65, 3.7, 456.89, 4.5E-12, 1E-3, 3.64E4, 5E26 25.1GGGG7.0GGG69.9GGG%-34.7GGG%-65.0GGGG3.7GGG%456.9GGG G0.0GGGG0.0GGG%36400.0GGG% 5E+26 Ok 2) NEW Ok 10 PRINTUSING"###.##,";1.234;-4578;1234567.89;3.45E-23 run 1.23,%-4578.00,%1234567.89GG0.00 Ok Отметим,что если выводимое на экран дисплея или принтер число содержит десятичных позиций больше, чем "размеры" поля вывода, то число выводится, однако перед ним ставится символ процента "%", чтобы предупредить пользо- вателя. 3) NEW Ok 10 ?USING"#.################";123.4;12345678910111213 run %123.4000000000000000 % 1.2345678910111E+16 Ok 5.+###.# - примеры значений ф о р м а т а для вывода десятичных чисел ##.##+ с фиксированной точкой с указанием знака числа("+" или "-") в начале или конце записи. Посмотрите, пожалуйста, следующий иллюстратив- ный пример: 10 A$="+##.# ":B$="#.###+ " 'LEN(A$)=8;LEN(B$)=9 20 ?USING A$; 12.6, 1.26, -35.7, -0.678 'пробелы - для 30 ?USING B$; 12.6, 1.26, -35.7, -0.678 'наглядности! run +12.6GGGG+1.3GGG-35.7GGGG-0.7 %12.600+GGG1.260+GGG%35.700-GGG0.678- Ok 6. #.##- - пример значения ф о р м а т а для вывода десятичных чисел с указанием знака "-" в конце выводимых отрицательных значений (для поло- жительных чисел в этом случае печатается пробел в конце числа). NEW Ok 10 A$="##.##- " 'LEN(A$)=9 20 ?USING A$;-11.78, 11.78;-3.6, 3.6;-234.567, 234.567 run 11.78-GGG11.78GGGGG3.60-GGGG3.60GGGG%234.57-GGG%234.57 Ok Отметим,что знак "-" используется только в качестве последнего символа ф о р м а т а. Использование знака "-" в качестве первого символа ф о р- м а т а приводит к выводу знака "-" впереди числа, например: Ok ? USING"-##.# ";-3.1,-33.1;3.1, 33.1 --3.1GGG-%-33.1GGG-.3.1GGG-33.1 Ok 7. **##.## - пример значения ф о р м а т а для вывода десятичных чи- сел с фиксированной точкой с заполнением пустого пространства перед ними символами "*" (разумеется, если количество цифр числа меньше размера поля вывода!) NEW Ok 10 ?USING"**###.# ";125.3,-125.3;5.,-5.;345.45,-345.45; 34.67Е3,-34.67Е3 run **125.3GGG*-125.3GGG****5.0GGG***-5.0GGG**345.5GGG*-345.5GGG34670.0 GGG%-34670.0 Ok 8. #.###^^^^ - пример значения ф о р м а т а для вывода десятичных чисел с плавающей точкой. NEW Ok 10 ?USING"+##.#^^^^ ";22.5,-22.5;234567,-234567;2.2E-62 run +22.5E+00GGG-22.5E+00GGG+23.5E+04GGG-23.5E+04GGG+22.0E-63 Ok 9. #,####.# - пример значения ф о р м а т а для вывода десятичных чисел в фиксированной форме с разбивкой записи их целой части запятыми на группы по 3 цифры в каждой, причем запятую можно ставить не только по- сле первого, но и после любого другого символа "#", но обязательно до де- сятичной точки. 1) NEW 2) NEW Ok Ok 10 A$="#,#######.##" 10 A$="#,,#,#,#,#######.###" 20 ?USING A$;5554322.43 20 ?USING A$;12345678910.891 run run 5,554,322.43 GG12,345,678,910.891 Ok Ok 10. $$ - эти два символа, расположенные слева от первого символа "#" в ф о р м а т е , вызывают печать одного символа "$" слева от старшей значащей цифры выводимого числового значения. 11. **$ -эти символы вызывают печать одного символа "$" слева от стар- шей значащей цифры выводимого числового значения, но в оставшихся позици- ях ф о р м а т а слева от символа "$" печатаются символы "*". П р и м е р. NEW WWWWWWWWWWW Ok 10 ?USING "$$##.# ";15.3,-15.3;15390 20 ?USING"**$##.# ";15.3,-15.3;15390 run $15.3GG-$15.3GG%$15390.0 **$15.3GG*-$15.3GG%$15390.0 Ok Если оператор PRINT USING содержит выражений в с п и с к е в ы в о- д а больше, чем управляющих символов в ф о р м а т е , то после вывода значения, соответствующего последнему управляющему символу в значении ф о р м а т а, ф о р м а т начинает использоваться повторно с самого на- чала для следующих выражений из с п и с к а в ы в о д а. П р и м е р. NEW WWWWWWWWWWW Ok 10 X$="версия":Y$="MSX - мощная":Z$="!" 20 ?USING "& & ";X$,Y$,X$,Z$ '4 выражения и 2 управляющих run символа версия MSX - мощная версия ! Ok Если в значении ф о р м а т а определено больше управляющих символов, чем выражений в с п и с к е в ы в о д а , то лишние управляющие символы игнорируются. П р и м е р. NEW WWWWWWWWWWW Ok 10 X$="MSU":Y$="BASIC"' B PRINTUSING:1 выражение 20 ?USING "\\X-&";X$ ' и 2 управляющих символа run MSX- Ok Разумеется, что числовым выражениям в с п и с к е в ы в о д а должны соответствовать числовые ф о р м а т ы, а строковым - строковые. В против- ном случае произойдет ошибка. П р и м е р. NEW NEW WWWWWWWWWWW Ok Ok 10 Y$="BASIC" 10 A$="&&&" 20 ?USING "##.#";Y$ 20 ?USING A$;23.1 run run Type mismatch in 20 Type mismatch in 20 Ok Ok З а м е ч а н и е. Напомним, что при необходимости числа перед выводом округляются и что если число "шире" поля вывода,то оно все равно выводит- ся,но перед ним ставится знак предостережения "%" . Обычно ф о р м а т служит для вывода сразу нескольких значений. П р и м е р. NEW WWWWWWWWWWW Ok 10 A$="Факультет:\ \-\ \.Группа:!#!" 20 ?USING A$;"физ","мат","М",5,"А" run Факультет:физ-мат.Группа:М5А Ok Отметим, что оператор вида: LPRINT [USING ф о р м а т;] с п и с о к в ы в о д а позволяет вывести информацию, получаемую при работе программы,не на экран, а на п е ч а т а ю щ е е у с т р о й с т в о (п р и н т е р).Управление выводом здесь такое же, как и в случае оператора PRINT. При выполнении оператора LPRINT на рулоне бумажной ленты(или одиночных листах) печатаются значения выражений элементов списка. При этом предпола- гается, что по ширине лента условно разбита на зоны по 14 позиций - в каж- дой (максимальное число зон в строке печати - 9). II.4.7. О п е р а т о р в в о д а д а н н ы х INPUT Разговор - это здание, которое строят совместными усилиями. А.Моруа Вначале договоримся о терминологии. П о л ь з о в а т е л ь ("user") - человек, использующий техническое и программное обеспечение, а также различные виды услуг, представляемые ему вычислительным центром, для решения своих задач и самостоятельно осущест- вляющий подготовку этих задач к решению на ЭВМ. Режим п а к е т н о й обработки - один из видов организации вычисли- тельного процесса на ЭВМ, при котором несколько задач пользователей объ- единяют вместе, образуя входной п а к е т, который затем последовательно обрабатывается компьютером. При пакетной обработке пользователь не имеет прямого доступа к машине,а сдает пакет своей задачи оператору,который вво- дит его в ЭВМ и выдает пользователю результат работы. Режим д и а л о г а (и н т е р а к т и в н ы й режим) -режим общения пользователя с компьютером,при котором пользователю обеспечивается возмож- ность выдавать ЭВМ задание, следить за процессом обработки, получать отве- ты, фиксировать те или иные результаты, исправлять ошибки, выдавать указа- ния и т.д.Режим диалога пользователь осуществляет с помощью индивидуально- го т е р м и н а л а (пишущей машинки, дисплея) и применяет обычно для таких задач, алгоритмы решения которых еще не совсем определены. MSX-BASIC имеет в своем арсенале простые и эффективные средства органи- зации диалога пользователя с выполняемой программой,в частности,с помощью оператора INPUT. Вспомним,что слово "диалог" (от греч."dialogos") означает разговор меж- ду двумя или несколькими лицами. В настоящее время участником такого "раз- говора" становится компьютер. Однако отметим,что инициатива в диалоге и ответственность за успех его выполнения лежат только на пользователе! Ясно, что разрабатываемые программы должны быть универсальными для сво- его класса задач, т.е. программа должна решать задачу при любых (в задан- ном диапазоне, конечно) значениях исходных данных. Однако именно необходи- мость изменять исходные данные и не позволяет создать полностью универ- сальную программу при ориентации на пакетный режим работы с ЭВМ. Действи- тельно, если обрабатывающая часть программ, работающая лишь с именами пе- ременных, может оставаться в памяти ЭВМ неизменной, то ее фрагмент,обеспе- чивающий ввод данных, должен переписываться при каждом их изменении. Диалоговые средства MSX-BASIC (диалоговый режим) позволяют пользовате- лю вводить данные с клавиатуры в нужный момент по запросу самой программы, в определенном месте которой записан оператор вида: INPUT ["║";] ═,╔,╚,... , где: INPUT ("input"-"ввод") - служебное слово; ║ - последовательность произвольных символов алфавита MSX-BASIC ("подсказка"); ═,╔,╚,... - список имен переменных или имен элементов массивов,раз- деленных запятыми. Напомним, что квадратные скобки означают, что информация внутри них не является обязательной, то есть в данном случае допустима запись оператора INPUT в виде: INPUT ═,╔,╚,... При выполнении оператора INPUT вычисления приостанавливаются и на экра- не дисплея выводится "подсказка" ║ (если она имеется), знак "?", пробел и текстовый курсор, то есть ║ ? ⌡ "Подсказка", то есть текст,появляющийся на экране дисплея перед вводом необходимой для дальнейшей работы информации,- один из элементов культуры программирования. Благодаря такой особенности программа не нуждается в до- полнительной инструкции. Она сама подсказывает, как с ней работать. Далее компьютер о ж и д а е т, пока с клавиатуры не будут введены зна- чения для всех переменных списка ═,╔,╚,... . Вводимые данные представляют собой числовые или строковые константы. При наборе они отделяются друг от друга запятыми. Тип (числовой, строковый) и количество их должны соответ- ствовать типам и количеству переменных ═,╔,╚,.... После нажатия на клави- шу "RETURN" значения вводимых констант последовательно присваиваются этим переменным. Впрочем, вводить данные можно и частями. П р и м е р 1. NEW WWWWWWWWWWWWW Ok 10 INPUT "ГРУППА";A$,B,C$ 20 PRINT A$;B;C$:END run ГРУППА? М Нажмите клавишу "RETURN"! ?? 5,А Нажмите клавишу "RETURN"! М 5 А Ok После ввода компьютер продолжает вычисления. Если на строке после знака "?" были только пробелы, то считается, что Вы не хотите изменять значения переменных ═,║,╖,... . П р и м е р 2. NEW WWWWWWWWWWWWW Ok 10 A=5:INPUT A:PRINT A 20 END run ? Нажмите клавишу "RETURN"! 5 Прежнее значение переменной A сохранилось! Ok При несоответствии типов вводимых констант типам переменных ═,╔,╚,... на следующей экранной строке появляется сообщение об ошибке: ? Redo from start ("П о в т о р и т е с н а ч а л а"), и в следующей строке вновь выводится "подсказка", символ "?", пробел и текстовый курсор. Разумеется,у Вас должно быть достаточно информации для обеспечения вво- да значения каждой переменной из списка ввода. Если значений переменных недостаточно, то MSX-BASIC выдает символы "??" в следующей строке и пере- ходит в режим ожидания, пока Вы не введете дополнительных данных.Если зна- чений слишком много, то в следующей строке выдается сообщение ? Extra ignored ("Л и ш н е е и г н о р и р у е т с я"). П р и м е р 3. NEW WWWWWWWWWWWWW Ok 10 INPUT "ГРУППА";A$,B,C$ 20 PRINT A$;B;C$ 30 END run ГРУППА? М- ?? L ? Redo from start ГРУППА? М-,5,-А,-D ? Extra ignored M- 5 -A Ok Вводимые значения строковых переменных можно заключать в кавычки; если кавычка является первым символом вводимого значения, то значением перемен- ной становится все содержимое кавычек; если кавычка - не первый встречаю- щийся символ, то она является одним из символов вводимого значения. П р и м е р 4. NEW WWWWWWWWWWWWW Ok 10 INPUT "Гм...";A,B$:PRINT A,B$ run run Гм...? 123.4 Гм...? e5,"ab"g" ?? ab"g ? Redo from start G123.4GGGGGGGGab"g Гм...? e5,"ab'g" Ok G0GGGGGGGGGGGGab'g Ok Оператор INPUT переводит программу в режим SCREEN0 или SCREEN1,поэтому использование его невозможно, если Вы работаете в графических экранах SCREEN 2 и SCREEN 3 (см.раздел V.1). II.4.8. О п е р а т о р LINEINPUT Общий вид данного оператора: LINEINPUT ["║";] с т р о к о в а я п е р е м е н н а я, где: LINEINPUT ("ввод строк") - служебное слово; ║ - последовательность произвольных символов алфавита MSX-BASIC ("подсказка"); с т р о к о в а я п е р е м е н н а я - имя строковой переменной или имя элемента строкового массива. Этот оператор обеспечивает чтение символов с клавиатуры. Вначале на эк- ран выводится "подсказка" ║ и текстовый курсор, расположенный на следую- щей за ней позиции дисплейной строки. Теперь Вы можете вводить любую информацию, даже можете нажимать команд- ные клавиши, комбинацию символов (используя способы редактирования с кла- виатуры). После нажатия клавиши "RETURN" первые 255 символов,начиная с начальной позиции курсора и до конца строки(строка может занимать несколько физичес- ких строк), становятся новым значением с т р о к о в о й п е р е м е н- н о й. Указанный оператор, как правило,используется для ввода в компьютер зна- чений строковых переменных, содержащих кавычки или запятые. Дело в том, что строку символов, содержащую кавычки, например строку 'Курс "Программированиe"',нельзя ввести как значение строковой переменной в память компьютера оператором INPUT. П р и м е р ы: 1) NEW WWWWWWWWWWWWW Ok 10 LINEINPUT"!";A$:PRINT A$ run !синус синус Ok Вы можете при помощи оператора LINEINPUT вводить числа,но после чтения результат нужно преобразовать при помощи функции VAL()(см. раздел IV.1.3). П р и м е р ы: WWWWWWWWWWWWW 2) NEW Ok 10 LINEINPUT "Введите число:";A$ 20 Z=VAL(A$):PRINT Z^2 run run run Введите число:12 Введите число:4Е-4 Введите число:&В100 144 1.6Е-07 16 Ok Оk Ok 3) NEW Ok 10 LINEINPUT"Введите текст";T1$ 15 INPUT"Введите этот же текст";T2$ 20 PRINT"Первый раз текст воспринят как:"; :PRINT Т1$ 30 PRINT"Во второй раз текст воспринят как:";:PRINT T2$ ═) run Введите текст:кука Введите этот же текст? кука Первый раз текст воспринят как:кука Во второй раз текст воспринят как:кука Ok ║) run Введите текст:ку,ка Введите этот же текст? ку,ка ?Extra ignored Первый раз текст воспринят как:ку,ка Во второй раз текст воспринят как:ку Ok ╖) run Введите текст:"ку"ка" Введите этот же текст? "ку"ка" ?Redo from start Введите этот же текст? (нажмите клавишу "RETURN") Первый раз текст воспринят как:"ку"ка" Во второй раз текст воспринят как:ку Ok Из примера 3(║) хорошо видно, что знак "," в операторе INPUT является разделителем информации, в то время как в операторе LINEINPUT запятая вос- принята как символ строки. Пример 3(╖) наглядно показывает, что в операторе INPUT символ "кавычка" не воспринимается как символ - он является указателем границ строковой константы. Заметим, что нажатие "CTRL"+"C" или "CTRL"+"STOP" вызовет прекращение действия оператора LINEINPUT, перевод интерпретатора в режим прямого вы- полнения команд и выдачу на экране дисплея сообщения "Break in ..." ("П р е р ы в а н и е в с т р о к е ..."). Оператор LINEINPUT, также как и оператор INPUT,переводит программу в ре- жим SCREEN 0 или режим SCREEN 1. Отметим, что в школьном алгоритмическом языке ввод информации исполните- лю осуществляется с помощью команды ввод , действие которой идентично дей- WWWW ствию оператора INPUT без строки-"подсказки" ║. "Подсказкой" в алгоритми- ческом языке может служить команда вывод , где выводимой информацией явля- WWWWW ется текст-"подсказка". Ясно, что оператор INPUT вскоре отойдет в прошлое, а пользователь, воз- можно, будет обращаться к компьютеру с помощью жеста или мимики. Однако по- ка компьютер не способен воспринимать такие обращения,но MSX-BASIC уже сей- час представляет пользователю достаточно развитые устройства ввода, напри- мер световое перо или джойстик. II.4.9. О п е р а т о р ы END и STOP . К о м а н д а CONT Операторов END в одной программе может быть несколько, причем рас- полагаться они могут в любых ее местах. При выполнении END вычисления по программе прекращаются. Оператор END не является обязательным для программы. При его отсутствии вычисления прекращаются после выполнения последнего оператора программной строки с наибольшим номером (конечно,если этот оператор не предусматривает передачу управления!). Однако END удобен для документации, так как он обо- значает физический конец программы. Отметим, что имеется второй оператор останова программы STOP ("to stop"-"остановиться"). Разница между END и STOP только в том, что STOP приостанавливает работу по программе, после действия этого оператора можно при желании продолжить работу командой CONT ("to CONTinue"-"продолжать") в непосредственном режиме; END же прекращает работу окончательно.