OOP Course
Сьогодні

Lab 02

Масиви

Пошук, сортування, 2D-розклад

Лаба 02 — Масиви

Мета

Навчитися працювати з одновимірними, двовимірними, рваними та тривимірними масивами в C#.

Контекст

Це пісочниця — окремий мінімальний проєкт, який не зливається в main. Після цієї лаби стартує основний проєкт (Лаба 03).


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

git checkout main
git checkout -b sandbox/arrays

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

dotnet new console -o sandbox/arrays --name SandboxArrays
cd sandbox/arrays
dotnet run

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

cd ../..
git add sandbox/arrays/
git commit -m "Lab02: create sandbox/arrays console project"

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

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

// Рядок для коректного зчитування дробових чисел з крапкою
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
Task1.Run();   // → Task2.Run() → Task3.Run() → ...

Задача 1. Ваги пацієнтів ⭐

Умова

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

Формат вводу

Рядок Поле Тип
1 N — кількість пацієнтів int (> 0)
2 … N+1 вага пацієнта double (кг)

Приклади

Приклад 1:

N ваги Вихід
5 70.0, 85.5, 62.0, 91.0, 78.3 Кількість: 5 / Середня вага: 77.4 кг / Мін / Макс: 62.0 / 91.0 кг / Вище середнього: 3 з 5

Приклад 2:

N ваги Вихід
3 55.0, 70.0, 90.0 Кількість: 3 / Середня вага: 71.7 кг / Мін / Макс: 55.0 / 90.0 кг / Вище середнього: 1 з 3

Підказки

  1. Оголосіть масив: double[] weights = new double[n];
  2. Заповніть масив циклом for.
  3. Порахуйте суму, мін і макс одним проходом foreach.
  4. Середнє = sum / n.
  5. Другим проходом for рахуйте елементи, де weights[i] > avg.

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

Домен Масив Статистика
Готель ціни номерів (double) середня ціна, найдешевший, найдорожчий
Ресторан ваги порцій (double) середня вага, мін/макс, скільки понад норму
Університет бали студентів (int) середній бал, мін/макс, скільки ≥ 90
Прокат авто пробіги (double, тис. км) середній пробіг, мін/макс, скільки потребують ТО (> 150)

Коміт

git add sandbox/arrays/Task1.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task1: basic 1D array stats"

Задача 2. Сортування черги прийомів ⭐

Умова

Зчитайте N вартостей прийомів у масив, відсортуйте методом бульбашки (bubble sort) за зростанням і виведіть результат.

Формат вводу

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

Приклади

N вартості (до) Вихід (після) мін макс
5 500 200 800 350 150 150 200 350 500 800 150 800
3 300 100 200 100 200 300 100 300
4 1000 500 750 250 250 500 750 1000 250 1000

Вихід для першого прикладу:

Черга (до):    500 200 800 350 150
Черга (після): 150 200 350 500 800
Найдешевший:   150 грн
Найдорожчий:   800 грн

Підказки

  1. Збережіть вивід черги до сортування одразу після зчитування.
  2. Bubble sort — два вкладені цикли. Зовнішній i від 0 до n-2, внутрішній j від 0 до n-2-i.
  3. Якщо queue[j] > queue[j+1] — міняємо місцями через тимчасову змінну temp.
  4. Після сортування: queue[0] — мінімум, queue[n-1] — максимум.
  5. Для виводу масиву: string.Join(" ", queue).

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

Домен Що сортувати Вихід
Готель ціни номерів (зростання) відсортовані ціни, мін/макс
Ресторан ваги порцій (зростання) відсортовані ваги
Університет бали студентів (спадання) рейтинг балів
Прокат авто рік випуску авто (зростання) від найстаршого до найновішого

Коміт

git add sandbox/arrays/Task2.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task2: bubble sort on 1D array"

Задача 3. Тижневий графік клініки ⭐⭐

Умова

Зчитайте кількість пацієнтів за кожен день тижня (7 значень, Пн–Нд). Виведіть таблицю, загальну кількість, найзавантаженіший і найтихіший день.

Формат вводу

Рядок Поле Тип
1 Пн — пацієнтів int
2 Вт — пацієнтів int
3 Ср — пацієнтів int
4 Чт — пацієнтів int
5 Пт — пацієнтів int
6 Сб — пацієнтів int
7 Нд — пацієнтів int

