Когда операция выполняется над каждым скалярным элементом и в результате получается последовательность той же длины, операция называется покомпонентной. В противном случае, если операция выполняется над всей последовательностью, она будет называться непокомпонентной.
Покомпонентными являются все арифметические операции, математические функции и операции присваивания. Префиксные покомпонентные операции вырабатывают в качестве результата последовательность значений, каждое из которых получается применением данной операции к очередному значению аргумента.
Префиксная операция «плюс» вырабатывает значения, совпадающие со значениями аргумента. Это не означает, что она «ничего не делает»: аргумент может быть последовательностью адресов, а результат – всегда последовательность значений. Выше уже рассматривался пример, показывающий, когда операция «плюс» необходима. Отметим также, что эта операция применима как к арифметическим, так и к логическим и строковым аргументам.
Префиксная операция «минус» меняет знаки каждого элемента последовательности-аргумента на противоположный. Эта операция применима только к арифметическим аргументам. Для изменения логических значений на противоположные используется покомпонентная префиксная операция 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.
Во всех случаях эти функции возвращают скалярный результат.
Введение в язык «Ядро» специальных операций повторения обусловлено наличием в данных о регулярных разностных сетках большого числа повторяющихся последовательностей. Пусть, например, необходимо задать координаты узлов равномерной сетки, в которой узлы пронумерованы вдоль оси Х (рисунок 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;
Рассмотрим ещё раз приведенный выше пример задания координат. В операторах присваивания длина последовательности адресов (левой части) определена описанием массива XYZ и равна произведению границ по свободным индексам MxN (третий индекс зафиксирован). Длина последовательности в правой части равна произведению длины массива X или Y на значение повторителя M или N соответственно, при этом длина массива X должна быть равна N, а длина массива Y – M, так, что длина правой части тоже равна MxN. Таким образом, в этих операторах есть избыточность: если длина последовательности известна, то число повторений определяется однозначно, и эту задачу можно возложить на интерпретатор.
В языке «Ядро» число повторений в данном случае задавать не обязательно. Тот же результат получился бы при выполнении операторов:
XYZ[,1]:=X repeat; XYZ[,2]:=Y repscal;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.