> For the complete documentation index, see [llms.txt](https://axideli.gitbook.io/osnovy-programmirovaniya-na-yazyke-c/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://axideli.gitbook.io/osnovy-programmirovaniya-na-yazyke-c/operatory-i-vyrazheniya.md).

# Операторы и выражения

## **Введение**

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

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

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

Готовьтесь к захватывающему погружению в мир операторов и выражений, где каждая операция – шаг к созданию более сложных и умных программ на языке C#.

## Арифметические операторы

Арифметические операторы в C# предоставляют средства для выполнения математических операций над числами. Эти операторы позволяют производить основные арифметические действия, такие как сложение, вычитание, умножение и деление. Рассмотрим основные арифметические операторы и их применение.

#### **Сложение (`+`)**

Оператор сложения (`+`) используется для суммирования двух чисел. Если оба операнда являются числами, оператор вернет их сумму.

```csharp
csharpCopy codeint a = 5;
int b = 3;
int sum = a + b; // sum = 8
```

#### **Вычитание (`-`)**

Оператор вычитания (`-`) вычитает одно число из другого. Если оба операнда являются числами, оператор вернет разность.

```csharp
csharpCopy codeint x = 10;
int y = 4;
int difference = x - y; // difference = 6
```

#### **Умножение (`*`)**

Оператор умножения (`*`) умножает два числа. Если оба операнда являются числами, оператор вернет их произведение.

```csharp
csharpCopy codeint p = 7;
int q = 3;
int product = p * q; // product = 21
```

#### **Деление (`/`)**

Оператор деления (`/`) делит одно число на другое. Если оба операнда являются числами, оператор вернет результат деления.

```csharp
csharpCopy codedouble numerator = 15;
double denominator = 2;
double result = numerator / denominator; // result = 7.5
```

#### **Остаток от деления (`%`)**

Оператор остатка от деления (`%`) возвращает остаток от деления одного числа на другое.

```csharp
csharpCopy codeint dividend = 17;
int divisor = 5;
int remainder = dividend % divisor; // remainder = 2
```

#### **Инкремент (`++`) и декремент (`--`)**

Оператор инкремента (`++`) увеличивает значение переменной на единицу, а оператор декремента (`--`) уменьшает значение на единицу.

```csharp
csharpCopy codeint counter = 10;
counter++; // counter = 11
counter--; // counter = 10
```

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

## Операторы сравнения

Операторы сравнения в C# играют важную роль в создании условий и принятии решений в программах. Они позволяют сравнивать значения и устанавливать отношения между ними. Рассмотрим основные операторы сравнения и их применение.

#### **Оператор равенства (`==`)**

Оператор равенства (`==`) используется для проверки, равны ли два значения. Если значения равны, выражение возвращает `true`, в противном случае – `false`.

```csharp
csharpCopy codeint a = 5;
int b = 5;
bool isEqual = (a == b); // isEqual = true
```

#### **Оператор неравенства (`!=`)**

Оператор неравенства (`!=`) проверяет, различны ли два значения. Если значения не равны, выражение возвращает `true`, в противном случае – `false`.

```csharp
csharpCopy codeint x = 8;
int y = 3;
bool notEqual = (x != y); // notEqual = true
```

#### **Оператор больше (`>`)**

Оператор больше (`>`) проверяет, является ли значение слева от оператора большим, чем значение справа. Если условие выполняется, выражение возвращает `true`, иначе – `false`.

```csharp
csharpCopy codedouble p = 10.5;
double q = 7.2;
bool isGreater = (p > q); // isGreater = true
```

#### **Оператор меньше (`<`)**

Оператор меньше (`<`) проверяет, является ли значение слева от оператора меньшим, чем значение справа. Если условие выполняется, выражение возвращает `true`, иначе – `false`.

```csharp
csharpCopy codeint m = 15;
int n = 20;
bool isLess = (m < n); // isLess = true
```

#### **Оператор больше или равно (`>=`)**

Оператор больше или равно (`>=`) проверяет, является ли значение слева от оператора большим или равным значению справа. Если условие выполняется, выражение возвращает `true`, иначе – `false`.

```csharp
csharpCopy codeint alpha = 25;
int beta = 20;
bool isGreaterOrEqual = (alpha >= beta); // isGreaterOrEqual = true
```

#### **Оператор меньше или равно (`<=`)**

Оператор меньше или равно (`<=`) проверяет, является ли значение слева от оператора меньшим или равным значению справа. Если условие выполняется, выражение возвращает `true`, иначе – `false`.

```csharp
csharpCopy codedouble price1 = 15.75;
double price2 = 20.00;
bool isLessOrEqual = (price1 <= price2); // isLessOrEqual = true
```

Операторы сравнения играют важную роль в создании условий и контроле потока выполнения программы. Их использование позволяет программистам элегантно решать различные задачи, связанные с сравнением значений в программе.

## Логические операторы

Логические операторы в языке программирования C# позволяют комбинировать условия и создавать сложные логические выражения. Эти операторы существенно облегчают работу с условиями и принятием решений в программах. Рассмотрим основные логические операторы и их применение.

#### **Логическое И (`&&`)**

Логическое И (`&&`) возвращает `true`, если оба условия, стоящих по обе стороны от оператора, истинны. В противном случае, выражение возвращает `false`.

```csharp
csharpCopy codebool condition1 = true;
bool condition2 = false;
bool result = condition1 && condition2; // result = false
```

#### **Логическое ИЛИ (`||`)**

Логическое ИЛИ (`||`) возвращает `true`, если хотя бы одно из условий, стоящих по обе стороны от оператора, истинно. Если оба условия ложны, выражение возвращает `false`.

```csharp
csharpCopy codebool option1 = false;
bool option2 = true;
bool isSelected = option1 || option2; // isSelected = true
```

#### **Логическое НЕ (`!`)**

Логическое НЕ (`!`) инвертирует значение условия. Если условие истинно, логическое НЕ вернет `false`, и наоборот.

```csharp
csharpCopy codebool isTrue = true;
bool isFalse = !isTrue; // isFalse = false
```

#### **Комбинированные логические выражения**

Логические операторы можно комбинировать для создания более сложных логических выражений. Их использование становится особенно полезным при построении условий с несколькими вариантами.

```csharp
csharpCopy codeint age = 25;
bool isAdult = age >= 18 && age <= 65; // isAdult = true
```

#### **Приоритет логических операторов**

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

```csharp
csharpCopy codebool complexCondition = (condition1 || condition2) && condition3;
```

Логические операторы предоставляют эффективные средства для построения условий и контроля потока выполнения программы. Их умение комбинировать условия делает их незаменимыми при написании гибких и логичных программ.

## Операторы присваивания

Операторы присваивания в языке программирования C# предназначены для присвоения значений переменным. Эти операторы обеспечивают изменение содержимого переменных в процессе выполнения программы. Рассмотрим основные операторы присваивания и их применение.

#### **Простое присваивание (`=`)**

Оператор простого присваивания (`=`) используется для присвоения значения переменной. Переменная слева от оператора получает значение, указанное справа.

```csharp
csharpCopy codeint number = 10;
```

#### **Присваивание с операцией сложения (`+=`)**

Оператор присваивания с операцией сложения (`+=`) позволяет прибавить значение справа к текущему значению переменной слева.

```csharp
csharpCopy codeint total = 5;
total += 3; // total = 8
```

#### **Присваивание с операцией вычитания (`-=`)**

Оператор присваивания с операцией вычитания (`-=`) вычитает значение справа из текущего значения переменной слева.

```csharp
csharpCopy codeint balance = 20;
balance -= 7; // balance = 13
```

#### **Присваивание с операцией умножения (`*=`)**

Оператор присваивания с операцией умножения (`*=`) умножает текущее значение переменной слева на значение справа.

```csharp
csharpCopy codedouble price = 3.5;
price *= 2; // price = 7.0
```

#### **Присваивание с операцией деления (`/=`)**

Оператор присваивания с операцией деления (`/=`) делит текущее значение переменной слева на значение справа.

```csharp
csharpCopy codeint totalItems = 15;
totalItems /= 3; // totalItems = 5
```

#### **Присваивание с операцией остатка от деления (`%=`)**

Оператор присваивания с операцией остатка от деления (`%=`) присваивает переменной слева остаток от деления ее текущего значения на значение справа.

```csharp
csharpCopy codeint remainder = 10;
remainder %= 3; // remainder = 1
```

Операторы присваивания являются неотъемлемой частью программирования на C# и позволяют эффективно изменять значения переменных в процессе выполнения программы. Их использование упрощает манипуляции с данными и делает код более гибким.

## Условные операторы

Условные операторы в языке программирования C# предоставляют механизм принятия решений в зависимости от выполнения определенных условий. Эти операторы позволяют строить ветвления в коде и изменять ход выполнения программы. Рассмотрим основные условные операторы и их применение.

#### **Условие `if`**

Условный оператор `if` позволяет выполнить определенный блок кода, если указанное условие истинно.

```csharp
csharpCopy codeint number = 7;
if (number > 5)
{
    // Этот блок кода выполнится, так как условие истинно
    Console.WriteLine("Число больше 5");
}
```

#### **Условие `else`**

Условный оператор `else` используется в паре с `if` и выполняет блок кода, если условие `if` ложно.

```csharp
csharpCopy codeint age = 16;
if (age >= 18)
{
    Console.WriteLine("Доступ разрешен");
}
else
{
    // Этот блок кода выполнится, так как условие if ложно
    Console.WriteLine("Доступ запрещен. Вам несовершеннолетнему.");
}
```

#### **Условие `else if`**

Условный оператор `else if` добавляет дополнительные условия к проверке `if`. Блок кода внутри `else if` выполняется, если предыдущее условие ложно, а текущее – истинно.

```csharp
csharpCopy codeint mark = 85;
if (mark >= 90)
{
    Console.WriteLine("Отличная оценка");
}
else if (mark >= 70)
{
    // Этот блок кода выполнится, так как первое условие ложно, а второе – истинно
    Console.WriteLine("Хорошая оценка");
}
else
{
    Console.WriteLine("Плохая оценка");
}
```

#### **Тернарный оператор**

Тернарный оператор (`? :`) предоставляет компактный синтаксис для создания условий в одной строке кода.

```csharp
csharpCopy codeint x = 10;
int y = 5;
string result = (x > y) ? "x больше y" : "y больше или равно x";
Console.WriteLine(result);
```

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

## Операторы инкремента и декремента

Операторы инкремента и декремента в языке программирования C# предоставляют удобные средства для увеличения или уменьшения значения переменной на единицу. Эти операторы часто применяются при работе с циклами и счетчиками. Рассмотрим их использование.

#### **Оператор инкремента (`++`)**

Оператор инкремента (`++`) увеличивает значение переменной на единицу.

```csharp
csharpCopy codeint counter = 5;
counter++; // Теперь counter = 6
```

Оператор инкремента также может использоваться до (префиксная форма) или после (постфиксная форма) переменной.

```csharp
csharpCopy codeint a = 10;
int b = ++a; // a увеличится на 1, b будет равно 11
```

#### **Оператор декремента (`--`)**

Оператор декремента (`--`) уменьшает значение переменной на единицу.

```csharp
csharpCopy codeint countDown = 8;
countDown--; // Теперь countDown = 7
```

Как и оператор инкремента, оператор декремента может использоваться префиксно или постфиксно.

```csharp
csharpCopy codeint x = 15;
int y = x--; // x уменьшится на 1, y будет равно 15 (использование постфиксной формы)
```

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

## Приоритет и ассоциативность операторов

В языке программирования C# операторы имеют различные приоритеты, определяющие порядок их выполнения в выражениях. Ассоциативность, с другой стороны, определяет направление, в котором операторы выполняются при одинаковом приоритете. Это важные концепции при написании выражений. Давайте рассмотрим их более подробно.

#### **Приоритет операторов**

Приоритет операторов влияет на порядок их выполнения в выражениях. Операторы с более высоким приоритетом выполняются раньше. Вот некоторые общие примеры:

1. Арифметические операторы (`*, /, %`) имеют более высокий приоритет, чем операторы сложения и вычитания (`+, -`).
2. Операторы сравнения (`>, <, >=, <=`) обычно имеют более высокий приоритет, чем логические операторы (`&&, ||`).
3. Унарные операторы инкремента и декремента (`++, --`) имеют более высокий приоритет, чем бинарные арифметические операторы.

Пример:

```csharp
csharpCopy codeint result = 5 * 3 + 2; // Умножение выполнится раньше сложения, result = 17
```

#### **Ассоциативность операторов**

Ассоциативность определяет направление, в котором операторы выполняются при одинаковом приоритете. Например, ассоциативность арифметических операторов обычно слева направо.

Пример:

```csharp
csharpCopy codeint expression = 10 - 5 + 3; // Вычитание выполняется раньше сложения, expression = 8
```

#### **Изменение приоритета с использованием скобок**

Использование круглых скобок в выражениях позволяет изменить порядок выполнения операторов и управлять приоритетом.

Пример:

```csharp
csharpCopy codeint result = (5 + 3) * 2; // Сложение выполнится раньше умножения, result = 16
```

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

## Примеры использования операторов

Давайте рассмотрим некоторые примеры использования различных операторов в языке программирования C#. Эти примеры помогут проиллюстрировать, как операторы могут быть применены для выполнения различных задач.

#### **Арифметические операторы**

```csharp
csharpCopy code// Сложение и вычитание
int sum = 5 + 3;         // sum = 8
int difference = 10 - 4;  // difference = 6

// Умножение и деление
double product = 3.5 * 2; // product = 7.0
int quotient = 15 / 3;    // quotient = 5

// Остаток от деления
int remainder = 17 % 5;   // remainder = 2

// Инкремент и декремент
int counter = 10;
counter++;               // counter = 11
counter--;               // counter = 10
```

#### **Операторы сравнения**

```csharp
csharpCopy codeint a = 8, b = 5;

// Операторы равенства и неравенства
bool isEqual = (a == b); // isEqual = false
bool notEqual = (a != b); // notEqual = true

// Операторы больше и меньше
bool isGreater = (a > b); // isGreater = true
bool isLess = (a < b);    // isLess = false

// Операторы больше или равно и меньше или равно
bool greaterOrEqual = (a >= b); // greaterOrEqual = true
bool lessOrEqual = (a <= b);    // lessOrEqual = false
```

#### **Логические операторы**

```csharp
csharpCopy codebool condition1 = true, condition2 = false;

// Логическое И
bool resultAnd = condition1 && condition2; // resultAnd = false

// Логическое ИЛИ
bool resultOr = condition1 || condition2;  // resultOr = true

// Логическое НЕ
bool resultNot = !condition1;              // resultNot = false
```

#### **Условные операторы**

```csharp
csharpCopy codeint age = 20;

// Условие if
if (age >= 18)
{
    Console.WriteLine("Вы совершеннолетний");
}
else
{
    Console.WriteLine("Вы несовершеннолетний");
}

// Тернарный оператор
string status = (age >= 18) ? "Совершеннолетний" : "Несовершеннолетний";
Console.WriteLine(status);
```

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

***

## Упражнения

#### **Упражнение 1: Практика с Арифметическими операторами**

Даны два целых числа `a` и `b`. Напишите программу, которая вычисляет и выводит на экран сумму, разность, произведение и частное этих чисел.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите значение для a: ");
        int a = int.Parse(Console.ReadLine());

        Console.Write("Введите значение для b: ");
        int b = int.Parse(Console.ReadLine());

        // Вычисление и вывод результатов
        int sum = a + b;
        int difference = a - b;
        int product = a * b;

        // Проверка деления на ноль
        if (b != 0)
        {
            double quotient = (double)a / b; // Используем double для точности при делении
            Console.WriteLine($"Сумма: {sum}");
            Console.WriteLine($"Разность: {difference}");
            Console.WriteLine($"Произведение: {product}");
            Console.WriteLine($"Частное: {quotient}");
        }
        else
        {
            Console.WriteLine("Деление на ноль невозможно.");
        }
    }
}
```

</details>

#### **Упражнение 2: Проверка условий с Операторами сравнения**

Пользователь вводит два числа. Напишите программу, которая определяет, равны ли эти числа, и выводит соответствующее сообщение.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите первое число: ");
        int number1 = int.Parse(Console.ReadLine());

        Console.Write("Введите второе число: ");
        int number2 = int.Parse(Console.ReadLine());

        // Проверка и вывод результата
        if (number1 == number2)
        {
            Console.WriteLine("Числа равны.");
        }
        else
        {
            Console.WriteLine("Числа не равны.");
        }
    }
}
```

