OOP Course
Сьогодні

Lab 01

Основи C#

Типи, умови, цикли, методи

Лаба 01 — Основи C#

Мета

Навчитися працювати з базовими конструкціями C#: типи даних, умовні оператори, цикли та методи.

Контекст

Це пісочниця — окремий мінімальний проєкт, який не зливається в main. Методи з Задачі 8 стануть методами класів у Лабі 03.


Перший запуск: налаштування репозиторію

Ці кроки виконуються один раз на початку курсу.

git init
git branch -m main

Створіть .gitignore у корені:

bin/
obj/
.vs/
*.user
git add .gitignore
git commit -m "Initial commit: add .gitignore"

Гілка для цієї лаби

git checkout main
git checkout -b sandbox/intro

Гілка sandbox/intro ніколи не зливається в main.


Створення проєкту

dotnet new console -o sandbox/intro --name SandboxIntro
cd sandbox/intro
dotnet run

Має вивести Hello, World!. Поверніться в корінь і зробіть коміт:

cd ../..
git add sandbox/
git commit -m "Lab01: create sandbox/intro console project"

Як виконувати завдання

Кожне завдання — окремий файл (Task1.cs, Task2.cs ...).
У Program.cs один рядок — змінюйте номер після кожного завдання:

Task1.Run();   // → Task2.Run() → Task3.Run() → ...

Після кожного завдання — коміт.


Задача 1. ІМТ пацієнта ⭐

Умова

Напишіть програму, яка зчитує вагу та зріст пацієнта і розраховує Індекс маси тіла (ІМТ).

Формула: ІМТ = вага / (зріст × зріст)

Формат вводу

Рядок Поле Тип
1 вага double (кг)
2 зріст double (м)

Приклади

вага зріст Вихід
70 1.75 ІМТ: 22.86
90 1.80 ІМТ: 27.78
55 1.62 ІМТ: 20.95

Підказки

  1. Зчитайте вагу через double.Parse(Console.ReadLine()!).
  2. Зчитайте зріст аналогічно.
  3. Порахуйте ІМТ за формулою.
  4. Виведіть результат із форматуванням {bmi:F2} (два знаки після коми).

Адаптація до вашого домену

Домен Формула Поле 1 Поле 2 Вихід
Готель завантаженість = зайнятих / всього зайнятих (int) всього (int) Завантаженість: X.XX
Ресторан калорійність 100 г = калорії / вага × 100 калорії (double) вага порції (double) Калорійність: X.XX ккал/100г
Університет середній бал = сума / кількість сума балів (double) кількість (int) Середній бал: X.XX
Прокат авто вартість = ціна × днів ціна/день (double) кількість днів (int) Вартість: X.XX грн

Коміт

git add sandbox/intro/Task1.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task1: calculate BMI from weight and height"

Задача 2. Вартість прийому зі знижкою ⭐

Умова

Напишіть програму, яка розраховує підсумкову вартість серії медичних прийомів з урахуванням знижки.

Формула: сума = ціна × кількість × (1 − знижка / 100)

Формат вводу

Рядок Поле Тип
1 ціна одного прийому double (грн)
2 кількість прийомів int
3 знижка int (%)

Приклади

ціна кількість знижка Вихід
500 3 10 Сума: 1350.00 грн
200 5 0 Сума: 1000.00 грн
750 2 15 Сума: 1275.00 грн

Підказки

  1. Зчитайте ціну як double, кількість і знижку як int.
  2. Формула: price * visits * (1 - discount / 100.0). Зверніть увагу на 100.0 — якщо написати 100, ділення буде цілочисельним.
  3. Виведіть результат з {total:F2}.

Адаптація до вашого домену

Домен Формула Поле 1 Поле 2 Поле 3 Вихід
Готель підсумок = ціна × ночей × (1 − знижка/100) ціна/ніч ночей знижка % Підсумок: X.XX грн
Ресторан чек = ціна × кількість × (1 − знижка/100) ціна страви кількість знижка % Чек: X.XX грн
Університет вартість = кредити × ціна × (1 − пільга/100) ціна/кредит кредитів пільга % Вартість: X.XX грн
Прокат авто вартість = ціна × дні × (1 − знижка/100) ціна/день днів знижка % Вартість: X.XX грн