Приклади

Приклад 1:

Пн Вт Ср Чт Пт Сб Нд
12 8 15 10 9 5 2
Понеділок   : 12 пацієнтів
Вівторок    : 8 пацієнтів
Середа      : 15 пацієнтів
Четвер      : 10 пацієнтів
П'ятниця    : 9 пацієнтів
Субота      : 5 пацієнтів
Неділя      : 2 пацієнтів
Разом:        61
Найбільше:    Середа (15)
Найменше:     Неділя (2)

Приклад 2:

Пн Вт Ср Чт Пт Сб Нд
5 5 5 5 5 0 0
...
Разом:        25
Найбільше:    Понеділок (5)
Найменше:     Субота (0)

Підказки

  1. Оголосіть масив назв днів: string[] days = { "Понеділок", "Вівторок", ... }.
  2. Зчитайте patients[0..6] циклом for.
  3. Знаходьте maxIdx і minIdx — індекси, а не самі значення. Тоді days[maxIdx] дасть назву.
  4. Для форматування стовпців: {days[i],-12} вирівнює рядок ліворуч у полі 12 символів.

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

Домен Що per день Назви
Готель кількість заїздів Пн-Нд або місяці
Ресторан кількість замовлень час доби (8 годин)
Університет відвідуваність пар Пн-Сб
Прокат авто кількість оренд Пн-Нд

Коміт

git add sandbox/arrays/Task3.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task3: weekly schedule with named fixed array"

Задача 4. Матриця прийомів лікарів ⭐⭐

Умова

Зчитайте матрицю N×M, де рядок = лікар, стовпець = робочий день. Значення — кількість прийомів. Виведіть: сума прийомів по кожному лікарю (рядки), сума по кожному дню (стовпці), максимальне значення та його позицію.

Формат вводу

Рядок Поле Тип
1 N — лікарів int
2 M — днів int
3 … N+2 M чисел через пробіл (рядок матриці) int

Приклади

Приклад 1 (3×3):

Вхід:

3
3
5 3 4
2 8 1
6 2 7
Лікар 1: 12 прийомів
Лікар 2: 11 прийомів
Лікар 3: 15 прийомів
По днях: 13, 13, 12
Максимум: 8 (Лікар 2, День 2)

Приклад 2 (2×4):

Вхід:

2
4
4 3 5 2
2 5 4 7
Лікар 1: 14 прийомів
Лікар 2: 18 прийомів
По днях: 6, 8, 9, 9
Максимум: 7 (Лікар 2, День 4)

Підказки

  1. Оголосіть int[,] matrix = new int[n, m]; — це прямокутний 2D масив.
  2. Зчитування рядка: string[] parts = Console.ReadLine()!.Split(' ');, потім int.Parse(parts[j]).
  3. Два вкладені for для рядкових сум: зовнішній по i (лікарі), внутрішній по j (дні).
  4. Для стовпцевих сум: зовнішній по j, внутрішній по i — навпаки.
  5. Максимум: стежте за maxRow і maxCol — індексами найбільшого елемента.

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

Домен Рядки Стовпці Значення
Готель номери кімнат місяці кількість бронювань
Ресторан офіціанти дні тижня кількість замовлень
Університет викладачі пари на тиждень кількість студентів
Прокат авто автомобілі тижні кількість оренд

Коміт

git add sandbox/arrays/Task4.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task4: 2D rectangular array with row/column sums"

Задача 5. Аналіз квадратної матриці ⭐⭐

Умова

Зчитайте квадратну матрицю N×N. Знайдіть елементи та суми головної і побічної діагоналей.

Головна діагональ: клітинки де i == j (зліва-зверху → праворуч-знизу)
Побічна діагональ: клітинки де i + j == N - 1 (зверху-праворуч → ліворуч-знизу)

Формат вводу

Рядок Поле Тип
1 N — розмір int (≥ 2)
2 … N+1 N чисел через пробіл int

Приклади

Приклад 1 (N=3):

Вхід:

3
1 2 3
4 5 6
7 8 9
Головна діагональ: 1, 5, 9 (сума = 15)
Побічна діагональ: 3, 5, 7 (сума = 15)