</details>

#### **Упражнение 3: Применение Логических операторов**

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

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите ваш возраст: ");
        int age = int.Parse(Console.ReadLine());

        // Проверка допустимости возраста для водительских прав
        if (age >= 18 && age <= 70)
        {
            Console.WriteLine("Вы можете получить водительские права.");
        }
        else
        {
            Console.WriteLine("Вы не соответствуете требованиям для получения водительских прав.");
        }
    }
}
```

</details>

#### **Упражнение 4: Операторы присваивания и Инкремента/Декремента**

Напишите программу, которая использует операторы присваивания для увеличения или уменьшения значения переменной и выводит результат на экран.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Исходное значение переменной
        int number = 10;

        // Использование оператора увеличения
        number += 5;
        Console.WriteLine("Значение после увеличения на 5: " + number);

        // Использование оператора уменьшения
        number -= 3;
        Console.WriteLine("Значение после уменьшения на 3: " + number);

        // Использование оператора умножения
        number *= 2;
        Console.WriteLine("Значение после умножения на 2: " + number);

        // Использование оператора деления
        number /= 4;
        Console.WriteLine("Значение после деления на 4: " + number);

        // Использование оператора инкремента
        number++;
        Console.WriteLine("Значение после инкремента: " + number);

        // Использование оператора декремента
        number--;
        Console.WriteLine("Значение после декремента: " + number);
    }
}
```

