[an error occurred while processing this directive]
─PL63 ─LS1 ─SRP 27 ─TM0 ─HM2 ─DH//-|P-// ─LM5 │..................................................................< 3.3 Вывод информации. Форматирование печати Вывод (распечатка) информации в программе на языке BASIC, как известно, осуществляется с помощью оператора PRINT на экран дисплея, либо на печатающее устройство (принтер). Вид выводимой информации указывается в списке имен переменных оператора PRINT, которые могут быть числовыми и (или) символьными. При исполнении оператора PRINT под каждую выводимую переменную автоматически отводится поле, состоящее из десяти позиций экрана. Можно представить себе, что строка экрана или принтера разбита на определенное количество колонок (в зависимости от числа символов в строке) по десять позиций каждая. Значения числовых переменных выводятся в соответствующих полях заполняя позиции справа, а символьных переменных - слева. Это наглядно иллюстрируется следующим простым фрагментом: 10 X=8 20 A¤="HELLO" 30 PRINT X,X/2,X/4 40 PRINT A¤,A¤,A¤ >RUN 8 4 2 HELLO HELLO HELLO Количество полей в строке будет различным в зависимости от возможного экранного режима. Всего для ПЭВМ могут быть заданы восемь экранных режимов, отличающихся количеством символьных позиций в строке, наличием или отсутствием графичиских возможностей, числом цветов, кодировкой символов, обьемом резервируемой под вывод на экран оперативной памяти и т.д. (см.также приложение II). Однако, в различных экранных режимах с точки зрения количества позиций в строке, возможны лишь три варианта - 20,40 и 80 позиций. Экранный режим задается с помощью команды MODE. Формат команды MODE n , где n-номер режима, изменяется от 0 до 7. Применительно к количеству символьных позиций в строке экранные режимы можно разделить на группы: 0,3 - 80 позиций (8 полей) 1,4,6,7 - 40 позиций (4 поля); 2,5 - 20 позиций (2 поля). Использование оператора PRINT предполагает возможность исключения форматирования выводимых значений переменных с помощью полей. В этом случае выводимая информация отображается на устройстве вывода в соответствии со списком переменных, разделяемых символом ; , сплошным образом (без пропуска позиций между значениями соседних в списке переменных). Иллюстрацией к этому является пример: 10 X=8 20 A¤="HELLO" 30 PRINT X;A¤;X >RUN 8HELLO8 Отметим также,что символ ; может эффективно использоваться в конце списка вывода. В этом случае его действие заключается в отсутствии перевода строки после вывода значений переменных в списке или текстовой строки (литерала) опертора PRINT. Такую форму удобно применять при организации диалоговых программ, когда вводимая пользователем программы информация является ответом на некоторый вопрос и собственно ввод осуществляется в той же строке,в которой располагается текст вопроса. Например, такой фрагмент программы 10 PRINT "Как вас зовут"; 20 INPUT Name¤ 30 PRINT "Добрый день, "; Name¤;"!" RUN Как вас зовут? Николай Добрый день, Николай! Наличие символа ; в конце оператора 10 позволило осуществить ввод значения переменной Name¤ (оператор 20) в той же строке. При распечатке числовой информации форматирование выводимых строк с помощью полей является удобным. Наряду с этим хотелось бы иметь возможность управлять размером поля (особенно полезно для формирования таблиц), а также при выводе вещественных чисел - количеством распечатываемых цифр после запятой с соответствующим округлением. В качестве средства для этих целей в языке BASIC используется специальная резидентная в памяти переменая %. Управление форматированием вывода осуществляется установкой ее значения с помощью команды или оператора присваивания в программе, предшествующих выполнению оператора PRINT. Значение, приваиваемое переменной %, имеет следующую структуру %=&мn1n2 Здесь символ &-указывает на то, что значение целочисленной переменной % представлено в шестнадцатиричной системе исчисления, а м - номер формата, определяющего представление вещественных чисел при выводе. Возможные значения м: 1-вывод вещественных чисел в экспоненцианальной форме; 2-вывод вещественных чисел с десятичной точкой; 0-стандартный формат вывода, устанавливаемый автоматически при включении ПЭВМ (по умолчанию). Далее, n1 (две позиции) - количество выводимых значащих цифр после десятичной точки для вещественных чисел, n2 (две позиции) - количество позиций в выводимом поле (размер поля) при форматировании строки. Отметим, что п1, п2 - задаются в шестнадцатиричной системе исчисления. Предположим, что вывод информации осуществляется по формату 2, требуется 3 значещих цифры после десятичной точки, а длина поля - 8 позиций. Этот вариант иллюстрируется следующим фрагментом: 10 %=&20308 20 X=7 30 PRINT X,X+2,X/3,X*X >RUN 7.000 9.000 2.333 49.000 Пусть те же значения мы хотим вывести на экран в экспоненциональной форме (фомат 1), тогда оператор 10 в приведенном фрагменте примет вид 10 %=&10308 , а по команде RUN на экране появляется следующий результат: 7.00Е0 9.00Е0 2.33Е0 4.90Е1 Для станартного формата вывода (формат 0): длина поля 10 позиций, девять значащих цифр после десятичной точки, переменная % имеет следующее значение %=&90A Напомним, что А в шестнадцатиричной системе исчисления обозначает число 10. Возможен случай, когда выводимое число или символьная строка не помещается в отведенном поле. Например, задано значение специальной переменной %=&20507 (формат 2, пять значащих цифр после десятичной точки, длина поля 7). В этом случае некоторые числа, например 125.98731, не могут быть размещены, так как для них требуется 9 позиций. В таких ситуациях автоматически присоединяется соседнее поле справа от отведенного, и, соответственно, текущее поле для вывода следующей переменной в списке оператора PRINT смещается на одно поле вправо. Если полей в строке (количество зависит от экранного режима) не достаточно для вывода всех переменных списка, автоматически при выполнении оператора PRINT осуществляет переход к следующим строкам. Рассмотрим теперь еще некоторые возможности размещения выводимой символьной информации по усмотрению пользователя, представляемые языком BASIC. Прежде всего обратим внимание на то, что различным экранным режимам, устанавливаемым командой MODE, соответсвует не только разное количество символов в строке, но и разное число самих строк, размещаемых на экране. В целом схематично экран при выводе символьной (не графической, см.п.4.2) информации может быть представлен в виде дискретного прямоугольника, состоящего из M x N соответственно по вертикали и горизонтали клеточек (позиций для отображения символов). MODE 0 - 32 * 80 MODE 1 - 32 * 40 MODE 2 - 32 * 20 MODE 3 - 25 * 80 MODE 4 - 32 * 40 MODE 5 - 32 * 20 MODE 6 - 25 * 40 MODE 7 - 25 * 40 Таким образом, каждая позиция курсора на экране может быть задана (адресована) с помощью двух координат по осям Х-горизонталь (номер позиции в строке, слева от 0 до N-1) и Y-вертикаль (номер строки, сверху от 0 до М-1). Первым расматриваемым средством языка BASIC для осуществления вывода символьной информации с заданной позиции экрана является функция TAB (X,Y), где параметры X,Y-задают непосредственно координаты позиции экрана для вывода требуемой информации. Функция TAB(X,Y) используется в списке переменных оператора PRINT и осуществляет посылку курсора в указанное через параметры место экрана. Следующий пример фрагмента программы реализует электронное табло на экране, где в заданном месте (пятая сверху строка, восемнадцатая слева позиция) пробегают цифры от 1 до 1000. 10 CLS 20 FOR I=1 TO 1000 30 PRINT TAB (18,5);I 40 NEXT I Оператор 10 CLS осуществляет очистку экрана при выполнении программы. Функция TAB может также использоваться в обычной форме с одним параметром TAB(X), где X - номер позиции в текущей выводимой строке. Пример фрагмента программы: 10 PRINT "01234567890123456789" 20 FOR F=16 TO 17 30 PRINT TAB (10); F; TAB (15); 2*F 40 NEXT F >RUN 01234567890123456789 16 32 17 34 Оператор 10 используется в данном фрагменте для идентификации, с целью наглядности, номера позиции строки. Необходимо отметить, что с помощью функции TAB(X), если всречается в операторе PRINT несколько раз, можно изменить номера адресуемых позиций в строке только в строну возрастания (как это сделано в предшествующем примере - TAB(10), затем TAB(15) и т.д.) Если в списке оператора PRINT встречается функция TAB(N), а после нее TAB(M) при М<N возврата курсора к предшествующим позициям в текущей строке вывода не происходит и осуществляется автоматический переход к следующей строке. Изменим оператор 30 предшествующего примера, поменяв местами номера позиций в функции TAB(X) : 30 PRINT TAB (15); F;TAB (10);2*F Тогда при выполнении измененного фрагмента на экране появится выводимая информация в следующем виде: >RUN 01234567890123456789 16 32 17 34 Таким образом мы рассмотрели одно из средств управления размещением информации на экране при выводе, реализуемое функцией языка BASIC - TAB(X,Y). Однако, часто бывает необходимо (удобно), например при выводе значения следующей переменной списка, перемещать курсор по экрану не в фиксированные позиции, а на произвольное число позиций (влево, вправо, вверх, вниз) относительно текущей позиции. Мы знаем, что все символы, с которыми работает ПЭВМ и, в часности, осуществляет их ввод-вывод, представляются в оперативной памяти своими ASCII-кодами (см.п.3.2.2). Имеется ряд, так называемых дисплейных ASCII-кодов, для которых вывод соответствующих символов заключается в перемещении курсора на одну позицию экрана влево, вправо, вверх, вниз. Вывод этих символов полностью аналогичен перемещению читающего курсора клавишами со стрелками в режиме экранного редактирования (см.п.2.2). Приведем указанные ASCII-коды: код 8-перемещение курсора на одну позицию влево; код 9-вправо; код 10-вниз; код 11-вверх. Вывод символов с указанными кодами осуществляется оператором PRINT с использованием известной функции CHR (см. п.3.2 ). Так например, перемещение курсора на одну позицию вправо и на одну строку вниз осуществляется оператором PRINT CHR¤(9);CHR¤(10); Обратим внимание, что в данном операторе для разделения элементов списка и в конце списка применяется символ ; (не , ), что запрещает соответственно при перемещении курсора и выводе информации (например, в следующем оператора PRINT) переходить к следующим полям строки (отменяет форматирование выводимых строк с помощью полей). Если требуется переместить курсор в общем случае на N позиций в одном из направлений, можно воспользоваться языковой конструкцией оператора цикла. Так, например, в результате выполнения фрагмента: 10 FOR I=1 TO 25 20 PRINT CHR¤(9); 30 NEXT I курсор будет перемещен на 25 позиций вправо. 3.4 Языковые средства ввода информации с терминала Основным средством языка BASIC, используемым в программах для ввода информации с терминала, является оператор INPUT. Как известно, действие этого оператора заключается в выдаче на экран символа "?" и переводе ПЭВМ в состояние ожидания терминального ввода, завершающегося нажатием клавиши RETURN. Вводимые значения при этом последовательно присваиваются переменным в списке оператора INPUT. Запрос ввода может сопровождаться выдачей на экран некоторого текстового сообщения, имеющего смысл вопроса, а сами вводимые значения в диалоговых программах могут интерпритироваться как ответ на этот вопрос. Текстовое "сообщение-запрос" может быть выведено на экран либо предшествуюшим оператору INPUT оператором PRINT, либо самим оператором INPUT. Символьная строка, заключенная в двойные кавычки, следующая в начале списка оператора INPUT, выводится им на экран, и в той же строке ожидается ввод значений переменных. Например, фрагмент запроса и ввода имени абонента может быть реализован двумя полностью эквивалентными, с точки зрения выполнения программы, способами: 10 PRINT "Ваше имя: "; 20 INPUT Name¤ или одним оператором 10 INPUT "Ваше имя: "Name¤ Исполнение фрагментов будет выглядеть на экране следующим образом : > RUN Ваше имя: Николай Вводимое имя (в данном случае Николай) присваивается символьной переменной Name¤. Обратим внимание еще раз, что любой ввод информации оператором INPUT завершается нажатием клавиши RETURN. До этого момента такая строка может быть модифицирована с использованием клавиши DELETE или отменена полностью с помощью управляющего символа CTRL/U. В ряде случаев бывает полезной возможность немедленного осуществления программного ввода путем нажатия произвольной клавиши (без последующего нажатия клавиши RETURN). Такой ввод используется в большинстве игровых программ, когда требуется быстрая реакция на управление событиями, происходящими на экране дисплея, со стороны пользователя. В языке BASIC для осуществления немедленного ввода символа путем нажатия произвольной клавиши используются четыре специальные функции: GET, GET¤, INKEY,INKEY¤. Поскольку при вводе с помощью этих функций символ присваивается одной из переменных программы (т.е. может быть в дальнейшем проанализираван), такой способ ввода также удобен при разветвлении программ пользователем путем ответа на вопрос одним символом, например Д(да), Н(нет), Y(yes), N(no) и т.д. Рассмотрим подробнее указанные функции. Все они могут быть использованы в правой части оператора присваивания. В левой части указывается одна из переменных программы, причем символьная - для функций GET¤, INKEY¤ и соответственно - числовая для функций GET, INKEY. Действие функций GET¤ и GET, INKEY¤ и INKEY одинаково, только в первом случае они возвращают символ, а во втором - его ASCII-код. Функция GET и GET¤ переводит ПЭВМ в состояние ожидания терминального ввода (переход к следующему оператору программы будет осуществлен только после нажатия произвольной клавиши). Примеры операторов: А=GET (А получает значение кода введенного символа) A¤=GET¤ (А¤ - введенный символ). Основное назначение функций GET и GET¤ состоит в приостановке вывода информации на экран дисплея. Это бывает необходимо,когда вся выводимая подряд информация не может быть размещена на экране. Тогда между операторами вывода в программу включается оператор присваивания функции GET или GET¤ и переход к следующему кадру экрана происходит после нажатия пользователем программы произвольной клавиши. Функции INKEY и INKEY¤ вызывают ожидание ввода символа в течении заданного интервала времени и осуществляют переход к следующему оператору либо сразу после нажатия клавиши, либо по истечении заданного временного интервала. Общий вид соответстующих операторов присваивания: А=INKEY(n) или A¤=INKEY¤(n) , где n - временной интервал ожидания ввода в сотых долях секунды. По истечении временного интервала числовая переменная в левой части (А) получает значение-1, а символьная-пусто (отсутствие значения символьной переменной). Символ "пусто" изображается "" (пара следующих подряд двойных кавычек). Например, оператор 10 В¤=INKEY¤(200) приводит к ожиданию ввода в течении двух секунд. Если в этот временной отрезок будет нажата клавиша, например Y, то В¤ получит значение "Y" и сразу произойдет переход к следующему оператору программы, иначе по истечении двух секунд В¤ будет присвоено значение "". Анализ значения переменной, присвоеного функциями INKEY или INKEY¤ позволяет учесть в программе не только введенный символ (нажатую клавишу), но и проконтролировать, что она была нажата в течение заданного временного интервала, т.е. оценить реакцию пользователя (например, время принятия решения). 3.5 Управляющие структуры 3.5.1 Общие положения К основным управляющим структурам языка BASIC (средствам, определяющим последовательность выполнения операторов программы) относятся известные операторы: перехода GOTO и вычисляемого перехода ON GOTO, условный оператор IF...THEN, конструкция цикла FOR...NEXT, оператор перехода GOSUB и вычисляемого перехода ON GOSUB к подпрограмме. Все перечисленные средства содержатся в рассмариваемой версии языка. Однако имеется, во-первых, целый ряд расширений предоставляемых возможностей, а во-вторых, вводится дополнительная структура REPEAT...UNTIL, широко распространненная в ряде современных языков прогаммирования высокого уровня (например, 'PASCAL','C' и др.) Рассмотрим сначала расширенные возможности известных средств языка. 3.5.2 Оператор GO TO Дополнительные возможности заключаются в использовании вместо номера строки перехода имени переменной программы или даже произвольного арифметического выражения, обязательно заключенного в скобки. Например, GOTO label GOTO (start*55+14) Значение переменной, и результат арифметического выражения должны быть целочисленными. Они интерпритируются оператором GOTO как номер строки перехода в данной программе. Оператор GOTO, используемый в режиме непосредственного выполнения (в качестве команды оператора), позволяет осуществлять запуск программы, находящейся в оперативной памяти, с текущими значениями переменных. Пусть в оперативной памяти находится некоторая программа, при выполнении которой обнаружены ошибки. Используя команду GOTO можно проследить за ходом выполнения отдельных (произвольных) участков программы при известных значениях переменных, т.е. произвести отладку. Например, команда GOTO 1200 инициирует выполнение операторов текущий программы начиная со строки 1200. Отметим, что современная методология программи- рования, базирующаяся на структурном подходе к разработке и написанию программ, не рекомендует исползовать оператор GOTO вообще и особенно в больших программах. Объясняется это тем, что программа, содержащая большое количество переходов по оператору GOTO имеет текст, практически не соответствующий последо- вательности выполнения. Такая программа крайне трудна для понимания, а значит и для модернизации или исправления. Однако, некоторые языки программирования (например, очень распространенный язык FORTRAN 4) не позваляют обойтись без оператора GOTO даже при организации элементарных разветвлений. В этом смысле с удовлетворением можно отметить, что рассматриваемая версия языка BASIC содержит полный набор управляющих структур для того, чтобы можно было обойтись вообще без оператора GOTO и составлять программы в соответствии с самой современной технологией. Можно сказать, что язык BASIC в данном случае является языком структурного программирования. В заключение - изящный пример использования оператора GOTO в виде фрагмента программы, немедленно отображающей на экране код введенного символа для любой нажимаемой клавиши. 10 PRINT GET 20 GOTO 10 3.5.3 Операторы ON...GOTO, ON...GOSUB Как известно, действие операторов вычисляемых переходов ON...GOTO, ON...GOSUB заключается в передаче управления определенной части программы в зависимости от значения, так называемой, управляющей переменной. В данной версии Бейсика операторы ON...GOTO и ON...GOSUB содержат дополнительную возможность указания последовательности действий в случае,когда значение управляющей переменной находится вне допустимого диапозона значений, т.е. превосходит максимально возможный номер элемента в списках оперторов ON...GOTO, ON...GOSUB. Общая форма оперторов имеет вид : ON<числ.перем.> GOTO<числ.выраж>[,<числ.выраж>] [ELSE<оператор>] ON<числ.перем.> GOSUB<числ.выраж>[,<числ.выраж>] [ELSE<оператор>] Например, оператор ON F% GOTO 100,210,350 ELSE GOTO 1000 осуществит переход на строку программы номер 1000, если значения переменной F% будет любым, кроме 1,2 или 3. 3.5.4 Оператор IF...THEN...ELSE В отличие от известного условного оператора IF конструкция оператора IF...THEN...ELSE является более общей и позволяет легко реализовать одну из основных элементарных логических структур - "развилку" без использования оператора GOTO. 10 A¤=GET¤ 20 IF A¤="&"THEN PRINT "Верно" ELSE PRINT"Не правильно" Тот же фрагмент с использованием усеченной формы оператора IF (без ELSE в привычной версии языка BASIC) выглядит менее изящно: 10 A¤=GET¤ 20 IF A¤="&" THEN GOTO 50 30 PRINT "Не правильно" 40 GOTO 60 50 PRINT "Верно" 60 .......... Забегая вперед, подчеркнем, что применение конструкции IF...THEN...ELSE является наиболее эффективным для структурирования программ, особенно при использовании механизма процедур (см. п. 3.6), придает программам максимально возможную наглядность, а следовательно, существенно упрощет процессы написания отладки и модернизации. 3.5.5 Конструкция REPEAT...UNTIL. Данная конструкция представляет собой некоторое обобщение конструкции цикла FOR...NEXT. Она также предназначена для организации многократного (циклического) повторения фрагмента программы, включающего последовательность строк между операторами REPEAT (открывает цикл) и UNTIL (ограничевает цикл снизу). Заметим, что ключевые слова конструкции REPEAT и UNTIL являются разными (могут иметь различные, самостоятельные, номера в программе) логически связанными операторами языка BASIC, т.е. наличие оператора REPEAT предполагает обязательное дальнейшие присутствие в программе оператора UNTIL. Общая форма конструкции имеет вид 100 REPEAT произвольное колич. операторов 100+м UNTIL логич. выр. где логич. выр. - произвольное логическое выражение, представляющее собой условие окончания цикла. Выполнение последовательности строк программы, заключенной между операторами REPEAT и UNTIL, будет повторяться до тех пор, пока указанное логическое выражение не станет истинно. Мы видим, что конструкция цикла REPEAT...UNTIL является более общей по отношению к конструкции FOR...NEXT, для которой имеет место единственное условие окончания цикла - достижение управляющей переменной заданного значения. Наряду с этим, отсутствие управляющей переменной вообще в конструкции REPEAT...UNTIL вызывает необходимость предусматривать изменение внутри цикла значений переменных, входящих в логическое выражение оператора UNTIL. В противном случае, может оказаться, что логическое выражение будет оставаться неизменненым (иметь всегда значение-ложь) и цикл станет бесконечным. Наглядным примером эффективного использования рассматриваемой конструкции является запрос ввода заданного (конкретного) символа, смысл которого может состоять, скажем, в проверке знания расположения указанной клавиши и способа ввода. Пусть это будет символ &. Тогда нижеследующий фрагмент осуществляет такой запрос и подсчитывает время реакции: 10 Z¤="&" 20 PRINT "Введите символ &"; 30 T=TIME 40 REPEAT UNTIL GET¤=Z¤ 50 PRINT "Вы затратили ";(TIME-T)/100;" секунд" Строка 40 будет выполняться (зацикливаться) до тех пор, пока пользователь программы не введет символ &. NT "Введите символ &"; 30 T=TIME 40 REPEAT UNTIL G─PL63[an error occurred while processing this directive]