Приклад 2 (N=4):

Вхід:

4
2 4 1 3
5 8 6 7
9 1 4 2
3 6 8 5
Головна діагональ: 2, 8, 4, 5 (сума = 19)
Побічна діагональ: 3, 6, 1, 3 (сума = 13)

Підказки

  1. Один цикл for i від 0 до N-1:
    • Головна: matrix[i, i]
    • Побічна: matrix[i, N-1-i]
  2. Збирайте елементи в масиви mainDiag[] і secDiag[] для виводу через string.Join(", ", ...).
  3. Суми накопичуйте паралельно: mainSum += matrix[i, i].

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

Домен Матриця Що шукати на діагоналі
Готель кімнати × тижні завантаження «особливих» номерів
Ресторан страви × дні тижня продажі у стабільні «діагональні» дні
Університет студенти × предмети «перехресні» оцінки
Прокат авто авто × тижні пробіг при самозбігу авто-тижень

Коміт

git add sandbox/arrays/Task5.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task5: square matrix diagonal analysis"

Задача 6. Рваний масив — прийоми лікарів ⭐⭐⭐

Умова

Кожен лікар має різну кількість прийомів. Зчитайте рваний масив (jagged array), виведіть статистику по кожному лікарю і знайдіть лікаря з найбільшим доходом.

Формат вводу

Рядок Поле Тип
1 N — кількість лікарів int
Для кожного лікаря:
наступний K — кількість прийомів int
K рядків вартість прийому int (грн)

Приклади

Приклад 1:

Вхід:

3
4
500
300
800
200
2
1000
600
3
400
250
700
Лікар 1: 4 прийоми, сума=1800 грн, середня=450.00 грн
Лікар 2: 2 прийоми, сума=1600 грн, середня=800.00 грн
Лікар 3: 3 прийоми, сума=1350 грн, середня=450.00 грн
Найбільший дохід: Лікар 1 (1800 грн)

Приклад 2:

Вхід:

2
2
200
400
3
300
500
400
Лікар 1: 2 прийоми, сума=600 грн, середня=300.00 грн
Лікар 2: 3 прийоми, сума=1200 грн, середня=400.00 грн
Найбільший дохід: Лікар 2 (1200 грн)

Підказки

  1. Рваний масив: int[][] costs = new int[n][];
  2. Для кожного лікаря: зчитайте K, потім costs[i] = new int[k];, потім K значень.
  3. Це нормально, що costs[i].Length відрізняється для різних i.
  4. Середнє: (double)totals[i] / costs[i].Length (явне приведення до double!).
  5. int[][] — масив масивів; int[,] — прямокутна матриця. Це різні типи.

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

Домен Зовнішній масив Внутрішній масив
Готель кімнати бронювання (різна к-сть за місяць)
Ресторан офіціанти чеки за зміну (різна к-сть)
Університет студенти здані предмети (різна к-сть)
Прокат авто автомобілі оренди (різна к-сть)

Коміт

git add sandbox/arrays/Task6.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task6: jagged array with per-row stats"

Задача 7. Паралельні масиви — рейтинг ІМТ ⭐⭐⭐

Умова

