OOP Course
Сьогодні

Підрозділ 2.Q

Питання для самоконтролю

Питання для самоконтролю — Розділ 2. Основи програмування на C 2.1. Структура програми 1. Що таке top level statements у C 9? Що компілятор додає неявно, коли ви пишете код без класу Program і методу Main ? 2.

Питання для самоконтролю — Розділ 2. Основи програмування на C#

2.1. Структура програми

  1. Що таке top-level statements у C# 9? Що компілятор додає неявно, коли ви пишете код без класу Program і методу Main?

  2. Що буде, якщо забути крапку з комою в кінці інструкції? Що саме повідомить компілятор і на якому етапі?

  3. У чому різниця між визначенням методу і його викликом? Чи виконується метод автоматично, коли ви його визначаєте?

  4. C# є реєстрозалежною мовою. Що виведе наступний код (вкажіть, чи скомпілюється він взагалі)?

    string name = "Іван";
    string Name = "Марія";
    Console.WriteLine(name);
    Console.WriteLine(Name);
  5. Поясніть різницю між однорядковим і багаторядковим коментарем. Коли доречно використовувати кожен тип?

  6. Що таке блок коду в C#? Скільки рівнів вкладеності допускається і чому блоки є фундаментальною конструкцією мови?

  7. Який параметр у файлі .csproj відповідає за версію .NET? Що означає значення net10.0? Що дає параметр <Nullable>enable</Nullable>?

  8. Поясніть, навіщо потрібен параметр <ImplicitUsings>enable</ImplicitUsings>. Що відбувається без нього?

2.2. Змінні та константи

  1. Яке відношення між поняттями «тип», «ім'я» і «значення» змінної? Навіщо потрібен кожен з цих трьох аспектів?

  2. У чому різниця між оголошенням змінної і її ініціалізацією? Що відбудеться, якщо спробувати прочитати значення змінної до ініціалізації?

  3. Що виведе наступний код?

    string diagnosis = "Первинний огляд";
    diagnosis = "Гіпертонія I ст.";
    diagnosis = "Гіпертонія I ст. — лікування розпочато";
    Console.WriteLine(diagnosis);
  4. Перелічіть правила іменування змінних у C#. Яка угода стосовно стилю іменування (camelCase/PascalCase) для локальних змінних?

  5. Що таке ключове слово var? Чи є var динамічним типом? Що відбувається після того, як компілятор вивів тип з виразу?

  6. Чому наступний код не скомпілюється?

    var x;
    x = 10;

    Як правильно записати той самий намір?

  7. Що таке константа? Чим вона відрізняється від змінної і коли варто використовувати const замість звичайної змінної?

  8. Спроєктуйте набір констант для медичної системи: нормальна температура тіла, мінімальний і максимальний пульс, назва клініки. Запишіть їх оголошення з дотриманням угод іменування.

2.3. Літерали

  1. Що таке літерал? Чим літерал відрізняється від змінної? Наведіть приклади літералів кожного виду.

  2. Запишіть число 255 у трьох системах числення: десятковій, двійковій і шістнадцятковій. Як вказати кожну форму в коді C#?

  3. Що таке роздільник розрядів _ у числових літералах? Що виведе наступний код?

    int million = 1_000_000;
    int cardNumber = 1234_5678;
    Console.WriteLine(million);
    Console.WriteLine(cardNumber);
  4. Який тип за замовчуванням мають речові літерали без суфікса (наприклад, 3.14)? Які суфікси потрібні для float і decimal? Чому суфікс для decimal особливо важливий у фінансових розрахунках?

  5. Що таке керуюча послідовність у символьних літералах? Запишіть символьні літерали для: табуляції, переходу на новий рядок, одинарної лапки, зворотного слішу.

  6. У чому різниця між звичайним рядковим літералом і verbatim-рядком (@"...")? Запишіть шлях C:\Users\Doctor\file.txt обома способами.

  7. Що таке null? Якому типу змінних можна присвоїти null і чому? Що відбудеться, якщо викликати метод на змінній з null?

  8. Поясніть, чому результат 3.2e3 дорівнює 3200. Запишіть число 0.00015 в експоненційній формі.

