[an error occurred while processing this directive]

.шп2

Х. ПРОГРАММА.

.шп0

Программа на языке Бейсик представляет собой последовательность операторов и директив понятных для машины. Программа состоит из строк. Каждая строка состоит из номера и одного или нескольких операторов, стоящих после номера строки. При употреблении в одной строке нескольких операторов, они (операторы) разделяются двоеточием':', но после последнего оператора двоеточие не ставится.

Номера строк, допустимых в программе, могут быть от 0 до 63999. Строка программы, как уже говорилось, может содержать несколько операторов, причем, при наборе, длинна строки не должна превышать 250 символов.

.шп2

Х. ПЕРЕМЕННЫЕ.

.шп0

Имена переменных всегда начинаются с буквы (в б60 разрешается использовать только латинские буквы), далее следует произвольный набор букв или цифр. В именах переменных запрещается использовать специальные символы: ; + ! " # & ' ( ) - = : * ~ ` { } . > , < / ? . В бикп, в именах переменных разрешено использовать символ '_', (в любых количествах). Переменные делятся на несколько типов:

        +------------------------+
        !       ПЕРЕМЕННЫЕ       !
        +------+-----------+-----+
               !           !
               V           V
  +----------------+   +---------------------+
  !    ПРОСТЫЕ     !   ! ИНДЕКСНЫЕ (МАССИВЫ) !
  +-----+----------+   +--------+------------+
        !                       !
        !   +---------------+   !
        +-->!     ЦЕЛЫЕ     !<--+
        !   +---------------+   !
        !                       !
        !   +---------------+   !
        +-->!  ВЕЩЕСТВЕННЫЕ !<--+
        !   +---------------+   !
        !                       !
        !   +---------------+   !
        +-->!  СИМВОЛЬНЫЕ   !<--+
            +---------------+