</details>

#### **Упражнение 5: Практика с Условными операторами**

Пользователь вводит два числа. Напишите программу, которая определяет, какое из чисел больше, и выводит соответствующее сообщение.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите первое число: ");
        int number1 = int.Parse(Console.ReadLine());

        Console.Write("Введите второе число: ");
        int number2 = int.Parse(Console.ReadLine());

        // Проверка и вывод результата
        if (number1 > number2)
        {
            Console.WriteLine("Первое число больше второго.");
        }
        else if (number1 < number2)
        {
            Console.WriteLine("Второе число больше первого.");
        }
        else
        {
            Console.WriteLine("Числа равны.");
        }
    }
}
```

</details>

#### **Упражнение 6: Выражения и Приоритет операторов**

Дано выражение: `result = (a + b) * c / d`. Запишите программу, которая вычисляет значение выражения для заданных значений `a`, `b`, `c`, и `d` и выводит результат.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите значение a: ");
        double a = double.Parse(Console.ReadLine());

        Console.Write("Введите значение b: ");
        double b = double.Parse(Console.ReadLine());

        Console.Write("Введите значение c: ");
        double c = double.Parse(Console.ReadLine());

        Console.Write("Введите значение d: ");
        double d = double.Parse(Console.ReadLine());

        // Вычисление выражения
        double result = (a + b) * c / d;

        // Вывод результата
        Console.WriteLine("Результат выражения (result = (a + b) * c / d): " + result);
    }
}
```

