OOP Course
Сьогодні

Lab 01

Основи C#

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

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

Мета

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

Контекст

Курс — це одна система, яку ви будуєте 22 лаби поспіль. Починаючи з Лаби 03, кожна лаба додає новий шар і зливається в стабільну гілку main.

Лаби 01 і 02 — виняток: це окремі маленькі проєкти-тренажери для синтаксису (базові конструкції в Лабі 01, масиви в Лабі 02). Вони не стають частиною основної системи. Але методи із Задачі 8 цієї лаби ви буквально перенесете в клас Patient у Лабі 03 — тож пишіть їх акуратно.

З Лаби 03 стартує основний проєкт, який далі росте до кінця курсу.

Ця лаба веде вас за руку: від порожньої теки до працюючого рішення з 8 завданнями. Git-механіку детально пояснює окремий Git Воркшоп — прочитайте його перед цією лабою, тут лише короткий підсумок.

Структура проєкту на початку лаби

Це перша лаба, тож ви починаєте з нуля: порожня тека, без репозиторію й проєктів.

(порожня тека)      ← усе, що з'явиться, ви створюєте самі в Кроках 0 і 1

Вигляд проєкту наприкінці лаби — у розділі «Структура проєкту наприкінці лаби» перед перевіркою. Повна схема репозиторію на весь курс — одразу нижче.


Як влаштований репозиторій курсу

До кінця курсу ваш репозиторій виглядатиме так:

<ваш-репозиторій>/
├── .gitignore
├── oop-course.slnx         ← рішення: посилається на всі проєкти нижче
├── Lab01/                   ← Лаба 01 — базовий C# (окремий проєкт)
│   ├── Lab01.csproj
│   ├── Program.cs
│   └── Task1.cs … Task8.cs
├── Lab02/                   ← Лаба 02 — масиви (окремий проєкт)
│   ├── Lab02.csproj
│   └── …
└── ClinicApp/               ← Лаби 03–22 — основний проєкт, росте весь курс
    ├── ClinicApp.csproj
    ├── Program.cs
    ├── Models/  Managers/  …

ClinicApp — назва для еталонного домену (клініка). Свій проєкт назвіть за власним доменом: HotelApp, LibraryApp тощо. Теки Lab01/ і Lab02/ — завжди з такими іменами.

Одне правило зв'язує теки, гілки й коміти:

Одиниця Чому дорівнює Приклад
Тека з кодом одній лабі (для 01–02) або всьому основному проєкту (03+) Lab01/, ClinicApp/
Гілка git одній лабі Lab-01, Lab-03
Коміт одному завданню Lab01 Task03
Злиття в main завершеній лабі (лише з Лаби 03) Merge Lab-03: Defining Classes

Тобто: працюючи над Задачею 3 Лаби 1, ви на гілці Lab-01, редагуєте файли в теці Lab01/, і в кінці робите один коміт Lab01 Task03.


Git у курсі — короткий підсумок

Повне пояснення (staging, .gitignore, авторизація GitHub, типові помилки) — у Git Воркшопі. Тут — лише цикл однієї лаби:

  1. git checkout main → git checkout -b Lab-XX — нова гілка від main.
  2. Виконали завдання → git add <файли> → git commit -m "LabXX TaskYY".
  3. Повторюєте крок 2 для кожного завдання.
  4. git push -u origin Lab-XX — гілка потрапляє на GitHub (резервна копія).
  5. З Лаби 03 — коли всі завдання лаби готові, гілка зливається в main: git checkout main → git merge --no-ff Lab-XX -m "Merge Lab-XX: <Назва>" → git push.

Пам'ятайте це до кінця курсу

Кожна лаба = окрема гілка Lab-XX, що відходить від main. З Лаби 03 кожна така гілка після завершення зливається назад у main — так основне дерево росте лаба за лабою.

Виняток — Лаби 01 і 02. Це тренажери синтаксису, а не частина системи. Їхні гілки ви пушите на GitHub, але НЕ зливаєте в main. Основне дерево main фактично стартує з Лаби 03.

Формат повідомлення коміту: LabXX TaskYY — номер лаби, пробіл, номер завдання, обидва по дві цифри. Приклад: Lab01 Task01. Коротко й однотипно — щоб коміти легко читались у git log --oneline.


Крок 0. Одноразове налаштування репозиторію

Робиться один раз на весь курс. Якщо ви вже створили репозиторій за Git Воркшопом — переходьте до Кроку 1.