Пример правильного написания имен переменных: K123, sum_a2, s1t22. Пример неправильного написания: 123k, :SSUm, (k2, s#. Для указания, что переменная относится к целым числам в конце имени ставится знак '%'. У переменных символьного типа в конце имени ставится знак '¤'. У вещественных переменных в конце имени нет ничего. Таким образом, язык отличает имена переменных одинаковых по написанию, но относящихся к разным типам, например:

Вещественные простые: SUM
Целые простые:        SUM%
Символьные простые:   SUM¤
Вещественные массивы: SUM(100)
Целые массивы:        SUM%(100)
Символьные массивы:   SUM¤(100)

Все эти имена интерпретатор считает разными.

.шп2

Х. ОПЕРАТОР ПРИСВАИВАНИЯ.

Синтаксис:

=

Назначение:

.шп0

Присвоить переменной слева от знака '=', значение находящееся справа от знака.

.шп2;Примечание:

.шп0

Слева от оператора всегда должна находиться переменная, а справа может находиться переменная, константа, выражение.

.шп2;Пример:

.шп0

A = SPK1   BOLD2¤ = "Каталог"     NTP = 23 + K(3) - S1 * 2

.шп2

Х. ЗНАКИ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ.

Синтаксис:

.шп2;-

.шп0; - минус;

.шп2;+

.шп0; - плюс;

.шп2;/

.шп0; - разделить;

.шп2;*

.шп0; - умножить;

.шп2;~

.шп0; - степень.

.шп2;Примечание:

.шп0

Приоритет выполнения операций такой же, как и в математике.

.шп2

Х. ТРИГОНОМЕТРИЧЕСКИЕ ФУНКЦИИ.

Сиснтаксис:

.шп2;SIN(X)

.шп0; - синус X;

.шп2;COS(X)

.шп0; - косинус X;

.шп2;TAN(X)

.шп0; - тангенс X;

.шп2;ATN(X)

.шп0; - арктангенс X.

.шп2;Примечание:

.шп0

Здесь Х может быть переменная, константа или выражение. Все значения X выражены в радианах.

.шп2

Х. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ.

Сиснтаксис:

.шп2;INT(X)

.шп0; - значение целой части X;

.шп2;SGN(X)

.шп0; - 1 при X>0, 0 при X=0, -1 при X<0 ;

.шп2;ABS(X)

.шп0; - модуль X;

.шп2;SQR(X)

.шп0; - положительный квадратный корень X;

.шп2;EXP(X)

.шп0; - экспонента X;

.шп2;LOG(X)

.шп0; - натуральный логарифм X;

.шп2;RND(X)

.шп0; - псевдослучайное число в интервале от 0 до 1.

.шп2;Примечание:

.шп0

Здесь Х может быть переменная, константа или выражение. Функция RND работает следующим образом: при X>0 - значение функции случайное число, при X=0 - повторение последнего результата, при X<0 - происходит запуск псевдослучайной последовательности (своей для каждого X).

.шп2;Пример записи функций

.шп0

A1=INT(LOG(2.345)).

.шп2

Х. ЛОГИЧЕСКИЕ ОПЕРАЦИИ И ОПЕРАЦИИ СРАВНЕНИЯ.

Синтаксис:

.шп2;=

.шп0;- равно;

.шп2;>

.шп0;- больше;

.шп2;<

.шп0;- меньше;

.шп2;<>

.шп0;- не равно;

.шп2;=>

.шп0;- больше или равно;

.шп2;<=

.шп0;- меньше или равно;

.шп2;OR

.шп0;- логическое ИЛИ;

.шп2;AND

.шп0;- логическое И;

.шп2;NOT

.шп0;- логическое НЕ.

.шп2;Примечание:

.шп0

В операциях 'Больше или равно' и 'Меньше или равно' очередность знаков '=' и '>', '<' не играет никакого значения, т.е. допустимо писать: =>, >=, <=, =<. Не следует путать оператор сравнения 'равно' и оператор присваивания, хотя написание у них одинаковое, но значение у них разное. Операции сравнения могут применяться не только в операторе IF. Так как результатом операций сравнения является Булево значение (истина-1, ложь-0), то следственно этот результат можно напечатать или присвоить переменной (см. пример). В последних двух примерах первый знак '=' является оператором присваивания, а второй знак - сравнение. В последнем примере переменной 'С' будет присвоено значение 1 (истина), в том случае, если значение переменной 'С1' равно 33. Иначе переменной 'С' будет присвоено значение '0'.

.шп2;Пример:

.шп0

PRINT A1 = A2    PRINT "AB">"AA"    A% = B1 > 22    C = 33 = C1

.шп2

Х. РАБОТА СО СТРОКАМИ СИМВОЛОВ.

.шп0

Строка - это текст из символов, заключенный в кавычки. При работе с оператором INPUT кавычки не набираются. Пример строковой константы: A¤="BALL". Строки символов допускается складывать, например: B¤="Коля"+" и "+"Вася". Результатом будет являться строка символов "Коля и Вася", которая будет присвоена переменной B¤. Причем, при об единении символов, они складываются в том порядке в каком перечислены. Со строками символов работают следующие операторы Бейсика:

.шп2;LEN(A¤)

.шп0;- вычисляет число символов в строке A¤;

.шп2;VAL(A¤)

.шп0;- перевод символов в целое или вещественное число;

.шп2;STR¤(X)

.шп0;- перевод целого или вещественного числа в строку;

.шп2;CHR¤(X)

.шп0;- выдает символ,код которого (X) соответствует КОИ-8;

.шп2;ASC(A¤)

.шп2;- выдает код КОИ-8 первого символа строки A¤;

.шп2;LEFT¤(A¤,X)

.шп0;- первые X символов строки A¤ (левая часть);

.шп2;RIGHT¤(A¤,X)

.шп0;- последние X символов строки A¤ (правая часть);

.шп2;MID¤(A¤,N,X)

.шп0;- строка из X символов от строки A¤ начиная с

               символа с номером N.

.шп2;Примечание:

.шп0

Здесь A¤ и Х могут быть переменные, константы или выражения. Для того, чтобы не путаться, какие операторы пишутся с символом '¤', а какие без него, нужно запомнить простое правило: операторы, результат которых число - пишутся без знака '¤'. Операторы, результат которых строка символов - пишутся со знаком '¤'. Оператор VAL работает следующим образом. Предположим у нас есть строка "234 рубля 22 копейки". Оператор VAL переводит символьное представление числа в число, до первого нечислового символа, т.е. результат 234. Оператор VAL распознает также знаки и десятичную точку, т.е. результат выражения A=VAL("-23.4 градуса") присвоит переменной A значение -23.4 .

.шп2

Х. ОПЕРАТОР ВВОДА INPUT.

Синтаксис:

INPUT { "ТЕКСТ" ; } A
INPUT { "ТЕКСТ" ; } A,B,C,......

Назначение:

.шп0

Ввести с устройства ввода данные и присвоить их переменной.

.шп2;Примечание:

.шп0

Оператор INPUT приостанавливает выполнение программы и ожидает набора с устройства ввода. Набор должен закончиться переводом строки. Здесь под "ТЕКСТ" подразумевается сообщение которое будет выведено на экран при запросе. Под A подразумевается переменная. Переменная может быть любого типа: целая, вещественная, строковая, а также все типы массивов. Операторы INPUT работают по разному в зависимости от того, есть ли в них параметр "ТЕКСТ" и одна или несколько переменных должны быть введены.

1) Оператор INPUT A.

