2_Условные операторы и циклы

Урок 2 : Условные операторы и циклы

О чём этот урок

Условные операторы позволяют программе принимать решения. Циклы - повторять действия. Эти две конструкции составляют основу любой логики управления потоком выполнения.


1. Условный оператор if / else

Думайте об if/else как о развилке на дороге: программа едет по одному пути или по другому в зависимости от условия - никогда по обоим сразу.

Позволяет выполнять разный код в зависимости от условия (значения типа bool).

int health = 30;

if (health > 50)
{
    Console.WriteLine("Здоровье в норме");
}
else if (health > 20)
{
    Console.WriteLine("Здоровье низкое!");  // выполнится это
}
else
{
    Console.WriteLine("Критически мало HP!");
}

Правила:

// Однострочный if (без фигурных скобок)
if (health <= 0)
    Console.WriteLine("Game Over");

// С вложенными условиями
if (isAlive && hasKey)
{
    if (doorIsLocked)
        OpenDoor();
}

2. Тернарный оператор

Короткая форма if/else для присвоения значения или выражения. Возвращает значение.

// Синтаксис: условие ? значение_если_true : значение_если_false
string status = health > 0 ? "Живой" : "Мёртвый";

int max = a > b ? a : b;   // максимум из двух чисел

Console.WriteLine($"Игрок {(isWinner ? "победил" : "проиграл")}");
Когда использовать тернарный оператор

Только для простых, однозначных случаев. Вложенные тернарные операторы резко снижают читаемость - лучше использовать обычный if/else.


3. Оператор switch

Альтернатива длинной цепочке if/else if, когда нужно сравнить одну переменную с множеством значений.

int day = 3;

switch (day)
{
    case 1:
        Console.WriteLine("Понедельник");
        break;
    case 2:
        Console.WriteLine("Вторник");
        break;
    case 3:
        Console.WriteLine("Среда");  // выполнится это
        break;
    case 6:
    case 7:
        Console.WriteLine("Выходной!"); // несколько case на один блок
        break;
    default:
        Console.WriteLine("Неверный день");
        break;
}
Ключевое слово break

В switch каждый case должен заканчиваться break (или return). Без него компилятор выдаст ошибку. Это защита от случайного «проваливания» в следующий case.

Switch expression (C# 8+)

Современная компактная форма - возвращает значение:

string dayName = day switch
{
    1 => "Понедельник",
    2 => "Вторник",
    3 => "Среда",
    6 or 7 => "Выходной",
    _ => "Неверный день"    // _ - аналог default
};

4. Циклы

Цикл похож на кольцевую гоночную трассу: программа проходит круг за кругом, пока условие продолжения остаётся истинным.

Циклы позволяют повторять блок кода заданное число раз или до выполнения условия.

for

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

// for (начальное условие; условие выполнения; действие на каждую итерацию)
for (int i = 0; i < 5; i++)
{
    Console.WriteLine($"Итерация {i}");
}
// Выведет: Итерация 0, 1, 2, 3, 4

// Обратный отсчёт
for (int i = 10; i >= 0; i--)
{
    Console.Write($"{i} ");
}

foreach

Перебирает все элементы коллекции или массива. Наиболее читаемый способ итерации.

string[] weapons = { "Меч", "Лук", "Посох" };

foreach (string weapon in weapons)
{
    Console.WriteLine(weapon);
}

// Работает с любой коллекцией (List, Dictionary и др.)
List<int> scores = new List<int> { 10, 25, 7, 42 };
foreach (int score in scores)
{
    Console.WriteLine(score);
}
Нельзя изменять коллекцию в foreach

Нельзя добавлять или удалять элементы из коллекции внутри foreach - это вызовет исключение. Используйте обычный for или создайте копию коллекции.

while

Повторяет, пока условие истинно. Подходит, когда число итераций неизвестно заранее.

int attempts = 0;

while (attempts < 3)
{
    Console.Write("Введите пароль: ");
    string input = Console.ReadLine();
    if (input == "secret") break;
    attempts++;
}
Бесконечный цикл

Если условие while никогда не станет false, программа зависнет. Убедитесь, что переменная в условии меняется внутри тела цикла.

do-while

Выполняет тело цикла хотя бы один раз, а затем проверяет условие.

int number;

do
{
    Console.Write("Введите число от 1 до 10: ");
    number = int.Parse(Console.ReadLine());
} while (number < 1 || number > 10);

Console.WriteLine($"Вы ввели: {number}");
Разница while и do-while

int x = 10;

while (x < 5)
    Console.WriteLine("while"); // не выполнится ни разу

do
    Console.WriteLine("do-while"); // выполнится ОДИН раз
while (x < 5);


5. Управление потоком в циклах

break - немедленный выход из цикла

for (int i = 0; i < 100; i++)
{
    if (i == 5)
        break;  // выходим из цикла при i == 5
    Console.WriteLine(i); // выведет 0, 1, 2, 3, 4
}

continue - пропустить текущую итерацию

for (int i = 0; i < 10; i++)
{
    if (i % 2 == 0)
        continue;  // пропускаем чётные числа
    Console.WriteLine(i); // выведет 1, 3, 5, 7, 9
}

return - выход из метода

static int FindIndex(int[] arr, int target)
{
    for (int i = 0; i < arr.Length; i++)
    {
        if (arr[i] == target)
            return i;  // немедленный выход из метода с результатом
    }
    return -1;  // не найдено
}
Ключевое слово Действие
break Прерывает текущий цикл (или switch)
continue Переходит к следующей итерации цикла
return Завершает выполнение метода

6. Сравнение циклов

Цикл Когда использовать
for Известно точное число итераций
while Условие может не выполниться ни разу
do-while Тело должно выполниться хотя бы раз
foreach Перебор всех элементов коллекции

Итог урока


📋 Перейти к практическим заданиям урока 2

Материалы для дополнительного ознакомления :

Конструкция if..else и тернарная операция
Switch
Циклы