Операторы

Для каждой константы или переменной в SimInTech тип определяется своим значением и принадлежит к какому-либо типу данных.

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

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

Если операции имеют равный приоритет, то они будут выполняться последовательно, слева направо.

Если приоритет операции выше, то она будет выполнена в первую очередь, независимо от расположения знака операции. В первую очередь вычисляются также выражения, заключенные в скобки, после чего они рассматриваются как операнды. В выражении (x > 0) and (y > 0) скобки необходимы, поскольку операции отношения имеют самый низкий приоритет.

Математические операторы

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

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

Массив воспринимается как вектор-строка. Вектор-столбец задается как матрица размером n x 1, например A=[[1],[3],[2]]; либо как транспонированный массив: A=transp([1,3,2]);

Оператор Семантика Назначение Пример
+ "слагаемое 1"+"слагаемое 2" Сложение двух выражений. Матрицы и вектора складываются поэлементно. Для строк сложение соответствует конкатенации.
//Сложение чисел
//Целые числа
a1 = 1 + 10;       //a1 =  11
//Вещественные числа 
a2 = 2.43 + 5.46;  //a2 =  7.89
//Сложение векторов
//Вектор с целыми числами
v1 = [1, 1] + [5, 7]; //v1 = [6, 8]
//Вектор с вещественными числами
v2 = [2.23, -0.47] + [5.48, 2.96]; //v2 = [7.71 , 2.49]
//Сложение матриц
m1 = [[8, 6], [2, 4]] + [[12, 1],[-8, 6]]; 
//m1 = [[20, 7],[-6, 10]]
//Объединение строк
str = "Язык программирования" + " " + "SimInTech"; 
//str = "Язык программирования SimInTech"
- "уменьшаемое"-"вычитаемое" Вычитание из первого выражения второго. Для строк не определено. Матрицы и вектора вычитаются поэлементно
//Вычитание чисел
//Целые числа
a1 = 10 - 5;       //a1 = 5
//Вещественные числа
a2 = 8.86 - 2.37;  //a2 = 6.49
//Вычитание векторов
//Вектор с целыми числами
v1 = [1, 1] - [5, 7];  //v1 = [-4, -6]
//Вектор с вещественными числами
v2 = [2.23, -0.47] - [5.48, 2.96];  //v2 = [-3.25, -3.43]
//Вычитание матриц
m1 = [[8, 6], [2, 4]] - [[12, 1],[-8, 6]]; 
//m1 = [[-4, 5];[10, -2]]
+= "базовое значение"+="значение инкремента" Оператор инкремента. Выражение, сформированное с помощью оператора +=
x += y
эквивалентно выражению
x = x + y

Оператор может быть использован для чисел, векторов, матриц и строк.

//Инкремент чисел
//Целые числа
var a1: integer;

a1 = 0;
a1 += 1; //a1 = 1
a1 += 5; //a1 = 6

//Вещественные числа 
var a2: double;

a2 = 0.1;
a2 += 1.5;  //a2 = 1.6
a2 += 0.73; //a2 = 2.33
//Инкремент векторов 
var v1: array;

v1  = [1, 1];
v1 += [3, 4]; //v1 = [4, 5]
v1 += [1, 3]; //v1 = [5, 8]
//Инкремент строк
var str: string;

str = "Sim";
str += "In";    //str = "SimIn"
str += "Tech";  //str = "SimInTech"
-= "базовое значение"-="значение декремента" Оператор декремента. Выражение, сформированное с помощью оператора -=
x -= y
эквивалентно выражению
x = x - y

Оператор может быть использован для чисел, векторов, матриц.

//Декремент чисел
//Целые числа
var a1: integer;

a1 = 0;
a1 -= 1; //a1 = -1
a1 -= 5; //a1 = -6

//Вещественные числа 
var a2: double;

a2 = 0.1;
a2 -= 1.5;  //a2 = -1.4
a2 -= 0.73; //a2 = -2.13
//Декремент векторов
var v1: array;