0.1. Створіть теку проєкту і локальний репозиторій.

mkdir oop-course
cd oop-course
git init
git branch -m main

0.2. Створіть .gitignore у корені — щоб не комітити збірку (bin/, obj/) та файли середовища. Вміст:

# C# / .NET
bin/
obj/
*.user
*.suo
.vs/
.idea/

# ОС
.DS_Store
Thumbs.db

# Секрети
*.env
appsettings.Development.json

Чому це важливо: теки bin/ і obj/ — це мегабайти згенерованих бінарників, які залежать від вашої машини. У git має бути лише ваш вихідний код.

0.3. Створіть рішення (solution) — файл .slnx, який тримає разом усі проєкти курсу, щоб Visual Studio / Rider відкривали їх однією дією. Робимо це відразу на main, бо рішення спільне для всіх лаб:

dotnet new sln --name oop-course

Починаючи з .NET 10 ця команда створює файл oop-course.slnx (новий XML-формат рішення). Старіші SDK створюють oop-course.sln — тоді в усіх командах git add курсу пишіть .sln замість .slnx. Перевірити: ls або dir.

0.4. Перший коміт.

git add .gitignore oop-course.slnx
git commit -m "chore: initial commit — gitignore + solution"

0.5. Створіть порожній репозиторій на GitHub (без README, без .gitignore — щоб не було конфлікту) і підключіть його:

git remote add origin https://github.com/<ваш-логін>/oop-course.git
git push -u origin main

Якщо push просить пароль — GitHub давно не приймає пароль акаунта. Потрібен Personal Access Token або SSH-ключ. Покроково — Git Воркшоп, Частина 6 «Аутентифікація GitHub».


Крок 1. Проєкт для Лаби 01

1.1. Гілка для цієї лаби (від main):

git checkout main
git checkout -b Lab-01

1.2. Створіть консольний проєкт Лаби 01 і додайте його в рішення:

dotnet new console -o Lab01 --name Lab01
dotnet sln add Lab01/Lab01.csproj

1.3. Запустіть — переконайтеся, що все працює:

dotnet run --project Lab01

Має вивести Hello, World!.

1.4. Закомітьте створення проєкту:

git add oop-course.slnx Lab01/
git commit -m "Lab01: project"

Далі кожне завдання — окремий файл TaskN.cs у теці Lab01/ та окремий коміт Lab01 TaskNN.


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

Кожне завдання — окремий файл у теці Lab01/ (Task1.cs, Task2.cs …): клас TaskN з єдиним статичним методом Run(). Файл додаєте просто як новий .cs у теку Lab01/ (у Visual Studio: ПКМ на проєкті → Add → Class).

У Lab01/Program.cs лишається один рядок-виклик — змінюйте номер після кожного завдання:

// Дробові числа вводимо з КРАПКОЮ незалежно від регіональних налаштувань Windows.
System.Threading.Thread.CurrentThread.CurrentCulture =
    System.Globalization.CultureInfo.InvariantCulture;

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

Перший рядок обовʼязковий. Без нього на системі з українською локаллю double.Parse("1.75") кине FormatException, бо очікує кому як десятковий роздільник. InvariantCulture фіксує крапку. Документація: CultureInfo.InvariantCulture.

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

Один знак `!` після `Console.ReadLine()`

У проєкті увімкнено <Nullable>enable</Nullable> (стандартна опція dotnet new). Через неї компілятор знає, що Console.ReadLine() теоретично може повернути null (наприклад, якщо ввід закінчився), і попереджає, коли ви одразу передаєте результат у double.Parse(...).

При інтерактивному вводі рядок завжди є, тому пишемо:

double weight = double.Parse(Console.ReadLine()!);

Знак ! (null-forgiving) означає «я гарантую, що тут не null» і прибирає попередження. Повноцінно тему nullable-типів розберемо в Лабі 03; поки що просто ставте ! після Console.ReadLine().

Ваш домен

За замовчуванням виконуйте завдання як написано — приклади, формат вводу й виводу розраховані на домен «клініка». Якщо ви ведете курс на власному домені (готель, бібліотека, кафе…), у кінці кожного завдання є таблиця «Адаптація до вашого домену» — вона показує, чим замінити суть задачі. Формат вводу/виводу й структуру коду зберігайте, змінюється лише предметна область.

Як користуватися підказками

