Українська
Приклади та типові помилки
Приклади програм
Оцінка за шкалою ЄКТС
Програма переводить кількість балів в оцінку ЄКТС і за національною шкалою відповідно до шкали оцінювання Криворізького національного університету. Обидва перетворення виконуються виразами switch: перше – з реляційними шаблонами, друге – з константними шаблонами, об’єднаними or.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Write("Кількість балів (0–100): ");
if (!int.TryParse(Console.ReadLine(), out int points)
|| points is < 0 or > 100)
{
Console.WriteLine("Помилка: потрібне ціле число від 0 до 100.");
return;
}
string ects = points switch
{
>= 90 => "A",
>= 80 => "B",
>= 71 => "C",
>= 61 => "D",
>= 50 => "E",
>= 30 => "FX",
_ => "F",
};
string national = ects switch
{
"A" => "відмінно",
"B" or "C" => "добре",
"D" or "E" => "задовільно",
_ => "незадовільно",
};
Console.WriteLine($"Оцінка ЄКТС: {ects}");
Console.WriteLine($"За національною шкалою: {national}");Результати для 85 і 47 балів та для некоректного значення:
Кількість балів (0–100): 85
Оцінка ЄКТС: B
За національною шкалою: добреКількість балів (0–100): 47
Оцінка ЄКТС: FX
За національною шкалою: незадовільноКількість балів (0–100): 120
Помилка: потрібне ціле число від 0 до 100.Меню калькулятора
Програма-калькулятор зберігає поточне значення і в циклі do/while виконує команди користувача, доки не буде введено q. Команди обробляє оператор switch, а гілка з умовою when перехоплює ділення на нуль.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
double result = 0;
string command;
do
{
Console.WriteLine($"Поточне значення: {result}");
Console.Write("Команда (+, -, *, /, c – скинути, q – вихід): ");
command = Console.ReadLine() ?? "q";
if (command == "c")
{
result = 0;
continue; // до перевірки умови циклу
}
if (command is not ("+" or "-" or "*" or "/"))
{
if (command != "q")
{
Console.WriteLine($"Невідома команда «{command}».");
}
continue;
}
Console.Write("Число: ");
if (!double.TryParse(Console.ReadLine(), out double number))
{
Console.WriteLine("Це не число.");
continue;
}
switch (command)
{
case "+":
result += number;
break;
case "-":
result -= number;
break;
case "*":
result *= number;
break;
case "/" when number == 0:
Console.WriteLine("Ділення на нуль неможливе.");
break;
case "/":
result /= number;
break;
}
} while (command != "q");
Console.WriteLine($"Результат: {result}");Оператор continue у циклі do/while переходить до перевірки умови, тому команда q одразу завершує цикл. Операція ?? підставляє "q", якщо введення завершено (ReadLine повернув null). Шаблон not ("+" or "-" or "*" or "/") перевіряє, що команда не є жодною з операцій. Приклад роботи:
Поточне значення: 0
Команда (+, -, *, /, c – скинути, q – вихід): +
Число: 12,5
Поточне значення: 12,5
Команда (+, -, *, /, c – скинути, q – вихід): *
Число: 4
Поточне значення: 50
Команда (+, -, *, /, c – скинути, q – вихід): /
Число: 0
Ділення на нуль неможливе.
Поточне значення: 50
Команда (+, -, *, /, c – скинути, q – вихід): %
Невідома команда «%».
Поточне значення: 50
Команда (+, -, *, /, c – скинути, q – вихід): -
Число: 10
Поточне значення: 40
Команда (+, -, *, /, c – скинути, q – вихід): q
Результат: 40Статистика введених чисел
Програма зчитує числа до порожнього рядка, пропускає некоректні значення та виводить кількість, мінімум, максимум і середнє.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.InputEncoding = System.Text.Encoding.UTF8;
int count = 0;
double sum = 0;
double min = double.MaxValue;
double max = double.MinValue;
Console.WriteLine("Вводьте числа, порожній рядок – кінець:");
string? line = Console.ReadLine();
while (!string.IsNullOrEmpty(line))
{
if (double.TryParse(line, out double value))
{
count++;
sum += value;
min = Math.Min(min, value);
max = Math.Max(max, value);
}
else
{
Console.WriteLine($" «{line}» пропущено: це не число");
}
line = Console.ReadLine();
}
if (count == 0)
{
Console.WriteLine("Жодного числа не введено.");
}
else
{
Console.WriteLine($"Кількість: {count}");
Console.WriteLine($"Мінімум: {min}, максимум: {max}");
Console.WriteLine($"Середнє: {sum / count:F2}");
}Рядок зчитується перед циклом і ще раз у кінці тіла, тому умова while щоразу перевіряє новий рядок. Метод string.IsNullOrEmpty повертає true і для порожнього рядка, і для null (кінець введення). Мінімум починається з найбільшого можливого значення, тому перше ж число його зменшить. Перевірка count == 0 запобігає діленню на нуль. Результат:
Вводьте числа, порожній рядок – кінець:
12,5
7
сім
«сім» пропущено: це не число
-3
20
Кількість: 4
Мінімум: -3, максимум: 20
Середнє: 9,12Таблиця множення
Програма запитує розмір таблиці, повторюючи запит до коректного значення, і виводить таблицю множення за допомогою вкладених циклів for. Ширина поля {…,4} вирівнює числа за правим краєм.
cs
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Write("Розмір таблиці (1–12): ");
int size;
while (!int.TryParse(Console.ReadLine(), out size)
|| size < 1 || size > 12)
{
Console.Write("Введіть ціле число від 1 до 12: ");
}
Console.Write(" │"); // заголовок стовпців
for (int col = 1; col <= size; col++)
{
Console.Write($"{col,4}");
}
Console.WriteLine();
Console.WriteLine("───┼" + new string('─', 4 * size));
for (int row = 1; row <= size; row++) // зовнішній цикл
{
Console.Write($"{row,2} │");
for (int col = 1; col <= size; col++) // внутрішній цикл
{
Console.Write($"{row * col,4}");
}
Console.WriteLine();
}Цикл while у заголовку одночасно зчитує число й перевіряє його: TryParse записує результат у змінну size, оголошену до циклу. Символи │, ┼ і ─ малюють рамку. Результат для розміру 9 (перше введене значення 15 відхилено):
Розмір таблиці (1–12): 15
Введіть ціле число від 1 до 12: 9
│ 1 2 3 4 5 6 7 8 9
───┼────────────────────────────────────
1 │ 1 2 3 4 5 6 7 8 9
2 │ 2 4 6 8 10 12 14 16 18
3 │ 3 6 9 12 15 18 21 24 27
4 │ 4 8 12 16 20 24 28 32 36
5 │ 5 10 15 20 25 30 35 40 45
6 │ 6 12 18 24 30 36 42 48 54
7 │ 7 14 21 28 35 42 49 56 63
8 │ 8 16 24 32 40 48 56 64 72
9 │ 9 18 27 36 45 54 63 72 81Типові помилки
У табл. 3.3 наведено помилки, яких найчастіше припускаються під час роботи з розгалуженнями та циклами.
Таблиця 3.3. Типові помилки під час роботи з розгалуженнями та циклами
| Проблема | Причина | Виправлення |
|---|---|---|
блок після if виконується завжди; попередження CS0642 | крапка з комою після умови if (x > 0); | прибрати ; після дужки умови |
| цикл не завершується | тіло не змінює змінну з умови або умова завжди істинна | змінювати лічильник; перевірити умову покроково в налагоджувачі |
| зайва або пропущена ітерація | < замість <= чи навпаки, неправильне початкове значення | перевірити першу й останню ітерацію вручну |
| CS0163: Control cannot fall through… | у гілці switch немає break | завершити гілку break, return або continue |
CS8509: вираз switch невичерпний | немає гілки для частини значень | додати гілку _ |
| CS8510: шаблон недосяжний | загальніший шаблон стоїть вище (> 0 перед > 10) | розташувати гілки від часткових до загальних |
CS0165 після if без else | змінній не присвоєно значення в усіх гілках | ініціалізувати змінну або додати else |
| CS0103: змінна циклу недоступна | змінна оголошена в заголовку for або в блоці | оголосити змінну перед циклом |
break у switch не завершує цикл | break належить до найближчого switch | прапорець для циклу або return |