2.4. Типи даних

  1. Що визначає тип даних для змінної? Назвіть три речі, які тип визначає для змінної.

  2. Чим відрізняються типи byte і sbyte? Для яких практичних задач підходить byte, а для яких — sbyte?

  3. Який цілочисленний тип є найпоширенішим у C# і чому? Яке числове значення за замовчуванням має літерал 42?

  4. У чому принципова різниця між float/double і decimal при роботі з дробовими числами? Чому decimal незамінний у фінансових розрахунках?

  5. Що таке string і що таке object з точки зору системи типів .NET? Чому object може зберігати «будь-що», але використовується обережно?

  6. Що означає, що int є псевдонімом System.Int32? Чи є різниця між int a = 4 і System.Int32 a = 4 для компілятора?

  7. Що виведе наступний код?

    var hello = "Hello";
    var c     = 20;
    var d     = 3.14;
    Console.WriteLine(hello.GetType().Name);
    Console.WriteLine(c.GetType().Name);
    Console.WriteLine(d.GetType().Name);
  8. Визначте тип, який найкраще підходить для кожної ситуації: вік пацієнта (0–120), точна сума рахунку в гривнях, пульс у ударах за хвилину (0–300), результат аналізу на гемоглобін (дробове значення), ознака госпіталізації (так/ні). Обґрунтуйте вибір.

2.5. Консольне введення-виведення

  1. У чому різниця між Console.Write і Console.WriteLine? Наведіть приклад, де важливо використати саме Console.Write.

  2. Що таке інтерполяція рядків у C#? Що означає символ $ перед рядком і фігурні дужки {...} всередині нього? Чи можна поміщати в дужки не лише змінні, але й вирази?

  3. Порівняйте інтерполяцію рядків ($"...") і складений формат (плейсхолдери {0}, {1}). Яка перевага інтерполяції у сучасному C#?

  4. Що повертає Console.ReadLine()? Чому результат має тип string?, а не просто string? Коли метод поверне null?

  5. Що відбудеться, якщо користувач введе рядок "сорок п'ять" там, де програма чекає:

    int age = Convert.ToInt32(Console.ReadLine());

    Як захистити програму від такої ситуації?

  6. Що таке культура операційної системи у контексті введення дробових чисел? Чому 1.5 з крапкою може призвести до помилки на машині з українською культурою?

  7. Напишіть фрагмент коду, що зчитує з консолі ім'я і вік пацієнта, а потім виводить рядок у форматі: "Пацієнт: Іван Петренко, 45 р.".

  8. Поясніть, чому наступний код виводить значення у форматі інтерполяції, але age.ToString() є бажаною практикою при передачі числа в рядок:

    int age = 45;
    Console.WriteLine($"Вік: {age}");
    Console.WriteLine($"Вік: {age.ToString()}");

2.6. Арифметичні операції

  1. Що відбувається при діленні двох цілих чисел у C#? Що виведе наступний код?

    double wrongResult = 10 / 3;
    double rightResult = 10.0 / 3.0;
    Console.WriteLine(wrongResult);
    Console.WriteLine(rightResult);
  2. Що таке операція % (залишок від ділення)? Як за допомогою % перевірити, чи є число парним?

  3. У чому різниця між префіксним (++x) і постфіксним (x++) інкрементом? Що виведе наступний код?

    int x = 5;
    int z = x++;
    Console.WriteLine(x);
    Console.WriteLine(z);
  4. Що таке пріоритет операцій? Яким буде результат виразу c-- - b * a, де c=40, b=5, a=3? Поясніть крок за кроком.

  5. Що таке лівоасоціативність арифметичних операцій? Яким буде результат 10 / 5 * 2 і чому?

  6. Як отримати дробовий результат при діленні двох цілочисленних змінних patients / doctors? Запишіть код.

  7. Написати код для обчислення ІМТ (індекс маси тіла) за формулою вага / (зріст * зріст), де вага в кг і зріст у метрах. Виведіть результат.

  8. Поясніть, чому x++ * 2 і ++x * 2 дають різні результати, якщо початкове значення x = 3. Обчисліть обидва вирази.