Підказки описують напрям думки, а не готовий код. Кожна закінчується блоком «Документація» — там офіційні сторінки Microsoft Learn. Спочатку прочитайте їх, спробуйте самі, і лише якщо застрягли — повертайтесь до наступного кроку підказки.


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

Умова

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

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

Формат вводу

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

Приклади

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

Підказки

  1. Ввід. Консоль віддає текст, а не число. Прочитайте рядок і перетворіть його на double. Зʼясуйте в документації різницю між double.Parse і double.TryParse — і чому для навчальних завдань поки достатньо Parse.
  2. Два значення — два рядки вводу. Вага і зріст читаються послідовно, кожен зі свого рядка. Порядок — той самий, що у «Формат вводу».
  3. Обчислення. Формула з умови перекладається в один вираз. Памʼятайте про пріоритет операцій: зріст × зріст має бути в дужках.
  4. Тип результату. Ділення двох double дає double — це те, що потрібно.
  5. Вивід із округленням. Потрібно рівно два знаки після коми. Це робота форматування при виводі, а не окремого округлення: знайдіть у документації стандартний числовий формат F та як застосувати його в інтерпольованому рядку ($"..."). Саме округлення формату пояснює, чому 20.9572 на екрані стає 20.96.

📖 Документація:

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

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

Коміт

git add Lab01/Task1.cs Lab01/Program.cs
git commit -m "Lab01 Task01"

Задача 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). Читайте кожне значення відповідним Parse.
  2. Головна пастка — цілочисельне ділення. Якщо поділити int на int, результат теж int: 15 / 100 дає 0, а не 0.15. Прочитайте розділ документації про арифметичні оператори та знайдіть, як змусити ділення бути дробовим (підказка: хоча б один операнд має бути double).
  3. Знижка у відсотках. «Мінус 10%» означає помножити на (1 − 10/100). Слідкуйте, щоб 10/100 порахувалося як 0.1.
  4. Порядок множників не впливає на результат, але тримайте формулу читабельною: ціна × кількість × коефіцієнт_знижки.
  5. Вивід — знову два знаки після коми, той самий формат F2.

📖 Документація:

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

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

Коміт

git add Lab01/Task2.cs Lab01/Program.cs
git commit -m "Lab01 Task02"

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

Умова

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

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

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

Формат вводу

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

Приклади

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

Підказки

  1. Ввід — одне ціле число (рік народження).
  2. Вік. У цьому завданні поточний рік зафіксовано як 2026 — щоб приклади були стабільні. Вік = 2026 − рік_народження.
  3. Три категорії — три гілки. Це класичний if / else if / else. Прочитайте в документації, чим відрізняється ланцюжок else if від трьох окремих if (у ланцюжку виконається рівно одна гілка).
  4. Порядок умов має значення. Перевіряйте межі так, щоб кожен вік попадав лише в одну гілку. Продумайте на папері: 17, 18, 59, 60.
  5. Вивід — два окремі рядки: спочатку вік, потім категорія (див. приклади).

📖 Документація:

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

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

Коміт

git add Lab01/Task3.cs Lab01/Program.cs
git commit -m "Lab01 Task03"

Задача 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. Ввід — два цілих числа, кожне зі свого рядка.
  2. Складена умова. Гілки «норма» і «підвищений» вимагають, щоб виконувались обидві частини одночасно — це логічне І (&&). Прочитайте документацію про логічні оператори та порядок їх обчислення (short-circuit).
  3. Чому третя гілка — це ||, а не &&. «Гіпертонія 1 ступеня» настає, коли хоча б один показник вийшов за норму, але ще не досяг 2 ступеня. Якщо поставити &&, то тиск 135/92 (діастолічний вже за межею) хибно класифікувався б як легший стан. || ловить «поганий хоча б один показник».
  4. Порядок гілок critical. Ідіть від найсуворішої норми до найважчого стану. Перша гілка, що спрацювала, і дає відповідь — решту не перевіряють.
  5. Це спрощена модель. Реальна класифікація AHA має більше нюансів; тут ми тренуємо складені умови, а не медицину.
  6. Вивід — один рядок: обидва значення через / та статус.

📖 Документація:

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

Домен Поле 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 Lab01/Task4.cs Lab01/Program.cs
git commit -m "Lab01 Task04"