</details>

#### **Упражнение 7: Примеры использования операторов**

Напишите программу, которая принимает от пользователя два числа и оператор (арифметический, сравнения или логический). Затем программа выполняет соответствующую операцию и выводит результат.

<details>

<summary>Решение</summary>

```csharp
using System;

class Program
{
    static void Main()
    {
        // Ввод данных
        Console.Write("Введите первое число: ");
        double number1 = double.Parse(Console.ReadLine());

        Console.Write("Введите второе число: ");
        double number2 = double.Parse(Console.ReadLine());

        Console.Write("Введите оператор (+, -, *, /, >, <, ==, &&, ||): ");
        string operatorSymbol = Console.ReadLine();

        // Выполнение операции в зависимости от введенного оператора
        switch (operatorSymbol)
        {
            case "+":
                Console.WriteLine($"Результат сложения: {number1 + number2}");
                break;
            case "-":
                Console.WriteLine($"Результат вычитания: {number1 - number2}");
                break;
            case "*":
                Console.WriteLine($"Результат умножения: {number1 * number2}");
                break;
            case "/":
                if (number2 != 0)
                {
                    Console.WriteLine($"Результат деления: {number1 / number2}");
                }
                else
                {
                    Console.WriteLine("Деление на ноль невозможно.");
                }
                break;
            case ">":
                Console.WriteLine($"Результат сравнения (больше): {number1 > number2}");
                break;
            case "<":
                Console.WriteLine($"Результат сравнения (меньше): {number1 < number2}");
                break;
            case "==":
                Console.WriteLine($"Результат сравнения (равно): {number1 == number2}");
                break;
            case "&&":
                Console.WriteLine($"Результат логического И: {number1 != 0 && number2 != 0}");
                break;
            case "||":
                Console.WriteLine($"Результат логического ИЛИ: {number1 != 0 || number2 != 0}");
                break;
            default:
                Console.WriteLine("Неверный оператор.");
                break;
        }
    }
}
```

</details>

***

## Вопросы

#### **Арифметические операторы**

Какие арифметические операторы предоставляет C#? Приведите примеры и объясните их использование.

#### **Операторы сравнения**

Какие операторы сравнения доступны в C#? Как они используются для сравнения значений?

#### **Логические операторы**

Объясните роль и применение логических операторов `&&`, `||`, и `!` в C#. Приведите примеры использования.

#### **Операторы присваивания и Инкремента/Декремента**

Какие операторы присваивания существуют в C#? Как работают операторы инкремента (`++`) и декремента (`--`)? Приведите примеры.

#### **Условные операторы**

Какие условные операторы предоставляет C#? Как они используются для выполнения различных блоков кода в зависимости от условий?

#### **Приоритет и ассоциативность операторов**

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

#### **Примеры использования операторов**

Какие типы задач можно решить с использованием операторов в C#? Приведите примеры, демонстрирующие различные сценарии использования операторов в реальных программах.

***

## Тесты

{% embed url="<https://docs.google.com/forms/d/e/1FAIpQLSfBDy96w17Iu48NSbFRn5FFbPw5q0dQjGdekiIbemoB7x8UoQ/viewform?usp=sf_link>" fullWidth="true" %}
