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 |
Підказки
- Оголосіть масив:
double[] weights = new double[n]; - Заповніть масив циклом
for. - Порахуйте суму, мін і макс одним проходом
foreach. - Середнє =
sum / n. - Другим проходом
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 грнПідказки
- Збережіть вивід черги до сортування одразу після зчитування.
- Bubble sort — два вкладені цикли. Зовнішній
iвід 0 до n-2, внутрішнійjвід 0 до n-2-i. - Якщо
queue[j] > queue[j+1]— міняємо місцями через тимчасову зміннуtemp. - Після сортування:
queue[0]— мінімум,queue[n-1]— максимум. - Для виводу масиву:
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)Підказки
- Оголосіть масив назв днів:
string[] days = { "Понеділок", "Вівторок", ... }. - Зчитайте
patients[0..6]цикломfor. - Знаходьте
maxIdxіminIdx— індекси, а не самі значення. Тодіdays[maxIdx]дасть назву. - Для форматування стовпців:
{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)Підказки
- Оголосіть
int[,] matrix = new int[n, m];— це прямокутний 2D масив. - Зчитування рядка:
string[] parts = Console.ReadLine()!.Split(' ');, потімint.Parse(parts[j]). - Два вкладені
forдля рядкових сум: зовнішній по i (лікарі), внутрішній по j (дні). - Для стовпцевих сум: зовнішній по j, внутрішній по i — навпаки.
- Максимум: стежте за
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)Підказки
- Один цикл
for iвід 0 до N-1:- Головна:
matrix[i, i] - Побічна:
matrix[i, N-1-i]
- Головна:
- Збирайте елементи в масиви
mainDiag[]іsecDiag[]для виводу черезstring.Join(", ", ...). - Суми накопичуйте паралельно:
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 грн)Підказки
- Рваний масив:
int[][] costs = new int[n][]; - Для кожного лікаря: зчитайте K, потім
costs[i] = new int[k];, потім K значень. - Це нормально, що
costs[i].Lengthвідрізняється для різних i. - Середнє:
(double)totals[i] / costs[i].Length(явне приведення доdouble!). 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Підказки
- Два окремих масиви:
string[] names = new string[n];іdouble[] bmis = new double[n];. - При сортуванні — міняйте обидва масиви одночасно. C# підтримує tuple swap:
(bmis[j], bmis[j+1]) = (bmis[j+1], bmis[j]); - Сортування за спаданням: умова
bmis[j] < bmis[j+1](не>). - Якщо не міняти
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 пацієнтів)Підказки
- Оголосіть:
int[,,] data = new int[d, w, 2];— три виміри: відділення, тиждень, зміна. - Три вкладені цикли
for: зовнішній поdept, середній поweek, внутрішній поshift(0..1). - Доступ до елементу:
data[dept, week, shift]. - Суму по відділенню збирайте в окремий масив
int[] totals = new int[d]. 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Порівняйте вивід з прикладами у кожному завданні.
Питання для самоперевірки
- Чим відрізняється
int[,]відint[][]? Коли який використовувати? - У Task 7, якщо міняти тільки
bmis, але неnames— що піде не так? - У Task 4 чому стовпцеві суми рахуються зворотним порядком циклів?
- Скільки елементів у масиві
int[d, w, 2]? Напишіть формулу. - Чому
(double)totals[i] / costs[i].Length— а не простоtotals[i] / costs[i].Length?
Статус гілки
Ця гілка не зливається в main. Після завершення:
git checkout main
# наступна лаба: git checkout -b feature/patient-class