Lab 01
Основи C#
Типи, умови, цикли, методи
Лаба 01 — Основи C#
Мета
Навчитися працювати з базовими конструкціями C#: типи даних, умовні оператори, цикли та методи.
Контекст
Це пісочниця — окремий мінімальний проєкт, який не зливається в main. Методи з Задачі 8 стануть методами класів у Лабі 03.
Перший запуск: налаштування репозиторію
Ці кроки виконуються один раз на початку курсу.
git init
git branch -m mainСтворіть .gitignore у корені:
bin/
obj/
.vs/
*.usergit 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 |
Підказки
- Зчитайте вагу через
double.Parse(Console.ReadLine()!). - Зчитайте зріст аналогічно.
- Порахуйте ІМТ за формулою.
- Виведіть результат із форматуванням
{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 грн |
Підказки
- Зчитайте ціну як
double, кількість і знижку якint. - Формула:
price * visits * (1 - discount / 100.0). Зверніть увагу на100.0— якщо написати100, ділення буде цілочисельним. - Виведіть результат з
{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 р. |
Категорія: дорослий |
Підказки
- Зчитайте рік як
int. - Вік =
2026 - birthYear. - Використайте
if / else if / elseз трьома гілками. - Виведіть два рядки: вік і категорію.
Адаптація до вашого домену
| Домен | Що визначити | Умови |
|---|---|---|
| Готель | клас номера за площею | < 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 ступеня |
Підказки
- Зчитайте обидва числа як
int(два рядки). - Перевіряйте умови зверху вниз: першою перевіряється найсуворіша норма.
- Зверніть увагу: третя гілка — АБО (
||), а не І (&&). Чому? Якщо систолічний 135 і діастолічний 92 — яка це категорія? - Виведіть один рядок з обома значеннями та статусом.
Адаптація до вашого домену
| Домен | Поле 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 |
День: невідомий день |
Підказки
- Зчитайте номер дня як
int. - Використайте
switchexpression (неswitchstatement):string info = day switch { 1 => "Понеділок, 08:00–18:00", ... _ => "невідомий день" }; - Гілка
_— це «за замовчуванням» (якdefaultу старому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 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:
Відділення: загальна терапія
Пільгова: так
Огляд: такПідказки
- Зчитайте номер як
int. - Остання цифра:
int lastDigit = card % 10; - У
switchexpression можна об'єднувати значення черезor:0 or 1 => "загальна терапія", - Пільгову та огляд визначайте тернарним оператором
?:. - Виведіть три рядки.
Адаптація до вашого домену
| Домен | % 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: немає
========================Підказки
- Зчитайте N, потім у циклі
forзаповніть масивdecimal[] costs = new decimal[n]. - Використайте
foreachдля суми, мінімуму і максимуму — один прохід. - Використайте
forдля підрахунку елементів вище середнього — потрібне середнє, рахуйте після першого проходу. - Використайте
whileдля пошуку першого елемента > 1000. Якщо не знайдено — виведіть"немає". - Використовуйте
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 ступеняПідказки
- Скопіюйте формули з Task1–Task4. Тепер кожна формула — тіло окремого методу.
- Метод, який повертає значення, має тип
static doubleабоstatic string. ЗамістьConsole.WriteLine—return. - Метод
Runвиглядає так:double bmi = CalculateBMI(weight, height); Console.WriteLine($"ІМТ: {bmi:F2} -> {GetBMICategory(bmi)}"); - Перевірте: якщо прибрати весь код з
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Порівняйте вивід з прикладами у кожному завданні.
Питання для самоперевірки
- Чому в Задачі 2 треба писати
100.0, а не100? - У Задачі 4 третя гілка —
||, а не&&. Чому? - Навіщо
decimalзамістьdoubleу Задачі 7? - У Задачі 8 метод не зчитує дані з консолі. Чому це важливо?
- Що означає
_уswitchexpression?
Статус гілки
Ця гілка не зливається в main. Після завершення:
git checkout main
# наступна лаба: git checkout -b sandbox/arrays