Коміт

git add sandbox/intro/Task2.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task2: calculate visit cost with discount"

Задача 3. Вік та категорія пацієнта ⭐

Умова

Напишіть програму, яка зчитує рік народження пацієнта, розраховує вік і визначає вікову категорію.

Формула: вік = 2026 − рік народження

Категорії: 0–17 → дитина / 18–59 → дорослий / 60+ → пенсіонер

Формат вводу

Рядок Поле Тип
1 рік народження int

Приклади

рік народження Вихід (рядок 1) Вихід (рядок 2)
2010 Вік: 16 р. Категорія: дитина
1990 Вік: 36 р. Категорія: дорослий
1955 Вік: 71 р. Категорія: пенсіонер
2008 Вік: 18 р. Категорія: дорослий

Підказки

  1. Зчитайте рік як int.
  2. Вік = 2026 - birthYear.
  3. Використайте if / else if / else з трьома гілками.
  4. Виведіть два рядки: вік і категорію.

Адаптація до вашого домену

Домен Що визначити Умови
Готель клас номера за площею < 20 м² → економ / 20–40 → стандарт / > 40 → люкс
Ресторан розмір порції за вагою < 200 г → S / 200–400 → M / > 400 → L
Університет рівень курсу за кредитами ≤ 3 → базовий / 4–6 → середній / > 6 → поглиблений
Прокат авто стан авто за роком > 2020 → новий / 2015–2020 → норм / < 2015 → старий

Коміт

git add sandbox/intro/Task3.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task3: determine age and patient category with if/else"

Задача 4. Артеріальний тиск ⭐⭐

Умова

Напишіть програму, яка зчитує показники артеріального тиску і визначає категорію стану за стандартом AHA.

Категорії:

  • систолічний < 120 І діастолічний < 80 → норма
  • систолічний < 130 І діастолічний < 80 → підвищений
  • систолічний < 140 АБО діастолічний < 90 → гіпертонія 1 ступеня
  • інакше → гіпертонія 2 ступеня

Формат вводу

Рядок Поле Тип
1 систолічний тиск int (мм рт. ст.)
2 діастолічний тиск int (мм рт. ст.)

Приклади

систолічний діастолічний Вихід
115 75 Тиск: 115/75 — норма
125 78 Тиск: 125/78 — підвищений
135 88 Тиск: 135/88 — гіпертонія 1 ступеня
155 100 Тиск: 155/100 — гіпертонія 2 ступеня

Підказки

  1. Зчитайте обидва числа як int (два рядки).
  2. Перевіряйте умови зверху вниз: першою перевіряється найсуворіша норма.
  3. Зверніть увагу: третя гілка — АБО (||), а не І (&&). Чому? Якщо систолічний 135 і діастолічний 92 — яка це категорія?
  4. Виведіть один рядок з обома значеннями та статусом.

Адаптація до вашого домену

Домен Поле 1 Поле 2 Категорії
Готель ціна/ніч кількість ночей < 500 + ≤ 3 → бюджет / < 500 + > 3 → тривалий / ≥ 500 → бізнес / ≥ 2000 → преміум
Ресторан калорії ціна < 300 + < 100 → дієт/економ / < 300 + ≥ 100 → дієт/преміум / ≥ 300 → калорійна
Університет бал кількість спроб ≥ 90 → відмінно / 75–89 + 1 спроба → добре / 60–74 → задовільно / < 60 → незадовільно
Прокат авто рік випуску пробіг (тис. км) > 2020 + < 50 → новий / ≥ 2015 + < 150 → норм / будь-який + ≥ 150 → старий

Коміт

git add sandbox/intro/Task4.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task4: classify blood pressure with compound conditions"

Задача 5. Розклад роботи клініки ⭐⭐

Умова

Напишіть програму, яка зчитує номер дня тижня (1–7) і виводить назву дня та години роботи клініки.

Розклад:

День Назва Години роботи
1 Понеділок 08:00–18:00
2 Вівторок 08:00–18:00
3 Середа 09:00–17:00
4 Четвер 08:00–18:00
5 П'ятниця 08:00–16:00
6 Субота 09:00–14:00
7 Неділя вихідний