Зчитайте N пацієнтів (ім'я і ІМТ) у два паралельні масиви. Відсортуйте за спаданням ІМТ методом бульбашки, переміщуючи обидва масиви синхронно. Виведіть пронумерований рейтинг.

Формат вводу

Рядок Поле Тип
1 N — кількість пацієнтів int
Для кожного:
непарний ім'я string
парний ІМТ double

Приклади

Приклад 1:

N Пацієнти (ім'я / ІМТ) Вихід
4 Ivan/28.5, Olha/22.3, Petro/35.1, Maria/19.8 #1 Petro: 35.10 / #2 Ivan: 28.50 / #3 Olha: 22.30 / #4 Maria: 19.80

Приклад 2:

N Пацієнти Вихід
3 Anna/24.0, Bob/30.5, Carl/17.2 #1 Bob: 30.50 / #2 Anna: 24.00 / #3 Carl: 17.20

Вихід для прикладу 1:

=== Рейтинг ІМТ ===
#1 Petro: 35.10
#2 Ivan: 28.50
#3 Olha: 22.30
#4 Maria: 19.80

Підказки

  1. Два окремих масиви: string[] names = new string[n]; і double[] bmis = new double[n];.
  2. При сортуванні — міняйте обидва масиви одночасно. C# підтримує tuple swap: (bmis[j], bmis[j+1]) = (bmis[j+1], bmis[j]);
  3. Сортування за спаданням: умова bmis[j] < bmis[j+1] (не >).
  4. Якщо не міняти names синхронно з bmis, ім'я і ІМТ розійдуться — типова помилка.

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

Домен Масив 1 Масив 2 Сортування
Готель назви кімнат ціна/ніч за спаданням ціни
Ресторан назви страв калорійність за зростанням калорій
Університет імена студентів середній бал за спаданням балу
Прокат авто марка+модель рік випуску за спаданням року

Коміт

git add sandbox/arrays/Task7.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task7: parallel arrays sorted by value"

Задача 8. Тривимірний масив — аналіз відділень ⭐⭐⭐

Умова

Зчитайте тривимірний масив [відділення][тиждень][зміна], де зміна 0 = ранкова, 1 = вечірня. Виведіть аналітику по кожному відділенню і знайдіть найзавантаженіше.

Формат вводу

Рядок Поле Тип
1 D — кількість відділень int
2 W — кількість тижнів int
D×W×2 рядків пацієнтів (зміна) int

Порядок введення: [відд0, тижд0, ранок], [відд0, тижд0, вечір], [відд0, тижд1, ранок], ..., [відд1, тижд0, ранок], ...

Приклади

Приклад 1 (D=2, W=2):

Вхід:

2
2
15
10
12
8
20
15
18
12
Відділення 1:
  Тиждень 1: ранок 15, вечір 10 → разом 25
  Тиждень 2: ранок 12, вечір 8 → разом 20
  Разом: 45 пацієнтів
Відділення 2:
  Тиждень 1: ранок 20, вечір 15 → разом 35
  Тиждень 2: ранок 18, вечір 12 → разом 30
  Разом: 65 пацієнтів
Найзавантаженіше: Відділення 2 (65 пацієнтів)

Приклад 2 (D=3, W=1):

Вхід:

3
1
10
8
15
12
5
3
Відділення 1:
  Тиждень 1: ранок 10, вечір 8 → разом 18
  Разом: 18 пацієнтів
Відділення 2:
  Тиждень 1: ранок 15, вечір 12 → разом 27
  Разом: 27 пацієнтів
Відділення 3:
  Тиждень 1: ранок 5, вечір 3 → разом 8
  Разом: 8 пацієнтів
Найзавантаженіше: Відділення 2 (27 пацієнтів)

Підказки

  1. Оголосіть: int[,,] data = new int[d, w, 2]; — три виміри: відділення, тиждень, зміна.
  2. Три вкладені цикли for: зовнішній по dept, середній по week, внутрішній по shift (0..1).
  3. Доступ до елементу: data[dept, week, shift].
  4. Суму по відділенню збирайте в окремий масив int[] totals = new int[d].
  5. int[,,] — тривимірний прямокутний масив. Всі три виміри фіксовані в момент створення.

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

Домен Вимір 1 Вимір 2 Вимір 3
Готель поверхи місяці тип номера (стандарт/люкс)
Ресторан зали дні тижня час (обід/вечеря)
Університет факультети тижні пари (перша/друга половина дня)
Прокат авто класи авто місяці тип оренди (короткострокова/довгострокова)

Коміт

git add sandbox/arrays/Task8.cs sandbox/arrays/Program.cs
git commit -m "Lab02 Task8: 3D array analysis with per-department stats"

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

cd sandbox/arrays
dotnet run

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


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

  1. Чим відрізняється int[,] від int[][]? Коли який використовувати?
  2. У Task 7, якщо міняти тільки bmis, але не names — що піде не так?
  3. У Task 4 чому стовпцеві суми рахуються зворотним порядком циклів?
  4. Скільки елементів у масиві int[d, w, 2]? Напишіть формулу.
  5. Чому (double)totals[i] / costs[i].Length — а не просто totals[i] / costs[i].Length?

Статус гілки

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

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