Необходимо отметить, что используя оператор INPUT без параметра "ТЕКСТ", он (оператор) при запросе выдает знак '?' и мигающий курсор, напоминая этим, что ожидает ввода.

2) Оператор INPUT A,B,C,......

При вводе нескольких переменных без параметра "ТЕКСТ", на первый ввод выдается знак '?' и курсор, а на каждый последующий ввод выдается знак '??'.

3) Оператор INPUT "ТЕКСТ"; A.

При вводе одной переменной оператор INPUT"ТЕКСТ";A не выдает '?', а выдает сообщение 'Текст', а затем мигающий курсор.

4) Оператор INPUT "ТЕКСТ"; A,B,C,.....

Здесь при вводе первой переменной оператор выдает 'ТЕКСТ' и курсор, а при вводе последующих переменных знак '??' без выдачи текста.

Иногда бывает нежелательно высвечивать знак '?', но в тоже время не нужно высвечивать никакого текста. В этом случае нужно писать оператор так: INPUT"";A. Наличие пустых кавычек (пустой текст) приводит к тому, что на экран не выводится знак '?'. Есть еще одна тонкость. Оператор INPUT может присваивать введенные символы числовым и символьным переменным. При вводе символьных переменных допустимо вводить как буквы так и цифры, а при вводе числовых переменных допускается вводить только цифры. Если производится ввод символов, с последующим присвоением числовой переменной, а Вы ввели символы, или нажали клавишу 'ввод' без набора цифр, то интерпретатор б60 выдаст на следующей строке '?REENTER' и за этим словом предложит еще раз ввести число. Интерпретатор бикп вместо слова '?REENTER' выдает 'Ош.ввод', а в остальном его действия такие же. Иногда требуется произвести ввод числа, но при этом нужно застраховаться от того, что по ошибке будут введены символы. Поступить можно следующим образом:

   100 INPUT"";A¤:A=VAL(A¤)

В этом случае если Вы введете символы вместо числа, или нажмете на клавишу 'ввод', переменная A станет равной 0, но при этом на экран не будет выдано сообщение '?REENTER' или 'Ош.ввод'.

.шп2;Пример:

.шп0

INPUT " ВВЕДИТЕ ДЛИНУ: "; L%     INPUT A,S1,D(2),S1(K)

.шп2

Х. ОПЕРАТОР ВВОДА GET.

Синтаксис:

.шп0

Оператор GET приостанавливает выполнение программы и ждет нажатия на одну клавишу (лЮбую). После чего переменной A¤ присваивается символ нажатой клавиши. Причем сам символ на экран не выводится.

.шп2

Х. ОПЕРАТОР DATA.

Синтаксис:

DATA Список констант

Назначение:

.шп0

Обозначить список констант.

.шп2;Примечание

.шп0

Оператор DATA описывает блок данных, которые затем можно считать. При запуске программы специальный счетчик оператора DATA устанавливается в начальное положение, т.е. указывает на первый элемент первого оператора DATA. Затем при чтении констант, этот счетчик смещается по мере чтения. Все элементы в операторе DATA должны быть перечислены через запятую. В списке констант могут перечисляться как числовые константы так и символьные, а также их смесь. Символьные константы могут записываться как в кавычках, так и без них (ниже я об ясню какая разница в такой записи). Для примера посмотрите как записывается оператор DATA со смешанным списком констант (числовые и символьные): data "katalog",22,katalog,33,36.2

