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 Воркшопі. Тут — лише цикл однієї лаби:
git checkout main→git checkout -b Lab-XX— нова гілка відmain.- Виконали завдання →
git add <файли>→git commit -m "LabXX TaskYY". - Повторюєте крок 2 для кожного завдання.
git push -u origin Lab-XX— гілка потрапляє на GitHub (резервна копія).- З Лаби 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 main0.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-011.2. Створіть консольний проєкт Лаби 01 і додайте його в рішення:
dotnet new console -o Lab01 --name Lab01
dotnet sln add Lab01/Lab01.csproj1.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 |
Підказки
- Ввід. Консоль віддає текст, а не число. Прочитайте рядок і перетворіть
його на
double. Зʼясуйте в документації різницю міжdouble.Parseіdouble.TryParse— і чому для навчальних завдань поки достатньоParse. - Два значення — два рядки вводу. Вага і зріст читаються послідовно, кожен зі свого рядка. Порядок — той самий, що у «Формат вводу».
- Обчислення. Формула з умови перекладається в один вираз. Памʼятайте про
пріоритет операцій:
зріст × зрістмає бути в дужках. - Тип результату. Ділення двох
doubleдаєdouble— це те, що потрібно. - Вивід із округленням. Потрібно рівно два знаки після коми. Це робота
форматування при виводі, а не окремого округлення: знайдіть у документації
стандартний числовий формат
Fта як застосувати його в інтерпольованому рядку ($"..."). Саме округлення формату пояснює, чому20.9572на екрані стає20.96.
📖 Документація:
- double.Parse та double.TryParse
- Типи з плаваючою комою (
double) - Стандартні числові формати (
F2) - Інтерполяція рядків
Адаптація до вашого домену
| Домен | Формула | Поле 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 грн |
Підказки
- Різні типи вводу. Ціна — дробова (
double), кількість і знижка — цілі (int). Читайте кожне значення відповіднимParse. - Головна пастка — цілочисельне ділення. Якщо поділити
intнаint, результат тежint:15 / 100дає0, а не0.15. Прочитайте розділ документації про арифметичні оператори та знайдіть, як змусити ділення бути дробовим (підказка: хоча б один операнд має бутиdouble). - Знижка у відсотках. «Мінус 10%» означає помножити на
(1 − 10/100). Слідкуйте, щоб10/100порахувалося як0.1. - Порядок множників не впливає на результат, але тримайте формулу
читабельною:
ціна × кількість × коефіцієнт_знижки. - Вивід — знову два знаки після коми, той самий формат
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 р. |
Категорія: дорослий |
Підказки
- Ввід — одне ціле число (рік народження).
- Вік. У цьому завданні поточний рік зафіксовано як
2026— щоб приклади були стабільні. Вік =2026 − рік_народження. - Три категорії — три гілки. Це класичний
if / else if / else. Прочитайте в документації, чим відрізняється ланцюжокelse ifвід трьох окремихif(у ланцюжку виконається рівно одна гілка). - Порядок умов має значення. Перевіряйте межі так, щоб кожен вік попадав лише в одну гілку. Продумайте на папері: 17, 18, 59, 60.
- Вивід — два окремі рядки: спочатку вік, потім категорія (див. приклади).
📖 Документація:
Адаптація до вашого домену
| Домен | Що визначити | Умови |
|---|---|---|
| Готель | клас номера за площею | < 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 ступеня |
Підказки
- Ввід — два цілих числа, кожне зі свого рядка.
- Складена умова. Гілки «норма» і «підвищений» вимагають, щоб виконувались
обидві частини одночасно — це логічне І (
&&). Прочитайте документацію про логічні оператори та порядок їх обчислення (short-circuit). - Чому третя гілка — це
||, а не&&. «Гіпертонія 1 ступеня» настає, коли хоча б один показник вийшов за норму, але ще не досяг 2 ступеня. Якщо поставити&&, то тиск135/92(діастолічний вже за межею) хибно класифікувався б як легший стан.||ловить «поганий хоча б один показник». - Порядок гілок critical. Ідіть від найсуворішої норми до найважчого стану. Перша гілка, що спрацювала, і дає відповідь — решту не перевіряють.
- Це спрощена модель. Реальна класифікація AHA має більше нюансів; тут ми тренуємо складені умови, а не медицину.
- Вивід — один рядок: обидва значення через
/та статус.
📖 Документація:
Адаптація до вашого домену
| Домен | Поле 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–7).
- Сім варіантів — це робота для
switch. У цьому завданні використайтеswitchяк вираз (switch expression), а не як оператор. Різницю між ними знайдіть у документації: вираз повертає значення, яке одразу можна присвоїти змінній. - Кожен варіант зіставляє номер дня з готовим рядком («назва + години» або «— вихідний»).
- Невідомий день. У switch expression є спеціальна гілка-«пастка» для всіх
інших значень (шукайте
_— discard pattern). Без неї компілятор попередить, що перелічені не всі випадки. - Вивід — один рядок за форматом із прикладів (зверніть увагу: для дня 7 і для помилкового номера формат трохи інший).
📖 Документація:
- Вираз
switch switchяк оператор — для порівняння- Патерн-відкидання
_
Адаптація до вашого домену
| Домен | Що закодовано | Варіанти |
|---|---|---|
| Готель | тип номера (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:
Відділення: загальна терапія
Пільгова: так
Огляд: такПідказки
- Ввід — одне ціле число (номер картки).
- Остача від ділення (
%). «Остання цифра числа» = остача від ділення на- «Парне» = остача від ділення на 2 дорівнює 0. Прочитайте розділ
документації про оператор
%.
- «Парне» = остача від ділення на 2 дорівнює 0. Прочитайте розділ
документації про оператор
- Відділення за останньою цифрою. Пари цифр (0–1, 2–3, …) зручно розібрати
через
switchexpression. У шаблонах switch кілька значень обʼєднуються словомor— знайдіть «логічні патерни» в документації. - Пільгова / огляд — це «так / ні». Такий вибір із двох варіантів компактно
робиться умовним (тернарним) оператором
?:. Знайдіть його синтаксис і потренуйтесь окремо. - Три незалежні характеристики — три рядки виводу. Порахуйте кожну окремо, потім виведіть.
📖 Документація:
Адаптація до вашого домену
| Домен | % 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: немає
========================Підказки
- Спершу N, потім масив. Прочитайте кількість, оголосіть масив рівно на
стільки елементів і заповніть його циклом
for. Синтаксис створення масиву — у документації (це перше повноцінне знайомство з масивом у курсі). decimal, неdouble, для грошей.double— двійковий дріб, він не може точно зберегти навіть0.1; для сум це накопичує похибку.decimalдесятковий. Прочитайте порівняння типів у документації.- Три різні цикли — навмисно. Завдання тренує всі три:
foreach— один прохід, щоб водночас накопичити суму, знайти мінімум і максимум;for— окремий прохід уже після того, як відоме середнє, щоб порахувати «скільки значень вище середнього»;while— пошук першого дорогого прийому (> 1000): щойно знайшли — виходимо з циклу.
- «Немає» замість числа. Заведіть ознаку (наприклад, індекс
-1), яка означає «не знайдено», і за нею вирішуйте, що друкувати. - Порядок обчислень: середнє потрібне для кроку 3, тому спочатку повний прохід сумою, і лише потім — порівняння з середнім.
📖 Документація:
- Масиви
- Оператори ітерації
for,foreach,while,do - Тип
decimalі чому він для грошей breakіcontinue
Адаптація до вашого домену
| Домен | 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–4. Тут змінюється не логіка, а структура: кожна формула переїжджає в тіло окремого методу.
- Метод, що повертає значення. Прочитайте в документації, як оголосити
метод із типом результату та як повернути значення оператором
return. Метод не друкує — він віддає результат тому, хто його викликав. - Параметри — це вхід. Усе, що методу потрібно для роботи, приходить
аргументами. Всередині методу
Console.ReadLine()бути не повинно — це і є сенс завдання (метод стане перевикористовуваним у наступних лабах). Runстає «диспетчером»: прочитати всі 8 значень → викликати методи → надрукувати рядки з прикладів. Жодної арифметики в самомуRun.- Композиція викликів. Результат одного методу можна одразу передати в
інший (
GetBMICategoryприймає те, що повернувCalculateBMI). - Самоперевірка: якщо подумки видалити всі виклики з
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() → …).
Питання для самоперевірки
Відповіді формулюйте своїми словами. Якщо не впевнені — поверніться до відповідних сторінок документації з підказок.
- Чому вираз
discount / 100приint discountдає0? Що саме робить.0в100.0? (напрямок: тип результату ділення залежить від типів операндів) - У Задачі 4 третя гілка —
||, а не&&. Наведіть конкретну пару значень тиску, для якої&&дав би неправильну категорію. - Чим
decimalвідрізняється відdoubleна рівні представлення числа? Чому для грошей це критично, а для зросту в метрах — ні? - У Задачі 8 методи не звертаються до консолі. Як це допоможе, коли ці ж
розрахунки знадобляться всередині класу
Patientу Лабі 03? - Що станеться, якщо у
switchexpression прибрати гілку_, а на вхід надійде значення, якого немає в списку? Спробуйте і прочитайте помилку. - Чим
switchяк вираз відрізняється відswitchяк оператора? Коли який зручніший? - У Задачі 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.