Формат вводу

Рядок Поле Тип
1 номер дня int (1–7)

Приклади

номер дня Вихід
1 День: Понеділок, 08:00–18:00
3 День: Середа, 09:00–17:00
6 День: Субота, 09:00–14:00
7 День: Неділя — вихідний
9 День: невідомий день

Підказки

  1. Зчитайте номер дня як int.
  2. Використайте switch expression (не switch statement):
    string info = day switch
    {
        1 => "Понеділок, 08:00–18:00",
        ...
        _ => "невідомий день"
    };
  3. Гілка _ — це «за замовчуванням» (як default у старому switch).
  4. Виведіть результат одним рядком.

Адаптація до вашого домену

Домен Що закодовано Варіанти
Готель тип номера (1–5) 1→Стандарт / 2→Делюкс / 3→Люкс / 4→Сімейний / 5→Президентський
Ресторан категорія меню (1–4) 1→Сніданок / 2→Обід / 3→Вечеря / 4→Банкет
Університет рівень програми ("B"/"M"/"P") B→Бакалавр / M→Магістр / P→Аспірант
Прокат авто клас авто ("E"/"S"/"L") E→Економ / S→Стандарт / L→Преміум

Коміт

git add sandbox/intro/Task5.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task5: print clinic schedule using switch expression"

Задача 6. Аналіз номера медичної картки ⭐⭐

Умова

Напишіть програму, яка зчитує номер медичної картки і виводить три характеристики на основі ділення з остачею (%).

Правила:

Умова Результат
номер % 10 дає 0 або 1 відділення: загальна терапія
номер % 10 дає 2 або 3 відділення: хірургія
номер % 10 дає 4 або 5 відділення: кардіологія
номер % 10 дає 6 або 7 відділення: неврологія
номер % 10 дає 8 або 9 відділення: офтальмологія
номер % 2 == 0 пільгова картка: так
номер % 3 == 0 черговий огляд: так

Формат вводу

Рядок Поле Тип
1 номер картки int (5–6 цифр)

Приклади

номер картки Відділення Пільгова Огляд
10240 загальна терапія так так
20003 хірургія ні так
11117 неврологія ні ні
10245 кардіологія ні так

Вихід для 10240:

Відділення: загальна терапія
Пільгова:   так
Огляд:      так

Підказки

  1. Зчитайте номер як int.
  2. Остання цифра: int lastDigit = card % 10;
  3. У switch expression можна об'єднувати значення через or:
    0 or 1 => "загальна терапія",
  4. Пільгову та огляд визначайте тернарним оператором ?:.
  5. Виведіть три рядки.

Адаптація до вашого домену

Домен % 10 % 2 % 3
Готель поверх номера некурящий / для курців щоденне прибирання
Ресторан стіл (1–10) самовивіз / доставка бонусне замовлення
Університет група денна / вечірня стипендіат
Прокат авто сегмент ринку КАСКО включено планове ТО

Коміт

git add sandbox/intro/Task6.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task6: analyze card number with modulo operator"

Задача 7. Статистика прийомів ⭐⭐⭐

Умова

Напишіть програму, яка зчитує кількість прийомів N та вартість кожного, після чого виводить зведену статистику.

Формат вводу

Рядок Поле Тип
1 N — кількість прийомів int (> 0)
2 … N+1 вартість прийому decimal (грн)

Приклади

Приклад 1 — є дорогий прийом:

Вхід
N 5
вартості 350, 800, 200, 1200, 450
=== Звіт по прийомах ===
Кількість:        5
Загальна сума:    3000.00 грн
Середня:          600.00 грн
Мін / Макс:       200.00 / 1200.00 грн
Вище середнього:  2 з 5
Перший > 1000:    #4 — 1200.00 грн
========================

Приклад 2 — немає дорогого прийому:

Вхід
N 3
вартості 300, 450, 350
=== Звіт по прийомах ===
Кількість:        3
Загальна сума:    1100.00 грн
Середня:          366.67 грн
Мін / Макс:       300.00 / 450.00 грн
Вище середнього:  1 з 3
Перший > 1000:    немає
========================