2.7. Порозрядні операції

  1. Що таке порозрядні операції? На відміну від арифметичних операцій, над чим саме вони виконуються?

  2. Поясніть операцію побітового AND (&). Яким буде результат 4 & 5? Покажіть двійкові подання і побітові обчислення.

  3. Яка практична задача вирішується за допомогою операції OR (|)? Наведіть приклад встановлення окремого біту у числі.

  4. Яка унікальна властивість операції XOR (^) робить її придатною для найпростішого шифрування? Доведіть математично, що (x ^ k) ^ k = x.

  5. Що таке додатковий код (two's complement)? Чому ~12 дорівнює -13, а не іншому числу?

  6. Що відбувається з числом при зсуві вліво на 1 позицію? А при зсуві вправо? Яким математичним операціям це відповідає?

  7. Що виведе наступний код і чому?

    int a = 22;
    int b = a >> 2;
    Console.WriteLine(b);
  8. Порівняйте << з множенням на 2 за ефективністю. Коли варто використовувати зсуви замість арифметичних операцій, а коли — ні?

2.8. Операції присвоєння

  1. Що таке операція присвоєння і яким є порядок її виконання відносно інших операцій у виразі?

  2. Що означає правоасоціативність операцій присвоєння? Що виведе наступний код?

    int a, b, c;
    a = b = c = 100;
    Console.WriteLine(a);
    Console.WriteLine(b);
    Console.WriteLine(c);
  3. Перепишіть вираз score = score + 10 за допомогою складеного оператора присвоєння. Назвіть п'ять складених арифметичних операторів присвоєння.

  4. Що виведе наступний код? Поясніть крок за кроком:

    int a = 8;
    int b = 6;
    int c = a += b -= 5;
    Console.WriteLine(a);
    Console.WriteLine(b);
    Console.WriteLine(c);
  5. Що робить оператор |= з бітовими прапорцями? Запишіть приклад, де ви встановлюєте нульовий біт числа за допомогою |=.

  6. Чому складені оператори присвоєння (+=, -= тощо) зменшують ризик помилок порівняно зі звичайним записом a = a + b?

  7. Напишіть код, що накопичує суму трьох медичних витрат (консультація, аналізи, ліки) за допомогою +=, а потім застосовує знижку 10% через -=.

  8. Чи можливе таке: 3 = x? Чи можливе const double Pi = 3.14; Pi = 3.0;? Поясніть правило щодо лівого операнда присвоєння.

2.9. Перетворення базових типів

  1. Чому наступний код не скомпілюється, хоча значення 74 вписується в byte?

    byte a = 4;
    byte b = a + 70;

    Як виправити цей код?

  2. Що таке розширювальне перетворення (widening)? Чому воно відбувається автоматично і не потребує явного приведення?

  3. Що таке звужувальне перетворення (narrowing)? Чому воно вимагає явного приведення? Що відбудеться, якщо значення не вписується в цільовий тип?

  4. Що виведе наступний код і чому результат саме такий?

    ushort a = 300;
    byte b = (byte)a;
    Console.WriteLine(b);
  5. Що робить (int) з дробовим числом? Чим це відрізняється від математичного округлення? Що виведе (int)36.9?

  6. Поясніть ланцюжки автоматичних безпечних перетворень. Чому перетворення між double і decimal не є автоматичним в жодному напрямку, попри те що decimal «більший»?

  7. Напишіть код, що обчислює частку чоловіків серед пацієнтів у відсотках. Використайте явне приведення для отримання дробового результату ділення.

  8. Що таке sign extension (розширення зі знаком)? Чому значення sbyte -4 після перетворення в short залишається -4, а не стає великим позитивним числом?

2.10. Явні та неявні перетворення

  1. У чому різниця між явним і неявним перетворенням типів? Хто відповідає за виконання кожного з них?

  2. Коли компілятор дозволяє неявне перетворення? Яка гарантія повинна виконуватися, щоб перетворення вважалося безпечним?

  3. Що таке ключове слово checked? Що відбудеться у наступному коді без checked і з ним?

    int a = 33;
    int b = 600;
    byte c = (byte)(a + b);
  4. Що таке unchecked і навіщо воно потрібне, якщо це «стандартна поведінка»?

  5. Що виведе наступний код і чому?

    int a = 33;
    int b = 600;
    byte c = (byte)(a + b);
    Console.WriteLine(c);

    Порахуйте самостійно, чому результат 121.

  6. Поясніть, чому отримане в результаті переповнення неправильне значення особливо небезпечне порівняно зі звичайним винятком. У яких медичних або фінансових сценаріях це критично?

  7. Чи є decimal більшим за double у сенсі точності та кількості значущих цифр? Якщо так, чому не можна неявно конвертувати double у decimal?

  8. Спроєктуйте функцію CalculateDose(double weightKg, double dosePerKg), що повертає результат як decimal. Використайте явне перетворення і поясніть, де воно відбувається.

2.11. Умовні вирази

  1. Що повертають оператори порівняння (==, !=, <, >, <=, >=)? Якому типу належить результат?

  2. У чому різниця між && і & для логічних значень? Що таке скорочене обчислення (short-circuit evaluation) і чому воно підвищує продуктивність?

  3. Поясніть оператор XOR (^) для логічних значень. Коли він повертає true?

  4. Запишіть умову, що перевіряє: «пацієнт є дорослим (вік >= 18) І має підвищений тиск (систолічний >= 140) АБО є критичний стан (тиск >= 180)». Використовуйте дужки для ясності.

  5. Що виведе наступний код?

    int age = 45;
    int bpSystolic = 155;
    bool highRisk = bpSystolic >= 160 || (age > 40 && bpSystolic >= 140);
    Console.WriteLine(highRisk);
  6. Чому if (isEmergency == true) є надлишковим записом? Як правильно записати цю умову?

  7. Яку роль відіграє оператор ! (NOT)? Запишіть еквівалентний вираз для !(age >= 18) без використання !.

  8. Розставте пріоритети операцій у наступному виразі і вкажіть результат (всі змінні мають конкретні значення):

    bool result = !hasFever || age > 60 && bpSystolic < 180;
    // hasFever = false, age = 65, bpSystolic = 150

2.12. Конструкція if..else та тернарна операція

  1. Що відбувається, якщо умова блоку if є false і немає блоку else? Яка частина коду виконується?

  2. Як працює ланцюжок else if? Чи перевіряються всі умови підряд, чи виконання зупиняється після першого збігу?

  3. Що виведе наступний код?

    int bpSystolic = 145;
    if (bpSystolic < 120)      Console.WriteLine("Оптимальний");
    else if (bpSystolic < 130) Console.WriteLine("Нормальний");
    else if (bpSystolic < 140) Console.WriteLine("Підвищено-нормальний");
    else if (bpSystolic < 160) Console.WriteLine("Гіпертонія I");
    else                        Console.WriteLine("Гіпертонія II+");
  4. Чому рекомендується завжди писати фігурні дужки навіть для однієї інструкції в тілі if? Наведіть приклад помилки, яка виникає через відсутність дужок.

  5. Що таке тернарна операція? Перетворіть наступну конструкцію у тернарну:

    string status;
    if (bpSystolic >= 140) status = "Підвищений";
    else status = "Нормальний";
  6. Що таке вкладені if? Напишіть код, що спочатку перевіряє вік (>= 60 — похилий), а потім всередині — тиск (>= 160 — критичний), і виводить відповідне повідомлення.

  7. Коли доречно використовувати тернарний оператор, а коли краще залишити повну форму if...else? Наведіть приклад обох ситуацій.

  8. Спроєктуйте ланцюжок if...else if...else, що класифікує ІМТ пацієнта: нижче 18.5 — дефіцит ваги, 18.5–24.9 — норма, 25.0–29.9 — надлишкова вага, 30 і вище — ожиріння.

2.13. Цикли

  1. Назвіть чотири типи циклів у C#. Для якої ситуації кожен з них найкраще підходить?

  2. З яких трьох частин складається заголовок циклу for? Коли виконується кожна частина?

  3. Що виведе наступний код?

    for (int i = 5; i >= 1; i--)
        Console.Write($"{i} ");
  4. У чому ключова відмінність між while і do...while? Наведіть приклад ситуації, де do...while є єдиним коректним вибором.

  5. Що таке break і continue? Поясніть їхній вплив на виконання циклу. Чим вони відрізняються один від одного?

  6. Чому у циклі foreach не можна змінювати елементи колекції через змінну циклу? Як слід вчинити, якщо потрібна модифікація елементів?

  7. Напишіть код з вкладеними циклами, що виводить таблицю множення від 1×1 до 3×3.

  8. Що таке нескінченний цикл? Запишіть нескінченний цикл for і поясніть, як коректно вийти з нього за допомогою break.

2.14. Масиви

  1. Що таке масив? Що означає «фіксований розмір» і «однотипні елементи» у визначенні масиву?

  2. З якого індексу починається нумерація елементів масиву? Чому це важливо враховувати при звертанні до останнього елемента?

  3. Що відбудеться під час виконання наступного коду?

    int[] values = { 1, 2, 3 };
    Console.WriteLine(values[10]);
  4. Які чотири способи ініціалізації масиву з конкретними значеннями допускаються в C#? Наведіть усі чотири варіанти для масиву {45, 32, 67, 28}.

  5. Що таке оператор ^ (індекс від кінця)? Напишіть код, що виводить останній та передостанній елемент масиву, використовуючи ^.

  6. У чому різниця між прямокутним двовимірним масивом [,] і зубчастим масивом [][]? Коли доречний кожен варіант?

  7. Напишіть код, що знаходить мінімальне і максимальне значення в масиві цілих чисел, використовуючи цикл for.

  8. Що таке властивість Length для одновимірного масиву і що повертає Length для двовимірного? Як отримати кількість рядків і стовпців двовимірного масиву?

2.15. Завдання з масивами

  1. Опишіть алгоритм підрахунку кількості елементів масиву, що задовольняють певну умову. Яку структуру даних використовують для накопичення кількості?

  2. Напишіть код, що підраховує кількість значень тиску >= 140 у масиві {120, 155, 130, 172, 118, 145}.

  3. Опишіть алгоритм реверсу масиву без виділення нового масиву. Чому потрібна тимчасова змінна temp для обміну елементів?

  4. Що виведе наступний код після реверсу масиву {1, 2, 3, 4, 5}? Скільки ітерацій виконає цикл і чому саме стільки?

  5. Поясніть принцип роботи бульбашкового сортування. Що означає «спливання» більшого елемента?

  6. Чому зовнішній цикл бульбашкового сортування виконується n-1 разів, а не n?

  7. Порівняйте ручну реалізацію сортування та Array.Sort(). Коли в реальному коді краще використовувати готовий метод і чому?

  8. Напишіть код, що знаходить середнє значення масиву показників температури {36.6, 37.2, 38.5, 37.0, 36.8}.

2.16. Методи

  1. Що таке метод і яку задачу він вирішує? Чому важливо уникати дублювання коду?

  2. Які чотири складові мають усі методи? Що означає тип void для методу?

  3. У чому різниця між визначенням методу і його викликом? Чи має значення порядок: визначення до або після виклику?

  4. Що таке скорочений запис методу (expression-bodied member) через =>? Коли він застосовується і яке обмеження має?

  5. Що виведе наступний код?

    void PrintSeparator() => Console.WriteLine("---");
    void PrintHeader()
    {
        PrintSeparator();
        Console.WriteLine("Журнал");
        PrintSeparator();
    }
    PrintHeader();
  6. Поясніть принцип «кожен метод відповідає лише за одну річ». Чому цей принцип покращує читабельність і підтримку коду?

  7. Напишіть три методи: PrintCriticalAlert, PrintWarningAlert, PrintNormalStatus, і викличте потрібний залежно від значення bpSystolic.

  8. Запропонуйте, як розбити наступний складний блок коду на кілька методів: зчитування даних пацієнта, перевірка коректності даних, виведення картки пацієнта.

2.17. Параметри методів

  1. У чому різниця між формальними параметрами і фактичними параметрами (аргументами)?

  2. Чи можна передавати аргументи у іншому порядку, ніж оголошені параметри? Що для цього потрібно?

  3. Що таке необов'язкові параметри зі значенням за замовчуванням? Де в списку параметрів вони повинні знаходитися?

  4. Що виведе наступний код?

    void RegisterVisit(string name, string ward = "Терапія", bool urgent = false)
    {
        string tag = urgent ? " [ТЕРМІНОВО]" : "";
        Console.WriteLine($"{name}{ward}{tag}");
    }
    RegisterVisit("Іван", "Кардіологія", true);
    RegisterVisit("Марія", "Неврологія");
    RegisterVisit("Олег");
  5. Що таке іменовані параметри? Запишіть виклик методу RegisterPatient(string name, int age, string ward), де ward передається за іменем, а name і age — за позицією.

  6. Яке обмеження існує щодо порядку іменованих і позиційних аргументів в одному виклику?

  7. Що станеться, якщо передати аргумент типу string у параметр типу int? На якому етапі виявляється ця помилка?

  8. Спроєктуйте метод PrintPatientCard, що приймає ім'я, вік та необов'язкові параметри: відділення (за замовчуванням «Загальне») і VIP-статус (за замовчуванням false).

2.18. Повернення значення та оператор return

  1. У чому принципова різниця між методом типу void і методом з типом результату string або int?

  2. Що відбувається після виконання оператора return? Чи виконається код, що стоїть після return у тому самому блоці?

  3. Що таке «недосяжний код» (unreachable code)? Як компілятор реагує на нього?

  4. Що таке Guard Clause (охоронна умова)? Які переваги цього патерну порівняно зі вкладеними умовами?

  5. Що виведе наступний код?

    string GetDiagnosis(string symptom)
    {
        if (symptom == "кашель") return "Бронхіт";
        if (symptom == "температура") return "ГРВІ";
        return "Необхідне обстеження";
    }
    Console.WriteLine(GetDiagnosis("кашель"));
    Console.WriteLine(GetDiagnosis("головний біль"));
  6. Як результат одного методу можна передати безпосередньо як аргумент іншому методу без проміжної змінної? Запишіть приклад.

  7. Напишіть метод CalculateBMI(double weight, double height), що повертає значення ІМТ, і метод IsNormalBMI(double bmi), що повертає true, якщо ІМТ між 18.5 і 24.9.

  8. Поясніть, коли return; (без значення) використовується у void-методах. Напишіть приклад методу з двома охоронними умовами на початку.

2.19. Передача параметрів за посиланням та значенням. Вихідні параметри

  1. Що відбувається з оригінальною змінною при передачі аргументу за значенням (без модифікаторів)? Що відбувається при передачі за посиланням через ref?

  2. Що виведе наступний код?

    void Increment(int x) { x += 10; }
    int a = 5;
    Increment(a);
    Console.WriteLine(a);
  3. Що виведе наступний код?

    void Increment(ref int x) { x += 10; }
    int a = 5;
    Increment(ref a);
    Console.WriteLine(a);
  4. У чому різниця між ref і out? Яка вимога до ініціалізації змінної для кожного з них?

  5. Навіщо потрібні out-параметри, якщо є оператор return? У чому їхня перевага? Наведіть приклад методу, що повертає два значення через out.

  6. Що таке inline-оголошення out-змінних? Запишіть виклик методу з використанням out var.

  7. Для чого призначений модифікатор in? Чим він схожий і чим відрізняється від ref?

  8. Спроєктуйте метод CalculateVitalSigns(int age, out int maxHeartRate, out int targetHeartRate), що обчислює максимальний пульс (220 - вік) і цільовий (75% від максимального). Запишіть визначення і виклик методу.

2.20. Масив параметрів та ключове слово params

  1. Що таке params? Яку задачу воно вирішує, що не вирішують звичайні параметри?

  2. Що відбувається всередині методу з params-параметром? Чи є він звичайним масивом?

  3. Які три способи можна використати для передачі значень у params-параметр? Що відбудеться, якщо не передати жодного аргументу?

  4. Де в списку параметрів повинен знаходитися params-параметр? Що буде, якщо порушити це правило?

  5. У чому різниця між методом з params double[] values і методом зі звичайним double[] values? Чи однаковий виклик у обох?

  6. Що виведе наступний код?

    void Log(params double[] values)
    {
        Console.WriteLine($"Отримано: {values.Length}");
    }
    Log(36.6);
    Log(120.0, 80.0);
    Log();
  7. Напишіть метод LogMeasurements(string label, params double[] values), що виводить назву і середнє значення переданих показників. Переконайтеся, що порожній масив обробляється коректно.

  8. Порівняйте params і звичайний масив-параметр: коли кожен з них зручніший у публічному API?

2.21. Рекурсивні функції

  1. Що таке рекурсія? Що відрізняє рекурсивну функцію від звичайної?

  2. Які два обов'язкових елементи повинна містити кожна коректна рекурсивна функція? Що станеться, якщо один з них відсутній?

  3. Поясніть покроково, як виконується Factorial(4). Скільки рекурсивних викликів відбудеться і в якому порядку?

  4. Що таке стек викликів? Що трапляється з ним у разі нескінченної рекурсії?

  5. Яке обмеження має наївна рекурсивна реалізація Фібоначчі? Чому Fibonacci(30) виконується повільно?

  6. Перепишіть факторіал через цикл for. Порівняйте читабельність рекурсивного та ітеративного варіантів.

  7. Для яких класів задач рекурсія є природним і виразним рішенням? Назвіть щонайменше три і поясніть чому.

  8. Що виведе наступний код і скільки разів буде викликана функція f?

    int f(int n)
    {
        if (n == 0) return 0;
        if (n == 1) return 1;
        return f(n - 1) + f(n - 2);
    }
    Console.WriteLine(f(5));

2.22. Локальні функції

  1. Що таке локальна функція і чим вона відрізняється від звичайного приватного методу класу?

  2. Де у коді може бути оголошена локальна функція? Чи має значення порядок: визначення до або після місця використання?

  3. Яку задачу вирішують локальні функції? Наведіть приклад, де без локальної функції виникає дублювання коду.

  4. Що таке доступ до змінних зовнішнього методу (захоплення)? Чому це може бути небезпечно?

  5. Що таке static локальна функція? Яку гарантію вона надає і для чого це корисно?

  6. У чому перевага локальної функції над виносом коду у приватний метод класу?

  7. Перепишіть наступний код з дублюванням, використовуючи локальну функцію:

    void AnalyzeTest(double hgb, double glc)
    {
        string hgbStatus = hgb < 120 ? "Низький" : hgb > 170 ? "Високий" : "Норма";
        string glcStatus = glc < 3.9 ? "Низький" : glc > 6.1 ? "Високий" : "Норма";
        Console.WriteLine($"Гемоглобін: {hgbStatus}");
        Console.WriteLine($"Глюкоза: {glcStatus}");
    }
  8. Коли варто оголошувати локальну функцію зі словом static? Що зміниться, якщо спробувати звернутися до змінної зовнішнього методу всередині static-локальної функції?

2.23. Конструкція switch

  1. У яких ситуаціях конструкція switch є кращою альтернативою ланцюжку if...else if? Що вона повідомляє читачеві коду?

  2. Навіщо потрібен оператор break наприкінці кожного блоку case? Що станеться, якщо його відсутній у конструкції switch — але є return?

  3. Що виведе наступний код?

    string diagnosis = "Bronchitis";
    switch (diagnosis)
    {
        case "Pneumonia":
        case "Bronchitis":
        case "Pleuritis":
            Console.WriteLine("Пульмонологія");
            break;
        default:
            Console.WriteLine("Терапія");
            break;
    }
  4. Що таке блок default у конструкції switch? Чи є він обов'язковим і чому рекомендується його завжди додавати?

  5. Для чого використовується goto case? Напишіть приклад, де goto case логічно виправданий.

  6. Що таке switch-вираз (switch expression)? Чим він відрізняється від switch-оператора синтаксично і концептуально?

  7. Що виведе наступний код?

    string GetWard(string code) => code switch
    {
        "ICU"  => "Інтенсивна терапія",
        "CARD" => "Кардіологія",
        _      => "Загальне"
    };
    Console.WriteLine(GetWard("CARD"));
    Console.WriteLine(GetWard("ORTHO"));
  8. Що таке «вичерпність» switch-виразу? Що станеться, якщо відсутня гілка _ і вхідне значення не збігається з жодним case?

2.24. Перерахування enum

  1. Що таке enum? Яку задачу він вирішує порівняно з використанням «магічних чисел» або рядкових констант?

  2. Яке числове значення за замовчуванням отримує перша константа enum? Яке значення отримує наступна?

  3. Що виведе наступний код?

    enum PatientStatus { Registered, Admitted, UnderTreatment, Discharged, Critical }
    PatientStatus status = PatientStatus.Admitted;
    Console.WriteLine(status.ToString());
    Console.WriteLine((int)status);
  4. Чому використання enum безпечніше, ніж рядкові константи типу "admitted" для представлення станів системи? Наведіть конкретний приклад помилки, яку enum запобігає.

  5. Які цілі типи можуть використовуватися як основа enum? Для яких сценаріїв варто обирати byte замість int?

  6. Що відбудеться, якщо привести до enum числове значення, яке не відповідає жодній константі? Як захиститися від цього при роботі з ненадійними зовнішніми даними?

  7. Напишіть enum WardType зі значеннями ICU, Surgery, Cardiology, Neurology, General і метод GetWardDescription(WardType ward), що повертає текстовий опис через switch-вираз.

  8. Для enum PriorityLevel { Low = 1, Medium = 2, High = 5, Critical = 10 } запишіть умову, що перевіряє: «пріоритет є принаймні High». Поясніть, чому явні числові значення у цьому enum є осмисленим вибором.

Розроблено Tomka Yurii · © 2026 ·