Цель работы
Изучить принципы построения циклических алгоритмов, освоить работу с операторами циклов, научиться создавать программы с повторяющимися действиями, понять различия между типами циклов и их применение.
Задачи лабораторной работы
- Изучить понятие циклического алгоритма
- Освоить цикл с предусловием (while)
- Освоить цикл с постусловием (do-while)
- Освоить цикл с параметром (for)
- Научиться использовать вложенные циклы
- Изучить операторы break и continue
- Реализовать программы обработки массивов
Что такое циклический алгоритм?
Циклический алгоритм — это алгоритм, в котором предусмотрено многократное выполнение одной и той же последовательности действий. Количество повторений может быть задано заранее или определяться в процессе выполнения программы.
Итерация
Однократное выполнение тела цикла
Условие
Логическое выражение для продолжения цикла
Счётчик
Переменная для подсчёта итераций
Тело цикла
Повторяющиеся действия
Виды циклов
🔄 Цикл с предусловием (while)
Проверка условия перед выполнением тела цикла
while (условие)
{
// Тело цикла
// Выполняется пока условие истинно
}
✅ Может не выполниться ни разу
🔁 Цикл с постусловием (do-while)
Проверка условия после выполнения тела цикла
do
{
// Тело цикла
// Выполняется хотя бы один раз
} while (условие);
✅ Выполнится минимум один раз
➿ Цикл с параметром (for)
Цикл с заранее известным количеством итераций
for (инициализация; условие; изменение)
{
// Тело цикла
// Компактная форма записи
}
✅ Удобен для работы с массивами
🔁 Цикл foreach
Перебор элементов коллекции
foreach (тип элемент in коллекция)
{
// Работа с элементом
// Автоматический перебор
}
✅ Безопасный перебор коллекций
Цикл while - детальный разбор
Синтаксис и работа
int i = 0; // Инициализация счетчика
while (i < 5) // Условие продолжения
{
Console.WriteLine($"Итерация {i}");
i++; // Изменение счетчика
}
// Вывод:
// Итерация 0
// Итерация 1
// Итерация 2
// Итерация 3
// Итерация 4
Примеры использования while
Сумма чисел
int sum = 0;
int n = 1;
while (n <= 100)
{
sum += n;
n++;
}
// sum = 5050
Поиск делителей
int num = 24;
int div = 1;
while (div <= num)
{
if (num % div == 0)
Console.Write($"{div} ");
div++;
}
// Вывод: 1 2 3 4 6 8 12 24
Цикл for - мощный инструмент
Структура цикла for
for (int i = 0; i < 10; i++)
{
// i = 0 - инициализация (выполняется один раз)
// i < 10 - условие (проверяется перед каждой итерацией)
// i++ - изменение (выполняется после каждой итерации)
Console.WriteLine($"i = {i}");
}
Вариации цикла for
Обратный отсчёт
for (int i = 10; i >= 0; i--)
{
Console.WriteLine($"Осталось: {i}");
}
Шаг больше 1
for (int i = 0; i <= 20; i += 2)
{
Console.WriteLine($"Четное: {i}");
}
Множественная инициализация
for (int i = 0, j = 10; i < j; i++, j--)
{
Console.WriteLine($"i={i}, j={j}");
}
Вложенные циклы
Циклы могут содержать внутри себя другие циклы. Это позволяет обрабатывать многомерные структуры данных.
Таблица умножения
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
Console.Write($"{i * j,4}");
}
Console.WriteLine();
}
Рисование фигур
// Треугольник из звездочек
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write("* ");
}
Console.WriteLine();
}
// Вывод:
// *
// * *
// * * *
// * * * *
// * * * * *
Управление циклами
break - выход из цикла
Немедленно прерывает выполнение цикла
for (int i = 0; i < 10; 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 - выход из метода
Завершает выполнение всего метода
void FindNumber(int[] arr, int target)
{
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == target)
{
Console.WriteLine($"Найдено на позиции {i}");
return; // Выход из метода
}
}
Console.WriteLine("Не найдено");
}
Бесконечные циклы
⚠️ Внимание!
Бесконечные циклы могут привести к зависанию программы. Используйте их осознанно!
Намеренный бесконечный цикл
while (true)
{
string input = Console.ReadLine();
if (input == "exit")
break; // Выход по команде
Console.WriteLine($"Вы ввели: {input}");
}
Случайный бесконечный цикл (ошибка)
// ОШИБКА: забыли изменить i
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
// i++; // Забыли увеличить!
}
Блок-схема циклического алгоритма
Начало
↓
Инициализация
↓
Условие?
Да
↙
Тело цикла
↓
Изменение счётчика
↰
Вывод результата
↓
Конец
Сравнение типов циклов
| Характеристика |
while |
do-while |
for |
foreach |
| Когда проверяется условие |
Перед итерацией |
После итерации |
Перед итерацией |
Автоматически |
| Минимум итераций |
0 |
1 |
0 |
0 |
| Известно число итераций |
Не обязательно |
Не обязательно |
Обычно да |
Зависит от коллекции |
| Удобен для |
Неопределённое число повторений |
Минимум одно выполнение |
Счётчики, массивы |
Перебор коллекций |
| Сложность |
Простой |
Простой |
Средняя |
Простой |
Примеры типовых задач
🔢 Математические вычисления
- Факториал числа
- Числа Фибоначчи
- Возведение в степень
- НОД и НОК
- Простые числа
📊 Обработка данных
- Сумма элементов
- Поиск максимума/минимума
- Среднее арифметическое
- Сортировка массивов
- Фильтрация данных
📝 Работа с текстом
- Подсчёт символов
- Поиск подстроки
- Замена символов
- Валидация ввода
- Парсинг данных
🎨 Генерация паттернов
- Геометрические фигуры
- Числовые пирамиды
- Таблицы данных
- ASCII-арт
- Фракталы
Оптимизация циклов
✅ Хорошие практики
- Вынос инвариантных вычислений из цикла
- Минимизация операций в теле цикла
- Использование подходящего типа цикла
- Кэширование длины массива
- Избегание лишних проверок
❌ Частые ошибки
- Забытое изменение счётчика
- Неверное условие выхода
- Выход за границы массива
- Модификация коллекции в foreach
- Слишком глубокая вложенность