Підказки

  1. Зчитайте N, потім у циклі for заповніть масив decimal[] costs = new decimal[n].
  2. Використайте foreach для суми, мінімуму і максимуму — один прохід.
  3. Використайте for для підрахунку елементів вище середнього — потрібне середнє, рахуйте після першого проходу.
  4. Використайте while для пошуку першого елемента > 1000. Якщо не знайдено — виведіть "немає".
  5. Використовуйте decimal (не double) для грошових сум — точніший тип для фінансових розрахунків.

Адаптація до вашого домену

Домен N операцій Показник Поріг для while
Готель бронювань кількість ночей (int) > 7 → «довгострокове»
Ресторан замовлень сума чеку (decimal) > 500 грн → «великий чек»
Університет оцінок студента бал (int, 0–100) ≥ 90 → «відмінна оцінка»
Прокат авто оренд тривалість у днях (int) > 14 → «довгострокова»

Коміт

git add sandbox/intro/Task7.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task7: calculate visit statistics using for/foreach/while"

Задача 8. Методи ⭐⭐⭐

Умова

Перепишіть логіку Задач 1–4 так, щоб кожен розрахунок був винесений у окремий метод. У Run() — лише зчитування вводу та виклики методів, жодних розрахунків у тілі Run.

Методи:

static double CalculateBMI(double weight, double height)
static string GetBMICategory(double bmi)
static double CalculateCost(double price, int visits, int discount)
static string GetAgeCategory(int age)
static string GetPressureStatus(int systolic, int diastolic)

Заборонено: Console.ReadLine() всередині методів — дані передаються через параметри.

Формат вводу

Рядок Поле Тип
1 вага double (кг)
2 зріст double (м)
3 ціна прийому double (грн)
4 кількість прийомів int
5 знижка int (%)
6 рік народження int
7 систолічний тиск int
8 діастолічний тиск int

Приклади

Приклад 1:

Поле Значення
вага 82.0
зріст 1.78
ціна прийому 500
кількість прийомів 3
знижка 10
рік народження 1990
систолічний 120
діастолічний 80
ІМТ: 25.88 -> надмірна вага
Сума: 1350.00 грн
Вік: 36 р., категорія: дорослий
Тиск: 120/80 — гіпертонія 1 ступеня

Приклад 2:

Поле Значення
вага 55.0
зріст 1.62
ціна прийому 200
кількість прийомів 2
знижка 15
рік народження 2010
систолічний 155
діастолічний 100
ІМТ: 20.95 -> норма
Сума: 340.00 грн
Вік: 16 р., категорія: дитина
Тиск: 155/100 — гіпертонія 2 ступеня

Підказки

  1. Скопіюйте формули з Task1–Task4. Тепер кожна формула — тіло окремого методу.
  2. Метод, який повертає значення, має тип static double або static string. Замість Console.WriteLinereturn.
  3. Метод Run виглядає так:
    double bmi = CalculateBMI(weight, height);
    Console.WriteLine($"ІМТ: {bmi:F2} -> {GetBMICategory(bmi)}");
  4. Перевірте: якщо прибрати весь код з Run, чи залишиться логіка в методах? Якщо так — все правильно.

Чому це важливо

Метод Де він буде Коли
CalculateBMI() Patient.GetBMI() Лаба 03
GetBMICategory() Patient.GetStatus() Лаба 05
CalculateCost() Appointment.GetCost() Лаба 03
GetPressureStatus() AppointmentService.Assess() Лаба 07

Коміт

git add sandbox/intro/Task8.cs sandbox/intro/Program.cs
git commit -m "Lab01 Task8: extract calculation logic into methods"

Перевірка перед здачею

cd sandbox/intro
dotnet run

Порівняйте вивід з прикладами у кожному завданні.


Питання для самоперевірки

  1. Чому в Задачі 2 треба писати 100.0, а не 100?
  2. У Задачі 4 третя гілка — ||, а не &&. Чому?
  3. Навіщо decimal замість double у Задачі 7?
  4. У Задачі 8 метод не зчитує дані з консолі. Чому це важливо?
  5. Що означає _ у switch expression?

Статус гілки

Ця гілка не зливається в main. Після завершення:

git checkout main
# наступна лаба: git checkout -b sandbox/arrays
Розроблено Tomka Yurii · © 2026 ·