v1  = [1, 1];
v1 -= [3, 4]; //v1 = [-2, -3]
v1 -= [1, 3]; //v1 = [-3, -6]
* "множитель 1"*"множитель 2" Умножение первого выражения на второе. Вектора умножаются поэлементно. Матрицы перемножаются по правилам умножения матриц
//Умножение чисел
a1 = 5*3;      //a1 = 15
a2 = 7.86*2.1; //a2 = 16.506
//Умножение векторов
//Вектор с целыми числами
v1 = [2,3] * [5,7]; //v1 = [10, 21]
//Вектор с вещественными числами
v2 = [2.2, -0.4] * [5.4, 2.9]; //v2 = [11.88, -1.16]
.* "матрица 1".*"матрица 2" Поэлементное перемножение действительных или комплексных матриц с использованием правил перемножения
//Умножение матриц
m1 = [[8, 6], [2, 4]] * [[12, 1],[-8, 6]]; 
//m1 = [[48, 44];[-8, 26]]
/ "делимое"/"делитель" Прямое деление первого выражения на второе. Вектора делятся поэлементно. Для матриц производится умножение на обратную матрицу
//Деление чисел
a1 = 3/10;        //a1 = 0.3
a2 = 20.484/3.75; //a2 = 5.4624
//Деление векторов
v1 = [1,1]/[10,20]; //v1 = [0.1, 0.05]
./ "матрица 1"./"матрица 2" Поэлементное деление действительных или комплексных матриц
//Поэлементное деление матриц
m1 = [[9, 6], [2, 3]] ./ [[12, 1],[-8, 6]]; 
//m1 = [[0.75, 6]; [-0.25, 0.5]]
\ "матрица A"\"матрица B" Обратное деление матриц. Соответствует операции A-1*B
//
^ "базовое значение"^"степень" Возведение первого выражение в степень второго. Вектора обрабатываются поэлементно. Матрицы возводятся в целую степень по правилам умножения матриц
//Возведение в степень
a1 = 2^3;      //Результат 8
a2 = 2^3^3;    //Результат 512
a3 = (2^3)^3;  //Результат 512 
.^ "матрица 1".^"матрица 2" Поэлементное возведение в степень двух матриц или матрицы в действительную степень
//
! "целое число"! Вычисление факториала целого числа
//Вычисление факториала
a = 4!; //a = 1*2*3*4 = 24
.. A..B

Вычисление интервала чисел от A до B.

Опционально при использовании оператора может быть задан шаг интервала. Шаг интервала указывается через символ ":", после которого указывается значение шага.

Также опционально только при указании шага интервала оператор может быть использован при вычислении интервала вещественных чисел

//Интервал целых чисел
a = 1..5; //a = [1,2,3,4,5] 
//Интервал целых чисел с заданием шага интервала
a = 1..9:2; //a = [1,3,5,7,9]
//Интервал вещественных чисел с заданием шага интервала
a = 1.1..1.9:0.2; //a = [1.1,1.3,1.5,1.7,1.9]
# A#B Размножение числа B в вектор размерностью A
//Размножение числа в вектор
v = 3#0.1; //v = [0.1, 0.1, 0.1]
& A&B Объединение векторов A и B
//Объединение векторов
v = [1,2] & 3..6 & 2#7; //v = [1, 2, 3, 4, 5, 6, 7, 7]

Целочисленные и логические операторы

Оператор Семантика Назначение Пример
or "выражение 1" or "выражение 2" Побитовая логическая операция ИЛИ
Данная операция в SimInTech также представлена в виде блоков:
var a: boolean,
    b: boolean;

if a or b then c = 1 else c = 0;
var a: double,
    b: double;

if a or b then c = 1 else c = 0;
and "выражение 1" and "выражение 2" Побитовая логическая операция И
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a > 0) and (b < -1) then c = 1 else c = 0;
xor "выражение 1" xor "выражение 2" Побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a xor b) then c = 1 else c = 0;
not "выражение 1" not "выражение 2" Побитовая логическая операция НЕ
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (not a) then c = 1 else c = 0;
div "делимое" div "делитель" Целочисленное деление
var a1: double,
    a2: double,
    a3: double,
    a4: double;

a1 = 5/2;     //a1 = 2.5
a2 = 5 div 2; //a2 = 2
a3 = 3 div 2; //a3 = 1
a4 = 3 div 4; //a4 = 0
mod "делимое" mod "делитель" Остаток от целочисленного деления
var a1: double,
    a2: double,
    a3: double;

a1 = 5 mod 2; //a1 = 1
a2 = 3 mod 2; //a2 = 1
a3 = 3 mod 4; //a3 = 0
shl "число" shl "количество сдвигов" Побитовый сдвиг влево
var a: double,
    b1: double,
    b2: double,
    b3: double;

a = 1; //a = 1 (1 в двоичной)
b1 = a shl 1; //b1 = 2 (10 в двоичной)
b2 = a shl 2; //b2 = 4 (100 в двоичной)
b3 = a shl 3; //b3 = 8 (1000 в двоичной)
shr "число" shr "количество сдвигов" Побитовый сдвиг вправо
var a: double,
    b1: double,
    b2: double,
    b3: double,
    b4: double;

