Функция ABS ------------------------------------------------------------------ Назначение ABS возвращает абсолютное значение Синтаксис y = ABS (numeric expression) Примечания ABS возвращает абсолютное значение численного выражения. Абсолютное значение х указывает его величину без учета знака. Например абсолютное значение -3 это 3;абсолютное значение +3 это 3. Пример ' ABS возвращает текущее расстояние посредством ' учета абсолютного значения размещения ' назначить размещение Location# = - 6,5 ' показать текущую позицию PRINT "Current location:", Location# ' показать расстояние PRINT "Distance:", ABS(Location#). Функция ASC ------------------------------------------------------------------ Назначение ASC возвращает код ASCII первого знака строки. Синтаксис y = ASC (string expression) Примечания ASC возвращает код ASCII (от 0 до 255) первого знака символьного выражения. Для перевода целочисленной строки в знаковую используйте комплементарную функцию CHR$, кото- рая производит односимвольную строку при подаче значения ASCII. Ограничения Символьный аргумент ASC не может быть пустой строкой. Если же это происходит, генерируется ошибка выполнения 5, Illegal Function Call. Смотреть также CHR$ Пример PRINT "The ASCII value of is"; ASC("A") Функция АТN --------------------------------------------------------------- Назначение ATN возвращает тригонометрический арктангенс. Синтаксис y = ATN (numeric expression) Комментарий ATN возвращает с удвоенной точностью арктангенс численного выражения. Результат, как и во всех операциях с углами в ТВ, выражается в радианах, а не в градусах. Если вам удобнее работать с градусами, ра- дианы можно перевести в градусы по соотношению 1 радиан = 180/пи градусов; 1 градус = пи/180 радиан. Для справки: пи = 3.141592653589793. Данное значение можно вычислить по выражению pi# = 4 * ATN(1) Перевод градусов в радианы и радианы в гра- дусы является хорошим применением для одно- строчных функций. Смотреть также COS , SIN , TAN Пример ' вычислите значение PI используя ATN PI# = 4*ATN(1) PRINT PI# Оператор BEEP ------------------------------------------------------------------ Назначение BEEP озвучивает динамик. Синтаксис BEEP [count] Комментарий BEEP воспроизводит тон на 800 Hz через встроен- ный динамик за 0.25 секунды. Необязательный численный аргумент вызывает выполнение соответ- ствующего количества операторов BEEP. BEEP имеет такой же эффект, как и вывод сим- вола звуковой сигнализации ASCII (код 7) на эк- ран. Например, PRINT CHR$(7). Более мелодичные тоны создаются при помощи операторов SOUND и PLAY. Смотреть также PLAY , SOUND Пример BEEP 2 ' привлечь внимание пользователя Функция BIN$ ------------------------------------------------------------------ Назначение BIN$ возвращает двоичный символьный эквивалент числа. Синтаксис s$ = BIN$ (numeric expression) Комментарий численное выражение находится в диапазоне от -32768 до 65535. Любая дробная часть округля- ется до того, как создается строка. Если чис- ленное выражение отрицательное, BIN$ возвращает дополнительный код числа. Смотреть также HEX$ , OCT$ Пример ' Этот пример иллюстрирует как десятичные,так и ' двоичные значения от -5 до 5. FOR l% = -5 to 5 ' от -5 до 5 ' показывает десятичные и двоичные значения l% PRINT USING "The binary equivalant of -## =&";_ l%,BIN$(l%) NEXT l% END ' закончить программу Оператор BLOAD ------------------------------------------------------------------ Назначение BLOAD загружает файл BSAVEd в память. Синтаксис BLOAD filespec[,address] Комментарий filespec есть символьное выражение, определяю- щее файл для загрузки, оно должно следовать стандартным условным обозначениям присвоения имени DOS, факультативно включая спецификатор накопителя и/или маршрут. address представляет собой необязательное численное выражение от 0 до 65535 с указанием где в текущем сегменте должен загружаться файл. В случае опущения, BLOAD помещает файл на адрес, с которого он был первоначально BSAVEd. Если даётся адрес, он заменяет адресную ин- формацию, записанную в файлах, произведённых оператором BSAVE. Учитывая тот факт, что на ад- ресе BLOAD не происходит никакой проверки, вполне возможно загрузить файл сверх DOS и/или вашей программы и разрушить систему. Ограничения BLOAD не будет загружать непосредственно память EGA. Смотреть макже BSAVE , DEF SEG Пример REM LoadGraphicsScreen DEF SEG &HB800 BLOAD "Pictcre",0 Оператор BSAVE ------------------------------------------------------------------ Назначение BSAVE записывает диапазон памяти на диске. Синтаксис BSAVE filespec,address,length Комментарий filespec есть символьное выражение,определяющее файл, в который должны быть занесены данные. filespec должен соблюдать стандартные условные обозначения присвоения имени DOS, и может фа- культативно включать спецификатор накопителя и/или информацию о маршруте. adress есть чис- ленное выражение с диапазоном oт 0 до 65535 и указывает на оффсетную часть адреса, с которой будет записан filespec (см.оператор DEF SEG), lenght (длина) есть число байтов, которые должны быть записаны, от 0 до 65535. BSAVE сохраняет объем памяти на диске (в действительности записывает цифровой моменталь- ный снимок указанного объема памяти во время BSAVE). Файлы, созданные с помощью BSAVE могут затем перезагружаться с командой BLOAD; факуль- тативно файлы могут быть загружены по другому адресу, чем с слудае BSAVE. BSAVE и BLOAD часто используются для записи и загрузки экранных образов при помощи непос- редственно считывания и записывания в память дисплея. Буфера дивплея Монохромного Адаптера Дисплея вмещает 4000 байтов и начинается на оффсете 0 в сегменте HB000. Буфер дисплея CGA вмещает 4000 байтов в режиме текста (SCREEN 0) и 16384 байта в графическом режиме среднего и высокого разрешения; оба начанаются с 0 в сег- менте &HB800. Ограничения Перед выполнением оператора BSAVE, программа должна эксплицитно установить сегмент, который будет записан на диске с использованием опера- тора DEF SEG. Смотреть также BLOAD , DEF SEG Пример ' BSAVE заполняет экран символами А и записывает ' на диске FOR I% = 1 to 2000 PRINT "A"; ' заполняет экран символами А NEXT I% ' определить сегмент для BSAVE DEF SEG = &HB000 ' записывает монохромное видео-ЗУ BSAVE "TEXT".PIC",0,4000 ' количество знаков, умноженные на два ' из-за атрибутов END ' закончить программу Оператора CALL ------------------------------------------------------------------ Назначение CALL вызывает процедуру(подпрограмму) Синтаксис CALL procname [(список параметров)] Комментарий procname представляет собой имя процедуры, определенной где-либо в программе с помощью оператора SUB. Список параметров является нео- бязательным, с отдельным занятым списком пере- менных, выражений, и/или констант,которые долж- ны быть переведены в имя процедуры. Существует 3 типа процедур SUB: STATIC (ста- тические), стандартные процедуры и INLINE (вст- роенные). Всё, о чем здесь говорится, относится ко всем 3 типам; однако, то, как компилятор бу- дет работать со списком параметров, зависит от типа процедуры SUB. Количество и тип проходных аргументов должны соответствовать вписку параметров в определении имени процедуры; иначе произойдет ошибка Para- meter Mismatch времени компиляции. Если процедура SUB является процедурой INLI- NE, число аргументов варьируется и не происхо- дит проверка типов параметров. В компетенцию процедуры SUB INLINE входит знание и определе- ние количества и типов параметров,которые в неё переходят (более подробно об этом см. Приложе- ние C, "Интерфейс языка ассемблера"). Когда аргументы процедуры проходят ссылками (т.е. переменными), они могут изменяться выз- ванными процедурами. Когда переменная заключа- ся в круглые скобки, она проходит по значению и оригинальное значение не может быть изменено. Обратите внимание, что выражения и постоянные всегда проходят по значению. Аргументы-массивы определяются с использова- нием пустых скобок после имени массива. Массивы всегда проходят посредством ссылки. Например: CALL SumArray (A()) ' передать массив A ' в SumArray CALL SumArray (A(3)) ' передать 3-й элемент A ' в SumArray Смотреть также $INLINE , SUB Пример DIM Array (1) ' объявить массив 2 чисел SUB TestProcedure (I%,L&,S!,D#,A(1)) ' эта процедура просто выводит значения ' каждого параметра, переданного ей PRINT I%;L&;S!;D#;A(0) END SUB ' закончить процедуру TestProcedure Integer = 1 LongInt& = 2 SinglePre! = 3 DoublePre# = 4 Array(0) = 5 CALL TestProcedure(Integer%,LongInt&,SinglePre!,_ DoublePre#,Array()) END ' закончить программу Оператор CALL ABSOLUTE ------------------------------------------------------------------ Назначение CALL ABSOLUTE вызывает программу языка ассемб- лера. Синтаксис CALL ABSOLUTE address (parametr list) адрес (список параметров) Комментарий адрес является численным скаляром, содержащим начальным номер вызываемой внешней программы. Сегмент определяется самым последним оператором DEF SEG. адрес должен находится в диапазоне от -32768 до 65535. Отрицательные значения будут переведены компилятором в положительные. Форма списка параметров поддерживает совмес- тимость с Интерпретатором БЕЙСИК передачей ко- ротких целых параметров в стек. Эта форма поз- воляет передавать только целые параметры (см. Приложение С, "Интерфейс языка ассемблера"). Регистровый буфер загружается в регистры процессора непосредственно перед CALL ABSOLUTE или CALL INTERRUPT и записывается сразу после возврата. В любой момент времени буфер содержит состояние процессора, в котором он находился во время выполнения самой последней по времени внешней подпрограммы. Из регистрового буфера выборку осущетсвляет оператор и функция REG, которые используют чис- ленный аргумент для обращения к соотвестствую- щему регистру: ------------------------------------- Аргумент REG Регистр ------------------------------------- 0 Флаги 1 AX 2 BX 3 CX 4 DX 5 SI 6 DI 7 BP 8 DS 9 ES ------------------------------------- REG в качестве оператора загружает отобранный элемент регистрового буфера с указанным целым значением: REG 2,&H1000 ' загрузить 1000H в буфер ' регистра BX REG в качестве функции возвращает значения отобранного элемента в буфере регистра: PRINT REG(2) ' печатать эначение буфера ' регистра BX Программист несeт ответственность за сохран- нение регистров Сегмента Данных (DS), Указателя Базы (BP), Сегмента Стека (SS) и Указатель Сте- ка (SP). Смотреть также CALL INTERRUPT , DEF SEG , REG Пример 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(1) WHILE NOT INSTAT : WEND FillAdr = VARPTR(FillRoutine(0)) CALL ABSOLUTE FillAdr '(REG) PRINT a(1) END Оператор CALL INTERRUPT ---------------------------------------------------------------- Назначение CALL INTERRUPT осуществляет системное прерывание Синтаксис CALL INTERRUPT n Комментарий n - это целочисленное выражение, представляющее вызы- ваемое прерывание, от 0 до 255. Непосредственно перед тем как обработчик прерываний получает управление, регистры процессора загружаются значениями из буфера машинных регистров. Когда обработчик прерывания воз- вращается, буфер берется за значения в регитстрах процессора. В любое данное время буфер содержит сос- тояние регистров процессора на момент завершения са- мого последнего внешнгего вызова или оператора REG Техническое руководство DOS содержит полную инфор- мацию по многим функциям, доступным через механизм CALL INTERRUPT. Программист отвечает за сохранение регистров сегмента стека (SS) и указателя стека (SP). Ограничения перед выполнением оператора CALL INTERRUPT: соответствующие регистры CPU должны быть выбраны из памяти через функцию REG. См. также CALL ABSOLUTE , REG Функция CDBL ------------------------------------------------------------------ Назначение CDBL преобразовывает выражение в формат удвоенной точности. Синтаксис Y = CDBL (численное выражение) Комментарий CDBL преобразует численную переменную или выражение в форму удвоенной точности. Для устранения возможности переполнения целых чисел в выражениях с целочисленными и с операндами с плавающей запятой используйте оператор CDBL. Напри- мер: Y = (2% + x%) / a# Результатом данного выражения будет переполнение, если (2% + X%) будет больше 32767. Во избежание этого, используйте оператор CDBL для преобразования одной из целочисленных переменных в форму с удвоенной точнос- тью. Это достигается вычислением всего выражения с удвоенной точностью. Y# = (CDBL (2%) + X%)) / а# Ограничения Диапaзон выражений, передаваемых CDBL должен быть в пределах допустимого диапазона числа удвоенной точнос- ти. См. также CINT , CLNG , CSNG Пример CDBL используется для профилактики ошибок выражения X% = 20000 ' обьявить целочисленную переменную Y% = 20000 ' присвоить Y% значения X% Z# = CDBL (X%) + Y% ' предотвратить переполнениe ' преобразованием x% PRINT x%, Y%, Z# ' показать значения трех ' переменных END Функция CEIL ------------------------------------------------------------------ Назначение Функция CEIL преобразует численную переменную или выражение в целое число, возвращая наимньшее целое число большее или равное его аргументу. Синтаксис Y = CEIL (численное выражение) Функция CEIL проеобразует численную переменную или выражение в целое число, возвращая наимньшее целое число большее или равное по аргументу. Различия В Интерпретаторе БЕЙСИК такой функции нет. См. также CINT , FIX , INT Пример FOR I! = -2.5 to 2.5 STEP 0.5 ' показать наименьшее целое число большее для ' серии значений PRINT "the ceiling of ### is ###."; I!, CEIL (I!). NEXT I! END 'закончить программу Оператор CHAIN ------------------------------------------------------------------ Назначение Оператор CHAIN вызывает модуль цепочки ТБ (создаваемый как файл) Синтаксис CHAIN filespec Комментарий filespec представляет собой имя файла в соответствии со стандартными условными обозначениями DOS и представляет це- почный модуль ТУРБО БЕЙСИКа (расширение ТВС). Если расшире- ние опущено, присваивается ТВС. Поэтому, если вам необходи- мо определить файл .ЕХЕ, вы должны к имени файла добавить .ЕХЕ. Переменные перечисленные как COMMON, как в текущей программе, так и в программе назначения переходят к про- грамме назначения. В фазе тестирования вызывающая программа должна компилироваться в файл .ЕХЕ, потому что нельзя сцеп- лять программы изнутри ТУРБО БЕЙСИКа. Вызываемая программа должна компилироваться на диск как цепочный модуль (файл .ЕХЕ или .ТВС). Если аргументы к операторам COMMON в вызы- вающей и вызываемой программах не совпадают (например, пе- ременные с плавающей запятой в одном месте, а целые числа в другом), происходит ошибка выполнения. ТУРБО БЕЙСИК не поддерживает версии CHAIN интерпретатора БЕЙСИК, ориентированные на номер строки, включая номер строки CHAIN, DELETE, MERGE. В виду невозможности определе- ния номера строки в пределах целочисленнонго модуля назна- чения, выполнение всегда начинается с начала. При трансляции системы CHAIN программ интерпретатора БЕЙСИК в ТУРБО БЕЙСИК, вы обнаружите расширенное использо- вание памяти ТУРБО БЕЙСИКа, позволяющее объединить отдель- ные модули в единую программу, и необходимость в сцеплении модулей отпадет. Ограничения Сцепление можно осуществить только при условии, что про- грамма выполняется с DOS т.е. с файла .ЕХЕ. MERGE, DERLETE, ALL и CHAIN (сцепление) на номер строки не поддерживаются. Различия В ТУРБО БЕЙСИКе операция CHAIN осуществляется из одной ком- пилированной программы в другую, которая была уже скомпили- рованна в файл .ТВС или .ЕХЕ. См. также COMMON Пример: Рассмотрим PROG1, которая вызывает цепочку в PROG2. ' PROG1.BAS ' oбъявить переменные, которые должны быть ' переведены в программу со сцепленными модулями ' скалярные переменные одинарной точности а и b ' и целочисленный массив C% DIM C%(3000) а = 65 : b = 13 : C%(2000) = 12 COMMON а,b,C%(1) ' определить число размерностей в массиве CHAIN "PROG2" ' PROG2.BAS ' Обьявить переменные, которые должны быть получены ' из вызываемой программы. ' они должны быить в таком порядке, одного типа, ' но не требуют одинаковых имен COMMON x, y, z%(1) PRINT x, y, z%(2000) Когда PROG1.EXE вызывается из DOS, она автома- тически "возьмет с собой" модуль PROG2.TBG и выполнит его, напечатaв значения, присвоенные в PROG1. Когда заканчивается PROG2, она возврвщается в DOS, а не в PROG1. Оператор CHDIR ---------------------------------------------------------------- Назначение Оператор CHDIR изменяет каталог (аналогично команде DOS CHDIR или CD). Синтаксис CHDIR path Комментарий path - это символьное выражение,соответствующее условным обозначениям маршрута в DOS (cм. "Файлы" в 4-й главе). Если маршрут не указывает правильный каталог, происходит ошибка выполнения 76, Path Not Found (маршрут не найден). оператор CHDIR изменяет текущий каталог (активный или по умолчанию).Она аналогична команде CHDIR с той лишь разни- цей, что она не может сокращенно называться CD. Выполне- ние програmmы,которая изменяет текущий каталог изнутри ТУРБО БЕЙСИК, изменяет также и активный каталог ТУРБО БЕЙСИКа. Примеры INPUT "New directory:" path$ ' измените на каталог,определенный пользователем CHDIR path$ END Функция CHR$ --------------------------------------------------------------- Назначение CHR$ преобразует code ASCII в строку из одного символа Синтаксис Y=CHR$ (integer ehpression) Комментарий CHR$ возвращает строку, единсвенный символ которой имеет целочисленное выражение кода ASCII, значения от 0 до 255. CHR$ комплементирует функцию ASC, которая возвращает код ASCII первого символа строки. CHR$ используется для созда- ния символов трудновводимых с клавиатуры, таких как графи- ческие символы для вывода на экран и управляющие последова- тельности для вывода на принтер. Значение целочисленного выражения, переходящее на CHR$, должно быть в пределах от 0 до 255. Использование аргумента, выходящего за рамки диапа- зона от 0 до 255 дает ошибку выполнения 5: Illegal Function Call (неправильный вызов функции). см. также ASC Пример ' CHR$ выводит набор символов ASCII на экран FOR i% = 0 то 255 PRINT CHR$ (i%) показывает символ ASCII, представленный i% NEXT i% END Функция CINT ---------------------------------------------------------------- Назначение Функция CINT преобразует аргумент в целое число. Синтаксис Y = CINT (numeric expression) Комментарий Функция CINT преобразует численную переменную или выражение в целое число с округлением дробной части численного выра- жения. Если численное выражение выходит из пределов диапа- зона от -32768 до +32767, то происходит ошибка выполнения программы 6: overflow (переполнение). Это преобразование осуществляется имплицитно назначением целочисленной переменной или вызовом процедуры или функции, которая принимает целочисленный аргумент. Различия В отличие от интерпритатора БЕЙСИК, ТУРБО БЕЙСИК не всегда округляет дробную частицу числа в большую сторону. Если дробная часть числа равна .5, она округляется в сторону четного числа . См. также CDBL , CEIL , CLNG , CSNC , FIX , INT Пример FOR I! = 0.0 TO 5.0 STEP 0.2 ' показать результат преобразования PRINT USING "CINT of #.# = #" I!, CINT(I!) NEXT I! END Оператор CIRCLE ----------------------------------------------------------------- Назначение Оператор CIRCLE рисует круг или часть круга. Синтаксис CIRCLE (x,y), radius [, color [, start, end[, aspect]]] Комментарий (x,y) является центром круга и может быть описан либо в абсолютной либо в относительной форме (с использованием STEP). (См. раздел по графике в Главе 3 для более подробной информации об абсолютных и относительных координатах). "radius" - представляет собой численное выражение, управляющее размером круга. "color" - это численное выражение определяющее цвет круга. Допустимые значения от 0 до 3 в графических устрой- ствах со средней разрешающей способностью (по умолчанию 3) и от 0 до 1 в графических устройствах с высокой разрешающей способностью (по умолчанию 1). Цвет по умолчанию - это наиболее высокий цвет для режима в котором вы находитесь. Использование аргумента цвета, выходящего за пределы данных диапазонов, дает ошибку выполнения 5, illegal function call (неправильный вызов функции). (Более подробно об отборе цвета см. оператор STATEMENT). "Stаrt" и "end" являются необязательными численными параметрами, определяющими начальную и конечную точки рисуемой дуги в радианах (о радианах смотри в статье ATN). Используйте их при изображении только части круга. Oтрицательные значения начала и конца дают участок круговой диаграммы с треугольным сектором на зкране дисплея. Для начала треугольного сектора на положительной оси x, исполь- зуйте отрицательное число, немного менньшее 0 (например, -0.0001), а не ноль. Если начало и конец опускаются, то ри- суется целый круг. Например: SCREEN 1 : pi = 4 * ATN(1) CIRCLE (160,100),50,3,0, pi рисует белую дугу полукруга от 0 рaдиан (0 градусов) до пи радиан (180 градусов). SCREEN 1 : pi = 4* ATN(1) CIRCLE (160,100),50,,-pi/4, -pi/2 Рисует учасмток секторной диаграммы в 45 градусов, от pi/4 радиан (45 градусов) до pi/2 радиан (90 градусов). "Aspect" - это численное выражение управляющее оваль- ностью круга. По умoлчанию 5/6 (0.83333) со средней разре- решающей способностью и 5/12 (0.416667) с высокой разреша- ющей способностью. После нанесения изображения круга, LPR становиться его центром. Пример Данная программа демонстрирует возможности CIRCLE изменение места, радиуса, цвета и овальности PI# = 4 * ATN(1) ' вычислить значения PI SCREEN 1 ' перейти в режим графиков FOR Radius% = 1 то 20 ' установить размер круга Colour% = Radius% MOD 4 ' вычислить цвет дисплея CIRCLE (250,150), Raidius%, Colour% ' центр в 250, 150 NEXT Radius% ' эллипсы могут производить иллюзии типа сфер... FOR Aspect = 0 TO 2.0 STEP 0.09 CIRCLE (90.100) Radius%,,,,Aspect NEXT Aspect END Оператор CLEAR ---------------------------------------------------------------- Назначение Оператор CLEAR очищает память переменной Синтаксис CLEAR Комментарий CLEAR - это команда без параметров, которая устанавливает численные переменные на ноль, а символьные переменные сводит к пустым. Оператор CLEAR отключает ловушку (например, воспроизведение музыки), и вновь инициализирует память массивов и строковую память. Примечание: Оператор CLEAR внутри цикла будет очищать счетчик, вызывая бесконечный цикл. Для выборочного освобождения массивов в памяти пользуйтесь оператором ERASE. Ограничения Турбо-Бейсик не поддерживает динамическую установку стека и сегментов данных; в этом операторе нет поэтому соответствующих параметров. Различия Различия между операторами CLEAR Интерпретаторного Бейсика и ТУРБО-БЕЙСИКа происходит, главным образом, из различий между компиляторами и интерпретаторами. Интерпретаторный Бейсик дает вам возможность динамически устанавливать пространство стека и данных там, где пространство стека и данных Турбо-Бейсика фиксируется во время компилирования. См. также ERASE , $STACK Пример: Эта программа демонстрирует что может делать CLEAR dim Array$(1) 'заявить массив строк play "mb l1 efgabcdef" 'играть музыку в фоне on pen gosub PenHolder 'настроить отслеживание 'светового пера on strig(0) gosub ButtonHolder 'настроить отсле- 'живатель ручки управления 'инициировать строчные данные Array$(0)="это строка в Array$(0)" Array$(1)="это строка в Array$(1)" 'отобразить строчные данные print using "Элемент массива 1: ":Array$(0) print using "Элемент массива 2: ":Array$(1) print input "нажмите (ввод)для исполнения оператора CLEAR": Пусто$ clear 'делается очистка print 'существующие строчные данные более не отображаются print using "Элемент массива 1: ":Array$(0) print using "Элемент массива 2: ":Array$(1) print print "строчные переменные теперь пусты" end PenHolder: 'определить пустую метку для ловушки 'светового пера return ButtonHolder: 'определить пустую метку для 'ручки управления return Функция CLNG ---------------------------------------------------------------- Назначение CLNG обеспечивает преобразование в длинное целое Синтаксис y=CLNG(числовое выражение) Комментарий CLNG преобразует числовую переменную или выражение в длинное целое посредством округления дробной части ее аргумента. Если числовое выражение находится вне диапазона от -(2^31) до (2^31)-1 (приблизительно от -2 миллиардов до +2 миллиардов), возникает ошибка 6 периода прогона, Переполнение. Ограничения Числовое выражение, подаваемое в функцию CLNG должно находится в законном диапазоне длинных целых. Различия Этой функции нет в больщинстве Интерпретаторных Бейсиков, поскольку они не поддерживают длинные целые. См. также CDBL , CINT , CSNG , FIX , INT Пример: print clng(2.0E9),clng(33.4),clng(-121.9),clng(100251.6) end Оператор CLOSE ---------------------------------------------------------------- Назначение CLOSE закрывает файл или устройство Синтаксис CLOSE[[#]filenum[,[#]filenum]...] Комментарий CLOSE оканчивает взаимосвязь номера файла и файла, установленного в операторе OPEN, и закнчивает ввод/вывод в этот файл. Буфер файла наполняется и, если filenum представляет файл, а не устройство, команда DOS CLOSE выполняется на нем для обновления каталога. Хороша привычка периодически закрывать файлы, которыe записываются программой. Это дает уверенность в том, что записывается вся информация, а вход этого файла в каталоге операционной системы правильно обновляется в случае последующего сбоя питания или какого-то другого затруднения. CLOSE без спецификации номера файла закрывает все открытые устройства и файлы (то же самое делают RESET, END, STOP и RUN). См.также END , OPEN , STOP , Пример: 'открыть файл назначенный печатающему устройству open "lpt1:" as#1 print#1,"это тест" close#1 open "openfile.one" as#1 open "openfile.two" as#2 print#1, "это тест" print#2, "это тест" close end Оператор CLS ---------------------------------------------------------------- Назначение CLS очищает экран Синтаксис В текстовом режиме CLS очишает экран до цвета фона и обеспечивает позиционирование курсора в исходном положении в левом верхнем углу (ряд 1, колонка 1). CLS в графическом режиме очищает экран до фонового цвета. LPR (ПУТ) оказывается в центре экрана, либо (160,100), либо (320,100), в зависимости от того, является текущий режим средней или высокой разрешающей способности. Если уже был исполнен оператор VIEW, CLS очищает только обзорно-приемное окно. Чтобы стереть весь экран, сначала воспользуйтесь VIEW без аргументов для выключения обзорного окна, а затем CLS-для очистки экрана. См. также COLOR , SCREEN , VIEW Пример: 'cls очищает экран до фонового цвета print "Это тест оператора CLS" input "Нажать для очистки экрана...",Empty$ color 10,1 cls end Опертатор COLOR (графический тип) ----------------------------------------------------------------- Назначение Опертатор COLOR графического типа устанавливает цвет при выполнении графическитх операций. Синтаксис Для SCREEN 1: COLOR [background] [,[palette]] ЭКРАНа ЦВЕТ [фоновый] [набор] Для SCREENs 7,8,9,10: COLOR [foreground] [,[background]] ЭКРАНов 7,8,9,10 ЦВЕТ [основной] [фоновый] Комментарий background это целое выражение в диапазоне от 0 до 63, определяющее цвет фона на котором высвечиваются символы и строятся графи- ческие объекты; palette это целое выражение в диапазоне от 0 до 1, которое выбирает один из двух цвето- вых наборов; foreground это целое выражение в диапазоне от 1 до 15, которое определяет основной цвет, т.е. цвет, которым высвечиваются симво- лы и графические объекты. Аргументы этой команды определяют фоновый цвет экрана и палитру из четырех цветов, которые будут использоваться в последующих чертежных операторах. После того, как вы уже определили палитру и цвет фона с помощью оператора COLOR, цвет отдельных обьектов попадает под управление различных команд графики (CIRCLE,LINE и т.д.). В режиме высокой разрешающей способности на Цветном Графическом Адаптере единственными возможными цветами являются черный и белый. Следовательно опе- ратор COLOR не имеет значения в этом режиме и попытка его использования приводит к ошибке 5 периода прогона, Вызов незаконной функции. SCREEN 1 Фон 0-255: фактически используемый цвет фона есть фон MOD16. Следовательно фон 0 и 16 дают один и тот же результат. Палитра 0-255: выбирается заранее определенная палитра, как показано на ниже ----------------------------------------------- цвет палитра 0 палитра 1 ----------------------------------------------- 1 зеленый зелено-голубой 2 красный пурпурно-красный 3 коричневый белый ----------------------------------------------- Четными числами обеспечивается выбор палитры 0, а нечетными -палитры 1 по умолчанию. Палитра 0 дает вашей программе возможность создавать обьекты в зеленом, красном, коричневом цветах. Палитрой 2 предлагаются цвета зелено-голубой (циановый), пурпурно-красный(анилиновый) и белый. ЭКРАН 7 и 8 Только EGA. Цвета зависят от текущего набора. Основной цвет 1 -15. Выбранный цвет используется при написании символов и построении графиков. Фонофый цвет 0 -15. Выбирает цвет фона на котором пишутся символы и строятся графики. ЭКРАН 9 Основной цвет 1 -15. Выбранный цвет используется при написании текста и построении графиков. Если в вашем EGA только 64К памяти для установки цвета поль- зуйтесь значениями из диапазона 1- 3. Фонофый цвет 0 -63. Выбирает цвет фона на котором пишутся символы и строятся графики. ЭКРАН 10 Основной цвет 1 - 3. Выбранный цвет используется при написании текста и построении графиков. 1 = черный, 2 = слабый, 3 = интенсивный. Использование 0 для основного цвета приводит к ошибке "Illegal Function Call" ("Неправильный вызов функции"). Для изменения атрибутов по умолчанию используйте оператор PALETTE. Фонофый цвет 0 -63. Выбирает цвет фона. Примечание: 0 является фоновыфм цветом для любого набора цветов, определенного в данном операторе, ос- новной цвет по умолчанию устанавливается с максималь- ным значением. Ограничения В режиме ЭКРАНа 2 оператор COLOR приводит к ошибке выполнения 5 "Illegal Function Call" ("Неправильный вызов функции"). Пример: 'Данная программа демонстрирует работу оператора 'COLOR в графическом режиме. 'Переключить экран в графический режим со средней 'разрешающей спрособностью и установить цветовой на- 'бор 0 SCREEN 1 COLOR ,0 FOR Radius% = 1 to 20 'увеличить размер круга Color% = Radius% MOD 4 'вычислить цвет дисплея CIRCLE (160,100), Radius%, Color% 'показать на экране NEXT Radius% 'круг с центром в точке 250.150 delay 2 COLOR ,1 'изменить набор цветов delay 2 'установить набор цветов и фоновый цвет, 'очистить экран COLOR 6,1:CLS 'построить красный кртуг в середине экрана CIRCLE (160,100), 50, 2 delay 2 END Опертатор COLOR (текстовый тип) ----------------------------------------------------------------- Назначение Опертатор COLOR устанавливает текстовый цвет. Синтаксис COLOR [foreground] [,[background] [,[border]] ЦВЕТ [основной] [фоновый] [граница] Комментарий foreground это целочисленное выражение от 0 до 31, определяющее цвет символов; background это целочисленное выражение от 0 до 7, определяющее цвет фона; border это целочисленное выражение от 0 до 15, определяющее цвет на границе ос- новного и фонового цветов. Если какой-либо из названных параметров выйдет за пределы указанных диапазонов произойдет ошибка вы- полнения 5 "Illegal Function Call" ("Неправильный вызов функции"). Для стандартных видеоадаптеров типа CGA ваш выбор основных цветов должен быть следующим: 0 - черный 8 - серый 1 - синий 9 - голубой 2 - зеленый 10 - светлозеленый 3 - зелено-голубой 11 - светлозелено-голубой 4 - красный 12 - светлокрасный 5 - пурпурно-красный 13 - светлопурпурно-красный 6 - коричневый 14 - желтый 7 - белый 15 - интенсивно белый Символы могут мигать на экране, для этого необхо- димо установить параметр основного цвета увеличенным на 16. Например, если установим foreground = 22, то получим мигающие коричневые символы (22 = 6 + 16). В случае монохромных адаптеров, которые не дают цветного изображения, соответствующие значения для установки основного цвета интерпретируются следуюшим образом: 0 - черный 1 - подчеркивание 2-7 - белый 8 - черный 9 - интенсивное подчеркивание 10-15 - интенсивный 16 - черный 17 - подчеркивание черным цветом 18-23 - мигание 24 - черный 25 - высокая интенсивность подчеркивания, мигание 26-31 - высокая интенсивность, мигание Значения фонового цвета от 0 до 6 при монохромном адаптере дают черный фон, 7 - белый. Усовершенствованные графические адаптеры (EGA) и Видео-графические адваптеры (VGA) с усовершенствован- ными мониторами позволяют использовать 16 цветов из набора в 64 цвета (см. PALETTE). Примечание: На любом Адаптере литеры становятся невидимыми, когда передний фон равен заднему фону. Ограничения Пограничный параметр не дает эффекта в случае EGA или VGA с усовершенствованным монитором. Пример 'Данная прграмма демонстрирует оператор COLOR как в 'текстовом, так и в графическом режиме. 'показать на экране таблицу атрибутов FOR Back% = 0 to 7 FOR Fore% = 0 to 15 COLOR Fore%, Back% PRINT USING " ### ";Back%*16+Fore%; NEXT Fore% PRINT NEXT Back% PRINT FOR Back% = 0 to 7 'показать на экране таблицу 'всех атрибутов c миганием FOR Fore% = 16 TO 31 COLOR Fore%, Back% 'установить цвет экрана PRINT USING " ### ";Back%*16+Fore%-16; NEXT Fore% PRINT NEXT Back% END Оператор COM(n) ---------------------------------------------------------------- Назначение Оператор COM(n) управляет срабатыванием ловушки серийных портов. Синтаксис COM(n){ON|OFF|STOP} Комментарий n - есть номер коммуникационного адаптера, где применяется ловушка (1 или 2). Оператор COM(n) ON позволяет применять ловушку при помо- щи программы, описанной в операторе ON COM(n). После COM(n) ON, ТУРБО БЕЙСИК проверяет выполнение каждого оператора для выяснения поступления знаков на указанный серийный порт. Если выясняется, что такое срабатывание произошло, он вызывает описанную в операторе ON COM(n) подпрограмму. Если COM(n) находится в OFF, активность в серийном порте игнорируется. Прерывание связи прекращается после оператора COM(n) STOP; однако, любая активность запоминается, в случае вы- полнения оператора COM(n) ON происходит незамедлительное срабатывание ловушки. Для увеличения или уменьшения размера буфера COM исполь- зуйте метаоператор $COM . См. также ON COM(n) Пример ' Демонстрируется оператор COM(n). Примечание. ' Данная программа ничего не покажет, если ваш ' port COM1 не получит ввода ON COM(1) GOSUB GetCominput ' Установите программу для ' обработки ввода COM DIM ComPortinput (5 * 1024) ' Назначить массив в 5К для ' сохранения ввода HeadPtr%=0 ' Назначить указатель (пойнтер) в следу- ' ющее доступное пространство буфера COM(1) ON ' Включить ловушку COM $COM1 1024 ' Установить буфер ввода в 1К OPEN "com1" AS # 1 ' Открыть переменную файла COM1 PRINT "Press any key to terminate the program..." WHILE NOT INSTANT ' Пока не нажата клавиша... IF TailPtr% <> HeatPtr% THEN ' Если буфер не пустой PRINT "COM Port input: "; ComPortInput (TailPtr%) 'Показать ввод. TailPtr% = TailPtr% + 1 ' Перейти к следующей ' ячейке буфера END IF LOCATE 2,1 PRINT TIME$ WEND END 'конец программы ' обработать прерывание порта COM GetComInput: ' считать ввод с буфера порта COM INPUT# 1,ComPortInput (HeadPtr%) ' указать следующую ячейку буфера HeadPtr% = HeadPtr% + 1 ' конец ввода порта COM RETURN Оператор COMMON ---------------------------------------------------------------- Назначение COMMON (т.е. "общие") объявляет одну или более переменных, подлежащих передаче в присоединяемый цепочечный .TBC-модуль. Синтаксис COMMON переменная [, переменная] ... Комментарий Переменная - это массив или скалярная переменная, которая должна быть сделана доступной в последующем присоединяемом .TBC-модуле. Массивы специфицируются посредством числа размерностей в скобках после имени. Операторы COMMON могут записываться в любом мемте программы и их может быть более одного, однако каждая переменная может появиться в них лишь однажды. Соответствующие операторы COMMON должны появляться и в присоединяемом .TBC-модуле. Имена переменных, использу- емых в операторе COMMON, не имеют значения, но их количество и тип важны. Если переменные, заявленные как общие в возбуж- дающей программе не совпадают по типу и количеству с пере- менными, заявленными как общие в принимающей программе, то генерируется ошибка стадии выполнения. Различия ТУРБО БЕЙСИК не поддерживает оператора CHAIN ALL, обеспечи- ваемый интерпретатором БЕЙСИК. Каждую переменную, общий доступ к которй должны иметь связываемые в цепочку программы, вы должны заявлять непосредственно. При специфицировании в ТУРБО БЕЙСИКе в качестве общей переменной массива, необходимо специ- фицировать число размерностей этого массива. В интерпретаторе БЕЙСИК совпадающие COMMON не требуются, поскольку COMMON в нем, в отличие от ТУРБО БЕЙСИКа, необходимы только из CHAIN, а внутрь CHAIN в них нет необходимости. ТУРБО БЕЙСИК требует, чтобы переменные в каждом опрераторе COMMON были правильно упорядочены, т.е. имена переменных в главном и цепочечном модуле могут отличаться, но типы переменных должны совпадать. Правильным является следующее употребление COMMON: 'Главная программа COMMON i%, Array(1), j# . . . . . . . . 'Цепочечный модуль COMMON Integer%, RealArray(1), Double# . . . . . . . . Пример ' Данные программы демонстрируют оператор COMMON ' Для выполнения данной программы необходимо: ' (1) скомпилировать первую программу в файл .EXE . ' (2) скомпилировать вторую программу в файл .ТВС ' (3) выполнить первую программу на подсказке DOS ' Программа MASTER. ' Скомпилируйте эту программу в файл .EXE DIM OldArray$(1) 'объявить массив двух строк OldArray$(0) = "This is the first string fn the array" OldArray$(1) = "This ts the second string fn the array" OldInteger% = 12345 OldLongInt% = 123450000 OldSingLePre! = 12345.12345 OldDoubLePre# = 1.OE+300 ' описать переменные, которые являются общими для главной и подчиненной программ COMMON OldArray$(1), OldInteger%, OldLongInt&,_ OldSinglePre!, OldDoudlePre# CHAIN "SLAVE.TBC" 'цепочка для подчинения программы END 'закончить программу ' Программа SLAVE. ' Cкомпилировать данную программу в файл .ТВС COMMON NewArray$(1), Newinteger%, NewLongInt,_ NewSinglePre!, NewDoudlePre# PRINT NewArray$(0) PRINT NewArray$(1) PRINT NewInteger%, NewLongInt&, NewSinglePre!,_ NewDoublePre# Функция COS ----------------------------------------------------------------- Назначение Функция COS возвращает тригонометрический косинус Синтаксис y = COS (numeric expression) Коментарий numeric expression есть угол, выраженный в радианах. (См. о радианах в описании функции ATN). Функция COS возвращает значение удвоенной точности. См. также ATN , SIN , TAN Пример 'Данная программа демонстрирует функцию COS PI# = ATN(1) * 4 FOR I% = 0 TO 360 STEP 45 PRINT USING "The Cosine of ### degrees = ##.###";_ I%, COS(PI#/180 * I%) NEXT I% END Функция CSNG ---------------------------------------------------------------- Назначение Функция CSNG преобразует численые выражения в его эквивалент с одинарной точностью. Синтаксис Y = CSNG (numeric expression) Комментарий Функция CSNG преобразует численную переменную или выражение в форму с одинарной точностью с плавающей запятой Функция CSNG обычно используется для профилактики промежуточного переполнения при обработке целочисленных операнд. См. также CDBL , CINT , CLNG Пример PRINT CSNG(&HFFF), CSNG(13241.1324), CSNG(&HF000) Функция CSRLIN ---------------------------------------------------------------- Назначение Функция CSRLIN возвращает текущее вертикальное положение курсора (номер строки). Синтаксис Y = CRLIN Комментарий Функция CSRLIN возвращает целое число от 1 до 25, представляя текущее вертикальное положение (номер строки) курсора. Для считывания горизонтального положения курсора (номер колонки) используйте функцию POS. Оператор LOCATE перемещает курсор в специальную строку и колонку. См. также LOCATE , POS Пример Col = POS ' записать строку курсора Row = CRLIN ' записать колонку курсора CLS LOCATE Row,Col 'восстановить положение курсора END Функции CVI,CVL,CVS,CVD ---------------------------------------------------------------- Назначение функции CVI,CVL,CVS,CVD преобразуют символьные данные, считываемые с файлов с произвольной организацией, в численные данные. Синтаксис Y% = CVI (2 - bite string) Y% = CVL (4 - bite string) Y% = CVS (4 - bite string) Y% = CVD (8 - bite string) Комментарий CVI преобразует 2-байтную строку в целое число. CVL преобразует 4-байтную строку в длинное целое число. CVS преобразует 4-байтную строку в значение с одинарной точностью. CVD преобразует 8-байтную строку в значение с двойной точностью. Из-за специфики работы ТУРБО БЕЙСИКа с файлами с произвольной организацией, численные значения должны транслироваться в символьные до того, как они будут записаны на диске, а при считывании файла они будут транслироваться обратно в числа. Не путайте эти функции (которые предназначены строго для обработки файлов с произвольной организацией) с функцией VAL, которая берет строку типа "3.7" и преобразует ее в численный вид. См. также MKD$ , MKI$ , MKL$ , MKS$ Пример см. FIELD Функции CVMD, CVMS ---------------------------------------------------------------- Назначение Функции CVMD и CVMS преобразуют символьные переменные, считываемые с файлов с произвольной организацией с формата Microsoft, в численный вид. Синтаксис y! = CVMS (4 - byte string) y# = CVMD (8 - byte string) Комментарий CVMS (ConVert Microsoft Single) преобразует 4-байтную строку, представляющую значение с одинарной точностью в формате Micvosoft, в значение с одинарной точностью в фор- мате IEEE ТУРБО БЕЙСИКа. CVMD (ConVert Microsoft Double) преобразует 8-байтную строку, представляющую значение с удвоенной точностью в формате Microsoft, в значение с удвоенной точностью в фор- мате IEEE ТУРБО БЕЙСИКа. Эти функции обеспечиваются только для совместимости с существующими файлами с произвольной организацией Интерпре- татора БЕЙСИК. Пример ' открыть файл с произвольной выборкой OPEN "CVMSD.DTA" AS #1 LEN = 12 FIELD #1, 4 AS Single$, 8 AS Double$ FOR I% = 1 TO 5 ' записать некоторые данные в файл ' преобразовать данные LSET Single$ = MKMS$ (I%) LSET Double$ = MKMD$ (I%-1) PUT #1,I% ' и записать их в файл NEXT I% FOR I% = 1 TO 5 ' считать данные файла GET #1,I% ' показать данные на экране PRINT CVMS (Single$), CVMD (Double$) NEXT I% CLOSE #1 'закрыть файл END Оператор DATA ---------------------------------------------------------------- Назначение Оператор DATA объявляет константы для операторов READ. Синтаксис DATA constant [,constant]... Комментарий constant - это численная или символьная постоянная. Численные константы могут быть целыми числами или с плаваю- щей запятой и могут факультативно быть выражены в шестнадцатеричных или восьмеричных значениях. Символьные константы не берутся в кавычки, если они не содержат огранчителей (запятых или двоеточий) или значимых пробелов, и их можно легко спутать с численными константами. Например: DATA Taco,.79,Chicken Supreme,2.29,"Dr.Pepper,large",.89 Программа может содержать много операторов DATA и они не должны распологаться в последовательных строках. каждая может включать столько констант, сколько может поместиься в строке. Во время выполнения программы операторы READ обращаются к константам DATA слева направо и сверху вниз в порядке по- явления их в исходной программе. Наиболее частой ошибкой, связанной с операторами DATA и READ, является "срыв синхро- низации" и попытка загрузить символьные данные в численную переменную (это генерирует ошибку выполнения 2). Команда RESTORE позволит вам повторно считать константы из первого оператора или любого описанного оператора DATA . Если вы попытаетесь использовать READ большее количество раз, чем количество констант, содержащихся в вашей программе, произойдет ошибка выполнения 4, Out of data (вне данных). Ограничения Нельзя использовать знаки, подчеркивающие непрерывность, в операторах DATA. Не используйте апострофа (') для комментирования опера- тора DATA, потому что ТУРБО БЕЙСИК подумает, что последняя величина и ваш комментарий являются частью одной длинной символьной константы. Например: DATA cats,dogs,tigs ' список названия животных интерпритируется как содержащая три символьных константы: "cats" , "dogs" and "pigs ' список названия животных "; Вы можете, однако, совершенно безопасно использовать для этой цели : REM : DATA cats,dogs,pigs :REM list the animals См. также READ , RESTORE Пример ' Данная программа демонстрирует использование ' операторов DATA и READ. SUB ProcessResults (StudentName$, StudentAverage%) LOCAL Total%, Value%, I% Total% = 0 READ StudentName$ FOR I% = 1 TO 10 READ Value% Total% = Total% + Value% NEXT I% StudentAverage% = Total%\10 END SUB FOR Student% = 1 TO 3 CALL ProcessResults (Name$, Average%) PRINT USING "&,average is ###"; Name$, Average%" NEXT Student% END 'закончить программу DATA W.Perry, 78,65,35,79,86,93,79,85,99,96 DATA P.Watson, 98,94,70,88,99,100,75,96,100,95 DATA M.Ciccone, 65,59,75,82,56,79,82,76,69,89 Системная переменная DATE$ ---------------------------------------------------------------- Назначение DATE$ устанавливает и отыскивает системную дату Синтаксис DATE$ = s$ (set date according to information in s$) ( установить дату по информации в s$ ) s$ = DATE$ (s$ now contains date informetion) ( теперь s$ содержит информацию о дате ) Комментарий Назначение строго форматированного символьного значения системной переменной DATE$ символьной переменной делает системную дату доступной для обработки. DATE$ возвращает 10-знаковую строку в виде mm-dd-yyyy, где mm - представляет месяц, dd - день, а yyyy - год. Для изменения даты, ваша строка должна форматировать дату одним из следующих способов: mm-dd-yy mm/dd/yy mm-dd-yyyy mm/dd/yyyy Например DATE$ = "10-25-86" устанавливает системную дату 05 октября 1986 года. Ограничения Год, назначаемый системной переменной DATE$, должен находиться в прeделах диапазона 1980 - 2099. См. также TIME$ Пример 'Покажите текущую системеую дату на экране PRINT "The current system date is" DATE$ INPUT "Enter then new date in then form MM-DD-YY";NewDate$ DATE$ = NewDate$ PRINT "The system date is now set to" DATE$ END Оператор DECR ---------------------------------------------------------------- Назначение Оператор DECR дает отрицательное приращение переменной Синтаксис DECR variable [,size] Комментарий variable - это численная переменная, а size - это необязательное числовое выражение, которое указывает на значение, которое должно быть вычтено из variable. Если size опускается, используется 1. DECR - удобный способ отрицательного приращения переменной. Для приращения переменной используйте оператор INCR. См. также INCR Пример I% = 15 ' инициализировать счетчик переменных J% = 500 WHILE I% > 0 PRINT I%,J% 'показать значение DECR I% 'уменьшить значение на 1 DECR J%, 5 'уменьшить значение на 5 WEND END 'закончить программу Оператор DEF FN/END DEF ---------------------------------------------------------------- Назначение DEF FN/END DEF определяет функцию. Синтаксис Из одной строки DEF FNidentifier[(argument list)] = expression Из нескольких строк DEF FNidentifier [(argument list)] [LOCAL variable list] [STATIC variable list] [SHARED variable list] . . . statements . [EXIT DEF] [FNidentifier = expression] END DEF Комментарий identifier есть уникальное имя, которое должно ассоциироваться с функцией, и должно соответствовать условиям присвоение имени меткам и переменным (т.е. буква за которой следует любое колличество букв и/или цифр). argument list есть необязательная, отделенная запятыми последовательность формальных параметров. Параметры в списке аргументов служат только для определения функции: они не имеют никакого отношения к другим переменным в программе с таким же названием. DEF FN и END DEF берут в скобки и присваивают имя группе подпрограммных операторов, называемых функцией. Функции могут быть факультативно переданы один или более аргументов по значению. Функции возвращают значение (тип которого контролируется именем функции, как будто это переменная) и могут по этому вызываться из любого оператора который принемает значение соответствующего типа. Определение функции и ход программы. Положение определений функции несущественно. Функция может быть определена в 1 строке или 1000 строке программы без учета места ее использования; и вам не надо направлять ход программы через функцию как шаг инициализации (как эито требуется в однострочных функциях в Интерпритаторе БЕЙСИК). Компилятор видит ваши определения, где бы они не находились Выполнение программы также не может случайно и в отличие от подпрограмм "распадаться" на функции. Что касается маршрута выполнения программы, определения функций и процедур являются невидимыми. Например: t = FNPrintStuff DEF fnprintStuff PRINT "Printed from within FNPrintStuff" END DEF Когда выполняется данная четырехстрочная программа, сообщение появляется только однажды, т.к. PrintStuff вызывается в первой строчке. Определения функции следует рассматривать как изолированные островки кода; не запрыгивайте на них и не выпрыгиваете обратно при помощи операторов GOTO, GOSUB или RETURN. В рамках определений, однако, такие операторы допустимы. Заметьте, что определения функции и процедуры не могут вкладываться; т.е. недопустимо определять процедуру или функцию в рамках процедуры или функции (хотя определение процедуры или функции может содержать вызовы других процедур или функций). Объявление локальных переменных (только многострочные функции). Для объявления локальных переменных в рамках функции используйте оператор LOСAL перед любым выполняемым оператором в дефиниции. Например: LOCAL a%,b#,bigArray%() создает три локальные переменные: a% и b# (целое число и число с двойной точностью соответственно) и целочисленный массив bigArray. Массив должен быть соответствующих размеров: DIM DYNAMIC bigArray%(1000) Статические и разделенные переменные. По умолчанию, переменные, которые появляются в рамках определений функции имеют аттрибут SHARED, т.е. они являются глобальными по отношению к остальной части программы. Объявляйте переменные с атрибутом STATIC, если важно, чтобы переменная не теряла свое значение с каждым вызовом, а изменена она может быть только в пределах функции. Определение функции из нескольких строк включает обычно назначение идентификатору функции и должно быть прекращено при помощи END DEF. Если вы решили не включать назначение идентификатору функции, тогда значения, возвращенное функцией, бюудет неопределенным. Используйте оператор EXIT DEF для возврата из функции, который находится не в ее конце. См. также LOCAL , SHARED , STATIC Пример $STASK &H7FFF Total = 1 DEF FNFactorial%(I%) ' Данная функция вычисляет факториал I% Total = Total * I% IF I% > 1 THEN Subb% = FNFactorial%(I%-1) END IF FNFactorial% = Total END DEF 'закончить факториал функции PRINT "Input the number you wish to calculate the"; INPUT "factorial of: ",J% PRINT FNFactorial%(J%) END Операторы DEFINT, DEFLNG, DEFSNG, DEFDBL, DEFSTR ---------------------------------------------------------------- Назначение Операторы DEFINT, DEFLNG, DEFSNG, DEFDBL и DEFSTR объявляют тип идентификаторов переменных по умолчанию Синтаксис DEFtype letter range [, letter range].... Комментарий type представляет один из пяти типов переменных ТУРБО БЕЙСИКа : INT, LNG, SNG, DBL и STR. letter range - есть либо одиночный алфавитный символ (от A до Z ), либо диапазон букв (две буквы отделенные друг от друга тире, например: A-M). Оператор типа DEF сообщает компилятору что переменные и определенные пользователем функции, начиная с конкретной буквы или набора букв будут определенного типа. Это дает возможность вам использовать переменные не только с одинарной точностью и плавающей запятой в вашей программе без включения идентификаторов типа (например, %, #). По умолчанию, когда компилятиор находит имя переменной без идентификатора типа, он допускает, что переменная с плавающей запятой и с одинарной точностью. Например: в данном операторе как n так и m являются переменными с одинарной точностью: n = m + 16 Однако если, этому оператору предшевствуют DEFINT n,m тогда n и m обе будут целочисленными переменными, как и любая другая переменная, чье имя начинается с n или m в верхнем или нижнем регистре. Выполнение DEFtype в ТУРБО БЕЙСИКе немного отличается от Интерпретатора БЕЙСИК. Интерпретатор оценивает DEFtype в соответсвии с тем, где оператор DEFtype появляется при выполнеии программы. ТУРБО БЕЙСИК в качестве компилятора рассматривает положение DEFtype в исходном файле. Например, при выполнении данной программы 10 GOTO 30 20 DEFINT A-M 30 j = 45.3 : PRINT j Интерпретатор БЕЙСИК никогда не видит оператор DEFINT в строке 20 когда он встретит j в строке 30, j станет переменной с одинарной точностью и будет напечетано 45.3 . Наоборот, ТУРБО БЕЙСИК принемает решения о введении переменных во время компиляции, без учета маршрута выполнения (о котором во время компиляции он ничего не знает). Он заботится только, чтобы оператор DEFINT появился физически до первого появления переменной j. Таким образом j становится целым числом и печатается 45 . Ограничения Оператор DEFtype переопределит тип любой соответствующей переменной уже использованной в программе. Следующий пример демонстрирует этот тонкий момент. Пример ' назначить значение числу с одинарной точностью I = 2.2 ' показать значение на экране PRINT "Single Precision number"I ' экплизитно объявить переменную с таким же именем ' и такого же типа DEFSNG I PRINT "Single Precision number"I ' эксплизитно объявить переменную с такимже именем ' но другого типа DEFINT I 'напечатать значение новой переменной PRINT "Integer number"I ' все идентификаторы, начиная с буквы от A до C ' будут с двойной точностью до следующего оператора DEF DEFOBL A-C ' все идентификаторы, начиная с буквы от J до Z будут ' целочисленного типа до очередного оператора DEF DEFLNG J-2 ' присвоить значение переменной с удвоенной точностью A = 32767.1 ' присвоить значение длинному целому числу Z = -1 'присвоить значение ранее определенной целочисленной 'переменной I = &H8FFF PRINT "The different types:",A,2,I END 'закончить программу Оператор DEF SEG ---------------------------------------------------------------- Назначение Оператор DEF SEG определяет сегмент данных,который будет использован операторами BLOAD, BSAVE, CALL, ABSOLUTE, PEEK и POKE Синтаксис DEF SEG (=numeric expression) Комментарий численное выражение может варьироваться от 0 до 65535. DEF SEG определяет сегмент памяти, в который последующие операторы BLOAD, BSAVE, CALL, ABSOLUTE, PEEK и POKE определят смещение. Сегмен представдляет собой адресную конструкцию, используемую процессорами семейства Intel86. Адреса должны быть определены двумя целыми числа- ми: сегментом и смещением в сегменте. DEF SEG без аргумента возвращает значение сегмента к его начальному значению по умолчанию. Первые 256 байтов сегмента по умолчанию содержат информацию, используемую системой поддержки выполнения вашей программы. Один интересный адрес находится в смещении &HF4E в данном сегменте. Значения POKE в этом адресе изменяют цвет текста на экране в любом графическом режиме. Цвет зависит от вашего режима. Еще один полезный адрес в сегменте данных по умолчанию находится в ячейке 0 и 1. Это слово содержит сегмент символов ТУРБО БЕЙСИКа. См. также COLOR Пример ' Данная программа заполняет экран буквами А, выполняя ' оператор POKE непосредственно в видео ram. ' Определить функцию, которая определяет адрес видео-памяти ' получить тип видео наборной панели от пользователя DEF FNVideoScreen% LOCAL ScreenType% ' объявить локальную переменную PRINT "Please enter the type of screen yon are using". INPUT "[ 1 for Mono, 2 for Color]:"; ScreenType% SELECT CASE Screen Type% ' назначить результат функции CASE 1 ' на основании ответа пользователя FNVideoScreen% = &HB000 ' монохромная ячейка видео ram CASE 2 FN VideoScreen% = &HB800 ' цветная ячейка видео ram END SELECT END DEF 'закончить функцию ' определить сегмент для POKE и BSAVE DEF SEG = FNVideoScreen% FOR I% = 0 to 4000 STEP 2 POKE I% , ASC("A") 'заполнить экран символами А NEXT I% END Оператор DELAY ---------------------------------------------------------------- Оператор DELAY вставляет паузу. Синтаксис DELAY seconds Комментарий seconds - это численное выражение, указывающее количество секунд паузы ТУРБО БЕЙСИКа перед выполнением следующего оператора. Примечание. Оператор DELAY принимает аргументы с плавающей запятой, мо- гут быть указаны также дробные задержки с разрешением при- близительно в 0,054 секунды. Использование оператора DELAY , а не никчемных программых программных петель, дает нам программы, которые прекрасно работают на машинах с различной скоростью обработки (то есть, с процессором 8088 против 80286 или 6 Мгц против 8 Мгц). Пример PRINT "Press any key to terminate the programm ..." WHILE NOT INSTAT 'до нажатия клавиши LOCATE 10,30 PRINT TIMES 'показать время DELAY 5 'задержать на 5 секунд WEND END 'закончить программу Оператор DIM ---------------------------------------------------------------- Назначение Оператор DIM описывает массивы. Синтаксис DIM {STATIC/DINAMIC} var (subscripts)[,var(subscripts)]... DIM {STATIC/DINAMIC} var(min:max[,min:max]...)[,var[,min:max]]... Комментарий var - это идентификатор, используемый для массива. subskripts - это ограниченный запятыми список из одного или более целочисленных выражений, определяющих размеры массива. Оператор DIM описывает переменные массива и определяет их размер и объем габаритного поля В расширении синтаксиса Интерпретатора БЕЙСИКа, ТУРБО БЕЙСИК дает вам возможность определить диапазоны значений субиндекса (min:max), а не только его верхнюю границу. Например: DIM b(50:60) создает массив 11 элементов с одинарной точностью, под номерами от 50 до 60. Оператор DIM c(50:60,25:45) создает массив с двойным габаритным полем с общим количеством элементов 11*21. Синтаксис диапазона значений может быть расширен для многомерных массивов: DIM binths (1800:1899,1:12) Связанный оператор OPTION BASE может также использоваться для определения самого младшего элемента в массиве, несмотря на то что механизм диапазона более мощный и ему отдается большее предпочтение. ТУРБО БЕЙСИК устанавливает каждый элемент численного массива на 0, когда программа выполняется в первый раз, и устанавливает символьные массивы на нулевую строку (длина = 0). Если программа запускается вновь с помощью оператора RUN , численные массивы устанавливаются в состояние 0 , а символьные массивы на нулевую строку. Если переменная массива используется без предшествующего оператора DIM, максимальное значение его субиндексов по умолчанию будет равным 10, как будто вы включили (10) в оператор DIM . Рекомендуем однако, экплуцитно описывать каждый массив. Минимальное значение, которое можно использовать в качестве субиндекса массива - это 0, если оно не было описано по-другому с помощью оператора OPTION BASE. Необязательные аргументы STATIC и DYNAMIC контролируют соответственно будет ли пространство для массива выделено заранее компилятором или будет распределяться динамически. В случае опущения, массивы переходят по умолчанию к стати- ческому распределению до введения метаоператора $DYNAMIC. Пространство распределяется также динамически, если в операторе DIM используется выражение, в двух операторах DIM появляется имя массива, либо массив объявляется локаль- ным в процедуре или функции. Переключатель проверки границ, доступный через меню Options , заставляет компилятор создавать код, который проверяет субиндексы на соответствие, когда идет ссылка на массив. Различия ТУРБО БЕЙСИК позволяет программисту описать и начальный, и конечный индексы массива. Интерпритатор БЕЙСИК размещает все массивы динамически, а ТУРБО БЕЙСИК попытается разместить массивы статически (во время компиляции), что сделает их более быстрыми. Вы можете эксплуцитно заменить тип размещения. См. также $DYNAMIC , FRE , $STATIC Пример 'константа с именем, определяющая верхнюю границу массива %MaxDim = 20 'константа с именем, определяющая нижнюю границу массива %MinDim = 1 'разместить массив %MaxDim целочисленных элементов DIM Array%(%MinDim:%MaxDim) 'инициализироваить массив со случайными цифрами FOR Count I% = %MinDim to %MaxDim Array%(Count I%) = INT(RND*10) NEXT Count I% END Оператор DO/LOOP --------------------------------------------------------------- Назначение Оператор DO/LOOP представляет собой цикл с тестом для TRUE или FALSE в верхней или/и в нижней части цикла. Синтаксис DO[{WHILE/UNTIL}expression] . . statements [EXIT LOOP] . [LOOP [WEND][{WHILE/UNTIL} expression] Комментарий выражение есть численное выражение, в котором значения, не равные нулю, представляют TRUE, а нулевые значения FALSE. DO и LOOP являются построителями циклов всех видов. Они позволяют вам создавать циклы с тестами для условий завер- шения наверху цикла, внизу, в общих местах, или ни в одном из них. Оператор DO должень всегда быть спаренным с опера- тором LOOP в нижней части цикла. Неудачная попытка спарить DO и LOOP приведет к ошибкам вреиени компиляции. Для дополнения теста в DO/LOOP используйте WHILE и UNTIL. Используйте резервное слово WHILE , если вам необходимо повторить цикл в случае, если выражение - это TRUE, и выйти из него в противном случае. UNTIL вызывает обратный эффект; то есть цикл будет закончен, если условие - TRUE и повторен в случае FALSE . Например: DO WHILE A = 13 . . statements . LOOP выполняет операторы между DO и LOOP до a = 13. В любой точке в DO/LOOP вы можете включить оператор EXIT LOOP. Это эквивалентно выполнению команды GOTO в отношении оператора после выхода из LOOD. (Подробные об этом см. оператор EXIT. Заметьте, что этот DO/LOOP: DO WHILE 2 < b . . . LOOP имеет такой же эффект как этот цикл WHILE/WEND: WHILE a < b . . . WEND Не смотря на то,что компилятор не заботится о таких вещах, зарезервируйте место для операторов между DO и LOOP. Это поможет прояснить структуру цикла. Пример ' Данная программа ждет нажатия клавиши DO LOOP UNTIL INSTAT END Оператор DRAW ---------------------------------------------------------------- Назначение Оператор DRAW производит построения на графическом экране Синтаксис DRAW string expression. Комментарий Оператор DRAW вычерчивает объекты на графическом экране в соответствии с командами, вставленными в символьный аргумент, который переходит к данному оператору. Фактически символьное выражение - это программа для "языка" интерператора DRAW. DRAW выполняет командные строки и создает музыку. --------------------------------------------------------- ДЕЙСТВИЕ КОМАНДЫ --------------------------------------------------------- Un Движение Вверх Dn -------- Вниз Ln -------- Налево Rn -------- Напраыво En -------- Вверх и вправо Fn -------- Вниз и вправо Gn -------- Вниз и влево Hn -------- Вверх и влево n - это расстояние, которое необходимо пройти (см.Sn, фактор масштабирования, следующий за ним). Движение всегда начинается на LPR и соответственно подстраивает LPR. (LPR означает "последнее указание точки", и относятся к последнему указанию точки определенных графопостроительных операторов. Более подробно об этом см. раздел графики в главе 4). Например: DRAW "D10R5" производит построение формы L (вниз 10, вправо 5), начиная с LPR. Он переводит LPR на последний элемент изображения. Mx,y перемещается на координату x,y. Если X сопровождается ведущим плюсом или минусом, перемещение будет относительным, в пиротивном случае оно будет абсолютным. Например: DRAW "D10 R5 M30,50" рисует L из предыдущего, а затем завершает построение перемещением в растровый элемент (30,50). Следущие префиксы могут предшествовать любой команде перемещения: B перемещается, но не производит построения; N перемещается, но возвращается после окончания в первоначальное положение. Например: DRAW "BM 180,20 NU10 ND10 NL10 NR10" перемещается без построения к растровому элементу (180,20), затем рисует знак плюса. Другие команды. An устанавливает угол n. Значение n может варьироваться от 0 до 3, где 0 равняется 0 градусов, 1 равняется 90 градусов, 2 = 180 градусам и 3 = 270 градусам. TAn поворачивает угол n. Значение n варьируется в диапазоне от -360 до +360 градусов. Если n имеет положительное значение, угол вращается против часовой стрелки. Если оно отрицательное - по часовой стрелке. Значения вне диапазона допустимых величин вызывают ошибку выполнения 5, неправельный вызов функции. Заметьте, что TAn не комулятивный. Cn рисует цветное n. Проверьте оператор PALETTE на диапазон n. В каждом режиме дисплея цвет по умолчанию - самый высокий допустимый атрибут. Sn устанавливает масштабный фактор на n/4, где n варьируется от 1 до 255. Например, если n = 8, масштабный фактор = 2. Оператор DRAW увеличивает масштабный фактор посредством аргументов на O,D,L,R,E,F,G,H и релятивные команды М для определения окончательных размеров объектов. По умолчанию для n есть 4, заканчивыается фактором единич- ного масштабирования (то есть отсутсвием масштабирования. Аспектное соотношение используемого вами дисплея определяет отношение между X и Y. На идеальном (несуществующем) дисплее с аспектным соотношением 1/1, пунктирная линия X имеет такуюже длину, как и Y. Однако дисплеи компьютеров ИБМ имеют следующие аспектные соотношения: --------------------------------------------------------------- Монитор/Адаптер Экран 1 Экран 2 Экран 7/8/9 Экран 10 --------------------------------------------------------------- CGA 5/6 5/12 N/A N/A EGA 5/6 5/12 8.76/12 N/A Усоверш. Моно N/A N/A N/A 9.52/12 --------------------------------------------------------------- X VARPTR$(переменная); выполняет подстроку, то есть, выполняет вторую командную строку изнунри первичной строки DRAW. Команда X похожа на GOSUB; например: DRAW "X" + VARPTR$(x$) P color,boundbary (цвет, граница) начинается на текущей координате (X,Y) и заполняет изображение цветом color, прекращая это заполнение в зонах цветовой границы. В каждом случае, аргумент n, X или Y может быть либо константой (как было показано на примерах) или переменной в виде = VARPTR$(переменная); например: DRAW "e15" тоже самое, что a = 15 DRAW "e =" + VARPTR$(a) DRAW игнорирует пробелы в командных строках - вы можете использовать их для того, чтобы сделать ваши программы DRAW более читаемыми. Ограничения ТУРБО БЕЙСИК не идентифицирует имена переменных в строках DRAW. Так, вы должны использовать VARPTR$(n) для выборки содержания переменных во время выполнения программы в рамках строки DRAW . Вместо DRAW "U = I%;" используйте DRAW "U = " + VARPTR$(I%) Пример ' Перейдите в средний разрешающий режим графики SCREEN 1 House$ = "U20 G5 E20 F20 H5 D20 C30" DRAW House$ DRAW "BE3" DRAW "P1,3" FOR I% = 1 TO 280 STEP 40 DRAW "BM = " + VARPTR$(I%) + ",40" DRAW House$ NEXT I% END 'закончить программу