Оператор END ---------------------------------------------------------------- Назначение Оператор END заканчивает выполнение программы или определяет конец структурного блока. Синтаксис END [{DEF/IF/SELECT/SUB}] Комментарий Оператор END без аргументов заканчивает выполнение программы. Операторы END могут быть помещены в любое место в программе, и их может быть более одного. Если программа встречается с оператором END , она закрывает все открытые файлы и возвращается к DOS (или к ТУРБО БЕЙСИКу, в зависимости от того, где была запущена программа). Оператор END не требуется компилятору, хотя использова- ние его можно рекомендовать. Если в программе заканчиваются операторы выполнения, генерируется тот же самый эффект. Если за оператором END следуют резервные слова DEF, IF, SUB или SELECT, то это означает конец структурного блока. См. также DEF , IF , SELECT , STOP , SUB Пример SUB DummyProc PRINT "Hello" END SUB 'закончить определение процедуры DEF FNDummyFunc$ FNDummyFunc$ = "Hello Again" END DEF 'закончить определении функции INPUT "Execute the procedure or the function_ [1 or 2]"; Which% IF Which% > 0 THEN SELECT CASE Which% CASE 1 CALL DummyProc END 'закончить программу CASE 2 PRINT FNDummyFunc% END 'закончить программу CASE ELSE PRINT "An illegal choice was mabe..." END SELECT 'закончить выбирающий оператор END IF 'закончить блок if/then END 'закончить программу Функция ENDMEM ---------------------------------------------------------------- Назначение Функция ENDMEM возвращает адрес конца физической памяти. Синтаксис y = ENDMEM Комментарий Функция ENDMEM возвращает длинное целое число, представ- ляющее адрес последнего байта физической памяти. ENDMEM в сопряжении с оператором MEMSET , может использоваться для распределения пространства в старшей памяти для программ языка ассемблера. Выполняя программу в памяти, ENDMEM в действительности возвращает конец физической памяти минус объем таблицы символов. Когда ТУРБО БЕЙСИК компилирует в памяти, он сохраняет таблицу символов на уровне самого старшего адреса в памяти. См. также MEMSET Пример 'показать результат PRINT "The end of addressable memore is :";ENDMEM END 'закончить программу Функция ENVIRON$ ---------------------------------------------------------------- Назначение Функция ENVIRON$ отыскивает параметры таблицы среды. Синтаксис s$ = ENVIRON$ (parameter string) s$ = ENVIRON$ (n) Комментарий parameter string - это символьное выражение, содержащее отыскиваемые параметры, n - это целочисленное выражение в диапазоне от 1 до 255. Функция ENVIRON$ и соответствующий оператор ENVIRON исполь- зуются для конфигурации средцы, которая переходит к программам, выполняемым через оператор SHELL (более подробно смотри статью об операторе SHELL в настоящем руководстве и команде SET справочнике DOS). Если используется символьный аргумент, функция ENVIRON$ возвращает текст, следующий за строкой параметра в таблице среды. Заметьте, что функция ENVIRON$ различает прописные строчные буквы. Если строка параметра отсутствует или после знака равенства нет никакого текста, возвращается нулевая строка. Если используеться численный вид, функция ENVIRON$ возвращает строку, содержащую n-ный параметр с начала таб- лицы. Если n-го параметра нет, возвращается нулевая строка. Пример См. пример в статье ENVIRON Оператор ENVIRON ---------------------------------------------------------------- Назначение Оператор ENVIRON... Функция EOF ---------------------------------------------------------------- Назначение Функция EOF возвращает статус "конец файла". Синтаксис Y = EOF (filenum) Комментарий Номер файла - это значение, описанное при открытии файла (OPEN). EOF возвращает TRUE (-1), если в указанном файле достигнут "конец файла"; в противном случае, возвращается FALSE (0). Функция EOF действительна только для дисковых файлов, открытых для последовательного ввода и для коммуникационных файлов. Возврат EOF -1 для коммуникационного файла озна- чает, что буфер пустой. Пример Следующий пример считывает информацию с TEXT.DTA последовательного файла до тех пор, пока не будет достигнут конец файла: OPEN "TEXT DTA" FOR INPUT AS #1 top: IF EOF (1) THEN PRINT c "records (lines) in file TEXT DTA" END IF INPUT #1, dummy$ c = c + 1 GOTO top или более элегантно: OPEN "TEXT.DTA: FOR INPUT AS #1 WHILE NOT EOF (1) INPUT #1, dummy$ INCR c WEND PRINT c "records (lines) in file TEXT.DTA" : END Функция ERADR ---------------------------------------------------------------- Назначение ERADR возвращает адрес самой последней ошибки. Синтаксис Y = ERADR Комментарий Функция ERADR возвращает длинное целочисленное значение, представляющее местонахождение самой последней ошибки. ERADR-это то же самое значение счетчика программы, которое было бы напечатано в случае, если бы не была выполнена ловушка ошибок (то есть, может быть использовано выбором ошибки выполнение меню Options для нахождения положения исходной программы оператора, генерирующего ошибку). ERADR используется в качестве последнего обращения в программах с ошибками из-за неправильного обращения. Если программа с ошибкой не имеет плана обработки конкретной ошибки, можно по крайней мере вывести код ошибки (ERR) и ERADR на экран и дать команду пользователю сообщать о ее наличии. См.также ERL , ERR , ERROR , ON ERROR Пример ON ERROR GOTO Trap ' установите обработку ошибки выполнения DIM X%(10) FOR I% = 1 TO 10 READ X%(I%) ' считайте X 10 раз PRINT X%(I%) ' только с семью данными NEXT I% ' возвращает ошибку вне данных ' недостаточное количество элементов данных DATA 1,2,3,4,5,6,7 END ' закончить программу ' Следующая программа обработки ошибок печатает номер ' ошибки (ERR) и адрес (ADD). Trap: ' Напечатать сообщение в середине экрана LOCATE 10,15 PRINT " An error of type " ERR _ " has occurred at address " ERADR LOCATE 11,15 PRINT "Please note these values and check your manual" END ' закончить программу Оператор ERASE ---------------------------------------------------------------- Назначение Оператор ERASE стирает динамические массивы и восстанавливает статические массивы. Синтаксис ERASE array name [,array name]... Комментарий Имя массива - это имя массива, который вы хотите обнулить или переместить. Заметьте, что с именем массива не должны быть включены пустые скобки. Если имя массива динамическое, его пространство в памя- ти освобождается и имя массива затем задается вновь с по- мощью нового оператора DIM. Если имя массива статическое, стирание (ERASE) просто очищает его элементы до 0 (или до нулевой строки для сим- вольных массивов). Ограничения Невозможно стереть (ERASE) несуществующий массив или, в случае динамических массивов, массив, который уже был стерт. Различия В ТУРБО БЕЙСИК статические массивы быстрее динамических массивов. Интерпретатор БЕЙСИК работает только с динамическими массивами. См.также CLEAR , DIM , $DYNAMIC , FRE , $STATIC Пример ON ERROR GOTO ErrorHandler ' установить программу ' обработки ошибок PRINT FRE(-1) ' показать доступное пространство ' обьявить динамический массив, присвоить ему данные DIM DYNAMIC BigArray(1000) ' Данный оператор возвратит ошибку выполнения, ' если программа вывполняется с проверкой границ. BigArray(6666) = 66 PRINT FRE(-1) ' показать доступное пространство ERASE BigArray ' удалить динамический массив PRINT FRE(-1) ' показать доступное пространство PRINT BigArray(6666) END ' закончить программу ErrorHandler: PRINT "An error of type" ERR PRINT "has occurred at address" ERADR END Функции ERDEV, ERDEV$ --------------------------------------------------------------- Назначение Функции ERDEV и ERDEV$ возхвращают информацию задающего устройства (драйвера). Синтаксис Y = ERDEV Y$= ERDEV$ Комментарий Когда происходит ошибка в устройстве, целочисленная функция ERDEV возвращает инфоромацию об ошибке в наименее значимый байт. Этот байт представляет ошибку кода INT 24 Наиболее значимый байт включает 15,14,13,3,2,1 и 0 биты аттрибута слова устройства. Функция ERDEV$ содержит имя 3 байтов устройства, пред- назначенных для знаковых устройств и 2 - для блочных устройств (Более подробно см. Техническое руководство- справочник IBM DOS) Пример ' установить обработку ошибок ON ERROR GOTO ErrorHandler PRINT "Open the door to drive A and press any key..." WHILE NOT INSTAT : WEND 'подождать клавишу ' попытайтесь получить каталог FILES "A:\*.*" END ' закончить программу ErrorHandler: ' программа обработки ошибок 'показать сообщение об ошибке с указанием 'проблемы и источника PRINT USING "Critical error ## occurred with &"; ERDEV,ERDEV$ RESUME NEXT Функции ERL,ERR --------------------------------------------------------------- Назначение Функции ERL и ERR возврвщают строку и код ошибки самой последней ошибки. Синтаксис Y = ERL Y = ERR Комментарий ERL возвращает номер строки последней ошибки. Если ошибка происходит в операторе без номера строки, ERL возвращает но- мер ближайшей строки с номером, оперируя в обратном порядке по направлению к началу программы. Если между местом ошибки и началом программы нет пронумерованных строк, ERL возвраща- ет 0. Функция ERR возвращает номер последней ошибки выполнения. Проверьте ее в программах ловушки ошибок для выполнения кода, соответствующего типу ошибки. Примечание Операторы ERL, RESUME и RESUME NEXT вызывают генерирование компилятором 4-байтового пойнтера для каждого оператора в программе. Это должны учитывать программисты, для которых важен раз- мер их генерированного кода. Использование оператора RESUME [строка #] генерируют инструкцию одной операции перехода. Обычно, функция ERL используется в целях отладки программ, поэтому здесь она не имеет значения. Различия Правила, касающиеся того на какой стороне реляционного оператора должен находиться номер строки, сопоставляемой с функцией ERL, неприемлемы. Это происходит потому, что в ТУРБО БЕЙСИКе нет инcтрукции RENUM. В ТУРБО БЕЙСИКе также не применим результат функции ERL интерпретатора БЕЙСИК, когда происходит ошибка во время выполнения оператора в не- посредственном режиме (DIRECT MODE). См. также ERADR , ERROR , ON ERROR Оператор ERROR ---------------------------------------------------------------- Назначение Оператор ERROR формирует ошибку выполнения Синтаксис ERROR errcode Комментарий errcode есть целочисленное выражение от 0 до 255. Если errcode является предопределенным кодом ошибки выпол- нения (см. приложение Е), тогда оператор ERROR вызывает такое поведение вашей программы, как в случае появления ошибки. Это способствует отладке программ, ловушке оши- бок. Для определения ваших кодов ошибок используйте зна- чения errcode, которые не используются ТУРБО БЕЙСИКом. Если вы не определите процедуру обработки ошибок этих новых кодов ошибок, ТУРБО БЕЙСИК выдаст сообщение: Error n at pgm-ctr: address, где n - это код ошибки, а address - значения в счетчике программы процессора во время появления ошибки. Пример ' Форсировать ошибку неправильного вызова ' функции из-за плохого ввода DEF FN func%= (X%) IF X% > 65 THEN ERROR 5 ' вызвать ошибку неправильного вызова функции ELSE FNfunc%= X%*1000 END IF END DEF PRINT FN func(66) ' вызвать ошибку неправильного вызова ' функции Оператор EXIT ---------------------------------------------------------------- Назначение Оператор EXIT преждевременно оставляет структуру. Синтаксис EXIT {SELECT|DEF|FOR|IF|LOOP|SUB} Комментарий Оператор EXIT дает вам возможность выйти из структурного оператора, процедуры или определения функции, не выполнив их до конца. ип структуры, к которой применен оператор EXIT, должен быть включен как часть оператора EXIT, в соответствии со следующим: ---------------------------------------------------------------- Вариант EXIT Выходная структура ---------------------------------------------------------------- SELECT оператор SELECT DEF определение функции FOR петля FOR/NEXT IF блок IF LOOP петля DO/LOOP или WHILE/WEND SUB определение процедуры ----------------------------------------------------------------- Использование EXIT может спасти беспорядочные операторы GOTO. Ограничения Используя оператор EXIT для выхода из функции, вы должны назначить этой функции результат до выполнения оператора EXIT. Пример ' Данная программа демонстрирует все операторы EXIT. ' Для терминирования выполнения используется как процедура ' так и функция. Подпрограммы также демонстрируют различные ' доступные операторы EXIT, используя конструкции LOOP ' наряду с SELECT CASE и IF/THEN/ELSE. SUB Controls(Sel%, Dummy %) ' Операторы EXIT могут использоваться для терминирования ' конструкции SELECT CASE и IF/THEN/ELSE. ' EXIT также терминирует выполнение процедуры SELECT CASE Sel% CASE 1 ' Используйте оператор SELECT для передачи пользователю ' информации о введенном числе SELECT CASE Dummy% CASE < 0 PRINT "Number is less the zero" EXIT SELECT CASE > 0 PRINT "Number is greater then zero" EXIT SELECT CASE ELSE PRINT "Number is 0" END SELECT EXIT SUB CASE 2 'исползуйте IF/THEN/ELSE для выполнения того, что 'делает SELECT CASE IF Dummy% < 0 THEN PRINT "Number is less then zero" EXIT IF ELSEIF Dummy% > 0 THEN PRINT "Number is greated then zero" EXIT IF ELSE PRINT "Number is 0" END IF END SELECT PRINT "You selected number 2" END SUB ' закончить определение процедуры DEF FNLoops (Sel%) ' Параметр, переходящий к функции указывает, какой EXIT ' будет выполнен. Каждая структура петли делает то же самое ' чтобы продемонстрировать как оператор EXIT может быть ' использован для завершения выполнения петли. ' Мы также демонстрируем как EXIT может использоваться для ' вывода функции. EXIT DEF используется для выполнения EXIT ' из двух первых отборов. Это предотвращает от выполнения ' оператора печатания. ' Присвоить значение результату функции FNLoops = -1 SELECT CASE Sel% CASE 1 ' используйте EXIT FOR для выхода из петли ' вместо того, чтобы закончить ее в нормально. FOR I% = 1 TO 32767 PRINT RND (Dummy%) EXIT FOR NEXT I% EXIT DEF CASE 2 ' используйте EXIT LOOP для выхода из этой петли ' вместо того, чтобы закончить ее в нормально. DO PRINT RND (Dummy%) EXIT LOOP LOOP EXIT DEF CASE 3 ' используйте EXIT LOOP для выхода из этой петли ' вместо того, чтобы закончить ее в нормально. WHILE 1 PRINT RND (Dummy%) EXIT LOOP ' это то же самое, WEND ' что и петля DO/LOOP END SELECT PRINT "Yoy executed selection 3" END DEF ' закончить определение функции ' начать главную программу INPUT "Enter a number":" Dummy% ' произвести три вызова FNLoops, выбирая каждую петлю PRINT FNLoops (1) PRINT FNLoops (2) PRINT FNLoops (3) ' выполните Controls, выбирая каждую структуру FOR Count% = 1 TO 2 CALL Controls (Count%, Dummy %) CALL Controls (Count%, Dummy %) NEXT Count% END ' закончить программу Функции EXP,EXP2, EXP10 ---------------------------------------------------------------- Назначение EXP возвращает степень числа е ; EXP10 возвращает степень 10 ; EXP2 возвращает степень 2 Синтаксис EXP: Y = EXP (X) EXP2: Y = EXP2 (X) EXP10 Y = EXP10 (X) Комментарий EXP(X) возвращает е в степени X, где X есть численное вы- ражение, а е является основой для натуральных логарифмов, приблизительно 2.718292. Такой же результат вы получите с оператором е^X. Что вы можете сделать с функцией EXP, так это вычислить само е: е = EXP(1) EXP2(X) возвращает 2 в степени X, где X есть численное выражение или численная переменная. Такой же результат вы получите в выражении 2^х. EXP10(X) возвращает 10 в степени X, где X есть числен- ная пероеменная или выражение. Такой же результат вы получите в выражении 10^Х. EXP, EXP2 и EXP10 возвращают результаты с удвоенной точ- ностью. Пример FOR I = 1 TO 10 PRINT USING "EXP OF ## = #### "; I,EXP(I) NEXT I END Оператор FIELD --------------------------------------------------------------- Назначение Оператор FIELD определяет переменные поля с буфером файла с произвольной организацией. Синтаксис FIELD [#] filenum, width AS string-var [,width AS string-var]... Комментарий filenum есть номер открытия файла, width (ширина) есть количество байтов, выделенных переменной поля, а string- var - это сама переменная поля. Оператор FIELD определяет преобразование данных между символьными переменными и буфером I/O файла с произвольной выборкой. Будучи однажды использованными в операторе FIELD, эти символьные переменные получают специальный статус "переменные поля". Они присваиваются только используя RSET и LSET при подготовке к записи в указанном файле с произвольной выборкой. Ограничения Идентификатор оператора FIELD никогда не должен использоваться с левой стороны оператора назначения. Если это произойдет,то идентификатор больше не будет идентифи- цироваться с определениями поля файла с произвольной вы- боркой. См. также LSET , RSET Пример 'открыть файл с произвольной выборкой OPEN "R", #1, "FIELD.DTA" ,18 'сделать два определения поля для каждого поля FIELD #1, 2 AS Integer$, 4 AS LongInt$,_ 4 AS SinglePre$, 8 AS DoublePre$ FIELD #1, 2 AS A$, 4 AS B$, 4 AS C$, 8 AS D$ MaxInt% = 32767 'записать данные в файл FOR l% = 1 TO 5 'преобразовать данные и назначить их буферу 'до записи его в файл данных LSET Integer$ = MKIS(l%) LSET LongInt$ = MKL$(l% + CLNG(MaxInt%)) LSET SinglePre$ = MKS$(CSNG(l% * CSNG(MaxInt%)) LSET DoublePre$ = MKD$(MaxInt% * l%) PUT #1,l% NEXT l% 'считать данные с файла FOR l% = 1 TO 5 ' и показать их на экране GET #1, l% PRINT CVI(A$), CVL(B$), CVS(C$),CVD(D$) NEXT l% CLOSE #1 'закрыть файл END 'закончить программу Оператор FILES ---------------------------------------------------------------- Назначение Оператор FILES показывает содержимое каталога ( как команда DIR DOS). Синтаксис FILES [filespec] Комментарий filespec усть символьное выражение, следующее условным обозначениям DOS, оно может факультативно включать в себя спецификатор накопителя и информацию о маршруте. Если filespec опущен, все файлы в данном каталоге будут проде- монстрированы. filespec может содержать знаки wildcard, например, ? и *, подобно команде DIR DOS: FILES "*.*" перечисляет все файлы в данном текущем каталоге; FILES "*.BAS" перечисляет только исходные файлы ТУРБО БЕЙСИКа В конце списка файлов (FILES) ТУРБО БЕЙСИК показывает количество свободных байтов на устройстве, содержащем текущий каталог.Файлы подкаталога укащзываются суффиксом DIR. Ограничения Описание несуществующего накопителя или каталога в операторе FILES вызовет ошибку выполнения. Пример INPUT "Enter the drive and directory "; Dir$ 'показать описанный каталог FILES Dir$ END 'закончить программу Функция FIX ---------------------------------------------------------------- Назхначение Функция FIX усекает до целого числа. Синтаксис Y = FIX (numeric expression) Комментарий Функция FIX отбрасывает дробную часть аргумента и возвращает целочисленную часть ( в отличие от CINT и INT, которые производят округление). См. также CEIL , CINT , INT Пример FOR I = 50 TO 52 STEP RND PRINT USING "The integer part of ##.## is ##";I,FIX(I) NEXT I END 'закончить программу Оператор FOR/NEXT ---------------------------------------------------------------- Назначение Операторы FOR и NEXT определяют автоматически положительно или отрицательно приращающийся цикл. Синтаксис FOR variable = x TO y [step z] . . statements . NEXT [variable]...] Комментарий variable есть численная переменная,служащая счетчиком цикла а x,y и z являются численными выражениями, определяющими начальные и конечные условия цикла. x есть начальное зна- чение счетчика, y есть конечное значение счетчика, а z есть необязательное приращающееся значение. Выполнение операторов между FOR и NEXT повторяется. С каждым прохождением через цикл переменная приращается на значение z. Если z опускается, пошаговое значение по умолчанию становится 1. Цикл завершается, когда переменная счетчика будет больше или равна y (или, для отрицательного x, меньше или равна y). Циклы FOR/NEXT выполняются быстрее всего с целочисленными переменными в качестве переменной счетчика и константами x,y и z. Тело цикла полностью пропускается, если начальное значе- ние x больше y при z>0 или, если z<0, x меньше y. Циклы FOR/NEXT могут быть помещены в пределах других циклов FOR/NEXT. Обеспечьте использование единых перемен- ных счетчика и появление оператора внутреннего цикла NEXT до внешнего цикла NEXT. Данный код пересек циклы и не будет компилироваться: FOR n = 1 TO 10 FOR m = 1 TO 20 . . . NEXT n NEXT m Если множественные циклы заканчиваются в одной точке, единственный оператор NEXT, содержащий каждую переменную счетчика, будет достаточным: FOR n = 1 TO 10 FOR m = 1 TO 20 . . . NEXT m,n В операторе NEXT переменная счетчика может опускаться, но если вы включите ее, то это должна быть единственно верная переменная. Например: FOR n = 1 TO 10 . . . NEXT 'NEXT n будет тоже работать, но не NEXT m Несмотря на то, что компилятору все это безразлично, расположите операторы между FOR и NEXT c двумя или тремя пробелами для структурирования цикла. Для выхода из цикла FOR/NEXT до его завершения исполь- зуйте оператор EXIT FOR. Если NEXT встречается без соответствующего ему FOR, происходит ошибка выполнения 1: NEXT без FOR. Пример FOR I% = 1 TO 10 PRINT "For loop iteration " I% ' показать интерации NEXT I% PRINT "Press any key..." 'пауза WHILE NOT INSTAT WEND 'используйте STEP для отрицательного приращения цикла FOR FOR I% = 50 to 1 STEP -5 PRINT "For loop iteration" (45-I%)\ 5 ' обратите внимание на отсутствие параметра в next NEXT END Функция FRE --------------------------------------------------------------- Назначение Функция FRE возвращает доступное вашей программе коли- чество свободной памяти. Синтаксис Y = FRE( string expression | - 1 | -2 ) Комментарий Функция FRE с символьным аргументом возвращает длинное целое число, представляющее количество байтов,свободных RAM в символьной памяти. FRE(-1) возвращает свободные RAM в пространство массива вашей программы.FRE(-2) сообщает, сколько места осталось на стеке. Различия Функция FRE ТУРБО БЕЙСИКа обеспечивает больше информации, чем функция Интерпретатора БЕЙСИК. Оператор FRE в интерпре- таторе БЕЙСИК возвращает обьем доступной памяти в сегмент данных БЕЙСИКа: таким образом вызов FRE(s$) и FRE(0) воз- вращают такое же количество. Однако, учитывая,что ТУРБО Буйсик обеспечивает больший обьем памяти для работы, его оператор FRE имеет больше функций. ТУРБО БЕЙСИК имеет отдельный символьный сегмент; таким образоми, FRE(S$) возвращает доступное символьное пространство. ТУРБО БЕЙСИК имеет большое (>64К) простран- ство массивов, поэтому FRE(-1) возвращает доступную память массивов. ТУРБО БЕЙСИК обеспечивает также процедуру и ре- курсию, поэтому FRE(-2) возвращает доступный обьем стека. Пример ON ERROR GOTO ErrorHandler 'установить обработку ошибок 'показать память, доступную в сегментах строки, 'данных и стека PRINT FRE("String Space"),FRE(-1),FRE(-2) DIM DINAVIC BigArray(10000) 'обьявить динамический массив BigArray(6666) = 66 'назначить ему данные S$="abc..z" 'показать память, доступную в сегментах строки, 'данных и стека PRINT FRE("String Spase"),FRE(-1),FRE(-2) ERASE BigArray 'перераспределить массив S$="" 'показать память, доступную в сегментах строки, 'данных и стека PRINT FRE("String Spase"),FRE(-1),FRE(-2) 'Данный оператор возвращает ошибку выполнения,если 'программа прогоняется с контролем границ PRINT BigArray(6666) END 'закончить программу ErrorHandler: PRINT "An error of type " ERR_ " has occurred at address" ERADR END Оператор GET (файлы) ---------------------------------------------------------------- Назначение Оператор GET считывает запись с файла с произвольной организацией. Синтаксис GET [#] filenum [,recnum] Комментарий filenum есть номер открытия файла, а recnum есть запись, которая должна быть считана, от 1 до 16777215 (2^24 -1). Если recnum опускается, тогда считывается следующая запись (следом за записью указанной самым последним GET и PUT). Пример см. в описании оператора FIELD. Оператор GET (графический) ---------------------------------------------------------------- Назначение Оператор GET считывает весь или часть графического экрана в массив. Синтаксис GET (x1,y1)-(x2,y2),array Комментарий (x1,y1) и (x2,y2) описывают соответственно верхнюю левую и нижнюю правую границы зоны на графическом экране оператора GET. array - это численный массив. Оператор GET и его комплиментирующая команда PUT используются для считывания, а затем для записи графических образов на экране. Единственное ограничение в отношении численного массива, используемого для удерживания данных, считываемых с экрана, это то, что он должен быть достаточно большим для того, чтобы удержать их. Используйте данную формулу для вычисления размера массива, необходимого для удержания данного диапазона экрана: ByteNecessary = 4 + INT((X * bitsPerPixel + 7)/8 * Y где X и Y представляют собой соответсвенно размеры по горизонтали и вертикали захватываемой зоны, bitsPerPixel (биты на растровый элемент) является константой, относящей- ся к графическому режиму: ----------------------------------------------------------- Экран Биты на растровый элемент ----------------------------------------------------------- 1 2 2 1 7 4 8 4 9 4 10 2 ----------------------------------------------------------- Например, для сохранения образа среднего разрешения CGA (SCREEN 1) 35 растровых элементов на 45, вам потребуется массив 4 + INT((35 * 2 + 7)/8) * 45 байтов, или 409 байтов. 409 байтов представляют целочисленный массив из 205 элементов, таким образом оператор размера DIM buffer%(204) делает свою работу. (Помните, что по умолчанию каждый массив имеет нулевой элемент, так что buffer% имеет 205 двухбайтных элементов, от 0 до 204, всего 410 байтов.) ТУРБО БЕЙСИК сохраняет графические данные в массиве buffer% в следующем формате: buffer%(0): Количество байт по-горизонтали buffer%(1): Количество байт по-вертикали buffer%(2): . . Собственно графическая информация . buffer%(204): В результате организации памяти дисплея, оживление основанное на GET и PUT , происходит быстрее, если вы выберете те участки экрана, которые примыкают к границам байтов. Для средней разрешающей способности используйте значения X равномерно делимые на 4; для высокого разрешения используйте значения X равноделимые на 8. Основная стратегия использования GET и PUT для оживления объекта от точки A до точки B заключается в следующем: Draw the object GET the object into an array position = old location = point A DO UNTIL position = point B PUT XOR the object at old location position = position + increment PUT XOR the object at position Delay if necessary old location = position LOOP Пример 'выделить буфер для хранения графических образов DIM Buffer%(143) 'перейти в графический режим средней 'разрешающей способности SCREEN 1 CIRCLE (16,16),8,2 'нарисовать круг GET (0,0)-(31,31),Buffer% 'получить круг 'скопировать его по всему экрану FOR I% = 0 TO 9 PUT (I% * 32, 100),Buffer% NEXT I% END 'закончить программу Функция GET$ ---------------------------------------------------------------- Назначение Функция GET$ считывает строку с файла открытого в режиме BINARY. Синтаксис GET$ [#] filenum, count, string variable Комментарий count есть целочисленное выражение в диапазоне от 0 до 32767. GET считывает счетные байты начиная с текущего положения (которое может быть установлено с помощью SEEK), из файла с номером filenum и назначает его символьной переменной. Файл filenum должен быть открыт в режиме BINARY. После функции GET$ , текущее положение файла будет продвинуто с помощью счетных байтов. GET$ , PUT$ и SEEK обеспечивают альтернативу низкого уровня технике обработки последовательных файлов и файлов с произвольной организацией, которая позволяет вам иметь дело с файлами на основе байт/байт. См. также OPEN , PUT$ , SEEK. Пример SUB Create File ' (создание файла) 'GET$ открывает файл и записывает 256 знаков в него LOCAL I% 'открыть файл для BINARY I/O OPEN "GET.DTA" FOR BINARY AS #1 'записать в него данные FOR I% = 0 TO 255 PUT$ #1, I%, CHR$(I%) NEXT I% END SUB 'закончить процедуру CreateFile DEF FNReagIt$(Start%,Size%) 'GET$ считывает указанное количество данных из файла LOCAL TempStr$, Char$, I% 'поиск для коррекции положения в файле SEEK #1, Start% 'считать Size% байтов GET$ #$1, Size% TempStr$ FNReadIt$ = TempStr$ END DEF 'закончить функцию ReadIt CALL CreateFile 'создать файл данных 'получить ввод пользователя PRINT "Enter the starting point[0...255] and how many" PRINT "bytes of data [0...255] yon wish to" INPUT "read from the file: ",St%, Sz% PRINT FNReadit$(St%, Sz%) 'считать данные END 'закончить программу Оператор GOSUB ---------------------------------------------------------------- Назначение Оператор GOSUB вызывает подпрограмму. Синтаксис GOSUB label Комментарий Оператор GOSUB заставляет ТУРБО БЕЙСИК перескакивать на оператор, следующий за меткой label. В стек производится запись текущего адреса оператора GOSUB. Выполнение RETURN возвращает управление к оператору непосредственно за GOSUB. Процедуры и функции ТУРБО БЕЙСИКа могут выполнять работу подпрограммы с извлечением дополнительных пиреимуществ от рекурсии, прохождения параметров, локальных и статических переменных. См. также DEF FN , SUB , RETURN Пример PI# = ATN(1) * 4 'вычисление значения Pi Radius! = 55 'объявить переменную с одинарной точностью GOSUB CalcArea 'переход на подпрограмму END 'закончить программу 'вычислить и показать на экране площадь круга СalcArea: Area = PI# * Radius^2 'вычислить площадь PRINT Area 'показать результат RETURN 'выход из подпрограммы Оператор GOTO ---------------------------------------------------------------- Назначение Оператор GOTO посылает выполнение программы к оператору с меткой. Синтаксис GOTO label Комментарий Оператор GOTO перемещает выполнение программы к коду с меткой. Оператор GOTO - это быстрое и эффективное программное устройство, если его использовать умеренно. Если же использовать его беспечно, они могут "удушить" программу своими кодами, которые практически невозможно отгадать (особенно по прошествии месяцев или нескольких лет). Современное использование операторов GOTO минимизировано в практике программирования подпрограммами, процедурами, функциями и структурными операторами, такими как FOR/NEXT, WHILE/WEND, DO/LOOP, блочный IF и SELECT. Оператор EXIT тоже может помочь сократиь использование GOTO. См. также EXIT Пример X = 0 Start: 'определите метку X = X + 1 'приращение X IF X < 20 THEN 'если X < 20 то перейти на PrintOut GOTO PrintOut END IF END PrintOut: 'показать значение X PRINT "Variable X = "X GOTO Start 'вернуться на Start (начало) Функция HEX$ --------------------------------------------------------------- Назначение Функция HEX$ преобразует число в его шестнадца- тиричный символьный эквивалент. Синтаксис s$ = HEX$(numeric expression) Комментарий численное выражение варьируется от -32768 до 65535. Любая дробная часть численного выражения округляется до создания строки. Если аргумент HEX$ отрицательный, HEX$ возвращает дополнительный код числа. См. такжке BIN$ , OCT$ Пример PRINT HEX$(65535) PRINT HEX$(-1) Оператор IF ---------------------------------------------------------------- Назначение Оператор IF тестирует условия и меняет ход выполнения программы для соответствия ее конкретным условиям. Синтаксис IF integer expression [,] THEN statement(s) _ [ELSE statement(s)] Комментарий Если целочисленное выражение есть TRUE (не равно нулю), выполняется оператор(ы), следующий за THEN и перед необязательным ELSE. Если выражение является FALSE (нулевой результат), тогда выполняется оператор(ы), следую- щий за ELSE. Если необязательный ELSE опускается, продол- жается выполнение следующей строки программы. Обычно, целочисленное выражение является результатом, возвращенным операцией отношения, хотя и не всегда, как видно из примера: IF printerOn THEN LPRINT answer$ Здесь оператор LPRINT выполняется в случае, если "флаговая" переменная printerOn (вкл.) имеет значение не равное нулю. Перед клавишей ELSE не должно быть двоеточия, например, следующий оператор не будет компилироваться: IF a < b THEN c = d : ELSE e = f Оператор IF и родственные операторы, включая те, что идут после ELSE, должны появляться на одной и той же логи- ческой строке. Поэтому следующая запись неправильная: IF a < b THEN t = 15 : u = 16 : v = 17 ELSE t = 17 : u = 16 : v = 15 потому что компилятор рассматривает вторую строку, как новый вид оператора, не связанный с предыдущим. Если у вас операторов больше, чем может вместить одна строка, вы може- те воспользоваться знаком продолжения строки и распрострa- нить единую логическую строку на несколько физических строк. Например, ниже следует правельный пример: IF a < b THEN t = 15 : u = 16 : v = 17_ ELSE t = 17 : u = 16 : v = 15 Однако альтернативой может быть использование блочного оператора IF. Блочный оператор IF можно также использовать для формирования многострочных серий операторов IF. Различия ТУРБО БЕЙСИК расширил оператор IF / THEN / ELSE для обеспечения многострочных кодов. ТУРБО БЕЙСИК также обеспе- чивает операторы ELSEIF и ENDIF для блочного оператора IF. См. также блочный IF , SELECT Пример 'одна строка IF INPUT "Enter a number", X IF X > 100 THEN PRINT "Bignumber" ELSE PRINT "SmallNumber" END Блочный оператор IF ---------------------------------------------------------------- Назначение Блочный IF создает серию операторов IF. Синтаксис IF integer expression [,] THEN . . statement(s) . [ELSEIF integer expression [,] THEN . . statement(s) . [ELSE . . statement(s)] END IF Комментарий Блок IF представляет собой расширение Интерпретатора БЕЙСИК, он позволяет многократные тесты многих строк. При выполнении блока операторов IF, сначало проверяется истинность выражения в оператора IF. Если FALSE (нулевой результат), каждый из последующих операторов ELSEIF прове- ется по порядку (операторов ELSEIF может быть сколько угодно). Как только ТУРБО БЕЙСИК подтверждает истинность одного из операторов, он выполняет этот оператор, следуя за связанным с ним THEN и перескакивает на END IF без дальней- ших тестов. Оператор(ы) после необязательного ELSE выпол- няется, если ни один из предшествующих тестов не удается. Заметьте, что после ключевого слова THEN в первой строке блока IF не может быть больше ничего; поэтому признаку компилятор может отличить блок IF от обычного оператора IF. Также помните, что после ELSE ничего нет. Операторы блока IF могут быть вложены; то есть, любой оператор после любого THEN может содержать блоки IF. Операторы блока IF должны заканчиваться END IF. Обратите внимание, что END IF имеет пробел, а ELSEIF - нет. См. также SELECT Пример RANDOMIZE TIMER bancroll = 100 : bet = 5 : delayVal = .5 WHILE NOT INSTAT 'для завершения нажать клавишу roll = INT(RND(1) * 6) + INT(RND(1) * 6) + 2 PRINT STRING$(30,"-") PRINT "Сумма наличности =" bancroll PRINT roll : DELAY delayVal IF roll = 2 OR roll = 3 OR roll = 12 THEN PRINT "Вы проиграли" bancroll = bancroll + bet ELSEIF roll = 7 OR roll = 11 THEN PRINT "Вы выиграли !" bancroll = bancroll - bet ELSE PRINT "Ваши очки" roll noPoint = -1 WHILE noPoint nextRoll = INT(RND(1) * 6) + INT(RND(1) * 6) + 2 PRINT nextRoll : DELAY delayVal IF roll = nextRoll THEN 'вложенный блок IF PRINT "Вы выиграли !" bancroll = bancroll + bet noPoint = 0 ELSEIF nextRoll = 7 THEN PRINT "Вы проиграли" bancroll = bancroll - bet noPoint = 0 END IF WEND 'завершает цикл WHILE noPoint END IF 'завершает первый блок IF WEND 'конец цикла WHILE NOT INSTAT Оператор INCR -------------------------------------------------------------- Назначение INCR увеличивает значение переменной Синтаксис INCR числовая переменная [, приращение ] Замечания Приращение - необязательное числовое выражение, эначение которого прибавляется к переменной. Оператор INCR дает простую возможность уве- личить значение переменной, не используя опера- тор присваивания. Отличия В интерпретаторе BASIC такого оператора нет. См. также DECR Пример I% = -15 'инициализация переменных-счетчиков J% = -500 WHILE I% < 0 PRINT I%,J% 'вывод значений счетчиков INCR I% 'эначение увеличивается на 1 INCR J%, 5 'эначение увеличивается на 5 WEND END 'конец программы Функция INKEY$ ----------------------------------------------------------------- Назначение INKEY$ считывает коды клавиш клавиатуры без воспро- изведения на экране их значений. Синтаксис s$ = INKEY$ Замечания INKEY$ присваивает переменной s$ строку из 0, 1 или 2 символов, отражающую состояние буфера клавиатуры. Пустая строка (LEN(s$)=0) означает, что буфер пуст. Если длина строки равна 1 (LEN(s$)=1), то строка содержит код ASCII клавиши, которая была нажата последней; например, значение 13 для клавишы Enter, (наэываемой также "возвратом каретки", 65 для кла- виши A. Если длина строки равна 2 (LEN(s$)=2), то пос- ледней была нажата клавиша расширенной клавиатуры, значение которой не входит в стандартный код ASCII; например, одна из клавиш Home, PgDn или стрелки. Первый символ такой строки 0, второй - вспомога- тельный код. (Для определения нажатой клавиши см. таблицу расширенных кодов ASCII в приложении F). Если нажата функциональная клавиша, определяемая пользователем (см. оператор KEY), то INKEY$ при каждом вызове возвращает односимвольные строки, которые соответствуют последовательности символов в определении функциональной клавиши. Функция INKEY$ предоставляет надежный способ ввода пользователем данных в программу без ограни- чений, имеющихся в операторе INPUT. INKEY$ возвра- щает результат не ожидая нажатия очредного символа, и поэтому обычно используется в цикле в подпрограм- ме низкого уровня для непрерывного контроля и конструирования вводимой строки, проверка которой выполняется процедурами более высокого уровня. INKEY$ пропускает без обработки и вывода на эк- ран все нажатия клавиш, включая управляющие (Tab,Enter и BackSpace), за исключением : - Ctrl-Break - комбинация прерывающая выполнение программы, кроме тех случаев, когда при компиля- ции соответствующее прерывание было запрещено; - Ctrl-Alt-Del - комбинация, вызывающая перезапуск системы; - Shift-PrtSc - комбинация, распечатывающая содер- жимое экрана. См. также INSTAT Пример PRINT "Введите несколько символов и затем нажмите'чтение и воспроизведение кодов клавиш WHILE Char$ <> CHR$(13) Char$ = INKEY$ InputSnring$ = InputString$ + Char$ WEND PRINT InputSnring$ END 'конец программы Оператор INPUT ----------------------------------------------------------------- Назначение INPUT подсказывает пользователю, что нужно ввести значение одной или нескольких переменных. Синтаксис INPUT [;] [текст подсказки {;|,}] список_переменных Замечания Текст подсказки - это необязательная символьная константа. Список переменных - одна или несколько символьных или числовых переменных, разделенных запятыми. Оператор INPUT ждет, пока пользователь не введет данные с клавиатуры, и затем присваивает значения заданным переменным. Если за текстом подсказки указана точка с запя- той, TURBO BASIC выводит знак вопроса вслед за текстом. Для того, чтобы знак вопроса не выводился, нужно поставить запятую. Вводимые данные должны соответствовать типам пе- ременных в операторе INPUT, т.е. нечисловые данные недопустимы для числовых переменных. Если типы не согласованы, TURBO BASIC потребует повторного ввода даннах. Так, при вводе нецифрового символа для чис- ловой переменной появится сообщение ? Redo from start (повторите сначала ) Если оператор INPUT содержит несколько перемен- ных, данные для них должны отделяться друг от друга запятыми. Если непосредственно за ключевым словом INPUT указана точка с запятой, то при нажатии клавиши Enter после окончания ввода курсор останется в той же строке. В противном случае на дисплее будут вы- полнены возврат каретки и перевод строки. Отличие В TURBO BASIC данные, вводимые по запросу оператора INPUT, могут разделяться запятыми или пробелами. В интерпретаторе BASIC требуется, чтобы входные данные разделялись запятыми. Пример INPUT "Введите Ваш возраст и вес: ", Age, Weight PRINT USING "Вам ### лет, Ваш вес ###";_ Age, Weight END 'конец программы Оператор INPUT # ------------------------------------------------------------------ Назначение Оператор INPUT # присваивает переменным значения из последовательного файла Синтаксис INPUT # номер файла, список переменных Замечания Номер файла определяется при открытии файла. Список переменных - одна или несколько символьных или чис- ловых переменных, разделенных запятыми. В качестве файла может использоваться дисковый файл, последовательный порт (COMn:) или клавиатура (KYBD:). Данные в файле должны соответствовать типам пе- ременных в операторе INPUT #. Значения в файле зада- ются в том же виде, что и для оператора INPUT, то есть разделяются запятыми, последним указывается возврат каретки. Файлы такого вида создаются с по- мощью оператора WRITE #. См. также WRITE # Пример SUB Makefile 'Открытие последовательного файла FILE.DTA для вывода 'Запись в файл строк, состоящих из данных различных 'типов, с помощью оператора WRITE # 'файлу переменных присваивается значение #1 OPEN "FILE.DTA" FOR OUTPUT AS #1 'определение и инициализация переменных StringVariable$ = "Я вернусь." Integer% = 1000 FloatingPoint! = 30000.1234 'запись строки текста в последовательный файл WRITE #1, StringVariable$, Integer%, FloatingPoint! CLOSE 1 'закрытие файла переменных END SUB 'конец процедуры Makefile SUB ReadFile 'Эта процедура открывает последовательный файл 'для ввода. Чтение строк, состоящих из данных 'различных типов, из файла с помощью 'оператора INPUT # 'файлу переменных присваивается значение #1 OPEN "FILE.DTA" FOR INPUT AS #1 StringVariable$ = "" 'определение и Integer% = 0 'инициализация FloatingPoint! = 0 'переменных 'чтение строки текста из последовательного файла INPUT #1, StringVariable$, Integer%, FloatingPoint! PRINT StringVariable$, Integer%, FloatingPoint! CLOSE #1 'закрытие файла переменных END SUB 'конец процедуры Readfile CALL MakeFile CALL ReadFile END 'конец программы Функция INP ----------------------------------------------------------------- Назначение INP осуществляет считывание из порта ввода / вывода Синтаксис y = INP(номер порта) Замечания INP считывает один байт из порта ввода/вывода с за- данным номером. Номер порта соответствует аппаратно- му порту ввода и может иметь значения от 0 до 65535. Функция INP полезна при считывании информации о состоянии различных аппаратных подсистем, таких, как порт связи. (Описание распределения портов для имеющейся модели компьютера см. в техническом спра- вочном руководстве.) Для вывода в порт ввода / вывода следует ис- пользовать оператор OUT См. также OUT Пример 'считывая регистр состояния, 'подавляя и пропуская биты управления, 'программа порождает пронзительный звуковой сигнал 'в динамике. 'Из порта 61 (hex) считывается значение StatusReg% = INP(&H61) StatusReg% = StatusReg% AND &H00FC 'на считываемое значение накладывается маска 'удлинить звук, чтобы его можно было услышать FOR J = 1 to 1000 StatusReg%= StatusReg% XOR 2 OUT &H61,StatusReg% delay .001 NEXT J END Функция INPUT$ ---------------------------------------------------------------- Назначение INPUT$ читает заданное число символов с клавиатуры или из файла Синтаксис s$=INPUT$(n [,[#] номер-файла]) Замечания n - число читаемых символов, номер-файла указывает файл, из которого выполняется чтение. Если номер файла опущен, символы читаются с клавиатуры. При чтении с клавиатуры символы на экране не возпроизводятся, а передаются непосредственно в строку s$. Основное достоинство функции INPUT$, так же, как и других способов чтения из файлов или с клавиатуры, состоит в возможности чтения любых символов, в том числе управляющих. Более гибкие возможности дают файлы типа BINARY. Примечание: Некоторые клавиши и их комбинации (например, функ- циональные клавиши или клавиши управления курсо- ром) не записываются в стандартном коде ASCII. При нажатии таких клавиш INPUT$ генерирует пустую строку CHR$(0); этого ограничения не имеет функция INKEY$. См. также INKEY$ Пример OPEN "FILE.DTA" FOR INPUT AS #1 S$ = INPUT$(15, #1) PRINT S$ CLOSE #1 END Функция INSTAT ----------------------------------------------------------------- Назначение INSTAT определяет состояние клавиатуры Синтаксис y = INSTAT Замечания INSTAT возвращает информацию о состоянии клавиатуры. При нажатии произвольной клавиши переменной y при- сваивается значение -1, в противном случае 0. INSTAT не очищает буфер, т.е.,если функция приняла значение TRUE (-1), оно не изменится до тех пор, пока строка не будет перемещена с помощью INKEY$ или другой ко- манды чтения с клавиатуры. См. также INKEY$ Пример WHILE NOT INSTAT ' проверка нажатия клавиши LOCATE 1,1 PRINT "нажмите клавишу" WEND PRINT INKEY$ ' вывод нажатой клавиши END ' конец программы Функция INSTR --------------------------------------------------------------- Назначение INSTR ищет в исходной строке заданную подстроку Синтаксис y = INSTR ([n,] исходная-строка, искомая-строка) Замечания n - целочисленное выражение, значение которого от 1 до 32767, исходная-строка и искомая-строка - символьные переменные, выражения или константы. INSTR определяет номер позиции искомой-строки в исходной-строке. Если в исходной строке нет ис- комой подстроки, INSTR возвращает 0. Если задан необязательный параметр n,поиск начинается с n-ой позиции исходной строки. Если искомая строка пустая (длины 0), INSTR возвращает 1 или n, если оно указано. Пример ' ввод данных пользователя LINE INPUT "Введите, пожалуйста, строку:";DummyStr$ PRINT "Теперь введите подстроку, имеющуюся"; INPUT " в первой строке:";SubStr$ ' вывод номера позиции подстроки PRINT USING "Строка '&' начинается с";_ SubStr$; PRINT USING "позиции ### в строке &";_ INSTR(1,DummyStr$,Substr$),DummyStr$ END 'конец программы Функция INT ---------------------------------------------------------------- Назначение INT преобразует числовое выражение в целое Синтаксис y = INT (числовое выражение) Замечания INT возвращает наибольшее целое,которое меньше или равно числовому выражению. См. также CEIL , CINT , FIX Пример PRINT "x","INT(x)" PRINT FOR N=1 TO 6 READ x# PRINT x#,INT(x#) NEXT N DATA 3.1,-3.1,3.5,-3.5,3.9,-3.9 END Оператор IOCTL, функция IOCTL$ ---------------------------------------------------------------- Назначение IOCTL и IOCTL$ осуществляют связь с драйвером устройства Синтаксиc Оператор: IOCTL [#] номер-файла, символьное-выражение Функция: s$ = IOCTL$ [#] номер-файла Замечания Номер-файла относится к нужному драйверу устройства, символьное-выражение содержит информацию, посылаемую драйверу устройства. Формат символьных данных, передаваемых или получаемых от драйвера зависит от конкретного драйвера. IOCTL передает данные драйверу устройства. Функция IOCTL$ принимает данные от драйвера. Для более детальной информации, см. раздел о драйвере устройства в техническом справочном руководстве по DOS IBM. Оператор KEY ----------------------------------------------------------------- Назначение KEY устанавливает и воспроизводит назначение фун- кциональных клавиш и определяет значения прерываний по клавишам Синтаксис KEY {ON | OFF | LIST} KEY n, символьное выражение KEY n, CHR$(код состояния регистров)+CHR$(скэн-код) Замечания KEY ON и KEY OFF включают и выключают воспроизведе- ние функциональных клавиш в нижней строке экрана. Обратите внимание, что выключение воспроизведения не влияет на определение функциональных клавиш. KEY LIST выводит на экран текущие определения функциональных клавиш. При выводе значений функцио- нальных клавиш 25-ая строка экрана никогда не пере- мещается, и попытка поместить в нее курсор (с по- мощью оператора LOCATE) является неверным вызовом функции (ошибка исполнения 5). KEY n,символьное-выражение - устанавливает значение функциональной клавиши n эквивалентной символьному выражению, длина которого не не должна превышать 15 символов (в строке вывода состояния воспроизводятся только первые 6). Для того чтобы отменить значение функциональной клавиши следует присвоить ей пустую строку. Возврат каретки (CHR$(13)) в строке воспроизводится как маленькая левая стрелка. KEY n, CHR$(код состояния регистров)+CHR$(скэн-код) связывает клавишу или их комбинацию с числом (n, от 15 до 20) для организации прерываний с помощью последующих операторов ON KEY и KEY(n). Код состояния регистров - целочисленное выраже- ние от 0 до 255, которое управляет срабатыванием прерывания в зависимости от состояния клавиш Ctrl, CapsLock, NumLock, Alt и обеих клавиш Shift. Скэн- код (порядковый номер клавиши) - числовое значение от 1 до 83, задающее согласно таблице скэн-кодов в приложении F клавишу, которая вызывает прерывание. Обратите внимание, что прерывания для клавиш с номерами 59-68, 72, 75, 77 и 80 (функциональные клавиши и клавиши управления курсором) уже опреде- лены, и повторное определение их с помощью операто- ра KEY не имеет смысла. Для кода состояния регистра следует иметь ввиду следующую таблицу: --------------------------------------------------- клавиша, | двоичное | 16-ричн. модифицирующая регистр | значение | значение --------------------------------------------------- нажата Right Shift | 0000 0001 | 01 нажата Left Shift | 0000 0010 | 02 нажата Gtrl | 0000 0100 | 04 нажата Alt | 0000 1000 | 08 состояние Scroll Lock (?) | 0001 0000 | 10 состояние Num Lock | 0010 0000 | 20 состояние Caps Lock | 0100 0000 | 40 состояние Insert (?) | 1000 0000 | 80 --------------------------------------------------- Предположим, например, что мы хотим, чтобы клавиши SHIFT - ESCAPE вызывали прерывание,т.е., мы хотим, чтобы, когда бы ни были одновременно нажаты клавиши ESCAPE и SHIFT, управление передавалось некоторой подпрограмме. Первоначально следует построить маску кода состояния регистра. Если необходимо, чтобы распознавались обе SHIFT-клавиши, маски складываются: 01H+02H=03H. Далее, по таблице скэн-кодов в приложении F можно определить, что скэн-код клавиши ESC равен 1. Следующий оператор сообщает о наших намерениях ТУРБО БЕЙСИКУ KEY 15, CHR$(&H03)+CHR$(1) При этом n равно 15, поскольку первые 14 значений уже отведены функциональным клавишам и клавишам управления курсором. Затем определяется подпрограмма обработки прерывания, вызываемая всякий раз при нажатии клавиши SHIFT-ESC: ON KEY (15) GOSUB ShiftEscape где ShiftEscape - метка начала подпрограммы обработки прерывания. Наконец, следует включить клавишное прерывание 15 с помощью оператора: KEY (15) ON См.также KEY (15) ON KEY Пример ' В этой программе показано использование ' операторов KEY ON/OFF и символьных ' выражений KEY n. ' Выключить воспроизведение функциональных клавиш KEY OFF ' Присвоить функциональным клавишам символь- ' ные выражения FOR N%=1 TO 10 READ A$ KEY N%,A$+CHR$(13) NEXT N% KEY LIST ' Воспроизведение значений функциональных ' клавиш ' Включить воспроизведение функциональных клавиш KEY ON ' Ждать, пока пользователь не нажмет клавишу WHILE NOT INSTAT WEND ' Данные, используемые оператором READ DATA Help, Enter, Edit, Change, Report, Print DATA Setup, DOS, Copy, Quit END ' конец программы Оператор KEY(n) ---------------------------------------------------------------- Назначение KEY(n) включает или выключает прерывание при нажа- тии заданной клавиши Синтаксис KEY(n) {ON | OFF | STOP} Замечания n - целочисленное выражение, которое указывает на клавишу, вызывающую прерывание, в соответствии со следующей таблицей ------------------------------------------------- n Клавиша ------------------------------------------------- 1-10 Функциональные клавиши F1 - F10 11 Курсор вверх 12 Курсор влево 13 Курсор вправо 14 Курсор вниз 15-25 Клавиши, определяемые в операторе KEY 30 Функциональная клавиша F11 31 Функциональная клавиша F12 ------------------------------------------------- KEY(n) ON включает прерывание по клавише с номером n. Это означает, что между каждыми двумя операто- рами выполняется проверка,была ли нажата клавиша n, и, если была, то управление передается из выполня- емой программы в процедуру, заданную для этой кла- виши в операторе KEY. KEY(n) OFF запрещает прерывание по клавише n. KEY(n) STOP также запрещает прерывание, но запоминает все нажатия клавиши n, так, что при последующем выполнении оператора KEY ON немедлен- но возникает прерывание. См.также $EVENT , ON KEY Пример ' программа иллюстрирует действия оператора KEY(n) ' включить контроль за нажатием клавиши KEY ON ' присвоить клавишам следующие строки KEY 1, "Hello"+CHR$(13) KEY 2, "GoodBye"+CHR$(13) KEY 10, CHR(13) ' по клавише F10 установить также прерывание ON KEY(10) GOSUB GoodBye ' включить прерывание по F10 KEY 10 ON ' запросы пользователю на ввод INPUT "НажмитеF1"; Dummy$ INPUT "НажмитеF2"; Dummy$ PRINT "Теперь нажмите F10..." ' теперь, когда пользователь нажмет F10 ' будет вызвана подпрограмма GoodBye WHILE NOT INSTAT : WEND 'ждать нажатия F10 END 'конец программы GoodBye: KEY LIST 'вызвать список текущих определений 'клавиш KEY (10) OFF 'отключить прерывание по F10 ' теперь, когда пользователь нажмет F10, будет ' выведена символьная строка,назначенная F10 PRINT "Нажмите F10, чтобы завершить программу..." RETURN Оператор KILL --------------------------------------------------------------- Назначение KILL удаляет файл (подобно команде DEL DOS) Синтаксис KILL имя-файла Замечания Имя-файла - символьное выражение, которое представ- ляет удаляемый файл или файлы и может включать (или не включать ) маршруты и/или символы шаблонов. Опе- ратор KILL аналогичен команде DEL (ERASE) в DOS. Так же, как и DEL, оператор KILL не может уда- лять каталоги. Для удаления каталога, после уничто- жения всех входящих в него файлов, следует исполь- зовать RMDIR. Пример ' обработка ошибок ON ERROR GOTO FileError ' ввод имени файла INPUT "укажите удаляемый файл:", FileName$ ' удаление файла IF FileName$<>"" THEN KILL FileName$ END IF END ' конец программы FileError: ' сообщение об ошибке PRINT "ошибка"; PRINT Err " возникла при удалении файла " END Функция LBOUND ----------------------------------------------------------------- Назначение LBOUND возвращает значение нижней границы (наименьшего индекса), допустимой для массива заданной размерности. Синтаксис LBOUND ( массив(размерность)) Замечание Массив - имя массива, нижняя граница которого под- лежит определению. Размерность - целое число от 1 до числа измерений массива. Для определения разме- ра массива вместе с LBOUND следует использовать UBOUND. Если диапазон индексов не задан (см. DIM), по умолчанию нижняя граница равна 0. Нижнюю границу, установленную по умолчанию, можно переопределить с помощью оператора OPTION BASE. См.также DIM , OPTION BASE , UBOUND Примечания ' задание размерности массива ' с нижней и верхней границами DIM Array$ (1900:2000,10:20) ' вывести нижнюю границу массива PRINT "нижняя граница 2-ой размерности массива ";_ LBOUND (Array%(2)) END Функция LCASE$ ---------------------------------------------------------------- Назначение LCASE$ возвращает строку, состоящую только из строчных букв Синтаксис s$ = LCASE$ (символьное-выражение) Замечания LCASE$ возвращает строку идентичную символьному выражению, за исключением того, что все заглавные буквы символьного выражения заменяются на строчные. См.также UCASE$ Пример PRINT LCASE$("To be or NOT to be?") Функция LEFT$ ----------------------------------------------------------------- Назначение LEFT$ возвращает n левых символов строки Синтаксис s$ = LEFT$ (символьное-выражение, n) Замечания n - целочисленное выражение, задающее число возвра- щаемых символов символьного-выражения. Оно должно быть заключено в диапазоне от 0 до 32767. LEFT$ возвращает строку, состоящую из n самых левых символов аргумента. Если n больше или равно длине символьного выражения, возвра- щается все символьное выражение. Если n равно 0, LEFT$ возвращает пустую строку. См.также MID$ , RIGHT$ Пример PRINT LEFT$ ("Эй, вы там, наверху! ",10) Функция LEN ----------------------------------------------------------------- Назначение LEN возвращает длину строки Синтаксис y = LEN (символьное-выражение) Замечания LEN возвращает целое от 0 до 32767, соответ- ствующее числу символов в символьном выражении. Об- ратите внимание, что диапазон значений существенно превышает максимальную длину строки интерпретатора BASIC, равную 255. Пример INPUT "Введите строку:",DummyStr$ PRINT USING "Длина строки = ###";_ LEN(DummyStr$) END Оператор LET ----------------------------------------------------------------- Назначение LET присваивает переменной значение Синтаксис [LET] переменная = выражение Замечания Переменная может быть символьной или числовой, тип выражения должен соответствовать типу пере- менной (т.е. символьные для символьной перемен- ной, числовое для числовой). Ключевое слово LET в операторе присваивания не является обязательным и на практике часто опускается. Пример INPUT "Введите строку :", DummyStr$ 'с помощью LET присвоить 'значение TempStr$ LET TempStr$ = DummyStr$ PRINT TempStr$, DummyStr$ END Оператор LINE ----------------------------------------------------------------- Назначение LINE рисует прямую линию, закрашенный или незак- рашенный прямоугольник Синтаксис LINE [(x1,y1)] - (x2,y2) [,[цвет] [,B[F]] _ [pattern]] Замечания (x1,y1) и (x2,y2) - координаты двух точек на графическом экране, которые могут быть заданы либо в абсолютном, либо в относительном виде. (Для более детальной информации об абсолютных и относительных координатах см. главу 4). Цвет - целочисленное выражение, указывающее цвет рисуемой линии или прямоугольника. Шаблон (pattern) - целочисленная маска, управля- ющая видом линии или контуром прямоугольника. Для того, чтобы нарисовать отрезок из LPR в точку (x,y) в цвете, установленном по умолчанию, введите : LINE -(x,y) Для того, чтобы нарисовать линию другим цветом, введите: LINE -(x,y),2 Отрезок из точки (x1,y1) в точку (x2,y2) рисуется командой LINE (x1,y1)-(x2,y2) Для того, чтобы нарисовать контур прямоу- гольника с верхней левой вершиной (x1,y1) и нижней правой вершиной (x2,y2) введите LINE (x1,y1) - (x2,y2),,B Чтобы закрасить прямоугольник цветом 2, введите LINE (x1,y1) - (x2,y2),2,BF Для изображения прерывистой линии, исполь- зуется аргумент шаблона. Например, для того, чтобы нарисовать пунктирную линию, следует использовать шаблон &HAAAA ( двоичное значение 1010 1010 1010 1010 ). Обратите внимание, что шаб- лоны не влияют на закрашивание прямоугольников. LINE (x1,y1) - (x2,y2),,,шаблон После выполнения оператора LINE, LPR принимает значение второй из двух точек оператора LINE. См.также FILL Пример SCREEN 1,0 ' Диагональ экрана LINE (0,0) - (319,199) ' горизонтальная штриховая пунктирная линия LINE (0,100) - (319,100),,,&HCCCC ' квадрат со стороной 50 пикселов, ' закрашенный цветом 2, ' с левой верхней вершиной в точке (10,20) LINE (10,20) - (60,70),2,BF ' ломаная линия из отдельных отрезков READ X,Y PSET (X,Y) ' установить LPR FOR N=1 TO 11 READ X,Y LINE - (X,Y) NEXT N LOCATE 9,9 PRINT " ORLAND " END ' конец программы DATA 10,20 50,20 55,25 55,40 50,45 10,45 DATA 50,45 55,50 55,65 50,70 10,70 10,20 Оператор LINE INPUT ----------------------------------------------------------------- Назначение LINE INPUT читает, игнорируя разделители, строку с клавиатуры в символьную переменную Синтаксис LINE INPUT [;] [текст-подсказки;] символьная-пере- менная Замечания Текст-подсказки - необязательная символьная конс- танта, посылаемая на экран в ожидании ответа. Символьная-переменная загружается вводимыми с клавиатуры данными. При вводе символьных данных с разделителями (например, запятыми) следует пользо- ваться не оператором INPUT, при выполнении которого возникает ошибка, а LINE INPUT. Например, на за- прос: INPUT "Введите адрес пациента:";a$ ответ 101 Main Street, Apt 2 вызовет сообщение ? Redo from start (Выполните сначала) LINE INPUT допускает запятые наравне с остальными символами. Если за оператором LINE INPUT указана точка с запятой, то при нажатии клавиши Enter после оконча- ния ввода возврат каретки выполнен не будет (т.е. курсор останется в той же строке). Пример PRINT "Введите несколько полей данных" LINE INPUT " беспокоится о разделителях не нужно:"_ DummyStr$ PRINT DummyStr$ END 'конец программы Оператор LINE INPUT# ----------------------------------------------------------------- Назначение LINE INPUT# считывает строку из последовательного файла в символьную переменную,игнорируя разделители Синтаксис LINE INPUT #номер-файла, символьная-переменная Замечания Номер-файла задает файл для считывания данных, символьная-переменная - адресат данных из файла. LINE INPUT# подобен оператору LINE INPUT за исклю- чением того, что данные читаются не с клавиатуры, а из последовательного файла. Текущая запись в файле считывается и загружается в символьную переменную. Наряду с LINE INPUT для ввода данных с разделителя- ми (запятыми) можно использовать оператор LINE INPUT#. Если данные в файл были записаны оператором WRITE#, т.е. они отделяются друг от друга правиль- ным образом, то наилучший способ чтения их в этом случае - оператор INPUT. Пример SUB MakeFile ' присвоение переменной файла значения #1 OPEN "FILE.DTA" FOR OUTPUT AS #1 ' определение и инициализация переменных StringVar$="в городе River-беспорядки" Integer% = 1000 FloatingPoint! = 30000.1234 'запись строки текста в последовательный файл PRINT #1,StringVar$, Integer%, FloatingPoint! CLOSE #1 'закрытие переменной файла END SUB 'конец процедуры MakeFile SUB ReadFile 'присвоение переменной файла значения #1 OPEN "FILE.DTA" FOR INPUT AS #1 StringVariable$="" 'ввод всей строки независимо от ее длины LINE INPUT #1, StringVariable$ PRINT StringVariable$ CLOSE #1 ' закрытие переменной файла END SUB ' конец процедуры ReadFile CALL MakeFile CALL ReadFile END ' конец программы Функция LOC ----------------------------------------------------------------- Назначение LOC возвращает текущую позицию в файле Синтаксис y = LOC (номер-файла) Замечания Номер-файла определяется при его открытии. Значение, возвращаемое LOC, зависит от режима, в котором файл был открыт. Для файлов произвольного доступа LOC возвращает номер записи, прочитанной или записанной последней. Для последовательных файлов LOC возвра- щает номер последнего с момента открытия файла про- читанного или записанного 128-байтового блока. По соглашению, если с момента открытия чтение или за- пись в файл не происходили, LOC возвращает первый блок. Для двоичных файлов LOC возвращает номер по- зиции поиска SEEK. Для коммуникационных файлов LOC возвращает число символов в буфере ввода. Пример OPEN "LOC.DTA" FOR BINARY AS #1 PUT$ #1, "ТУРБО-БЕЙСИК" PRINT LOC(1) CLOSE END Оператор LOCAL ----------------------------------------------------------------- Назначение LOCAL объявляет локальные переменные в процедуре или функции. Синтаксис LOCAL список-переменных Замечания Оператор LOCAL допустим только в описаниях функций и процедур, где он должен использоваться до любых выполняемых операторов. LOCAL определяет одну или несколько переменных как "локальные", внутренние для данной процедуры или функции. Локальные пере- менные могут иметь одинаковые имена с переменными в других частях программы или с локальными переменны- ми в других описаниях функций и процедур, не вызы- вая при этом конфликтных ситуаций, так как все они являются различными переменными. Для того, чтобы объявить локальный массив, следует его имя с пустой парой скобок указать в списке переменных, а затем установить размерность массива с помощью оператора DIM. Локальные переменные размещаются в стеке и ус- танавливаются в ноль (символьным переменным присва- ивается пустая строка) при каждом вызове включающей их функции или процедуры. Необъявленные переменные в процедурах по умолчанию считаются статическими (неперемещаемыми), однако, рекомендуется каждую переменную объявлять явно. См.также DIM , SHARED , STATIC Пример SUB Locals LOCAL a(), i% DIM DYNAMIC a(10:20) FOR i%=10 TO 20 a(i%)=i% NEXT i% END SUB Оператор LOCATE ----------------------------------------------------------------- Назначение LOCATE устанавливает курсор и/или определяет форму указателя Синтаксис LOCATE [строка] [,колонка] [,курсор] [,начало] [,конец] Замечания строка - целочисленное выражение, указывающее стро- ку экрана (1-25), на которую должен быть установлен курсор, колонка задает номер позиции от начала строки (1-80), курсор - числовое значение, которое управляет тем, видим указатель или невидим (0 - не- видим, 1 - видим). На 25 строку устанавливать кур- сор нельзя до тех пор, пока воспроизведение значе- ний функциональных клавиш разрешено (см.оператор KEY OFF), начало и конец - целочисленные выражения, управляющие размерами указателя и определяющие, ка- кое количество последовательных строк будет отмече- но указателем. Верхняя сканируемая строка - 0, нижняя: для цветных графических адаптеров - 7; для монохромных адаптеров - 13. Наиболее часто оператор LOCATE используется для задания места на экране, где будут размещены выводимые данные. См.также KEY OFF , PRINT Пример CLS CRSLIN and POS INPUT "Введите координаты x и y:",x%,y% 'размещение указателя и задание его формы LOCATE x%,y%,1,4,5 PRINT "Hi"; WHILE NOT INSTAT:WEND 'ожидание нажатия клавиши END 'конец программы Функция LOF ----------------------------------------------------------------- Назначение LOF возвращает длину файла Синтаксис y = LOF(номер файла) Замечания номер файла - число, которое было задано при от- крытии файла. LOF возвращает длину в байтах указанного файла. Для файлов связи LOF возвращает размеры доступного пространства в буфере связи. Пример OPEN "TB.EXE" FOR BINARY AS #1 PRINT "Размеры ТУРБО БЕЙСИКА равны";LOF(1) CLOSE #1 END Функции LOG, LOG2 и LOG10 ----------------------------------------------------------------- Назначение LOG возвращает значение натурального (по основанию e=2.7182818) логарифма, LOG2 - логарифма по основа- нию 2, LOG10 - логарифма по основанию 10. Синтаксис y = LOG (числовое-выражение) y = LOG2 (числовое-выражение) y = LOG10 (числовое-выражение) Замечания LOG возвращает значение натурального логарифма за- данного аргумента. Если числовое-выражение меньше или равно нулю, возникнет ошибка выполнения 5 - Illegal Function Call (неверный вызов функции). LOG, LOG2 и LOG10 возвращают значения с двойной точностью. Пример FOR I!=1 TO 50 STEP 2.5 PRINT USING "Натуральный логарифм ##.# = ##.##^^^^";_ I!, LOG (I!) NEXT I! END 'конец программы Функция LPOS ----------------------------------------------------------------- Назначение LPOS возвращает "позицию курсора" в буфере печатаю- щего устройства Синтаксис y = LPOS (принтер) Замечания принтер - целочисленное выражение от 0 до 3, указывающее на тип печатающего устройства: 0,1 для LPT1: 2 для LPT2: 3 для LPT3: LPOS сообщает, какое количество символов было пере- дано на принтер с момента выполнения последнего возврата каретки. См.также POS Операторы LPRINT,LPRINT USING ----------------------------------------------------------------- Назначение LPRINT и LPRINT USING посылают данные на принтер ( LPT1: ) Синтаксис LPRINT [список-выражений [;]] LPRINT USING строка формата, список-выражений Замечания список-выражений - последовательность числовых и/или символьных выражений, разделенных запятыми или точками с запятой. Строка формата содержит ин- формацию для форматирования. LPRINT и LPRINT USING выполняют те же действия, что и операторы PRINT и PRINT USING, за исключением того,что список выражений посылается на принтер (LPT1), а не на экран. Обратите внимание, что по умолчанию ТУРБО БЕЙСИК выполняет возврат каретки/перевод строки после вы- вода каждых 80 символов в строке. Длину строки мож- но изменить с помощью оператора WIDTH. См.также LPOS , PRINT , PRINT USING , WIDTH Оператор LSET ----------------------------------------------------------------- Назначение LSET перемещает символьные данные в буфер файла с произвольным доступом. Синтаксис LSET переменная-поле = символьное-выражение Замечания LSET и родственный ему оператор RSET перемещают символьную информацию в переменные поля, принадле- жащие по определению буферу файла с произвольным доступом. Если длина символьного-выражения меньше, чем длина переменной поля, оператор LSET выполняет выравнивание по левому знаку, дополняя поле пробе- лом. Это означает, что пробелы добавляются после последнего знака символьного выражения с тем, чтобы функция LEN (переменная-поле) возвращала то же зна- чение, которое указано в соответствующем операторе FIELD. RSET выполняет выравнивание по правому зна- ку, дополняя поле пробелами (пробелы добавляются до первого знака символьного выражения). LSET и RSET могут также использоваться для форматирования выво- димых на экран или на принтер данных. См.также FIELD , LEN , RSET Пример см. FIELD