5. ВЫЧИСЛЕНИЯ

Теперь поговорим о математических расчетах и функциях. Все расчеты делаются в той части текста программы, которая является аргументом специальной команды #calc или #с. Но лично я люблю использовать другой вариант этой команды, когда ее можно писать вообще без имени, так как учитывая частое использование этой команды для нее сделано такое исключение. Она не имеет параметров, а ее аргументом является совокупность операторов присваивания. Например,

.

 # a=1; b=sin(a); c=b<2; i(5000)=&;

Итак, два знака [# ] (пробел после решетки обязателен) открывает поле операторов присваивания с конструкцией <name>=<value>; причем пробелы между этими элементами могут быть в любом количестве, в том числе и отсутствовать. Можно все писать совсем без пробелов. Это поле заканчивается либо знаком [#], то есть началом новой команды, либо знаком [@] (в конце процедуры), либо знаком [!] (восклицательный знак) в дюбои месте кода. Первый знак естественно возникает при записи новой команды. Третий знак надо ставить перед комментарием. Внутри команды можно ставить комментарии специальной конструкции, но проще оборвать поле символом [!] или командой #%, записать комментарий простым текстом, а потом открыть новую команду. Про команду #% написано выше при описании команды выполнения процедур #e .

Тем не менее я укажу как можно писать комментарии внутри поля команды. Первым символом такого комментария должен быть символ [;], а последним символом должен быть символ [=], причем в тексте комментария этих символов быть не должно. Программа такие комментарии пропускает. Я писал код интерпретатора в начале 90-х годов прошлого столетия и тогда мне казалось что это надо сделать. Но за 30 лет использования языка ACL я так ни разу и не воспользовался этой возможностью и никогда не писал такие комментарии. Комментарии такого типа можно писать не только в данной команде, но и в некоторых других командах, например, #d (см. ниже), где есть поле со списком аргументов.

Для выполнения вычислений есть все стандартные операции

    +  -  *  /  ^  (  )

записанные в обратном порядке очередности выполнения. Знак ^ означает возведение в степень. И есть стандартные функции. Последние имеют имена, состоящие из трех знаков. Список стандартных функций дополнен некоторыми специальными функциями. Он перечислен ниже:

    abs() == абсолютное значение
    sqr() == квадратный корень
    log() == натуральный логарифм
    exp() == экспонента
    sin() == синус
    ars() == арксинус
    cos() == косинус
    arc() == арккосинус
    tan() == тангенс
    art() == арктангенс
    rnd() == случайное значение
    int() == целая часть
    sgn() == знак числа, 1 если аргумент > 0, 0 если 0, иначе -1.
    sfi() == синус интеграл Френеля int(0,x)dt*sin((pi/2)*t^2)
    cfi() == косинус интеграл Френеля int(0,x)dt*cos((pi/2)*t^2)
    bj0() == функция Бесселя J[0](x)
    bj1() == функция Бесселя J[1](x)

Аргумент у функций записывается в круглые скобки так же, как и индексы элементов массивов. У функции rnd() аргумент не используется, но для соблюдения грамматики надо писать rnd(0). Функция int() получается отбрасыванием дробной части у числа независимо от знака. При этом положительное число становится меньше, а отрицательное -- больше. Для получения ближайшего целого к положительному числу -- аргументу функции надо добавить 0.5, а к отрицательному -0.5. Числа можно писать в любом формате как с точкой, так и с запятой и в экспоненциальной форме как с [E] так и с [e]. Вот примеры правильной записи чисел:

     1,23 1.23 12,3E-1 0.123E1 123e-2

Но в языке ACL есть особенность, отличающая его от других языков, а именно, добавлены две новые операции a<b и a>b . Они означают меньшее из двух и большее из двух. Обычно это делается функцией двух переменных, но в ACL нет функций двух переменных, а минимум и максимум реализован операцией. Например, a<1 означает [a], если [а] меньше единицы, и 1, если больше. Приоритет этих операций выше всех других, кроме скобок. То есть все сложные части этих операций обязательно должны быть в скобках.

К команде расчетов естественным образом примыкают еще три простые, но полезные команды. Первая из них

.

 #d N r(11) a b c*5 g ...

Имя этой команды (data) но достаточно одной буквы. Она позволяет быстро определить значения элементов массивов. Первый аргумент (N) определяет сколько элементов будет определено, второй указывает первый элемент массива для определения. Эта запись задает как тип массива, так и первый индекс. Важно иметь в виду, что переменные тоже образуют массив, специальным образом упорядоченный, так что их тоже можно определять таким способом. А после идут значения, которые надо присвоить элементам массива. Это могут быть числа, переменные и элементы массивов. Если после значения стоит *5, то это означает, что данное значение нужно взять 5 раз. Итак, аргументы команды образуют следующую структуру: <число><начало массива><данные>. Но таких структур может быть сколько угодно, одна структура следует за другой. Окончание опять либо на знаке [#] либо на знаке [@] - все остальное трактуется как ошибка. Число N ограничено и не может быть больше 500.
Вторая команда

.

 #pas N r(11) i(25)

позволяет быстро присвоить значения из элементов одного массива элементам другого массива, как говорят, переслать значения из одного массива в другой. Если массивы имеют разный тип, то параллельно происходит преобразование типа. Первым указывается массив из которого пересылаются значения, вторым -- куда пересылаются. Например, в указанном примере вещественные числа будут округлены до ближайшего целого. В этой команде структура не повторяется. Надо снова писать имя команды. Число N не ограничено.
Третья команда

.

 #v N r(11) a b c g ...

Имя этой команды (vra, var restore from array) но достаточно одной буквы. Она позволяет быстро значения переменных, присваивая им значения из элементов массива. У нее такая же структура, что и у первой команды, но она работает в обратном направлении. Она появилась позднее остальных, начиная с версии 21.01.24. Первый аргумент (N) определяет сколько переменных будет определено, второй указывает первый элемент массива из которого берутся значения. Эта запись задает как тип массива, так и первый индекс. Важно иметь в виду, что переменные тоже образуют массив, специальным образом упорядоченный, так что из них тоже можно брать значения таким способом. А после идут переменные, которые надо определить, то есть которым значения присваиваются. Итак, аргументы команды образуют следующую структуру: <число><начало массива><переменные>. Но таких структур может быть сколько угодно, одна структура следует за другой. Окончание опять либо на знаке [#] либо на знаке [@] - все остальное трактуется как ошибка.