Теперь я об ясню какое отличие в записи с кавычками и без них. Все дело в том, что при чтении первого элемента в данном примере, в переменную будет занесено все, что находится в кавычках (кроме самих кавычек), в том числе и пробелы. При чтении третьего элемента в переменную будут занесены только символы, а пробелы (сколько бы их не было) не будут занесены в переменную. Операторы DATA могут размещаться в любом месте программы. Программа проходя через оператор DATA никак не реагирует на него, поэтому списки операторов DATA лучше всего располагать в самом конце программы.

.шп2

Х. ОПЕРАТОР READ.

Синтаксис:

READ Список переменных

Назначение:

.шп0

Оператор READ предназначен для чтения элементов из оператора DATA. Оператор содержит список переменных которым должны присваиваться значения из оператора DATA. Список переменных может состоять из числовых переменных, символьных, а также их смеси. Важно, чтобы выполнялось следующее условие: список переменных в операторе READ должен совпадать со списком констант в операторе DATA, т.е., чтобы при чтении числовой переменной, не была строка символов. Переменные в операторе READ могут быть перечислены через запятую. Также важно, чтобы количество переменных в READ не было больще количества констант в DATA. При чтении очередного значения счетчик оператора DATA смещается на следующее значение. Если при очередном смещении счетчика список DATA исчерпан, то выдается ошибка 'Мало данных' (диагностика ошибок описана в п15).

9.5 Оператор

.шп2;RESTORE

.шп2;RESTORE

.шп0

Этот оператор необходим для сброса счетчика оператора DATA. То есть, например нам потребовалось еще раз считать список в операторе DATA. RESTORE производит сброс счетчика DATA на самый первый элемент списка и можно по новой прочесть элементы.

9.6 Оператор

.шп2;PRINT.

.шп2;PRINT Список

.шп0

Оператор PRINT (печать) выводит на экран следующие аргументы: текст заключенный в кавички, константы, выражения и переменные (они обозначены словом список). Причем при чередовании различных аргументов для печати этих аргументов в одной строке между ними используется знак ';'. Например: PRINT "СУММА:";SUM;" ИТОГО: ";SUM1+SUM

Надо заметить, что если оператор PRINT заканчивается знаком ';', а за ним идут другие операторы, то ближайший оператор PRINT будет печатать в той же строке. Например:

  100 ribbon=3:print "кккк";:ribbon=5:?"eeeeeee"

.шп2

10. МАССИВЫ.

.шп0

Массив это переменные с индексом. Описать массив можно задав оператор:

.шп2;DIM (X)

.шп0; - одномерный, числовой массив состоящий из X+1 элементов.

Размер массива всегда больше на один элемент потому, что отсчет ведется не с 1-го элемента, а с 0-го. Оператор DIM только резервирует места для элементов массива. Массивы могут быть одномерные, двухмерные и т.д., главное, чтобы хватило памяти. Максимальный размер массива зависит от многих причин, от размера свободной памяти, от типа массива. С этим связано несколько проблем. В принципе мы можем описать массив (к примеру символьный) на 8000 элементов, т.е. написать оператор DIM A¤(7999). И вроде бы все прсто. Программа проглотит этот оператор и мы свободно вздохнем, что нам хватило свободной памяти. Но через некоторое время при работе с этим массивом интерпретатор выдаст 'Мало памяти'. Почему же не хватило памяти? Все дело в том, что описав массив символьных элементов мы только пометили, что есть массив с таким именем, и больше ничего. Затем при заполнении памяти различными значениями мы уменьшаем свободную память. А теперь представьте себе, что если каждый элемент массива занимает хотя бы 10 ячеек памяти, то для 8000 элементов потребуется 80000 элементов памяти!!! Это меньше, чем вся память компьютера. Но как это не пародаксально, есть такой способ заполнения памяти, что массив на 8000 эл-тов может быть полностью заполнен даже при длинне одного эл-та 20 ил 30 символов. Но этот способ организации массива не может, а если может, то частично применяться в базах данных. Тем не менее приведу два примера программ:

Программа I:

   100 dim a¤(8000):home:vtab10
   105 for i=1 to 8000:a¤(i)="*******"+str¤(i)
   110 htab10:?i;:next

