Оператор RANDOMIZE ---------------------------------------------------------------- Назначение RANDOMIZE устанавливает начальное число в генера- торе псевдослучайных чисел Синтаксис RANDOMIZE [числовое выражение] Замечания Если числовое выражение опущено, выполнение программы останавливается на операторе RANDOMIZE и пользователь получает запрос на ввод начального числа: RANDOM NUMBER SEED? (начальное число генератора псевдослучайных чисел ?) О случайных числах Без задания всякий раз нового начального числа значения функции RND вовсе не являются случайными; для данного начального числа RND всегда дает одну и ту же последовательность значений. Без изменения начального числа имитация бросания костей будет приводить к одному и тому же результату всякий раз, когда запускается программа. Удобным способом обеспечить уникальность каждого прогона (при условии, что программа не запускается каждый день точно в одно и то же время) является задание начального числа с помощью функции TIMER: RANDOMIZE TIMER Другой способ состоит в использовании оператора высокого разрешения MTIMER (микросчетчик времени), которым замеряется время, истекшее с момента нажатия некоторой клавиши в начале программы. Это время используется для задания начального числа датчика случайных чисел: MTIMER PRINT "Нажмите любую клавишу, чтобы начать..." WHILE NOT INSTAT : WEND RANDOMIZE MTIMER См.также RND Пример ' инициализация микротаймера MTIMER PRINT "Нажать любую клавишу, чтобы начать..." WHILE NOT INSTAT WEND Dummy$ = INKEY$ ' установить начальное значение ' датчика случайных чисел RANDOMIZE MTIMER FOR I% = 1 TO 5 STEP RND(1.5) PRINT I% IF INSTAT THEN STOP NEXT I% END 'конец программы Оператор READ ---------------------------------------------------------------- Назначение Оператор READ загружает переменные значениями констант из списка оператора DATA Синтаксис READ переменная [, переменная] ... Замечания переменная может быть числовой или символьной READ загружает заданные переменные значениями констант, следующих за служебным словом DATA. Во время выполнения программы оператор READ считывает константы из оператора DATA в том порядке, в котором они появляются. Наиболее распространенной ошибкой, связанной с использованием операторов DATA и READ, является несовпадение типов константы и соответствующей переменной; например, попытка загрузить значение символьной константы в числовую переменную. В этом случае появляется синтаксическая ошибка (ошибка выполнения). Сообщение об ошибке не появляется, если, наоборот, вы пытаетесь загрузить числовую константу в символьную переменную. Если вы пытаетесь считать оператором READ больше констант, чем объявлено в вашей программе операторами DATA, ТУРБО БЕЙСИК регистрирует ошибку выполнения 4, Out of Data (не хватает данных). Оператор RESTORE позволяет заново считать константы, заданные первым или каким-то другим оператором DATA. См.также RESTORE Пример см. DATA Функция и оператор REG ---------------------------------------------------------------- Назначение REG возвращает или задает заданное значение в ре- гистровом буфере Синтаксис Функция: y = REG (номер-регистра) Оператор: REG номер-регистра, значение Замечания Номер-регистра задает процессорный регистр согласно следующей таблице ---------------------------- номер регистра регистр ---------------------------- 0 флаги 1 AX 2 BX 3 CX 4 DX 5 SI 6 DI 7 BP 8 DS 9 ES ---------------------------- Если номер регистра меньше 0 или больше 9, то возникает ошибка выполнения 5 Illegal Function Call (неверный вызов функции). Значение - это числовая переменная или выражение в диапазоне от 0 до 65536. Функция REG возвращает значение выбранного элемента в регистровом буфере. Оператор REG, наоборот, за- гружает выбранный элемент в регистровом буфере зна- чением заданной целой переменной. Оператор и функ- ция REG используются для передачи информации от одной программы, написанной на ассемблере к другой. Содержимое регистрового буфера загружается в про- цессорные регистры непосредственно перед вызовами ABSOLUTE или INTERRUPT. Обратная загрузка осущест- вляется непосредственно после возврата. В каждый данный момент времени содержимое регистрового буфе- ра соответствует процессорным регистрам на момент выхода из последней внутренней программы. Пример DEFINT a-z DIM a(100) DIM fillRoutine(10) FillRoutine (0) = &HF2FC FillRoutine (1) = &HCBAA REG 1,-1 REG 3, 101 -2 REG 9, VARSEG(a(0)) REG 6, VARPTR(a(0)) DEF SEG = VARSEG(FillRoutine(0)) PRINT a(I) WHILE NOT INSTAT:WEND FillAdr = VARPIR(FillRoutine(0)) CALL ABSOLUTE FillAdr '(REG) PRINT a(I) END Оператор REM ----------------------------------------------------------------- Назначение REM отделяет комментарии в программе Синтаксис REM комментарий Замечания Комментарий - это любая последовательность симво- лов. В отличие от комментариев в интерпретаторе БЕЙСИКА, комментарии ТУРБО БЕЙСИКА появляются толь- ко в исходной версии программы и, соответственно, никоим образом не влияют на ее выполнение. Внимание! комментарии могут появляться в одной строке с другими оператороми, но комментарий непрe- менно должен быть последним оператором в строке. Так, например, следующая последовательность опера- торов не будет выполняться: REM теперь сложим числа : a = b+c, так как компилятор не сможет отделить конец коммен- тария от начала следующего оператора. Правильным вариантом записи такой последовательности операторов будет: a = b+c : REM теперь складываем числа... Другим обозначением комментария является знак апострофа ('). Если используется апостроф, нет необходимости отделять двоеточием предшествующий комментарию оператор. Не следует использовать апостроф для отделения комментария от оператора DATA, пользуйтесь вместо этого последовательностью :REM. Компилятор игнорирует комментарии, они не занимают места в объектных программах, поэтому вы можете их щедро использовать. Пример REM эта программа демонстрирует оператор REM PRINT "эта программа демонстрирует оператор REM" REM "END" END DATA 1, 2, 3, I'm return : REM комментарий 'заметьте, что одиночный апостроф в данном случае 'не считается разделителем комментария Оператор RESET ----------------------------------------------------------------- Назначение RESET закрывает и делает скрытыми для программы все дисковые файлы Синтаксис RESET Замечания RESET эквивалентен оператору CLOSE без аргументов Оператор RESTORE ----------------------------------------------------------------- Назначение RESTORE позволяет повторно читать константы, задан- ные в операторе DATA. Синтаксис RESTORE [метка] Замечания Наличие метки необязательно. Метка указывает оператор DATA, который будет использоваться следующим оператором READ. Оператор RESTORE вынуждает ТУРБО БЕЙСИК заново устанавливать счетчик операторов DATA, так что следующий оператор READ будет повторно использовать данные первого (или заданного меткой) оператора DATA. См.также READ Пример READ A$, B$ ' чтение данных RESTORE ' восстановление указателя READ C$, D$ ' чтение еще некоторых данных PRINT A$, B$, C$, D$ ' вывод данных RESTORE MoreData ' установка указателя на первый ' оператор DATA после метки READ A$, B$ ' чтение и вывод данных PRINT A$, B$ END 'конец программы ' определение данных DATA CAT, DOG MoreData: DATA MONKEY, GNU Оператор RESUME ----------------------------------------------------------------- Назначение RESUME перезапускает выполнение после обработки ошибки Синтаксис RESUME [{0 | NEXT | метка}] Замечания RESUME или RESUME 0 возобновляют выполнение с оператора, вызвавшего ошибку. RESUME метка возобновляет выполнение с помеченого оператора. Если оператор RESUME выполняется не в подпрограмме, обрабатывающей ошибку, возникает ошибка выполнения 20: RESUME WITHOUT ERROR. Внимание! При наличии операторов ERL, RESUME и RESUME NEXT, компилятор генерирует 4-байтовый указатель для каждого оператора программы. То есть, программисты, для которых важен размер программного кода, генерируемого компилятором, должны принять это к сведению. Использование RESUME [строка #] генерирует простую инструкцию перехода. ERL обычно используется в целях отладки так, что это обстоятельство не слишком важно. Пример ' установить обработку ошибок ON ERROR GOTO ErrorHandler ' этот оператор вызывает ошибку выполнения I# = LOG(-1) PRINT "произошло прерывание по ошибке"... END ErrorHandler: PRINT "ошибка" ERR "в операторе" ERL RESUME NEXT Оператор RETURN ----------------------------------------------------------------- Назначение RETURN возвращает управление из подпрограммы в вызвавшую ее программу Синтаксис RETURN [метка] Замечания метка указывает строку, на которую, по желанию, вы можете передать управление. RETURN прерывает выполнение подпрограммы и передает управление оператору, непосредственно следующему за вызовом подпрограммы (GOSUB). Необязательная метка предназначена для облегчения возвращения из подпрограмм обработки прерываний и ошибок. RETURN метка очищает адрес на вершине стека и выполняет оператор перехода (GOTO) на оператор, идентифицируемый меткой. В некоторых версиях БЕЙСИКА эта операция выполняется с помощью оператора POP и GOTO. Выполнение RETURN без предварительного обращения GOSUB вызовет неожиданные и трудно обнаруживаемые ошибки. Мы советуем включить тест стека (Stacktest) в спускающемся меню "вариантов" для обнаружения подобных ошибок. См.также GOSUB , GOTO Пример См. пример к оператору GOSUB Функция RIGHT$ ------------------------------------------------------------------ Назначение Функция RIGHT$ возвращает n правых символов заданной строки Синтаксис s$ = RIGHT$ (символьное выражение, n) Замечания n - целое выражение, задающее число возвращаемых знаков символьного выражения; n должно быть в диапазоне от 0 до 32767. RIGHT$ возвращает указанное число знаков своего символьного аргумента, начиная с самого правого символа. Если n больше длины строки символьного выражения, возвращается все символьное выражение целиком. Если n=0, RIGHT$ возвращает пустую строку. См.также LEFT$ , MID$ Пример RIGHT$ ("JOHN JONES",5) Оператор RMDIR ----------------------------------------------------------------- Назначение RMDIR удаляет каталог (аналогично команде RMDIR DOS) Синтаксис RMDIR маршрут Замечания маршрут - стандартная строка описания маршрута. RMDIR удаляет каталог, соответствующий маршруту. Этот оператор эквивалентен команде RMDIR DOS (за исключением того, что служебное слово оператора не может быть сокращено). На оператор распространяются те же ограничения, а именно, что маршрут задает существующий, пустой каталог. Если каталог не является пустым, возникает ошибка выполнения 75 Path/File Access Error (ошибка доступа к маршруту/файлу). Пример ' установить обработку ошибок ON ERROR GOTO ErrorHandler INPUT "Введите имя удаляемого каталога : ",D$ RMDIR D$ 'удаление каталога END 'конец программы ErrorHandler: PRINT "Ошибка " ERR " в операторе " ERADR RESUME NEXT Функция RND ----------------------------------------------------------------- Назначение RND возвращает псевдослучайное число Синтаксис y = RND [(числовое выражение)] Замечания RND возвращает псевдослучайное число от 0 до 1 с двойной точностью. Числа, генерируемые с помощью RND, на самом деле, вовсе не являются случайными, а являются результатом применения алгоритма псевдослучайного преобразования к начальному значению (к значению "посева"). Если даны одни и те же начальные значения, алгоритм RND ТУРБО БЕЙСИКА производит одинаковые цепочки "случайных" чисел. Действие функции RND зависит от необязательного числового значения, заданного в качестве аргумента. Если аргумент не задан или положителен, RND генерирует следующее число в последовательности случайных чисел, зависящей от начальной установки. Если аргумент равен 0, RND повторяет число, сгенерированное функцией последним. Отрицательный аргумент задает новую начальную установку датчика случайных чисел так,что последующие вызовы функции RND без аргумента или с положительным аргументом будут возвращать новую последовательность значений. В общем, используйте RANDOMIZE TIMER один раз в на- чале программы для того, чтобы оператор RND выдавал новую последовательность значений. Не следует ис- пользовать нулевое или отрицательное значения аргу- мента за исключением тех случаев, когда вам не нужны вызываемые или особые последствия. Для того, чтобы получить случайное целое от 1 до n включи- тельно, можно использовать следующий способ: randomNo% = INT(RND * n) + 1 Еще лучше создать функцию: DEF FNRndInt% (x%) = INT (RND * x%) + 1 См.также RANDOMIZE Пример FOR I = 1 TO 10 STEP 1.34 PRINT USING "###.##^^^^"; RND(I) NEXT I END Оператор RSET ----------------------------------------------------------------- Назначение RSET перемещает символьные данные в буфер файла с произвольным доступом Синтаксис RSET переменная-поле = символьное-выражение Замечания Операторы RSET и LSET пересылают символьные данные в переменную-поле, которая определена в предшест- вующем операторе FIELD и принадлежит буферу файла с произвольным доступом. Если длина символьного вы- ражения меньше, чем длина переменной-поле, оператор RSET выполняет выравнивание по правому знаку, до- полняя поле пробелами. Это означает, что пробелы добавляются перед первым знаком символьного выражения с тем, чтобы функция LEN (переменная-поле) возвращала то же значение, которое указано в соот- ветствующем операторе FIELD. LSET выполняет вырав- нивание по левому знаку, дополняя поле пробелами (пробелы добавляются после последнего знака символь- ного выражения). RSET может также использоваться для форматирования выводимых на экран или на принтер данных: a$ = space$(20) RSET a$ = "Right-just" PRINT a$ См.также LSET Пример OPEN "RSET.DTA" AS #1 LEN=18 ' определение имен и размеров полей FIELD 1, 2 AS FileInt$, 4 AS FileLong$,_ 4 AS FileSngl$, 8 AS FileDbl$ ' присвоение некоторых значений полям и ' занесение записи в файл с произвольным доступом FOR Count% = 1 TO 5 RSET FileInt$ = MKI$(Count%) RSET FileLong$ = MKL$(Count%^2) RSET FileSngl$ = MKS$(Count%^2.1) RSET FileDbl$ = MKD$(Count%^4.4) PUT 1, Count% NEXT Count% CLOSE 1 'закрытие файла END 'конец программы Оператор RUN ------------------------------------------------------------------ Назначение RUN перезапускает программу Синтаксис RUN [имя-файла] Замечания Оператор RUN без аргумента перезапускает с начала программу на ТУРБО БЕЙСИКЕ. Все числовые переменные (включая элементы массива) устанавливаются в 0, а всем символьным переменным присваивается пустая строка. Имя файла, если оно задано, - это символьное выражение, представляющее файл типа .TBC или .EXE, (которые являются результатом команды Chain или EXE из меню "варианты", устанавливающей режимы работы компилятора). Если в имени файла не указано расширение, то по умолчанию предполагается .TBC; если расширение указано, оно и используется. При запуске или связывании в .EXE файл следует в явном виде присоединить .EXE к имени файла. Пример ' компиляция этой программы в файл, названный ' MASTER.EXE ' ввод имени SLAVE в ответ на подсказку INPUT "Введите имя запускаемой программы:", N$ RUN N$ 'прогон заданной программы END 'конец программы ' компиляция этой программы в SLAVE.TBC ' по команде "компиляция в цепной файл" ' в меню "Варианты" PRINT "Теперь мы в программе SLAVE" END 'конец программы Функция SCREEN ----------------------------------------------------------------- Назначение SCREEN возвращает ASCII-код символа, находящегося в указанной строке и позиции Синтаксис y = SCREEN (строка, позиция [, вариант]) Замечания строка и позиция - целые выражения в диапазоне от 1 до 25 и от 1 до 80, соответственно. Функция SCREEN в текстовом режиме - двойник функции POINT в графическом режиме. SCREEN возвращает информацию о символе в заданной позиции указанной строки; например, SCREEN 1,1 возвращает ASCII-код символа в первой позиции первой строки. Если необязательный параметр "вариант" равен 1, SCREEN возвращает атрибут, хранимый в заданной позиции (строка, колонка), а не код символа. Пример LOCATE 10,10 PRINT "ASCII" ' ASCII-код для A - 65, ' по умолчанию атрибут экрана (белый на черном) ' равен 7 PRINT SCREEN (10,10), SCREEN (10,10,1) END 'конец программы Оператор SCREEN ----------------------------------------------------------------- Назначение: SCREEN устанавливает режим изображения на экране. Синтаксис: SCREEN [режим] [, [флажок-цвета]] _ [, [активная-страница]] [, [видимая-страница]] Замечания: Режим - целочисленное выражение в диапазоне от 0 до 12. Характеристики экрана после его установки определя- ются следующей таблицей. --------------------------------------------------------------- Режим Действие --------------------------------------------------------------- 0 Текстовый режим без изменения числа знаков в строке 1 Графический режим со средним разрешением (320х200 пикселов), число знаков в строке равно 40 2 Графический режим с высоким разрешением (640х200 пикселов), число знаков в строке равно 80 7 Для адаптера EGA режим со средним разрешением, допускает 16 цветов, число пикселов на экране - 320х200 8 Для адаптера EGA режим с высоким разрешением, допускает 16 цветов, число пикселов на экране - 640х200 9 Усиленный режим с высоким разрешением для адаптера EGA с усиленным дисплеем; допускает от 4 до 16 цветов (в зависимости от памяти на EGA) из палитры, состоящей из 64 цветов, число пикселов на экране - 640х350 10 Режим с высоким разрешением для адаптера EGA с монохром- ным монитором, допускает 4 атрибута и 640х350 пикселов 11 Черно-белый режим с наивысшим разрешением для адаптеров VGA или MCGA, число пикселов - 640х480 12 Режим с наивысшим разрешением для VGA, допускает 16 цве- тов из палитры с 64 цветами, число пикселов - 640х480 --------------------------------------------------------------- Флажок цвета - управляет тем, будет ли информация о цвете передана монитором с совмещенным управлением цветовыми лучами, которые присоединены к композитным видео-портаm цветных графических адаптеров. В тексто- вом режиме значение FALSE (0) отменяет использование цвета. В графическом режиме со средним разрешением, значение FALSE включает цвет. Активная страница - целое выражениев диапазоне от 0 до 7, которое управляет тем, куда записывается текст, формируется оператором PRINT или другими ко- мандами записи на экран. Этот аргумент допустим толь- ко для CGA и для EGA при установке режима 0, 7, 8, 9 и 10. (См. в главе 4 раздел о графике). Видимая страница - определяет какая из виртуальных страниц (от 0 до 7) выводится на экран в данный момент. Этот аргумент допустим только для CGA и для EGA при установке режима 0, 7, 8, 9 и 10. Выполнение оператора SCREEN запускает новый режим и стирает экран. Наивысший приоритет присваевается белому цвету, а фону и границе - черный цвет. Если в операторе SCREEN устанавливается такой же режим, как и текущий, ничего не происходит. Если текущий режим - текстовый и в операторе SCREEN указаны только аргументы активной и виртуальной страниц, то корректируются в соответствии с запросом только дисплейные "страницы". Пример. 'переключение в графический режим среднего разрешения 'с отменой цвета SCREEN 1,0 CIRCLE (160,100),50,2 WHILE NOT INSTAT:WEND A$=INKEY$ 'переключение в текстовый режим с отменой цвета, 'назначение активной и видимой страницам страницы с 'номером 0 SCREEN 0,0,0,0 PRINT "Активная страница - 0" WHILE NOT INSTAT:WEND A$=INKEY$ 'сделать активной страницу 2 SCREEN ,,2 PRINT "Активная страница - 2" WHILE NOT INSTAT:WEND A$=INKEY$ 'переключение в другой графический режим SCREEN 2 CIRCLE (320,100),100,1 END Оператор SEEK ------------------------------------------------------------- Назначение: SEEK устанавливает позицию в двоичном файле для функций GET$ и PUT$. Синтаксис: SEEK [#] номер-файла, позиция Замечания: SEEK объявляет, что следующий GET$ или PUT$ над файлом с заданным номером начнут свои действия с байта, номер которого указан в аргументе "позиция". Для определения текущей позиции, установленной для двоичного файла оператором SEEK, следует использовать функцию LOC. Пример SUB CreateFile 'открытие файла и запись в него 256 символов LOCAL I% 'открытие файла типа BINARY для ввода/вывода OPEN "SEEK.DTA" FOR BINARY AS #1 'запись данных в файл FOR I%=1 TO 256 PUT$ 1,CHR$(I%-1) NEXT I% END SUB 'конец подпрограммы CreateFile DEF FNReadIt$(START%,SIZE%) 'функция читает указанные данные из файла LOCAL TEMPSTR$,CHAR$,I% 'установка заданной позиции в файле SEEK 1,START% I%=1 TEMPSTR$="" 'считывание указанных данных - не более, чем до конца 'файла WHILE (NOT EOF(1)) AND (I%<=SIZE%) GET 1,I%,CHAR$ TEMPSTR$=TEMPSTR$+CHAR$ INCR I% WEND 'присвоение функции результата FNReadIt$=TEMPSTR$ END DEF 'конец функции ReadIt ' создание файла данных CALL CreateFile 'запрос пользователю на ввод PRINT "Введите начало [1..256] и число байтов данных" PRINT "(не более, чем 256-начало), которые" INPUT "Вы хотите прочитать из файла:",ST%,SZ% PRINT FNReadIt$(ST%,SZ%) 'чтение данных END 'конец программы Оператор SELECT ------------------------------------------------------------- Назначение: Оператор SELECT (вместе с оператором CASE) формирует операторы проверки общего назначения. Синтаксис: SELECT CASE выражение CASE список-тестов . . операторы . [CASE список-тестов . . операторы . ] [СASE ELSE . . операторы . ] END SELECT Замечания: Список тестов - это один или несколько тестов, разделенных запятыми, которые выполняются над выражением. Выражение может быть символьным или числовым, однако, все тесты в списке из отдельного блока оператора SELECT должны быть одного и того же типа. Тесты, которые могут выполняться в предложении CASE, включают проверки на равенство, неравенство, больше, меньше, диапазон (от-до). Примеры включения тестов в предложение CASE: CASE <b 'отношение CASE 14 'равенство (предполагается =) CASE b TO 90 'диапазон CASE b,14 'два теста проверки равенства CASE b TO 90,14 'комбинация (неявное ИЛИ) В предложении CASE с несколькими тестами между ними выполняется неявная логическая операция ИЛИ. Если один или несколько тестов в предложении удовлетворяются (TRUE), выполняются все операторы вплоть до следующего предложения CASE. После выполнения последнего оператора, управление передается оператору, следующему за END SELECT. Оператор SELECT является мощным средством сравнения переменной с некоторым числом её возможных значений и соответствующей обработки. Его использование может иногда помочь построить более ясную исходную программу, чем могло бы получиться с использованием многократных операторов IF. См. также END SELECT , EXIT , CASE Пример. INPUT "Введите число",X SELECT CASE X CASE <10 PRINT "Маленькое число" CASE <1000 PRINT "Среднее число" CASE 1111,2222,3333,4444 PRINT "Скучное число" CASE ELSE PRINT "Просто какое-то большое число" END SELECT Функция SGN ------------------------------------------------------------- Назначение: SGN определяет знак числового выражения Синтаксис: Y=SGN(числовое-выражение) Замечания: Если числовое выражение положительно, SGN возвращает +1. Если числовое выражение равно 0, SGN возвращает 0. Если числовое выражение отрицательно, SGN возвращает -1. При сочетании функции SGN с операторами ON/GOTO или ON/GOSUB можно получить разветвление с тремя выходами (подобное аналогичному разветвлению языка FORTRAN): ON SGN(BALANCE)+2 GOTO INTHERED,BREAKINGEVEN,INTHEMONEY См. также: ON/GOSUB , ON/GOTO Пример. 'установить X и Y в 0 X=0:Y=0 'определение пользователем значений X и Y INPUT "Введите пожалуйста значение для X";X INPUT "Введите пожалуйста значение для Y";Y 'оператор ON по SGN значения X*Y 'GOSUB на соответствующую подпрограмму ON SGN(X*Y)+2 GOSUB MINUS,ZERO,PLUS END 'конец программы MINUS: PRINT "Вход для отрицательного значения":RETURN ZERO: PRINT "Вход для нулевого значения":RETURN PLUS: PRINT "Вход для положительного значения":RETURN Оператор SHARED ------------------------------------------------------------- Назначение: SHARED объявляет в процедурах или функциях разделяемые (глобальные) переменные. Синтаксис: SHARED список-переменных Замечания: SHARED объявляет, что переменные, указанные через запятую в списке переменных, являются глобальными для всей программы, а не локальными по отношению к включающей их процедуре или поределению функции. Это дает возможность процедуре или функции организовать доступ к переменным без передачи их в качестве параметров. Оператор SHARED может появляться только в определениях функций или процедур и должен быть указан до первого выполняемого оператора соответствующего определния. Для того, чтобы объявить массив как переменную SHARED, принадлежащую процедуре или функции, нужно включить его идентификатор с пустыми скобками в cписок переменных - нет необходимости и не следует заново определять размерность массива. Необъявленные переменные в определениях функций по умолчанию считаются SHAREВ, но не следует полагаться на неизменность этого в будущих версиях компилятора. Желательно точно объявлять класс переменных, появляющихся в функциях или процедурах (LOCAL, STATIC, SHARED). См. также: LOCAL , STATIC Пример. DIM ARRAY$(5) DEF FNDUMMY$ SHARED ARRAY$() FNDUMMY$=ARRAY$(0) END DEF 'конец функции FNDUMMY ARRAY$(0)="Это работает на меня" PRINT FNDUMMY$ END 'конец программы Оператор SHELL ------------------------------------------------------------- Назначение: SHELL загружает и выполняет подчиненный процесс. Синтаксис: SHELL [строка-параметр] Замечания: Строка-параметр - это символьное выражение, со- держащее резидентную команду DOS или имя выполняемой .COM, .EXE или .BAT программы ("подчиненного процес- са"). Может содержать или не содержать параметры, ко- торые Вы можете передать подчиненному процессу. Если строка-параметр опущена, никакая программа не загружается. Вместо этого появляется подсказка DOS, в ответ на которую можно ввести стандартную команду DOS, например, команды DIR, COPY. Для возврата в программу следует набрать EXIT на подсказку DOS. Если строка-параметр указана, то выполняется заданная программа. После её завершения, выполнение Вашей программы продолжается со следующего оператора. См. также: ENVIRON , ENVIRON$ , SHELL в руководстве по DOS Пример. PRINT "Теперь Вы будете использовать оператор SHELL" PRINT "ТУРБО БЕЙСИКА для выполнения команды" PRINT "DIR/W DOS для просмотра файлов" PRINT "на Вашем диске" DELAY 3 'ждать 3 секунды 'использование SHELL для временного выхода из ТУРБО 'БЕЙСИКА и выполнение команды DIR с параметром /W SHELL "DIR /W" 'вывод в нижней строке экрана LOCATE 21,1 PRINT "Теперь возвращаемся в ТУРБО БЕЙСИК" END 'конец программы Функция SIN ------------------------------------------------------------- Назначение: SIN возвращает значение тригонометрического синуса. Синтаксис: y=SIN(числовое-выражение) Замечания: Числовое выражение представляет угол, заданный в радианах. (О радианах см. в описании функции ATN). SIN возвращает результат с двойной точностью. См. также: ATN Пример. B$="Borland's TURBO BASIC" CENTER=(79-LEN(B$))/2 'SIN(THETA) возвращает периодическую 'последовательность значений, изменяющуюся 'в диапазоне от -1 до 1 так, что TABVALUE всегда 'находится между -CENTER и CENTER THETA=0. WHILE THETA < 100 TABVALUE=CENTER*SIN(THETA) PRINT TAB(CENTER+TABVALUE+1); B$ THETA=THETA+.1 WEND END 'конец программы Оператор SOUND ------------------------------------------------------------- Назначение: SOUND генерирует тон заданной частоты и длитель- ности Синтаксис: SOUND частота, длительность Замечания: Частота - это целое выражение, представляющее желаемый уровень в диапазоне от 37 до 32767 герц. Длительность - это выражение с плавающей точкой, которое управляет длиной тона, измеряемой 18.2 раз в секунду. Соответственно, значение длительности 36 соответствует примерно 2 секундам. Длительность может изменяться в диапазоне 0.0015 до 65535 (один час). Оператор SOUND не останавливает выполнения программы. Если SOUND встречается в программе, начинается исполнение требуемого тона, а выполнение программы продолжается. Если встречен следующий оператор SOUND и его параметр длительности равен 0, то предыдущий SOUND выключается. В противном случае, когда поарметр длительности не равен 0, ТУРБО БЕЙСИК ждет пока не завершится предыдущий звук для того, чтобы начать следующий. Оператор SOUND лучше использовать для создания специальных эффектов (например, сирен, щелкания и свиста), а не для музыки. Ограничения: Обратите внимание, что оператор SOUND заново инициализирует микротаймер MTIMER. См. также: PLAY Пример. 'установить длину музыкального буфера равной 800 байт $SOUND 100 '8 байт на 1 ноту 'использование SOUND для создания звуковых эффектов 'имитация переключения скоростей 'первая скорость FOR I=150 TO 175 SOUND I,2 NEXT I 'вторая скорость FOR J=125 TO 152 SOUND J,1.5 NEXT J 'третья скорость FOR K=100 TO 127 SOUND K,1.25 NEXT K Функция SPACE ------------------------------------------------------------- Назначение: SPACE$ возвращает строку, состоящую из пробелов Синтаксис: s$=SPACE$(счетчик) Замечания: Счетчик - это положительное целое выражение в диапазоне от 0 до 32767, которое задает число пробелов, возвращаемых функцией. SPACE$ - одно из мощных средств форматирования текстов, имеющихся в ТУРБО БЕЙСИКЕ. См. также: LSET , PRINT USING , RSET , SPC , STRING$ , TAB Пример. 'резервирование пробелов для A$ A$=SPACE$(42) 'запись строки из 42 символов B$="ЭТА СТРОКА СОСТОИТ ИЗ СОРОКА ДВУХ СИМВОЛОВ" 'то же самое с помощью клавиши "ПРОБЕЛ" C$=" " 'печать длины A$, B$ и C$ PRINT LEN(A$),LEN(B$),LEN(C$) PRINT PRINT "Как Вы можете видеть, используя SPACE$" PRINT "A$ может быть дано то же значение, что и C$" END Функция SPC ------------------------------------------------------------- Назначение: SPC пропускает N пробелов (используется в операторе PRINT). Синтаксис: PRINT SPC(N) Замечания: N - целое выражение в диапазоне от 0 до 255. Как и родственная функция TAB, SPC может быть использована только в списке выражений операторов PRINT, INPUT и PRINT#. SPC(n) выводит n пробелов. Не следует путать функции SPC и SPACE$. Если N больше ширины строки, определенной оператором WIDTH, функция SPC выводит число пробелов равное (N mod ширина). Если SPC появляется в конце списка выражений с точкой с запятой или без неё, возврат каретки не выполняется. См. также: TAB , WIDTH Пример. 'с использованием SPC вывод слов "BOYS" и "GIRLS" 'с промежутком 40 пробелов и подчеркивание 'с помощью функции STRING$ PRINT SPC(5) "BOYS" SPC(40) "GIRLS" PRINT SPC(5) STRING$(4,61) SPC(40) STRING$(5,61) FOR I=1 TO 5 READ BOY$ READ GIRL$ 'вывод имен мальчиков и девочек в соответствующих 'колонках PRINT SPC(5) BOY$ SPC(40) GIRL$ NEXT I END 'конец программы DATA "John","Ann" DATA "Mark","Eve" DATA "Paul","Elizabeth" DATA "Tony","Sue" Функция SQR ------------------------------------------------------------- Назначение: SQR возвращает значение квадратного корня. Синтаксис: Y=SQR(числовое-выражение) Замечания: Числовое выражение больше или равно нулю. SQR вычисляет квадратный корень с использованием алгоритма, который работает быстрее, чем вычисление корня возведением в степень 0.5 (то есть вычисление Y=SQR(X) занимает меньше времении, чем Y=X^0.5 . При попытке извлечения квадратного корня из отрицательного числа возникает ошибка выполнения 5 Illgal function call (неверный вызов функции). SQR возвращает значение с двойной точностью. Пример. 'ТАБЛИЦА КВАДРАТНЫХ КОРНЕЙ 'разметка двух колонок PRINT "NUMBER" TAB(10) "SQUARE ROOT VALUE" PRINT FOR N=1 TO 10 'использование функции TAB для вывода значения 'корня в нужной колонке, вычисление квадратного 'корня с помощью функции SQR PRINT N; TAB(15) SQR(N) NEXT N END Оператор STATIC ------------------------------------------------------------- Назначение: STATIC объявляет статические переменные в процедуре или функции. Синтаксис: STATIC список-переменных Замечания: Оператор STATIC, использование которого допустимо только в определениях процедур или функций, объявляет что переменные (разделенные запятыми в списке переменных) имеют в памяти фиксированные адреса, а не базируются в стеке. Идентификатор, связанный со статичной переменной, известен только в заключающей его процедуре или функции, то есть переменные в других частях программы и остальные локальные переменные могут иметь те же имена. Оператор STATIC должен быть указан в определениях функций или процедур до любого выполняемого оператора. Для того, чтобы объявить массив как статическую переменную в процедуре или функции, следует включить его идентификатор с пустыми скобками в список переменных, а затем установить размерность массива в следующем операторе. В отличие от локальных переменных, статические переменные не меняют своего значения между вызовами процедур или функций. Они инициализируются единственный раз при запуске программы. См. также: LOCAL , SHARED Пример. 'объявление STATIC-процедуры со статическими 'локальными переменными SUB DUMMY STATIC 'переменная STATIC I% INCR I% PRINT I% END SUB 'конец процедуры DUMMY I=16 'два вызова процедуры CALL DUMMY CALL DUMMY PRINT I END 'конец программы Функция STICK ------------------------------------------------------------- Назначение: STICK возвращает информацию о позиции джойстика. Синтаксис: Y=STICK(вариант) Замечания: Вариант - это целое выражение в диапазоне от 0 до 3, действие которого определяется в соответствии со следующей таблицей: ----------------------------------------------------- Вариант Действие ----------------------------------------------------- 0 Возвращает Х-координату джойстика А 1 Возвращает Y-координату джойстика A 2 Возвращает Х-координату джойстика B 3 Возвращает Y-координату джойстика B ----------------------------------------------------- Обратите внимание, что интерфейс джойстика требует, чтобы до чтения координат любого джойстика процесс чтения был запущщен оператором STICK(0). См. также: STRIG Пример. 'опрос джойстиков для определения их 'текущей позиции WHILE NOT INSTAT LOCATE 15,15 PRINT STICK(0),STICK(1),STICK(2),STICK(3); WEND END 'конец программы Оператор STOP ------------------------------------------------------------- Назначение: STOP останавливает программу. Синтаксис: STOP Замечания: STOP прекращает выполнение программы и возвращает управление операционной системе (или ТУРБО БЕЙСИКУ, в зависимости от того, откуда она была запущена). Оператор END выполняет ту же функцию, но является более предпочтительным. Отличия: В отличие от программ на интерпретируемом БЕЙСИКЕ, если программа в ТУРБО БЕЙСИКЕ остановлена оператором STOP, её выполнение не может быть продолжено оператором CONTINUE. См. также: END Пример. DO 'запуск бесконечного цикла IF INSTAT THEN STOP 'завершение при нажатии клавиши LOOP END 'конец программы Функция STR$ ------------------------------------------------------------- Назначение: STR$ возвращает символьный эквивалент числа. Синтаксис: S$=STR$(числовое выражение) Замечания: STR$ преобразует числовую переменную или выражение в строку, то есть функция STR$ возвращает то, что Вы увидели бы на экране, если бы выполнили оператор "PRINT числовое выражение". Если числовое выражение больше 0, STR$ дополняет его лидирующим пробелом; например STR$(14) возвращает строку из трех символов, первый из которых - пробел. Обратной к функции STR$ является функция VAL, преобразующая символьную строку в числовое значение. См. также: VAL Пример. 'присвоим A% числовое значение A%=6789 'используем STR$ для преобразования числа A$=STR$(A%) PRINT A%,A$ 'проверим, имеет ли A% то же значение, что и A$ IF A%=VAL(A$) THEN PRINT "STR$ и VAL исправно работают" END IF END Функция STRIG ------------------------------------------------------------- Назначение: STRIG возвращает состояния клавиш джойстика. Синтаксис: Y=STRIG(вариант) Замечания: Функция STRIG возвращает информацию о триггере джойстика в соответствии со значением варианта. Вариант - это целое числовое выражение, управляющее действием функции STRIG в соответствии со следующей таблицей: --------------------------------------------------------- Вариант Действие --------------------------------------------------------- 0 Если после последнего вызова STRIG(1) была нажата клавиша 1 джойстика А, STRIG возвращает -1, в противном случае - 0. 1 STRIG возвращает -1, если клавиша джойс- тика А нажата в данный момент, иначе - 0. 2 Если после последнего вызова STRIG(3) была нажата клавиша 1 джойстика В, STRIG возвращает -1, иначе - 0. 3 STRIG возвращает -1, если клавиша 1 джойс- тика В нажата в данный момент, иначе - 0. 4 Если после последнего вызова STRIG(5) была нажата клавиша 2 джойстика А, STRIG возвращает -1, иначе - 0. 5 STRIG возвращает -1, если клавиша 2 джойс- тика А нажата в данный момент, иначе - 0. 6 Если после последнего вызова STRIG(7) была нажата клавиша 2 джойстика В, STRIG возвращает -1, иначе - 0. 7 STRIG возвращает -1, если клавиша 2 джойс- тика В нажата в данный момент, иначе - 0. --------------------------------------------------------- До выполнения вызовов функции STRIG следует раз- решить проверку клавиши джойстика с помощью оператора STRIG ON. Для чтения позиции джойстика используйте функцию STICK. См. также: STICK Пример. См. пример к оператору STRIG. Оператор STRIG. ------------------------------------------------------------- Назначение: STRIG управляет проверкой событий, связанных с клавишами джойстика. Синтаксис: STRIG (ON | OFF | STOP) Замечания: Оператор STRIG ON включает проверку событий, связанных с триггером, так, что могут выполняться запросы функций STRIG и обработка прерываний подпрограммой, заданной оператором ON STRIG. STRIG OFF отключает проверку соответствующих событий. STRIG STOP отключает реакцию на события, связанные с триггером, но сохраняет их в памяти так, что при последующем ваполнении STRIG ON немедленно возникает прерывание. См. также: ON STRIG Пример. 'включает проверку события STRIG(0) ON STRIG(1) ON STRIG(4) ON STRIG(6) ON 'опрашивает состояние события для проверки 'была ли нажата клавиша WHILE NOT INSTAT LOCATE 1,1 PRINT STRIG(0),STRIG(1),STRIG(2),STRIG(3) PRINT STRIG(4),STRIG(5),STRIG(6),STRIG(7) WEND END Функция STRING$ ------------------------------------------------------------- Назначение: STRING$ возвращает строку, состоящую из заданного числа повторений указанного символа. Синтаксис: S$=STRING$(счетчик,{значение | символьное выражение}) Замечания: Счетчик и значение - целые выражения, счетчик может меняться в диапазоне от 1 до 32767, значение - от 0 до 255. STRING$ с числовым аргументом вызвращает символьную строку, составленную из одинаковых символов, ASCII-код которых равен значению, а их число равно счетчику. STRING$ с символьным аргументом возвращает строку, состоящую из первых символов символьного выражения, число которых равно счетчику. STRING$(n,32), STRING$(n," ") и SPACE$(n) приводят к одному и тому же результату - возвращают строку из n пробелов. Пример. 'STRING$ и TAB строят прямоугольник 'использование 40 знаков равенства (=) для 'построения верхней грани прямоугольника, затем 'печать CLS TOP$=STRING$(40,61) PRINT TOP$ 'использование 1-секундной задержки для того, 'чтобы можно было увидеть, как строится прямоугольник DELAY 1 'стороны строятся с помощью цикла FOR I=1 TO 5 PRINT TAB(1) "=" TAB(40) "=" DELAY 1 NEXT I DELAY 1 'нижняя грань строится также как и верхняя PRINT TOP$ LOCATE 4,16 PRINT "середина" DELAY 1 'курсор перемещается за пределы прямоугольника LOCATE 20,1 END 'конец программы Операторы SUB/END SUB, SUB INLINE ------------------------------------------------------------- Назначение: Операторы SUB/END SUB и SUB INLINE определяют процедуру (подпрограмму). Синтаксис: SUB идентификатор [(список-параметров)] [ LOCAL список-переменных ] [ STATIC список-переменных ] [ SHARED список-переменных ] . . операторы . [ EXIT SUB ] END SUB Для SUB INLINE: SUB имя-процедуры INLINE Замечания: Идентификатор - это уникальное имя, связанное с процедурой, которое должно соответствовать соглашени- ям об именах меток и переменных. Список параметров - это необязательная последова- тельность формальных параметров, разделяемых запяты- ми. Параметры, используемые в списке аргументов, слу- жат только для определения процедуры, они не имеют никакого отношения к другим переменным с теми же име- нами в программе. SUB и END SUB отделяют и дают имя группе операто- ров, называемых процедурой (или подпрограммой). Вызов процедуры для выполнения осуществляется оператором CALL. Процедуре можно, при необходимости, передать параметры по значению и по имени (по ссылке). Встроенные (INLINE) подпрограммы на языке ассемб- лера используют ту же вызывающую последовательность, что и обычные процедуры. Например: CALL имя-процедуры [(список-параметров)] SUB имя-процедуры INLINE $INLINE список-байтов $INLINE "имя-СОМ-файла" END SUB Произвольное количество операторов $INLINE может быть задано в любом порядке. Единсвенное ограничение - использование в одной процедуре не более 16 файлов СОМ. Обратите внимание, что список параметров не задается в операторе SUB. Список байтов состоит из констант и выражений, равных целому в диапазоне от 0 до 255, разделенных запятыми (обычно, для байтовых значений используется шестнадцатеричные коды). Возвраты из процедур (RETURN) не являются необходимыми как в коде на ассемблере, так и в конце процедур SUB. За этим следит компилятор. (Для более детальной информации см. приложение С "Интерфейс с языком ассемблера".) Определения процедур и ход выполнения программы ----------------------------------------------- Место определения процедур в программе не имеет значения. Независимо от того, где будет использована процедура, она может быть определена в 1-ой или 1000-й строке программы. Вам нет нужды направлять ход программы через процедуру на этапе инициализации - компилятор найдет Ваше определение, где бы оно ни находилось. Кроме того, выполнение программы не может случайно "попасть" в процедуру, в отличие от подпрограммы. Что касается выполняемой ветви программы, определения функций и процедур являются невидимыми. Например: CALL PRINTSTUFF SUB PRINTSTUFF PRINT "Напечатано из PRINTSTUFF" END SUB При выполнении этой, состоящей из 4 строк, программы сообщение появится только один раз, так как PRINTSTUFF вызывается один раз в первой строке. К определению процедур следует относиться как к изолированным островкам программного кода, нельзя входить или выходить из них операторами GOTO, GOSUB, или RETURN. Внутри определений, однако, эти операторы допустимы. Обратите внимание, что определения функций и процедур не должны быть вложенными, то есть, нельзя определить процедуру или функцию внутри другой процедуры или функции (хотя определение процедуры или функции может содержать вызовы других процедур или функций). Параметры массивы. ------------------ Параметры, являющиеся массивами, объявляются путем указания в скобках числа размерностей массива, а не его длины. Например, оператор SUB CALCARRAY(A(2),SIZDIM1,SIZDIM2) объявляет, что CALCARRAY предполагает три аргумента: двумерный массив с одинарной точностью и две скалярные переменные с одинарной точностью. Обычно эти скалярные переменные используются для передачи размеров массива по двум его измерениям. Объявление локальных переменных. -------------------------------- Для того, чтобы объявить в процедуре локальные переменные, следует до любого выполняемого оператора в определении использовать оператор LOCAL. Например, оператор LOCAL A%,B#,BIGARRAY%() создает три локальные переменные, скалярные перемен- ные A% и B# (целую и с двойной точностью, соответ- ственно) и целочисленный массив BIGARRAY%. Затем, должна быть установлена нужная размерность массива: DIM DYNAMIC BIGARRAY%(1000) Локальные переменные-массивы должны быть динамическими. Они автоматически освобождают память, когда процедура завершается. Статические и разделяемые переменные. ------------------------------------- По умолчанию, переменные, появляющиеся внутри описаний процедур, являются локальными. Однако, в связи с тем, что это соглашение может измениться, следует затратить усилия на явное определение каждой переменной, используемой в процедуре. Для описания переменных, являющихся глобальными по отношению к основной части программы, используется оператор SHARED. В случаях, когда важно, чтобы переменные не теряли своего значения при каждом вызове процедуры, используйте для их объявления оператор STATIC. Описание процедуры должно заканчиваться операто- ром END SUB, который логически возвращает управление на оператор, непосредственно следующий за оператором вызова CALL. Чтобы выйти из процедуры не из её конца, а из какого-либо другого места, используется оператор EXIT SUB. См. также: $INLINE , CALL , EXIT SUB , LOCAL , SHARED , STATIC Пример. 'объявление массива чисел DIM ARRAY(1) SUB TESTPROCEDURE (I%,L&,S!,D#,E,A(1)) 'выводятся значения каждого 'параметра, переданного процедуре PRINT I%;L&;S!;D#;E;A(0) END SUB INTEGER%=1 LONGINT&=2 SINGLEPRE!=3 DOUBLEPRE#=4 ARRAY(0)=5 CALL TESTPROCEDURE(INTEGER%,LONGINT&,SINGLEPRE!, _ DOUBLEPRE#,INTEGER%^2,ARRAY()) END 'конец программы Оператор SWAP ------------------------------------------------------------- Назначение: SWAP обменивает значения двух переменных. Синтаксис: SWAP перем1, перем2 Замечания: Перем1 и перем2 - две переменные одного типа. При попытке обмена значений переменных разных типов (например, символьной и целой или с одинарной и двойной точностьтю) возникает ошибка компиляции 475 Type Mismatch (несоответствие типов). SWAP удобен, так как простой обмен значений в двух последовательных операторах присваивания не решает задачи: А=В: В=А К моменту выполнения второго присваивания, переменная А уже содержит другое значение. Выполнение такой операции без помощи оператора SWAP потребует временную переменную и ещё один оператор присваивания: TEMP=A: A=B: B=TEMP Пример. 'задание значений A% и B% A%=15: B%=17 'печать значений каждой переменной в одной строке PRINT TAB(8) "значение 'A%' равно:"A%_ TAB(42)"значение 'B%' равно:"B% PRINT 'обмен значений переменных с помощью SWAP SWAP A%,B% 'печать новых значений под старыми PRINT "значение 'A%' теперь равно:";A%_ TAB(34)"значение 'B%' теперь равно:";B% END Оператор SYSTEM ------------------------------------------------------------- Назначение: SYSTEM завершает программу. Синтаксис: SYSTEM Замечания: SYSTEM завершает программу и возвращает управление операционной системе (или ТУРБО БЕЙСИКУ в зависимость от того, откуда она запущена). Оператор END, выполняющий ту же функцию, является более предпочтительным. См. также: END , STOP Пример. 'ANSWER равен 5 ANS%=5 FOR I=1 TO 10 INPUT "Введите, пожалуйста, число от 1 до 10";X% 'если пользователь угадал ответ, выйти из цикла и 'похвалить IF X%=ANS% THEN GOTO REWARD 'спросить у пользователя, хочет ли он сделать ещё 'одну попытку INPUT "Хотите ли Вы попробовать ещё раз (Y/N)":X$ 'если пользователь не захочет пробовать ещё раз, 'выйти из программы IF UСASE(X$)<>CHR(89) THEN SYSTEM NEXT I REWARD: PRINT PRINT "Вы угадали!" END Функция TAB ------------------------------------------------------------- Назначение: TAB устанавливает метку табуляции на заданную позицию выводимой строки (используется только в операторах PRINT). Синтаксис: PRINT TAB(n) Замечания: n - целочисленное выражение в диапазоне от 1 до 255. Также, как и функция SPC, TAB может использоваться только в списке выражений операторов PRINT, LPRINT и PRINT#. Используйте TAB для выравнивания граф с данными. Функцис ТАВ заставляет процедуры печати ТУРБО БЕЙСИКа осуществлять вывод с n-ой позиции текущей строки. Если текущая позиция курсора больше n (например, PRINT TAB(20), когда курсор находится в 30-й колонке), то ТУРБО БЕЙСИК пропускает строку и перемещает курсор в n-ю позицию следующей сторки. Если ТАВ появляется в конце списка выражений оператора PRINT с последующей точкой с запятой или без неё, ТУРБО БЕЙСИК не выводит возврат каретки; то есть после ТАВ подразумевается точка с запятой. См. также: LPRINT , PRINT , PRINT# , SPC Пример. 'эта программа читает список друзей и 'номеров телефонов, а затем выводит их на 'экран с помощью PRINT и TAB PRINT PRINT TAB(5) "ИМЯ" TAB(40) "ТЕЛЕФОН" PRINT FOR I=1 TO 5 READ FRIEND$ READ PHONE$ 'вывод данных в тех же позициях, что и заголовка PRINT TAB(5) FRIEND$ TAB(40) PHONE$ NEXT I END DATA "John Blaze","423-4598" DATA "Ann Span", "335-2343" DATA "Bill Write","668-9834" DATA "Mark Jones","425-5593" DATA "Dan Moore", "438-4593" Функция TAN ------------------------------------------------------------- Назначение: TAN возвращает значение тригонометрического тангенса. Синтаксис: Y=TAN(числовое-выражение) Замечания: Числовое выражение - это угол, заданный в радианах. О радианах см. описание оператора ATN. TAN возвращает результат с двойной точностью. См. также: ATN , COS , SIN Пример. DEFDBL A-Z 'установка значения PI# с помощью функции 'арктангенса ATN PI=ATN(1)*4 'вывод значения PI# PRINT PI 'PI, деленное на 4 радиана, равно 45 градусам 'использование тригонометрической функции тангенса PRINT TAN(PI/4) END Системная переменная TIME$ ------------------------------------------------------------- Назначение: TIME$ читает или устанавливает системное время. Синтаксис: Считывание времени: S$=TIME$ Установка времени: TIME$=символьное-выражение Замечания: Системная переменная TIME$ содержит 8-символьную строку, представляющую время на системных часах в формате hh:mm:ss, где hh - часы (в военном формате, от 0 до 23), mm - минуты, ss - секунды. TIME$ не будет хранить точное время, если при последней загрузке системы DOS на компьютере часы не были правильно установлены. Присвоение значения переменной TIME$ устанавлива- ет системные часы. Для этого необходимо построить символьное выражение, содержащее текущее время в во- енном формате (24 часа), и затем присвоить его пере- менной TIME$. Минуты и секунды можно опустить. Напри- мер: TIME$="12" 'устанавливает часы на 12 часов дня TIME$="13:01" 'устанавливает часы на час и минуту TIME$="13:01:30" 'устанавливает часы ещё на 30 'секунд TIME$="0:01" 'устанавливает часы на минуту 'после полуночи Если значения часов, минут или секунд выходят за пределы допустимых диапазонов (например, число минут равно 61), возникает ошибка выполнения 5 Illegal Function Call (неверный вызов функции). С помощью функции TIMER можно определить число секунд, прошедших с момента загрузки системы. Пример. 'включение проверки времени TIMER ON 'вывод текущего времени по системным часам PRINT "текущее время";TIME$ 'новая установка времени INPUT "Введите новое время (0-23)";ANS$ 'установка нового значения TIME$=ANS$ 'вывод нового значения PRINT "новое время равно ";TIME$ END Функция TIMER ------------------------------------------------------------- Назначение: TIMER возвращает время в секундах, прошедшее после полуночи. Синтаксис: Y=TIMER Замечания: Функция TIMER не имеет аргументов и возвращает число секунд, прошедших после полуночи в виде значения одинарной точности с плавающей запятой с разрешением около одной десятой секунды. Если системное время не переустанавливалось после последней загрузки (либо с помощью команды DOS TIME, либо через иситемную переменную TIME$ ТУРБО БЕЙСИКа), функция TIMER возвращает число секунд, прошедших с момента последней загрузки системы. См. также: MTIMER Пример. TIME$="12" PRINT USING"после полуночи прошло ##### секунд";TIMER END Оператор TIMER ------------------------------------------------------------- Назначение: TIMER управляет проверкой событий, связанных с таймером. Синтаксис: TIMER {ON | OFF | STOP } Замечания: TIMER управляет проверкой событий, связанных с таймером, то есть TIMER определяет, нужно ли передавать управление подпрограмме, заданной в операторе ON TIMER по прошествии указанного количества секунд. TIMER ON включает проверку событий по таймеру. TIMER OFF выключает их. TIMER STOP отключает прерывания по событиям, связанным с таймером, но запоминает их так, что при последующем выполнении оператора TIMER ON, немедленно возникает прерывание. См. также: ON TIMER Пример. 'установка обработки события ON TIMER(1) GOSUB UpdateClock 'включение проверки событий TIMER ON WHILE NOT INSTAT: WEND END 'конец программы UpdateClock: SaveX%=CSRLIN 'сохранение позиции курсора SaveY%=POS(0) LOCATE 24,36 PRINT TIME$; LOCATE SaveX%,SaveY% 'восстановление позиции курсора RETURN Команды TRON и TROFF ------------------------------------------------------------- Назначение: TRON и TROFF включают и выключают трассировку выполняемой программы. Синтаксис: Включить трассировку: TRON Выключить трассировку: TROFF Замечания: TRON переводит программу в режим отладки, при котором номера строк исходного текста, метки операторов, имена процедур и функций по мере выполнения очередного оператора выводятся в окне трассировки. TROFF выключает режим отладки. При выполнении программы в текстовом режиме ТУРБО БЕЙСИКа трассировка номеров срок, меток, имен процедур и функций воспроизводится в окне трассировки. Находясь в режиме трассировки, используйте Alt-F9 для переключения трассировки и выполнения, и наоборот. Для выполнения отдельного шага на следующую строку, метку, имя процедуры или функции нажмите Alt-F10. Отличия: В отличие от Интерпретатора БЕЙСИКа, в ТУРБО БЕЙСИКе работой команд TRON и TROFF управляет их физическое местоположение в исходном тексте программы, а не положение в выполняемой ветви программы. Рассмотрим, например, следующую программу: 10 GOTO 30 20 TRON 30 X=Y+2 40 TROFF 50 END При выполнении этой программы Интерпретатор БЕЙСИКа никогда не включит трассировку, что касается команды TRON в строке 20, то она просто не существует. С другой стороны, ТУРБО БЕЙСИК принимает решение о включении/выключении трассировки во время компиляции и считает, что трассировка включена для всех операторов, стоящих после команды TRON. Таким образом, при запуске программы в ТУРБО БЕЙСИКе в окне трассировки появится: [30][40] Пример. 'присвоение значений X, Y, Z 10 X=0: Y=1: Z=2 20 GOTO 40 30 TRON 'при выполнении программы выводятся номера 'строк 20, 30 и 40, а не их содержимое 40 X=Y+Z 'после выключения трассировки выводится значение Х 50 TROFF 60 PRINT X 70 END Функция UBOUND ------------------------------------------------------------- Назначение: UBOUND возвращает наибольшее допустимое значение границы (наибольший индекс) для заданной размерности массива. Синтаксис: N=UBOUND(массив(размерность)) Замечания: Размерность - это целое число от 1 до числа измерений массива, для которого ищется наибольший индекс. Для нахождения наименьшего индекса используется функция LBOUND. См. также: LBOUND , OPTION BASE Пример. 'задание нижней и верхней границ массива DIM ARRAY%(1900:2000) 'вывод значений массива FOR INDEX%=LBOUND(ARRAY%(1)) TO UBOUND(ARRAY%(1)) PRINT "элемент массива (";INDEX%;") равен";_ ARRAY%(INDEX%) NEXT INDEX% END Функция UCASE$ ------------------------------------------------------------- Назначение: UCASE$ возвращает строку, состоящую только из прописных букв. Синтаксис: S$=UCASE$(символьное-выражение) Замечания: UCASE$ возвращает строку, эквивалентную символьному выражению, за исключением того, что все строчные алфавитные символы в символьном выражении заменяются на прописные. См. также: LCASE$ Пример. PRINT UCASE$("TB or not TB..."); Функция VAL ------------------------------------------------------------- Назначение: VAL возвращает числовой эквивалент строки. Синтаксис: Y=VAL() Замечания: Функция VAL преобразует символьный аргумент в числовое значение. Если символьное выражение начинается с числовых знаков (0 - 9, +, -,..., Е, D), но содержит и нечисловые, то функция VAL возвращает числовое значение подстроки, предшествующей первому нечисловому символу. Если символьное выражение начинается с нечислового символа, VAL возвращает 0. Лидирующие пробелы или другие неотображаемые на экране знаки (например, табуляция) игнорируются. Функция VAL часто используется в подпрограммах ввода, выдающих запрос пользователю на ввод символьных данных. Функция VAL преобразует при необходимости данные в числовые значения без опасения, что числовым переменным будут присвоены нечисловые значения и появится сообщение об ошибке ?Redo From Start (повторите сначала). См. также: STR$ Пример. 'строка типа адреса A$="34 N.Main St." 'строка без цифр B$="Правильно, тридцать четыре" 'цифры и символы C$="+3.4eb" 'цифры с лидирующим пробелом D$=" 123 go" 'вывод получаемых с помощью VAL значений PRINT VAL(A$),VAL(B$),VAL(C$),VAL(D$) END Функция VARPTR ------------------------------------------------------------- Назначение: VARPTR возвращает адрес переменной. Синтаксис: Y=VARPTR(переменная) Замечания: Переменная может быть любой числовой или символьной переменной, или элементом массива. VARPTR возвращает смещение адреса в памяти, где хранится переменная. Такая адресная информация иногда называется указателем (pointer); например, о выражении VARPTR(X) говорится, что оно возвращает значение "указателя на Х". В связи с тем, что в программах на ТУРБО БЕЙСИКе используется расширенная модель памяти, для полного определения адреса переменной требуется ещё и функция VARSEG. (VARSEG возвращает сегментную часть адреса.) VARPTR наиболее часто используется для того, чтобы обеспечить подпрограмме на языке ассемблера доступ к ячейке памяти. При использовании VARPTR для получения смещения строки или массива помните, что функция возвращает смещение дескриптора строки или массива, а не данных. См. в приложении С "Интерфейс с языком ассемблера" описание форматов дескрипторов строк и массивов и карту распределенияпамяти в момент выполнения. См. также: VARSEG Пример. B%=55 DEF SEG=VARSEG(B%) ADDRESS%=VARPTR(B%) PRINT PEEK(ADDRESS%) END Функция VARPTR$ ------------------------------------------------------------- Назначение: VARPTR$ возвращает указатель переменной в символьном формате. Синтаксис: S$=VARPTR$(переменная) Замечания: Переменная может быть любой числовой или символьной переменной, или элементом массива. VARPTR$ возвращает указатель переменной в символьном формате и используется, в основном, для включения имен переменных в командную строку операторов PLAY и DRAW. См. также: DRAW , PLAY , VARSEG Пример. SCREEN 1 HOUSE$="G20 G5 E20 F20 H5 D20 L30" DRAW HOUSE$ DRAW "BE3" DRAW "P1.3" FOR I%=1 TO 280 STEP 40 DRAW "M="+VARPTR$(I%)+",40" DRAW HOUSE$ NEXT I% END Функция VARSEG ------------------------------------------------------------- Назначение: VARSEG возвращает адрес сегмента переменной. Синтаксис: y=VARSEG(переменная) Замечания: Переменная может быть любой числовой или символьной переменной, или элементом массива. В связи с тем, что в программах на ТУРБО БЕЙСИКе используется расширенная модель памяти, для полного определения адреса переменной требуется ещё и функция VARPTR. VARSEG возвращает числовое значение в диапазоне от 0 до 65535. Для получения адреса переменной следует использовать VARSEG совместно с VARPTR c тем, чтобы оператор CALL мог сообщить подпрограмме на языке ассемблер, где в памяти находится аргумент, который она должна обрабатывать. Программы на ТУРБО БЕЙСИКЕ размещают все одиночные (не являющиеся массивами) переменные в отдельном сегменте, длина которого может быть в пределах до 64К. Таким образом, VARSEG для всех одиночных переменных заданной программы всегда будет возвращать одно и то же значение. В действительности, это значение адреса сегмента устанавливается по умолчанию для операторов, управляемых DEF SEG (как например, PEEK и POKE). При использовании VARSEG для получения смещения строки или массива, помните, что возврвщаемое значение - это сегмент дескриптора строки или массива, а не данные строки или массива. См. в приложении С "Интерфейс с языком ассемблера" описание форматов дескрипторов строк и массивов и карту распределенияпамяти в момент выполнения. См. также: VARPTR Пример См. VARPTR Оператор VIEW ------------------------------------------------------------- Назначение: VIEW определяет активную область (поле изображения) графического экрана. Синтаксис: VIEW [[SCREEN][(X1,Y1)-(X2,Y2) [,[цвет],[граница]]]] Замечания: (Х1,Y1) и (X2,Y2) - верхний левый и нижний правый углы, соответственно, выделяемого поля изображения. Цвет - это необязательный числовой аргумент; если он указан, новое поле изображения окрашивается в заданный цвет. Граница - это необязательный числовой аргумент; если он указан, ТУРБО БЕЙСИК обводит границу нового поля изображения заданным цветом. Если он не указан, граница не изображается. VIEW определяет область на графическом экране, на которую может производиться запись или, наоборот, область, на которую запись не производится. Попытки изобразить пикселы вне поля изображения не приводят к результату, это называется отсечением изображения. Параметр SCREEN. ---------------- Если служебное слово SCREEN опущено, координаты точек отсчитываются непосредственно от верхнего левого угла поля изображения, а не от левого верхнего угла экрана. Например, после команды VIEW (100,50)-(300,180) команда PSET(0,0) изображает точку с координатами (100,50). Если SCREEN указан, координаты точек определяются обычным путем, то есть относительно левого верхнего угла экрана. Так, например, PSET(0,0) изображает точку в самом верхнем левом углу экрана. Однако, видимы только те точки, которые попадают в поле изображения (точки вне поля изображения невидимы). Оператор VIEW без аргументов определяет в качестве поля изображения весь экран. Оператор SCREEN, используемый для изменения режимов экрана, (например, переключения из режима со средним разрешением в режим с высоким разрешением), отменяет все предыдущие установки оператора VIEW. Если задано поле изображения, оператор CLS очищает только его. См. также: CLS , SCREEN , WINDOW Пример. SCREEN 1 FOR I=0 TO 6 'задание поля изображения VIEW ( 10*(I+1), 10*(I+1) )- _ ( 25*(I+1), 25*(I+1) ),I,3-I 'вывод круга в поле изображения CIRCLE(10,10),I+1,3-I NEXT I END Оператор WAIT ------------------------------------------------------------- Назначение: WAIT ждет заданных условий состояния аппаратуры. Синтаксис: WAIT порт, N [,M] Замечания: Порт - целочисленное выражение (в диапазоне от 0 до 65535), задающее аппаратный порт ввода. N и M - целые выражения в диапазоне от 0 до 255. WAIT останавливает выполнение программы до тех пор, пока указанным портом не будет представлено значение, соответствующее заданному битовому шаблону. Над значением, считанным из порта выполняется операция логического "И" с числом M, и - логического "ИЛИ" с числом N. Если результат равен 0, процесс повторяется. Если не равен 0, ТУРБО БЕЙСИК выполняет следующий оператор. Если M опущено, вместо него WAIT тспользует 0. Пример. WAIT &H60,1 PRINT "hi" END Оператор WHILE/WEND ------------------------------------------------------------- Назначение: WHILE/WEND строят цикл, в котором проверка выполняется на входе. Синтаксис: WHILE целое-выражение . . [операторы] . WEND Замечания: Если целое выражение истинно, то есть TRUE (равно ненулевому значению), выполняются все операторы между WHILE и завершающим цикл оператором WEND; затем ТУРБО БЕЙСИК возвращается на оператор WHILE и повторяет проверку, если целое выражение опять истинно, выполняются все внутренние операторы и т. д. Этот процесс повторяется до тех пор, пока проверяемое выоажение не будет равно 0, тогда управление передается на оператор, следующий за оператором WEND. Если целое выражение оценивается как ложное, т.е. FALSE (ложь), при первом проходе цикла, не выполняет- ся ни один оператор цикла. Циклы, построенные операторами WHILE/WEND могут быть вложенными (заключенными внутри другого цикла). Каждый WEND соответствует ближайшему к нему незакрытому оператору WHILE. Если ТУРБО БЕЙСИК встречает оператор WEND без соответствующего ему оператора WHILE, возникает ошибка выполнения 30 WEND Without WHILE (WEND без соответствующего WHILE). Если оператору WHILE не соответствует оператор WEND, возникает ошибка выполнения 29 WHILE Without WEND (WHILE без соответствующего WEND). Хотя компилятору это совершенно безразлично, структурируйте расположение операторов между WHILE и WEND с помощью пары пробелов для того, чтобы сделать более ясной структуру созданного Вами цикла. Внимание: WHILE -1 : ... : WEND создает бесконечный цикл. Для выхода из цикла WHILE/WEND следует использовать оператор EXIT WHILE. См. также: DO/LOOP , EXIT Пример. 'положить I равным 0 'положить X равным 10 I=0 X=10 'выполнять цикл до тех пор, пока I не будет равно 10 WHILE I<X 'прибавить 1 к значению I I=I+1 'вывести значение I PRINT "I=";I 'ждать 1 секунду DELAY 1 'завершить цикл, когда выполнится условие WEND PRINT PRINT "Оба значения: и I и X равны 10" PRINT I PRINT X END Оператор WIDTH ------------------------------------------------------------- Назначение: WIDTH устанавливает логическую длину строки. Синтаксис: WIDTH [{ имя-устройства | #номер-файла },] длина Замечания: Длина - целое выражение в диапазоне от 0 до 255, которое задает новую логическую длину строки. Имя устройства - необязательное символьное выра- жение, указывающее устройство, длина строки которого устанавливается. Могут указываться устройства SCRN:, LPT1:, LPT2:, LPT3:, COM1: или COM2:. Если устройство не указано, по умолчанию устанавливается длина строки экрана (SCRN:). Номер файла - целое выражение, которое задает файл, открытый для вывода. В целом, WIDTH определяет число символов, которое может быть выведено на заданное устройство прежде, чем будет выполнен возврат каретки. Конкретные детали работы оператора WIDTH зависят от конкретного устройства. WIDTH <длина> или WIDTH "SCRN:",<длина> устанавливают ширину экрана. Допустимы только два значения длины: 40 и 80,; но для монохромного экрана 40 тоже не допустимо. Если экран находится в графическом режиме, изменение ширины экрана имеет тот же эффект, что и смена графического режима. Например, если текущим является режим с высоким разрешением, WIDTH 40 переключает в графический режим со средним разрешением. WIDTH <устройство>, <длина> - определяет строки указанного устройства при последующем его открытии. Если устройство уже открыто, длина строки не изменяется. Внимание: оператор LPRINT непосредственно открывает принтер, то есть действие оператора WIDTH "LPT1:",длина проявляется немедленно. WIDTH #<номер-файла>,<длина> также меняет длину устройсва, представленного номером файла в момент выполнения команды. Устройства, для которых оператор WIDTH что-либо означает, это LPT1:, LPT2:, LPT3:, COM1: и COM2:. Ширина строки каждого принтера по умолчанию - 80. Если ширина строки устанавливается равной 255, это означает, что логической длины строки практически не существует, и возврат каретки никогда не вставляется. Пример. 'установить графический режим со средним разрешением SCREEN 1,0 PRINT "Это пример работы в режиме" PRINT " со средним разрешением" DELAY 3 'ждать 3 секунды 'установка с помощью WIDTH графического режима 'с высоким разрешением WIDTH 80 PRINT "Это образец графического режима" PRINT " с высоким разрешением" DELAY 3 'переключение в режим со средним разрешением WIDTH 40 PRINT "Заметьте, что в режиме" PRINT "со средним разрешением" PRINT "буквы большего размера" DELAY 3 SCREEN 0,1 'текстовый режим WIDTH 80 PRINT "Это 80-символьный текстовый режим" DELAY 3 WIDTH 40 '40-символьный режим PRINT "Это 40-символьный текстовый режим" '80-символьный текстовый режим WIDTH 80 'вопрос пользователю, можно ли продолжить пример на 'принтере? INPUT "Поддерживаются ли EPSON-коды принтера (Y/N)";_ ANS$ 'завершение программы, если EPSON-коды не 'поддерживаются IF UCASE$(ANS$)<>CHR$(89) THEN END 'установить сжатый режим печати LPRINT CHR$(15) 'установить логическую длину сроки WIDTH "LPT1:",130 LPRINT "Тестирование в сжатом режиме установлено "; LPRINT "на 130 колонок, та же строка печатается "; LPRINT "до конца страницы." LPRINT CHR$(18) 'восстановление WIDTH "LPT1:",80 END 'конец программы Оператор WINDOW ------------------------------------------------------------- Назначение: WINDOW определяет систему координат графики. Синтаксис: WINDOW [[SCREEN](X1,Y1)-(X2,Y2)] Замечания: (X1,Y1) и (X2,Y2) - это две пары координат с одинарной точностью. (Х1,Y1) представляют нижнюю левую часть экрана, а (X2,Y2) - верхнюю правую. Если Вам не нравится стандартный способ адресации графического экрана, принятый в ТУРБО БЕЙСИКе с началом координат в левом верхнем углу от 0 до 319 (от 0 до 639), от 0 до 199, Вы можете задатьего по собственному усмотрению с помощью оператора WINDOW. Оператор WINDOW преобразует произвольно выбранные "пользовательские" координаты (которые могут быть более естественным для Вашей программы способом определения позиций) в "физические" координаты (адреса пикселов на экране). Одно из применений оператора WINDOW состоит в том, чтобы перемасштабировать дисплей в соответствии с координатами экрана, принятыми в различных компьютерных системах. Так, например, графический экран Apple II состоит из 280 горизонтальных и 192 вертикальных рядов пикселов. Оператор WINDOW SCREEN (0,0)-(279,191) определяет для экрана PC ту же адресную схему. После выполнения этого оператора с компьютера Aplle II переносится программа, пытающаяся засветить самый нижний правый пиксел на экране Apple II, для которого она была написана. Например, PSET(279,191) изображает пиксел с физическим адресом 319,199 (в нижнем правом углу экрана PC). В качестве другого примера предполпжим, что Вы работаете в прикладной области, где было бы удобно описывать линии и другие объекты в терминах коорди- нат, много больших чем 0-199 и 0-639, допустимых при стандартной адресации экрана. Предположим также, что было бы полезно иметь начало координат в центре экра- на, так, чтобы значение Y возрастало вверх, как это принято в аналитической геометрии. Оператор WINDOW позволяет работать с графическим экраном с высоким или средним разрешением, как если бы он был именно таким образом устроен. WINDOW позволяет разместить на экране весь диапазон чисел с одинарной точностью, например, оператор WINDOW (-1E6,1E6)-(1E6,-1E6) создает систему координат на 4 триллиона точек (2 миллиона на 2 миллиона). Верхнему левому пикселу соответствует (-1000000,1000000); точка (0,0) расположена в центре экрана; (1000000,-1000000) соответствует нижнему правому пикселу. Это аппроксимация стандартной координатной плоскости в декартовой геометрии: начало координат в центре, положительные значения X находятся справа от начала координат, положительные значения Y - выше начала координат. Псле выполнения этого оператора любая операция записи на экран (CIRCLE, LINE и др.) будут использовать новую систему координат. PSET(0,0) выделяет пиксел в центре экрана; PSET(250000,250000) выделяет пиксел немного выше и правее центра. Аргументы оператора WINDOW - это числа с плавающей точкой одинарной точности, которые позволяют задавать на экране и огромные области (миллионы пикселов в обоих направлениях), и области с дробными значениями координат - от 0 до 1. Если задано необязательное служебное слово SCREEN, то сохраняется установленное по умолчанию свойство координаты Y расти по направлению вниз. Так, например WINDOW SCREEN (-1,1)-(-1,1) создает систему координат, в которой верхний край экрана имеет координату Y равную -1, а нижний край - координату Y равную 1. Любое распределение экрана, заданное оператором WINDOW, отменяется при выполнении операторов RUN, SCREEN или WINDOW без параметров. Функция PMAP выполняет масштабирование в соответствии с текущей установкой оператора WINDOW без какого-либо отображения на экране. См. также: CLS , PMAP Пример. 'установка графического режима со средним разрешением SCREEN 1 PI=ATN(1)*4 'определение константы VAL1=5 : VAL2=6 : STEPS=400 'выбор значений WINDOW (-1,1)-(1,-1) 'начало координат в центре 'однократный обход круга FOR THETA=0 TO 2*PI STEP 2*PI/STEPS 'круг единичного радиуса RADIUS=COS(2*THETA) 'перевод в декартовы координаты X=RADIUS*COS(VAL1*THETA) 'с искривлением Y=RADIUS*SIN(VAL2*THETA) PSET(X,Y) 'изобразить точку NEXT THETA 'повторить 'нажать любую клавишу для возврата в редактор WHILE NOT INSTAT: WEND END 'конец программы Оператор WRITE ------------------------------------------------------------- Назначение: WRITE посылает данные, разделенные запятыми, на экран. Синтаксис: WRITE [список-выражений] Замечания: Список выражений - это последовательность числовых и/или символьных выражений, разделенных запятыми и точками с запятой. Если список выражений опущен, выводится пустая строка. Действие оператора WRITE аналогично действию оператора PRINT за исключением того, что WRITE выводит запятые между данными из списка выражений, заключает символьные данные в кавычки и записывает положительные числа без предшествующих пробелов. См. также: PRINT Пример. 'В этом цикле считываются данные 'и печатаются сначала с помощью PRINT, 'затем с помощью WRITE FOR I=1 TO 3 READ WORDS$,NUMBER% PRINT WORDS$ PRINT NUMBER% WRITE WORDS$,NUMBER% NEXT I DATA "Hello",10,"How are",20,"you",30 END 'конец программы Оператор WRITE# ------------------------------------------------------------- Назначение: WRITE# выводит данные в последовательный файл. Синтаксис: WRITE# номер-файла, список-выражений Замечания: Номер файла - номер, который присваивается устройству или файлу при открытии (OPEN). Список выражений - это последовательность числовых и/или символьных выражений, разделенных запятыми или точками с запятой. Действие оператора WRITE# аналогично действию оператора PRINT# за исключением того, что WRITE# выводит запятые между данными из списка выражений, заключает символьные данные в кавычки и записывает положительные числа без предшествующих пробелов. Использование оператора WRITE# является более предпочтительным методом записи полей данных в последовательный файл, так как выводимые значения автоматически отделяются запятыми, а символьные строки помещаются в кавычки. Это облегчает ввод с помощью оператора INPUT# данных, записанных в последовательный файл. См. также: PRINT# Пример. 'открыть последовательный файл для вывода OPEN "FILE.PRN" FOR OUTPUT AS #1 'чтение информации из операторов DATA и 'вывод в файл FOR I=1 TO 6 READ INFO$ WRITE #1,INFO$ NEXT I CLOSE 1 'закрытие файла END 'конец программы 'определение данных DATA "Mike","Smith","12 Main St.",_ "Paris","Ca","95066"