Українська
Практика
Приклад 1. Пора року та кількість днів у місяці
Написати програму, яка запитує номер місяця та рік, перевіряє введені дані й виводить пору року, ознаку високосного року та кількість днів у місяці.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Write("Номер місяця (1–12): ");
if (!int.TryParse(Console.ReadLine(), out int month)
|| month is < 1 or > 12)
{
Console.WriteLine("Помилка: місяць має бути від 1 до 12.");
return;
}
Console.Write("Рік: ");
if (!int.TryParse(Console.ReadLine(), out int year) || year < 1)
{
Console.WriteLine("Помилка: рік має бути додатним.");
return;
}
bool isLeap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
string season = month switch
{
12 or 1 or 2 => "зима",
>= 3 and <= 5 => "весна",
>= 6 and <= 8 => "літо",
_ => "осінь",
};
int days = month switch
{
2 => isLeap ? 29 : 28,
4 or 6 or 9 or 11 => 30,
_ => 31,
};
Console.WriteLine($"Пора року: {season}");
Console.WriteLine($"Рік {(isLeap ? "високосний" : "невисокосний")}");
Console.WriteLine($"Днів у місяці: {days}");Рік високосний, якщо він ділиться на 4, але не на 100, або ділиться на 400. Перевірка month is < 1 or > 12 виконується до виразів switch, тому гілка _ у виразі для пори року означає лише місяці 9–11. Шаблони or об’єднують місяці з однаковим результатом, а and – задають діапазон. Результати для лютого 2024 і 1900 років та листопада 2026 року:
Номер місяця (1–12): 2
Рік: 2024
Пора року: зима
Рік високосний
Днів у місяці: 29Номер місяця (1–12): 2
Рік: 1900
Пора року: зима
Рік невисокосний
Днів у місяці: 28Номер місяця (1–12): 11
Рік: 2026
Пора року: осінь
Рік невисокосний
Днів у місяці: 30Приклад 2. Прості числа в діапазоні
Написати програму, яка запитує межі діапазону (у будь-якому порядку), виводить усі прості числа з нього по 10 у рядку та їх кількість.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
int from = ReadInt("Початок діапазону: ");
int to = ReadInt("Кінець діапазону: ");
if (from > to)
{
(from, to) = (to, from); // поміняти межі місцями
}
int count = 0;
for (int n = from; n <= to; n++)
{
if (n < 2)
{
continue; // 0 і 1 не є простими
}
bool isPrime = true;
for (int d = 2; d * d <= n; d++)
{
if (n % d == 0)
{
isPrime = false;
break; // дільник знайдено
}
}
if (!isPrime)
{
continue;
}
count++;
Console.Write($"{n,6}");
if (count % 10 == 0)
{
Console.WriteLine(); // по 10 чисел у рядку
}
}
if (count % 10 != 0)
{
Console.WriteLine();
}
Console.WriteLine($"Простих чисел: {count}");
static int ReadInt(string prompt)
{
while (true)
{
Console.Write(prompt);
if (int.TryParse(Console.ReadLine(), out int value))
{
return value;
}
Console.WriteLine("Потрібне ціле число.");
}
}Число n просте, якщо воно більше за 1 і не має дільників від 2 до √n: якщо n = a · b і a ≤ b, то a ≤ √n. Тому внутрішній цикл перевіряє умову d * d <= n і завершується оператором break, щойно дільник знайдено. Оператор continue пропускає числа, менші за 2, і складені числа. Запис (from, to) = (to, from) міняє значення змінних місцями (кортежі розглядаються в темі 11). Локальна функція ReadInt повторює запит у циклі while (true), доки не буде введено ціле число. Результат:
Початок діапазону: 100
Кінець діапазону: абв
Потрібне ціле число.
Кінець діапазону: 1
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
Простих чисел: 25Приклад 3. Квадратний корінь методом Ньютона
Написати програму, яка обчислює квадратний корінь з невід’ємного числа a методом Ньютона із заданою точністю, виводить наближення на кожній ітерації, кількість ітерацій і порівнює результат із Math.Sqrt.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Write("Число a (a ≥ 0): ");
if (!double.TryParse(Console.ReadLine(), out double a) || a < 0)
{
Console.WriteLine("Помилка: потрібне невід’ємне число.");
return;
}
Console.Write("Точність (наприклад, 1e-10): ");
if (!double.TryParse(Console.ReadLine(), out double eps)
|| eps <= 0)
{
Console.WriteLine("Помилка: точність має бути додатною.");
return;
}
if (a == 0)
{
Console.WriteLine("Корінь: 0"); // для нуля збіжність повільна
return;
}
const int MaxIterations = 100;
double x = a > 1 ? a : 1; // початкове наближення
int iterations = 0;
double delta;
do
{
double next = (x + a / x) / 2; // формула Ньютона
delta = Math.Abs(next - x);
x = next;
iterations++;
Console.WriteLine($"{iterations,3}: x = {x:F12}");
} while (delta >= eps && iterations < MaxIterations);
Console.WriteLine($"Корінь: {x}");
Console.WriteLine($"Math.Sqrt: {Math.Sqrt(a)}");
Console.WriteLine($"Ітерацій: {iterations}");Кожне наступне наближення обчислюється за формулою xk+1 = (xk + a / xk) / 2. Цикл do/while підходить, бо хоча б одну ітерацію потрібно виконати, щоб обчислити зміну delta. Цикл завершується, коли зміна наближення стає меншою за точність, а константа MaxIterations гарантує завершення навіть за дуже малої точності. Для a = 0 наближення лише зменшується вдвічі на кожній ітерації, тому цей випадок оброблено окремо. Результат для a = 2 і точності 10−10:
Число a (a ≥ 0): 2
Точність (наприклад, 1e-10): 1e-10
1: x = 1,500000000000
2: x = 1,416666666667
3: x = 1,414215686275
4: x = 1,414213562375
5: x = 1,414213562373
Корінь: 1,414213562373095
Math.Sqrt: 1,4142135623730951
Ітерацій: 5Метод Ньютона збігається дуже швидко: кількість правильних цифр приблизно подвоюється на кожній ітерації. Результат відрізняється від Math.Sqrt лише в останньому розряді.