a = 8; //a = 8 (1000 в двоичной)
b1 = a shr 1; //b1 = 4 (100 в двоичной)
b2 = a shr 2; //b2 = 2 (100 в двоичной)
b3 = a shr 3; //b3 = 1 (1 в двоичной)
b4 = a shr 4; //b4 = 0 (0 в двоичной)
> "операнд 1" > "операнд 2" Операция БОЛЬШЕ. Операция возвращает True, если операнд 1 больше чем операнд 2.
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a > 0) then c = 1 else c = 0;
< "операнд 1" < "операнд 2" Операция МЕНЬШЕ. Операция возвращает True, если операнд 1 меньше чем операнд 2.
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a < 0) then c = 1 else c = 0;
>= "операнд 1" >= "операнд 2" Операция БОЛЬШЕ ЛИБО РАВНО. Операция возвращает True, если операнд 1 больше либо равен операнду 2.
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a >= 0) then c = 1 else c = 0;
<= "операнд 1" <= "операнд 2" Операция МЕНЬШЕ ЛИБО РАВНО. Операция возвращает True, если операнд 1 меньше либо равен операнду 2.
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if (a <= 0) then c = 1 else c = 0;
= "операнд 1" = "операнд 2" Операция РАВНО. Операция возвращает True, если операнд 1 равен операнду 2.
Данная операция также представлена в SimInTech в виде блоков:
var a: double,
    b: double;

if a = b then c = 1 else c = 0;
if (a = 0) or (b = -1) then c = 1 else c = 0;
<> "операнд 1" <> "операнд 2" Операция НЕ РАВНО. Операция возвращает True, если операнд 1 не равен операнду 2.

Данная операция также представлена в SimInTech в виде блоков:

var a: double,
    b: double;

if a <> b then c = 1 else c = 0;

Специальные операторы

Оператор Семантика Назначение Пример
() ("выражение") Математические скобки.

Выражение внутри скобок выполняется первым.

//Вычисление арифметического выражения
a1 = 4*(10+7); //Результат a1 = 68
a2 = 4*10 +7 ; //Результат a2 = 47
() ("действительная часть","мнимая часть") Упаковка действительных чисел (векторов, матриц) в комплексное (комплексный вектор, матрицу). Допустимо написание частей комплексного числа через пробел или точку с запятой.
//Объявление комплексного числа
c1 = (10,5); //Вариант 1 с использованием символа ","
c2 = (14 8); //Вариант 2 с использованием символа " "
c3 = (18;0); //Вариант 3 с использованием символа ";"
[] ["элемент 1"{,"элемент 2"}] Упаковка элементов в массив:
  • если элементы – действительные или целые числа, то результат – вектор действительных чисел;
  • если элементы – векторы действительных чисел, результат – матрица действительных чисел;
  • если элементы – комплексные числа, то результат – вектор комплексных чисел
  • если элементы – векторы комплексных чисел, результат – матрица комплексных чисел.
Разделителем элементов вектора могут быть следующие символы:
  • запятая;
  • точка с запятой;
  • пробел.
Прим.:
Если элемент вектора отрицательное число (например, -0.23), то данный элемент в векторе должен отделяться от предыдущего запятой.

Векторы и матрицы можно присваивать, при этом способ расчета для данных векторов и матриц должны быть объявлены как "Переменные".

//Объявление вектора
v1 = [1, 4.5, 7]; //Вариант 1 с использованием символа ","
v2 = [1 4.5 7];   //Вариант 2 с использованием символа " "
v3 = [1; 4.5; 7]; //Вариант 3 с использованием символа ";"
//Пример работы символа " " при объявлении вектора, 
содержащего отрицательное число
v1 = [0, -0.23 2 3]; //Результат [0, -0.23, 2, 3]
v2 = [0 -0.23 2 3];  //Неправильно. Результат [-0.23, 2, 3]
//Объявление матрицы
m1 = [[1,2], [6,7]];
m2 = [[1 2]; [6 7]];
//Присваивание элементов массива
[a,b] = [1, 2];
[] "массив или матрица"["номер элемента или строки"{,"номер столбца"} ] Возвращает значение элемента с указанным номером. Нумерация начинается с 1. Тип возвращаемого значения соответствует типу элементов массива. Если для матрицы указывается один индекс, то возвращается вектор-строка матрицы, если 2 – возвращается число. Этот оператор может быть присвоен. Разделителем элементов может быть запятая, точка с запятой или пробел.
//Доступ
A = C[1,1]
k = arr[i]
//Присваивание
C[1,1] = 10
k[3] = 4
Прим.:
Скобки массивов [ ] могут использоваться для декларации действительных массивов и матриц аналогично блоку "Язык программирования" (см. описание ключевого слова var) .