<Допустимое обозначение файла> это допустимое в операционной системе CPM обозначение файла. Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменной, или как результат строкового выражения. Буквенная метка ".BAS" добавляется автоматически, если не задаются другие метки. Если директива SAVE используется без параметра A или P, то бейсик-программа запоминается в промежуточном коде, который вновь может быть загружен с помощью директивы LOAD. Если Бейсик-программа должна быть вставлена с помощью директивы MERGE в другую Бейсик-программу, то необходимо дополнительно задать параметр А. Он вызывает запоминание Бейсик-программы в коде ASCII. Если затем Бейсик- программа должна быть странслирована с помощью Бейсик-компилятора, также следует использовать параметр А. Если Бейсик-программа, подлежащая хранению в памяти, не должна больше изменяться или распечатываться (т.е. должна быть недоступной для других пользователей в смысле просмотра и обработки), то она может быть записана в память в защищенном формате с помощью дополнительного параметра Р. Программа может быть повторно загружена только с помощью директивы LOAD. Пример: SAVE "B:DATEII" SAVE "DATE12",A SAVE "DATE13",P Примечание: Так как каждое строковое выражение переписывается без изменения содержания (маленькие буквы не преобразуются автоматически в большие буквы), допустимые обозначения файлов в директиве LOAD должны всегда состоять только из больших букв. Этим обеспечивается то, что файл позже откликнется в списке файлов, т.к. операционная система СРМ автоматически преобразует все введенные маленькие буквы в большие. Если используется обозначение файла, которое уже задействовано для файла во внешней памяти, то соответствующий файл переписывается без предупреждения. Директива SAVE игнорируется Бейсик- компилятором. 5.12. Директива LOAD С помощью директивы LOAD можно загрузить (и если нужно запустить) бейсик-программу. Формат: LOAD"<допустимое обозначение файла>" [,R] <допустимое обозначение файла> - это допустимое в операционной системе СРМ обозначение файла с буквенной меткой ".BAS". Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменой, или как результат строкового выражения. Директива LOAD проверяет буквенную метку и загружает только файлы с буквенной меткой ".BAS". Директива LOAD закрывает все до данного момента открытые файлы, стирает все переменные и переписывает программу, находящуюся в оперативной памяти. Если используется параметр R, то загруженная программа запускается. Все на данный момент открытые файлы остаются открытымии неизменными в своем состоянии. Бейсик-программы, подлежащие загрузке директивой LOAD, должны быть перед этим записаны в файл с помощью директивы SAVE (см.раздел 5.11.) Примеры: LOAD "DATEI1",R программа загружается из файла "DATEI1" и сразу запускается LOAD "DATEI1.BAS" программа загружается из файла "DATEI1.BAS". Примечание: Директива LOAD может быть использована также как оператор. В совокупности с вариантом R, имеется возможность сформировать цепочку из нескольких программ или программных шагов, т.е. одна программа вызывает следующую и т.д. 5.13. Директива RUN С помощью директивы RUN может быть загружена и запущена Бейсик- программа. Формат: RUN[<номер строки>] или RUN<допустимое обозначение файла> [,R] В первом формате уже загруженная программа обрабатывается с заданного номера строки. Если указание номера строки отсутствует, программа запускается с первой имеющейся строки. Все файлы предварительно переводятся в исходное состояние, т.е. открытые файлы закрываются и стираются буферные области. Во втором формате программа загружается и обрабатывается с первой строки. <Допустимое обозначение файла> это допустимое в операционной системе СРМ обозначение файла с буквенной меткой ".BAS". Его следует или взять в кавычки " " как строковую константу, или оно может бытьзадано в виде строковой переменной, или как результат строкового выражения. Если дополнительный парааметр R не задается, то как в первом формате все файлы предварительно переводятся в исходное состояние, т.е. открытые файлы закрываются и стираются буферные области. При использовании параметра R имеется возможность обрабатывать последующей программой файлы, открытые предшествующей Бейсик-программой. Пример: 10 A%=10 * 10 20 PRINT A% RUN 20 0 OK RUN 100 OK RUN "DATEI1" . . . RUN "B:DATEI2",R PN$="C:DATEI1.BAS" RUN PN$ Примечания: Второй формат может быть использован как оператор. С его помощью можно загрузить в оперативную память программу из другой программы, и выполнить ее. Директива воспринимается Бейсик-компилятором только без варианта "R". Здесь лучше использовать оператор CHAIN (см. раздел 12.5.). В режиме компиляции RUN работает с машинными программами, которые записаны в файлах с буквенной меткой ".COM". Поэтому программа, подлежащая активации, может быть любой программой в машинных кодах. 5.14. Директива MERGE С помощью директивы MERGE к загруженному тексту программы может быть добавлен другой программный текст. Программа, которую нужно добавить, должна быть записана в памяти в формате ASCII (с помощью варианта а оператора SAVE) (см. раздел 5.11.). Формат: MERGE <допустимое Oбозначение файла> <допустимое обозначение файла> это допустимое в операционной системе СРМ обозначение с буквенной меткой ".BAS". Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменной, или как результат строкового выражения. Директива MERGE предполагает, что текст программы представлен в коде ASCII. Директива проверяет буквенную метку и учитывает только файлы с буквенной меткой ".BAS". Если в тексте программы, подлежащей добавлению, встречаются номера строк программы, которые уже содержаться в имеющейся программе, то первоначальные строки заменяются новыми строками. После обработки директивы вновь устанавливается директивный режим. Активация модефицированной программы может быть осуществлена только с помощью директивы RUN (см. раздел 5.13.) Пример: LOAD "DATEI1" OK MERGE "DATEI2" OK RUN Примечание: Директива MERGE может также стоять в строке программы. Эта директива особенно полезна тогда, когда часто используемый текст программы должен вставляться в новую программу. С ростом опыта, программист должен формировать "библиотеку подпрограмм и текстов". С использованием соответствующей документации, за счет этого может быть достигнута высокая производительность при разработке программ. Директива MERGE игнорируется Бейсик-компилятором. 5.15. Директива FILES С помощью директивы FILES список файлов может быть выведен на экран дисплея. Формат: FILES [<допустимое обозначение файла>] <допустимое обозначение файла> это допустимое в операционной системе СРМ обозначение файла. Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменной, или как результат строкового выражения. Примеры: FILES - на экран выводятся все имеющиеся в актуальном логическом блоке файлы. FILES "*.BAS" - на экран выводятся все имеющиеся в актуальном логическом блоке файлы с буквенной меткой ".BAS". FILES "B:*.BAS" - на экран выводятся все имеющиеся в логическом блоке в: файлы с буквенной меткой ".BAS". FILES BEZ$ - сообщается, имеются ли в актуальном логическом блоке файлы, отобранные по содержимому строковых переменных. 5.16. Директива KILL Спомощью директивы KILL файлы могут быть стерты. Формат: KILL <допустимое обозначение файла> <допустимое обозначение файла> это допустимое в операционной системе СРМ Oбозначение файла. Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменной, или как результат строкового выражения. Пример: KILL "DATEI.BAS" 5.17. Директива NAME С помощью директивы NAME переименовываются файлы. Формат: NAME <допустимое обозначение файла> AS <допустимое обозначение файла> <допустимое обозначение файла> это допустимое в операционной системе СРМ обозначение файла. Его следует или взять в кавычки " " как строковую константу, или оно может быть задано в виде строковой переменной, или как результат строкового выражения. Первое обозначение, это имя файла, подлежащего переименованию, а второе обозначение является новым выбранным именем этого файла. Пример: NAME "B:DATEI1" AS "DATEI2.BAS" NAME "DATEI3.BAS" AS "DATEI03". Примечание: Директива NAME может быть успешно использована как оператор. Директивы TRON и TROFF вызывают включение и выключение программы TRACING, т.е. программы трассировки. Директивы служат для обеспечения тестирования программ. Формат: TRON TROFF С помощью TRON включается TRACING. Трассировщик выводит на экран дисплея номера строк программы в фактической последовательности их интерпретации; номера обработанных строк программы заключаются в скобки [ ] . С помощью TROFF программа TRACING может быть вновь выключена. Пример: 10 K%=10 20 FOR J%=1 TO 3 30 L%=K%+10 40 PRINT J%;K%;L% 50 K%=K%+10 60 NEXT J% 70 END TRON OK RUN [10] [20] [30] [40] 1 10 20 [50] [60] [30] [40] 2 20 30 [50] [60] [30] [40] 3 30 40 [50] [60] [70] OK TROFF OK RUN 1 10 20 2 20 30 3 30 40 ок Примечание: Директивы TRON и TROFF могут также использоваться в программе как операторы, если нужно получить распечатку номеров интерпретированных строк для определенного раздела программы. Следует учесть, что выведенные номера строк мешают формированию изображения на экране. Режим TRACE после использования оператора TRON остается включенным до тех пор, пока не будет выполнен оператор TROFF или NEW (см. раздел 5.1.). Чтобы эту директиву можно было использовать в Бейсик-компиляторе, следует проводить компилирование с вариантом /D. В других случаях операторы игнорируются и компилятор выводит предупреждение. 6. Константы в языке Бейсик Константы, это постоянные величины, используемые в Бейсик-программе, которые при выполнении программы не изменяются. В языке Бейсик различают: - числовые константы - строковые константы Числовые константы, содержащие менее 8 цифр, или имеющие десятичную экспоненту с буквой Е, или заканчивающиеся восклицательным знаком ! - Являются числовыми константами простой одинарной точности. Их внутреннее изображение выглядит следующим образом: целые числа N, лежащие в диапозоне -32768 <= N <= 32767, изображаются в виде двухбайтных двоичных чисел. Все остальные числовые константы одинарной точности, лежащие в диапозоне от ABS(10E-38) до ABS(10E+38), изображаются в виде четырехбайтного двоичного числа, если допускается число без потери точности; в противном случае происходит представление числа в форме с плавающей запятой. Числовые константы, содержащие более 7 цифр, или имеющие десятичную экспоненту с буквой D, или заканчивающиеся знаком #, являются числовыми константами двойной точности. Они представляются в виде 8-байтного числа с плавающей запятой. Все числовые константы могут использоваться как шестнадцатеричные числа в форме &HN...N или как восьмеричные числа в форме &0N...N или &N...N. Шестнадцатеричные константы могут лежать в диапазоне от H0000 до HFFFF. Во внутреннем изображении они представляют собой INTEGER-константы и имеют при изображении следующие десятичные эквиваленты: &H0000...&H7FFF 0...+32767 &H8000...&HFFFF -32768...-1 Восьмеричные числа могут лежать в диапазоне от 0 до 177777. Во внутреннем изображении они представляют собой INTEGER-числа и также обрабатываются. При изображении они имеют следующие десятичные эквиваленты: &0000000...&0077777 0...+32767 &0100000...&0177777 -32768...-1 Строковые константы могут быть длиной максимум 255 знаков. Они заключаются в кавычки " ". Примеры: Числовые константы простой точности 44.3 20.51 -1.078Е-07 Числовые константы двойной точности 1234567890 12345.678901 20.5# -1.078DD-07 Шестнадцатеричные константы &H2A70 &HCABI Восьмеричные константы &012345 &12345 Строковые констнанты "строковые константы" "123.45 MARK" 7. Переменные в языке Бейсик 7.1. Обозначения переменных и определенные декларации типов Переменные это программные величины, значения которых в программе могут изменяться. Они идентифицируются именами. В языке Бейсик различают: - числовые переменные - строковые переменные - указатели функций Обозначения переменных образуются с помощью максимум 40 обозначающих знаков. Они всегда начинаются с буквы, за которой могут следовать буквы, цифры или точка. Обозначения переменных могут заканчиваться одним из знаков: $, %, !, или #. Это означает: $ обозначение строковой переменной, например А10$ % обозначение INTEGER-переменной (2-байтной), например I% ! Обозначение REAL-переменной простой точности (4-байтной) например R17! ("!" Может быть опущен) # обозначение REAL-переменной двойной точности (8-байтной) например ALPHA#. Обозначения переменных, которые начинаются с "FN", являются обозначениями функций. Простые числовые и строковые переменные определяются котекстно, т.е. они обЪявляются имплицитно с их первым использованием. Примеры: Правильные обозначения AI$ 15% DIAB# BEZ BEZ! ENDWERT Неправильные обозначения 1A$ - (обозначение переменной всегда начинается с буквы) A$1 - (буквенная метка переменной всегда стоит в конце) FN# - последовательность знаков FN является зарезервированной, в качестве обозначения переменной использоваться не может END - недопустимое обозначение, т.к. END в языке Бейсик является зарезервированным словом. 7.2. Операторы описания DEFIND, DEFSNG, DEFDBL и DEFSTR для имплицитной декларации типа С помощью операторов DEFINT, DEFSNG, DEFDBL, DEFSTR возможна имплицитная декларация типа обозначений переменных. За счет этого выпадают специальные знаки окончания обозначений переменных (%,!,# И $), которые обычно стандартным образом определяют тип переменной в Бейсик-программах. Формат: DEFINT <знак> [-<знак>] [,<знак>[-<знак>]]... DEFSNG <знак> [-<знак>] [,<знак>[-<знак>]]... DEFDBL <знак> [-<знак>] [,<знак>[-<знак>]]... DEFSTR <знак> [-<знак>] [,<знак>[-<знак>]]... Примеры: 10 DEFINT I-N, W-Z 20 DEFDBL A-C 30 DEFSTR R,T 40 R="DAS IST EIN STRING". 50 A=10/3 60 I=10/3 70 PRINT I 80 PRINT A 90 PRINT R RUN -3 3.333333333333333 DAS IST EIN STRING. OK Примечания: Имплицитные декларации типов должны нахдится в начале программы. Они действительны в течение всего времени выполнения программы. Использование явных и неявных деклараций типов может происходить смешанно. При этом эксплицитные (явные) декларации типов имеют преимущество, т.е. если имя переменной при неявной декларации типа содержит дополнительную буквенную метку, которая отличается от декларации, то эта метка имеет приоритет. Например: DEFINT X-Z. В этом случае такие обозначения, как X, YPSYLOG, ZEIT$ используются как INTEGER- переменные. Но обозначение переменной ZEIT$ интерпретируется как строковая переменная, хотя здесь есть кажущееся совпадение имен с INTEGER- переменными. Рекомендуется не использовать имплицитную декларацию типа в практике программирования. С точки зрения современной методики программирования, она приводит к более высокой частоте появления ошибок и к плохим текстовым условиям. Ее рекомендуется использовать в тех случаях, если или выдвигаются экстремальные требования касающиеся об'ема памяти, т.к. из-за отсутствия буквенных меток сокращается текст программы, или если в программе и без этого должен использоваться только один определенный тип переменной. При работе Бейсик-компилятора эти операторы обрабатываются статически. Это означает, что они эффективны с того момента, как компилятор опознал в тексте программы оператор DEF???. Обход этих операторов, например с помощью оператора GOTO , как в Бейсик-интерпретаторе, в компиляторе невозможен. 7.3.Оператор описания для функции DEF FN С помощью оператора описания DEF FN определяются отдельные функции. Формат: Описание: DEF FN <название функции> [(<формальный параметр> [,<формальный параметр>]...)] =<выражение функции> Вызов: <название переменной>= FN <название функции> [(<актуальный параметр> [,<актуальный параметр>]...)] Описание функции должно всегда происходить перед ее первым вызовом. Это означает, что номер строки оператора описания функции всегда должен быть меньше, чем номер строки оператора, в котором вызывается описываемая функция. Перед названием функции ставятся буквы FN. Они образуют интегрированную постоянную часть описания функции. Тип функции задается с помощью последнего знака названия функции или с помощью имплицитной декларации типа. Список параметров содержит названия формальных переменных, которые используются для формулирования выражения функции. При вызове функции формальные параметры заменяются актуальными переменными. Это не приводит к ошибке, если в остальной части программы используются названия переменных, которые также используются как формальный параметр в определении функции. Выражение функции строится в соответствии с синтаксическими правилами языка бейсик для выражений соответствующего типа. При этом сама функция может использоваться рекурсивно. Все определение функции не должно превышать длину, равную 255 знакам. Пример: 10 DEF FNPYT!(A!,B!)=SQR(A!^2+B'^2) 20 Z!=3 30 Y!=4 40 C!=FNPYT!(Y!,Z!) 50 PRINT C! RUN 5 OK Следующий пример показывает строковую функцию, которая преобразует большие буквы в малые (ST%=-1) или малые в большие (ST%=+1). При этом показано, как могут быть реализованы логические решения в отдельной функции. 10 DEF FNGKKG$(Z$,ST%)=CNR$(ASC(Z$)- 32*((ST%=1)*(Z$>="A'")*(Z$<="Z'")-(ST%=-1)* (ZS>="A")*(Z$<="Z"))) 20 PRINT "GROSSE BUCHSTABEN IN KLEINE BUCHSTABEN" * 30 PRINT "A";FNGKKG$ ("A",-1) 40 PRINT "Z";FNGKKG$ ("Z",-1) 50 PRINT "A'";FNGKKG$ ("A'",-1) 60 PRINT "Z'";FNGKKG$ ("Z",-1) 70 PRINT "KLEINE BUCHSTABEN IN GROSSE BUCHSTABEN " ** 80 PRINT "A";FNGKKG$ ("A",1) 90 PRINT "Z";FNGKKG$ ("Z",1) 100 PRINT "A'";FNGKKG$ ("A'",1) 110 PRINT "Z'";FNGKKG$ ("Z'",1) 120 END RUN GROSSE BUCHSTABEN IN KLEINE BUCHSTABEN * A A' Z Z' A' A' Z' Z' KLEINE BUCHSTATEN IN GROSSE WUCHSTABEN ** A A Z Z A' A Z' Z OK * "большие буквы в маленькие буквы" ** "маленькие буквы в большие буквы" 7.4. Преобразование типов данных Часто возникает необходимость преобразовать значение одного типа данных в другой тип данных. Это происходит автоматически, когда содержимое переменной с низкой точностью преобразуется в тип данных переменной с высокой точностью. Результат сохраняет высокую точность. Например, сложение 2 и 2.718281828 Дает результат, имеющий двойную точность. При этом число 2 было преобразовано в действительное число двойной точности, т.к. второе число является числом этого типа. Неавтоматически происходит преобразование знаковых последовательностей в числовые и наоборот. Для преобразования числовых типов данных действуют следующие правила: а) REAL (простая или двойной точности) в INTEGER: вырабатывается наибольшее INTEGER-значение, которое не больше, чем первоначальное значение (математическое округление). При этом REAL- значение может лежать в диапазоне от -32768 до +32767. В противном случае появляется сообщение об ошибке размерности. Пример: 10 A%=1234.56789012345 20 B%=2.5 30 C%=-10.5 40 D%=-32770.5 50 PRINT A%;B%;C%;D% 60 END RUN 1234 2 -11 OVERFLOW OK B) INTEGER в REAL (простая или двойная точность): При этом преобразовании после десятичной точки добавляются нули, так что ошибка округления не возникает. Пример: 10 A#=32767 20 B!=-12345 30 PRINT A#,B! 40 END RUN 32767.00000000000 -12345.0 OK C) REAL (двойная точность) в REAL (простая точность): К REAL-числу простой точности добавляются нули. При этом могут возникнуть неточности, т.к. только небольшое число десятичных дробей может быть точно преставлено в виде двоичных дробей. Поэтому необходимо избегать этого вида преобразований. Существует другая возможность преобразовать REAL-переменную простой точности в двойную. Она заключается в том, чтобы преобразовать REAL-число простой точности в знаковую последовательность и ее вновь в REAL-число двойной точности. Для этого в языке бейсик имеются специальные функции преобразования типа STR$ и VAL (см. разделы 17.3. и 17.4.). Принцип действия должен быть ясен следующего примера: 10 A!=1.3 20 B#=A! 30 C#=VAL(STR$(A!)) 40 PRINT A!,B#,C# 50 END RUN 1.29999 1.29999995216284 1.3000000000000 OK 7.5. Функции CINT, CDBL и CSNG для вынужденных преобразований типов данных Функция CINT осуществляет округление в области чисел от -32768 до 32767. Формат: [] = CINT (<аргумент>) <аргумент> может быть числовым выражением, числовой переменной или числовой константой, значения могут быть простой или двойной точности. Функция принимает целочисленные значения. Пример: 10 PRINT CINT(33.33); CINT(33.52) RUN 33 34 Функция CDBL преобразует число простой точности в число двойной точности. Формат: [] = CDBL (<аргумент>) <аргумент> может быть числовым выражением, числовой переменной или числовой константой, значения могут быть простой точности или INTEGER-значениями. Значение функции является значением типа REAL двойной точности. Пример: 10 A!=454.67 20 PRINT A!; CDBL(A!) RUN 454.67 454.6700134277344 OK Функция CSNG преобразует число двойной точности в число простой точности. Формат: [] = CSNG (<аргумент>] <аргумент> может быть числовым выражением, числовой переменной или числовой константой, значения могут быть двойной точности. Значение функции является значением типа REAL простой точности. Пример: 10 A#=975.3421 20 PRINT A#; CSNG(A#) RUN 975.3421020507813 975.342 OK