Українська
Переходи та типові алгоритми
Оператори переходу
Оператори переходу (jump statements) змінюють хід виконання циклу (https://learn.microsoft.com/dotnet/csharp/language-reference/statements/jump-statements):
break– негайно завершує найближчий цикл або гілкуswitch;continue– пропускає решту тіла й переходить до наступної ітерації найближчого циклу;return– завершує метод; в операторах верхнього рівня – усю програму;goto мітка– переходить до оператора з міткою (використовується вкрай рідко).
cs
// Перше число від 100, яке ділиться і на 7, і на 13.
int found = 0;
for (int n = 100; ; n++)
{
if (n % 7 != 0)
{
continue; // не ділиться на 7 – далі
}
if (n % 13 == 0)
{
found = n;
break; // знайдено – вийти з циклу
}
}
Console.WriteLine(found); // 182Оператор break у вкладеному циклі завершує лише внутрішній цикл. Щоб вийти одразу з кількох циклів, використовують логічну змінну-прапорець, яку перевіряє зовнішній цикл, або виносять цикли в окремий метод і виходять з нього оператором return. C# підтримує й оператор goto, але код із переходами на мітки важко читати й перевіряти, тому в сучасних програмах його не використовують. Зверніть увагу: break усередині switch завершує лише switch, а не цикл, у якому він розташований.
Типові алгоритми з циклами
Більшість задач з циклами зводиться до кількох шаблонів (табл. 3.2).
Таблиця 3.2. Типові алгоритми з циклами
| Задача | Схема розв’язання |
|---|---|
| сума, добуток | змінна-накопичувач: sum = 0 (product = 1) до циклу, sum += x у циклі |
| кількість | лічильник count = 0, count++ для елементів, що задовольняють умову |
| мінімум, максимум | min = double.MaxValue або перший елемент; min = Math.Min(min, x) |
| середнє | сума та кількість; перед діленням перевірити, що кількість не нуль |
| пошук | цикл із break, щойно елемент знайдено; прапорець found |
| цифри числа | n % 10 – остання цифра, n /= 10 – відкинути її, доки n > 0 |
| наближене обчислення | повторювати, доки зміна результату не стане меншою за точність eps |
| повторний запит | do/while або while (true) з TryParse і break |
Ітераційні обчислення з точністю виконують циклом, який зупиняється, коли черговий доданок або зміна результату стає меншою за задану точність. Щоб цикл гарантовано завершився, додають обмеження кількості ітерацій:
cs
// e^x = 1 + x + x²/2! + x³/3! + …
double x = 1.0, eps = 1e-12;
double term = 1, sum = 1;
int k = 0;
while (Math.Abs(term) >= eps && k < 1000)
{
k++;
term *= x / k; // наступний доданок з попереднього
sum += term;
}
Console.WriteLine($"e^{x} ≈ {sum} за {k} доданків");
Console.WriteLine($"Math.Exp: {Math.Exp(x)}");Кожен доданок обчислюється з попереднього множенням на x / k, тому факторіал окремо не рахується. Програма виводить e^1 ≈ 2,718281828458995 за 15 доданків і Math.Exp: 2,718281828459045.
Випадкові числа для ігор і моделювання дає Random.Shared.Next(min, max) (верхня межа не входить):
cs
int secret = Random.Shared.Next(1, 101); // від 1 до 100
int attempts = 0;
int guess;
do
{
Console.Write("Ваше число: ");
if (!int.TryParse(Console.ReadLine(), out guess))
{
break;
}
attempts++;
Console.WriteLine(guess < secret ? "Більше" :
guess > secret ? "Менше" : "Вгадали!");
} while (guess != secret);
Console.WriteLine($"Спроб: {attempts}");