Программирование на языке «Ядро»: Руководство пользователя, страница 7

Когда операция выполняется над каждым скалярным элементом и в результате получается последовательность той же длины, операция называется покомпонентной. В противном случае, если операция выполняется над всей последовательностью, она будет называться непокомпонентной.

Покомпонентными являются все арифметические операции, математические функции и операции присваивания. Префиксные покомпонентные операции вырабатывают в качестве результата последовательность значений, каждое из которых получается применением данной операции к очередному значению аргумента.

Префиксная операция «плюс» вырабатывает значения, совпадающие со значениями аргумента. Это не означает, что она «ничего не делает»: аргумент может быть последовательностью адресов, а результат – всегда последовательность значений. Выше уже рассматривался пример, показывающий, когда операция «плюс» необходима. Отметим также, что эта операция применима как к арифметическим, так и к логическим и строковым аргументам.

Префиксная операция «минус» меняет знаки каждого элемента последовательности-аргумента на противоположный. Эта операция применима только к арифметическим аргументам. Для изменения логических значений на противоположные используется покомпонентная префиксная операция not.

Математические префиксные операции приведены в таблице.

sin

синус аргумента в радианах

cos

косинус аргумента в радианах

sin1

синус аргумента в градусах

cos1

косинус аргумента в градусах

tg

тангенс аргумента в радианах

tg1

тангенс аргумента в градусах

arcsin

арксинус аргумента в радианах

arcsin1

арксинус аргумента в градусах

arccos

арккосинус аргумента в радианах

arccos1

арккосинус аргумента в градусах

arctg

арктангенс в радианах

arctg1

арктангенс в градусах

sh

гиперболический синус

ch

гиперболический косинус

abs

абсолютная величина

sign

знак аргумента

sqrt

квадратный корень

exp

экспонента

Все эти операции являются покомпонентными. Длина результата определяется однозначно, поскольку аргумент только один.

Инфиксные покомпонентные операции (сложения, вычитания, умножения, деления и возведения в степень) имеют по два аргумента – левый и правый. В случае, когда аргументы одинаковой длины, длина результата будет точно такой же. Если длины различаются, то перед выполнением операции интерпретатор пытается выровнять длины по следующим правилам.

Если один из аргументов – скаляр, то он повторяется столько раз, сколько значений имеет другой аргумент.

Если один из аргументов – последовательность неопределенной длины (например, бесконечная прогрессия), то он усекается до длины другого аргумента.

Если длины последовательностей-аргументов больше единицы и не равны между собой, то более короткая последовательность дополняется значениями по умолчанию (в случае арифметических переменных – DefaultDoubleSkip, см. п. 1.3.1).

Если оба аргумента имеют неопределенную длину, то выдается сообщение об ошибке, и операция не выполняется.

Приведем примеры выражений с арифметическими операциями.

1+(1,2) – последовательность значений: (2,3) (скалярный левый аргумент повторяется).

(1,2)*(0,2,4) – последовательность: (0,4,0) (более короткий левый аргумент дополняется нулём).

(1,2)/(0,2,4) – последовательность (1.0Е+50, 1, 0) (левый аргумент дополняется нулём, результат деления на нуль – значение константы MaxDoubleValue из п. 1.3.1).

(1,2)^0.5 – последовательность (1, 1.4142136) (возведение в степень 0,5).

К непокомпонентным математическим функциям относятся:

- упоминавшиеся выше функции нахождения максимального и минимального значения max, min;

- вычисление суммы значений последовательности-аргумента sum;

- вычисление суммы квадратов значений последовательности-аргумента sumqu.

Во всех случаях эти функции возвращают скалярный результат.

1.4.3. Повторение последовательностей и их элементов

Введение в язык «Ядро» специальных операций повторения обусловлено наличием в данных о регулярных разностных сетках большого числа повторяющихся последовательностей. Пусть, например, необходимо задать координаты узлов равномерной сетки, в которой узлы пронумерованы вдоль оси Х (рисунок 8). Тогда абсциссы узлов в каждом горизонтальном ряду будут одинаковыми, и достаточно задать их один раз, а затем повторить по числу рядов.

Повторение последовательности выполняется инфиксной операцией repeat. Её левый аргумент – повторяемая последовательность, правый – число повторений. Поместим повторяющуюся M раз последовательность координат Х в первый столбец массива XYZ:

real X[N]; X:={абсциссы первого ряда узлов}…. ;

real XYZ[М,N,3];

XYZ[,1]:=X repeat M;

Рисунок 8. Равномерная прямоугольная сетка

Рассмотрим, далее, ординаты узлов равномерной сетки. В нумерации, показанной на рисунке 8, первые N узлов имеют одинаковую ординату Y[1], следующие N узлов – ординату Y[2] и т.д., т.е. каждое скалярное значение из последовательности Y надо повторить N раз. Для этого может использоваться операция повторения скалярных значений repscal:

real Y[M]; Y:={ординаты первой колонки узлов}…. ;

XYZ[,2]:=Y repscal N;

1.4.4. Последовательности неопределенной длины

Рассмотрим ещё раз приведенный выше пример задания координат. В операторах присваивания длина последовательности адресов (левой части) определена описанием массива XYZ и равна произведению границ по свободным индексам MxN (третий индекс зафиксирован). Длина последовательности в правой части равна произведению длины массива X или Y на значение повторителя M или N соответственно, при этом длина массива X должна быть равна N, а длина массива Y – M, так, что длина правой части тоже равна MxN. Таким образом, в этих операторах есть избыточность: если длина последовательности известна, то число повторений определяется однозначно, и эту задачу можно возложить на интерпретатор.

В языке «Ядро» число повторений в данном случае задавать не обязательно. Тот же результат получился бы при выполнении операторов:

XYZ[,1]:=X repeat; XYZ[,2]:=Y repscal;