Программа II:

   100 dim a¤(8000):home:vtab10
   105 for i=1 to 8000:a¤(i)="*******************************"
   110 htab10:?i;:next

Первая программа если Вы ее наберете и запустите будет показывать на экране номера элементов которым присвоено значение, примерно после 1200-го элемента мелькание цифр на экране замрет и программа (как покажется на первый взгляд) "повиснет". На самом деле программа не повиснет, а только начнет упорядочивать элементы в памяти. Этот процесс будет длиться так долго, что у Вас наверняка не хватит терпения. Я не стал ждать пока закончится этот процесс (по моим соображениям он продлится 15-25 мин), а прервал выполнение программы и посмотрел состояние памяти. Просмотр памяти показал, что память занята на 40-50%.

Вторая программа через 30-40 сек. закончит свою работу и Вы сможете убедиться в нормальном завершении, просмотрев все (или выборочно) элементы. В чем же секрет? Давайте для начала разберемся как устроены все типы массивов и как они располагают свои элементы.

МАССИВ ЦЕЛЫХ ЧИСЕЛ. Один элемент такого массива занимает 2 байта памяти. У каждого массива существует заголовок в котором указыватся размер массива, тип массива и его имя. После заголовка который занимает 10 байт лежит непосредственно сам массив. Так как все эл-ты массива имеют одинаковую длинну, то массив из X эл-тов, занимает в памяти X*2 байт памяти.

МАССИВ ВЕЩЕСТВЕННЫХ ЧИСЕЛ. Здесь строение массива такое же, как и массива целых чисел, с той лишь разницей, что один элемент такого массива занимает 5 байт. Соответственно массив из X эл-тов, будет занимать X*5 байт памяти.

СИМВОЛЬНЫЙ МАССИВ. Прежде всего, структура такого массива состоит из двух главных частей: а) из ссылки на элемент; б) из непосредственно самого элемента. Такое строение связано с тем, что длинна элементов такого массива может быть различной. Причем некоторые элементы состоят только из ссылки, а некоторые из ссылки и самого элемента. Отчего это зависит? Если в программе встречается присвоение элементу строковой константы (например: A¤(I)="****"), то элемент массива состоит из одной ссылки, и эта ссылка указывает на то место, где эта константа находится непосредственно в программе, т.к. эта константа жестко зафиксирована в программе и размер ее никогда (во время работы программы) не увеличивается. То же самое относится к спискам констант в операторе DATA элемент массива состоит только из ссылки и она указывает на то место в памяти, где размещена эта константа в операторе DATA. Все те эл-ты которые не являются константами состоят из ссылки и самого эл-та. К ним относятся те эл-ты, которые были введены при помощи оператора INPUT (это справедливо так же при чтении текстовых файлов). Ссылка на элемент занимает в памяти 3 байта, 1 байт - длинна элемента и 2 байта адрес элемента в памяти. Как уже говорилось выше сам элемент может быть различной длинны. При длинне элемента 10 байт, он будет занимать в памяти 13 байт.

Вот теперь вернемся к нашим двум программам. Я думаю должно быть понятно, почему в первой программе не хватило памяти. Так как все элементы массива не являются константами, то эти эл-ты состоят из ссылки и самого элемента. Во второй программе все элементы - константы, поэтому состоят только из ссылки. Для 8000 элементов это 24000 ячейки памяти, что вполне реально, и даже остается около 18000 ячеек памяти свободными (для бикп).

Теперь постараемся выработать общее правило для примерного подсчета памяти необходимого для размещения массивов разного типа. А перед этим вспомним: заголовок массива занимает 10 байт, ссылка занимает 3 байта, элемент массива целых чисел - 2 байта, вещественных чисел - 5 байт, символьного массива - 3 байта + длинна элемента. Итак при массиве описанном DIM.....(X), память занимаемая массивом:

ЦЕЛЫЕ: 10+(X+1)*2;

ВЕЩЕСТВЕННЫЕ: 10+(X+1)*5;

СИМВОЛЬНЫЕ: 10+(X+1)*(3+L), где L длинна элемента.

Таким образом массив из 1000 элементов будет занимать:

ЦЕЛЫЕ: 2012 ячеек;

ВЕЩЕСТВЕННЫЕ: 5015 ячеек;