Задача 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. Ввід — одне ціле число (1–7).
  2. Сім варіантів — це робота для switch. У цьому завданні використайте switch як вираз (switch expression), а не як оператор. Різницю між ними знайдіть у документації: вираз повертає значення, яке одразу можна присвоїти змінній.
  3. Кожен варіант зіставляє номер дня з готовим рядком («назва + години» або «— вихідний»).
  4. Невідомий день. У switch expression є спеціальна гілка-«пастка» для всіх інших значень (шукайте _ — discard pattern). Без неї компілятор попередить, що перелічені не всі випадки.
  5. Вивід — один рядок за форматом із прикладів (зверніть увагу: для дня 7 і для помилкового номера формат трохи інший).

📖 Документація:

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

Домен Що закодовано Варіанти
Готель тип номера (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 Lab01/Task5.cs Lab01/Program.cs
git commit -m "Lab01 Task05"

Задача 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. Ввід — одне ціле число (номер картки).
  2. Остача від ділення (%). «Остання цифра числа» = остача від ділення на
    1. «Парне» = остача від ділення на 2 дорівнює 0. Прочитайте розділ документації про оператор %.
  3. Відділення за останньою цифрою. Пари цифр (0–1, 2–3, …) зручно розібрати через switch expression. У шаблонах switch кілька значень обʼєднуються словом or — знайдіть «логічні патерни» в документації.
  4. Пільгова / огляд — це «так / ні». Такий вибір із двох варіантів компактно робиться умовним (тернарним) оператором ?:. Знайдіть його синтаксис і потренуйтесь окремо.
  5. Три незалежні характеристики — три рядки виводу. Порахуйте кожну окремо, потім виведіть.

📖 Документація:

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

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

Коміт

git add Lab01/Task6.cs Lab01/Program.cs
git commit -m "Lab01 Task06"

Задача 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. Синтаксис створення масиву — у документації (це перше повноцінне знайомство з масивом у курсі).
  2. decimal, не double, для грошей. double — двійковий дріб, він не може точно зберегти навіть 0.1; для сум це накопичує похибку. decimal десятковий. Прочитайте порівняння типів у документації.
  3. Три різні цикли — навмисно. Завдання тренує всі три:
    • foreach — один прохід, щоб водночас накопичити суму, знайти мінімум і максимум;
    • for — окремий прохід уже після того, як відоме середнє, щоб порахувати «скільки значень вище середнього»;
    • while — пошук першого дорогого прийому (> 1000): щойно знайшли — виходимо з циклу.
  4. «Немає» замість числа. Заведіть ознаку (наприклад, індекс -1), яка означає «не знайдено», і за нею вирішуйте, що друкувати.
  5. Порядок обчислень: середнє потрібне для кроку 3, тому спочатку повний прохід сумою, і лише потім — порівняння з середнім.

📖 Документація:

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

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

Коміт

git add Lab01/Task7.cs Lab01/Program.cs
git commit -m "Lab01 Task07"

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

Умова

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

Методи, які треба реалізувати (сигнатури задані — тіла пишете ви):

Метод Параметри Повертає Що робить
CalculateBMI вага, зріст (double) double ІМТ за формулою Задачі 1
GetBMICategory ІМТ (double) string недостатня вага / норма / надмірна вага / ожиріння
CalculateCost ціна (double), кількість, знижка (int) double сума за формулою Задачі 2
GetAgeCategory вік (int) string категорія за Задачею 3
GetPressureStatus систолічний, діастолічний (int) string статус за Задачею 4

Пороги GetBMICategory: < 18.5 → недостатня вага; < 25 → норма; < 30 → надмірна вага; інакше → ожиріння.

Заборонено: Console.ReadLine() або Console.WriteLine() всередині методів — дані входять лише через параметри, результат виходить лише через return.

Формат вводу

Рядок Поле Тип
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
систолічний 128
діастолічний 78
ІМТ: 25.88 -> надмірна вага
Сума: 1350.00 грн
Вік: 36 р., категорія: дорослий
Тиск: 128/78 — підвищений

Приклад 2:

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

Підказки

  1. Формули вже готові — вони в Задачах 1–4. Тут змінюється не логіка, а структура: кожна формула переїжджає в тіло окремого методу.
  2. Метод, що повертає значення. Прочитайте в документації, як оголосити метод із типом результату та як повернути значення оператором return. Метод не друкує — він віддає результат тому, хто його викликав.
  3. Параметри — це вхід. Усе, що методу потрібно для роботи, приходить аргументами. Всередині методу Console.ReadLine() бути не повинно — це і є сенс завдання (метод стане перевикористовуваним у наступних лабах).
  4. Run стає «диспетчером»: прочитати всі 8 значень → викликати методи → надрукувати рядки з прикладів. Жодної арифметики в самому Run.
  5. Композиція викликів. Результат одного методу можна одразу передати в інший (GetBMICategory приймає те, що повернув CalculateBMI).
  6. Самоперевірка: якщо подумки видалити всі виклики з Run, уся змістовна логіка має лишитися в методах. Якщо ні — щось не винесено.

📖 Документація:

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

Розрахунки залишаються з вашого домену — з Задач 1–4. Головна вимога та сама: кожен розрахунок у своєму методі, жодної арифметики в Run(), дані лише через параметри.

Клініка Ваш домен (приклад)
CalculateBMI / GetBMICategory розрахунок + категорія з Задачі 1
CalculateCost сума зі знижкою з Задачі 2
GetAgeCategory категорія з Задачі 3
GetPressureStatus класифікація за складеною умовою з Задачі 4

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

Ці методи ви буквально перенесете в класи вже наступними лабами:

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

Коміт

git add Lab01/Task8.cs Lab01/Program.cs
git commit -m "Lab01 Task08"

Структура проєкту наприкінці лаби

Так має виглядати ваш репозиторій, коли всі 8 завдань виконано:

oop-course/                          ← гілка Lab-01 (у main НЕ зливається)
├── .gitignore                          🆕 Крок 0
├── oop-course.slnx                     🆕 Крок 0   ✏ Крок 1
└── Lab01/
    ├── Lab01.csproj                    🆕 Крок 1
    ├── Program.cs                      🆕 Крок 1   ✏ Т1 Т2 Т3 Т4 Т5 Т6 Т7 Т8
    ├── Task1.cs                        🆕 Т1
    ├── Task2.cs                        🆕 Т2
    ├── Task3.cs                        🆕 Т3
    ├── Task4.cs                        🆕 Т4
    ├── Task5.cs                        🆕 Т5
    ├── Task6.cs                        🆕 Т6
    ├── Task7.cs                        🆕 Т7
    └── Task8.cs                        🆕 Т8

Легенда: 🆕 — новий файл · ✏ — змінено вміст · Тn — номер задачі, у якій ви працюєте з файлом · Крок n — підготовчі кроки на початку лаби.

.gitignore і .slnx ви створюєте на main (Крок 0), а гілка Lab-01 відходить від нього — тому вони вже є в гілці. Проєкт Lab01/ існує лише на гілці Lab-01.


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

dotnet run --project Lab01

Переконайтесь, що:

  • Структура проєкту збігається зі схемою вище
  • Вивід кожного завдання збігається з прикладами

Пройдіться по всіх завданнях, міняючи виклик у Program.cs (Task1.Run() → Task2.Run() → …).


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

Відповіді формулюйте своїми словами. Якщо не впевнені — поверніться до відповідних сторінок документації з підказок.

  1. Чому вираз discount / 100 при int discount дає 0? Що саме робить .0 в 100.0? (напрямок: тип результату ділення залежить від типів операндів)
  2. У Задачі 4 третя гілка — ||, а не &&. Наведіть конкретну пару значень тиску, для якої && дав би неправильну категорію.
  3. Чим decimal відрізняється від double на рівні представлення числа? Чому для грошей це критично, а для зросту в метрах — ні?
  4. У Задачі 8 методи не звертаються до консолі. Як це допоможе, коли ці ж розрахунки знадобляться всередині класу Patient у Лабі 03?
  5. Що станеться, якщо у switch expression прибрати гілку _, а на вхід надійде значення, якого немає в списку? Спробуйте і прочитайте помилку.
  6. Чим switch як вираз відрізняється від switch як оператора? Коли який зручніший?
  7. У Задачі 7 середнє рахується до циклу підрахунку «вище середнього». Чому не можна порахувати обидві речі за один прохід?

Статус гілки

Після завершення всіх 8 завдань (кожне — окремий коміт Lab01 TaskNN на гілці Lab-01) — лише push гілки, без злиття в main:

git push -u origin Lab-01

Лаба 01 — тренажер синтаксису, не частина основної системи, тому в main вона не зливається (див. блок «Пам'ятайте це до кінця курсу» вище). Гілка Lab-01 лишається на GitHub як ваша здача.

Наступна лаба: git checkout main → git checkout -b Lab-02, новий проєкт Lab02/ у тому ж рішенні. Лаба 02 — теж без злиття в main. Основне дерево main почне рости з Лаби 03.

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