СИМВОЛЬНЫЕ (при длинне элемента 7 символов): 10020.

.шп2

11. РАБОТА С ТЕКСТОВЫМ ЭКРАНОМ (СТРАНИЦЕЙ).

.шп0

ПЭВМ 'Агат' предоставляет возможность работать с тремя типами текстовых страниц:

1) цветная текстовая страница 32х32;

2) черно-белый экран 32х64 (черные символы на белом фоне);

3) черно-белый экран 32х64 (белые символы на черном фоне).

Второй и третий тип экрана одинаковы по размерам. Тексовая страница имеет такой параметр, как - текстовое окно. Такое окно не обязательно вцлючает весь экран. Оно может быть меньше экрана и располагаться в любом месте экрана. Как установить границы этого окна будет рассказано ниже. Все три типа экрана имеют 32 строки. Нумерация строк и позиций экрана ведется из левого верхнего угла экрана:

    1 ------------>32 
 1 +-----------------+
   !                 !
 ! !                 !
 ! !                 !
 ! !                 !
 ! !                 !
 ! !                 !
 V !                 !
 32!                 !
   +-----------------+

.шп2;HOME

.шп0; - очистка текущего текстового окна;

.шп2;HTAB X

.шп0; - установить курсор в позицию X;

.шп2;VTAB Y

.шп0; - установить курсор в строку Y;

.шп2;TAB (X)

.шп0; - элемент оператора PRINT, установить курсор в позицию X;

.шп2;POS (0)

.шп0; - вычислить номер позиции от левого края текстового окна;

.шп2;SPC (X)

.шп0; - элемент оператора PRINT, напечатать X пробелов;

.шп2;FLASH

.шп0; - устанавливает мигающий режим вывода текста;

.шп2;INVERSE

.шп0; - устанавливает черный по светлому режим вывода текста;

.шп2;NORMAL

.шп0; - устанавливает светлый по черному режим вывода текста;

.шп2;SPEED=X

.шп0; - установить скорость вывода текста (0 <= X <= 255);

.шп2

12. КОМАНДЫ РЕДАКТИРОВАНИЯ ПРОГРАММЫ.

.шп0

.шп2;LIST

.шп0; - вывод на экран всего текста программы;

.шп2;LIST 100

.шп0; - вывод на экран строки 100;

.шп2;LIST 100,

.шп0; - вывод на экран строк, начиная с 100 и до конца;

.шп2;LIST ,100

.шп0; - вывод на экран строк, начиная с начала и до 100;

.шп2;LIST 100,500

.шп0; - вывод строк с номерами от 100 до 500;

.шп2;DEL 100,110

.шп0; - удалить строки с номерами от 100 до 110, включительно;

При выводе текста программы приостановить вывод на экран можно нажав клавишу "Пробел", продолжить вывод текста можно нажав любую клавишу. Прервать вывод текста программы можно нажав на функциональную клавишу "=".

.шп2

12. ПРОЧИЕ ОПЕРАТОРЫ.

.шп0

12.1 Оператор

.шп2;CLEAR.

.шп2;CLEAR

.шп0

Этот оператор выполняет чистку в области хранения имен переменных. При работе с программой бывает так, что мы исключаем некоторые имена переменных из программы. Но исключая их из программы, интерпретатор Бейсика не исключает их из списков переменных. Это ведет к увеличению программы. Бывает так, что иногда вместо слова LIST, например, мы набираем LIT. Бейсик просматривая слово LIT среди команд не находит его, и поэтому относит LIT к переменным (с занесением его в список переменных), но т.к. мы не указали, что нужно сделать с этой переменной, то Бейсик выдает 'Синтаксическую ошибку'. При выполнении оператора CLEAR интерпретатор просматривает текст программы и оставляет только те имена которые упоминаются в программе. При этом на экран выдается листинг программы.

ВНИМАНИЕ! В б60 и бикп оператор CLEAR работает неправильно. Лучше им не пользоваться. В бикп после работы оператора портятся все имена переменных длинной более 2-х символов.

12.2 Оператор

.шп2;FRE.

.шп2;FRE (0)

.шп0

Оператор FRE выполняет упорядочивание переменных в памяти, освобождая при этом неиспользуемую память. Значение аргумента в скобках не существенно. Для

[an error occurred while processing this directive]