← Повернутися до лекцій

Лекція 12: Структури даних (struct )

1. Що таке структура?

Уявіть, що ви заповнюєте анкету. У ній є поля: "Ім'я", "Вік", "Адреса". Всі ці дані належать одній людині. У С++ структура (struct) — це контейнер, який дозволяє об'єднати змінні різних типів під одним іменем.

  • Масив: зберігає багато даних одного типу (список оцінок).
  • Структура: зберігає дані різних типів, що описують один об'єкт.

2. Створення структури (Синтаксис)

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

// Оголошуємо новий тип даних "Robot"
struct Robot {
    string name; // Поле структури
    int batteryLevel;
    double weight;
    bool isActive;
}; // <--- УВАГА! Крапка з комою тут ОБОВ'ЯЗКОВА!

Тепер Robot — це такий самий повноцінний тип даних, як int або double.

3. Створення об'єкта та доступ до полів

#include <iostream>
#include <string>
using namespace std;

struct Robot {
    string name;
    int batteryLevel;
};

int main() {
    Robot bot1; // Створення об'єкта (екземпляра) структури
    
    // Запис даних
    bot1.name = "R2-D2";
    bot1.batteryLevel = 100;
    
    // Читання даних
    cout << "Робот: " << bot1.name << endl;
    cout << "Заряд: " << bot1.batteryLevel << "%" << endl;
    
    // Створення та ініціалізація одразу
    Robot bot2 = {"C-3PO", 50};
    cout << "Другий робот: " << bot2.name << endl;
    
    return 0;
}

4. Масиви структур

Це найпопулярніший сценарій. Замість того, щоб створювати 3 масиви (окремо для імен, окремо для віку, окремо для оцінок), ми створюємо один масив структур.

#include <iostream>
#include <string>
using namespace std;

struct Book {
    string title;
    string author;
    int year;
    double price;
};

int main() {
    Book library[3]; // Бібліотека на 3 книги
    
    // Заповнення першої книги
    library[0].title = "Kobzar";
    library[0].author = "Shevchenko";
    library[0].year = 1840;
    library[0].price = 350.50;
    
    // У циклі це виглядає ще краще
    for(int i = 0; i < 3; i++) {
        cout << "Книга " << library[i].title << " коштує " << library[i].price << endl;
    }
    
    return 0;
}

5. Структури та Функції

Структури можна передавати у функції. Правила ті самі, що й раніше: якщо структура велика — передаємо за посиланням (&), щоб не копіювати всі поля. Якщо структуру не змінюємо — додаємо const.

#include <iostream>
#include <string>
using namespace std;

struct Hero {
    string name;
    int hp;
    int damage;
};

// Функція для виводу (Тільки читання -> const &)
void printHeroInfo(const Hero& h) {
    cout << "Герой: " << h.name << " [" << h.hp << " HP]" << endl;
}

// Функція для лікування (Зміна -> &)
void healHero(Hero& h, int amount) {
    h.hp += amount;
    if (h.hp > 100) h.hp = 100; // Ліміт здоров'я
    cout << h.name << " вилікувався!" << endl;
}

int main() {
    Hero player = {"Knight", 80, 15};

    printHeroInfo(player); // 80 HP
    healHero(player, 10); // Стало 90 HP
    printHeroInfo(player);

    return 0;
}

6. Вказівники на структури (Оператор стрілка ->)

Коли працюємо зі структурами через вказівники (наприклад, у динамічній пам'яті), синтаксис трохи змінюється. Замість (*ptr).name використовуємо оператор стрілка ptr->name.

#include <iostream>
#include <string>
using namespace std;

struct Hero {
    string name;
    int hp;
    int damage;
};

int main() {
    Hero* dynHero = new Hero; // Створили в динамічній пам'яті

    // dynHero.name = "Elf"; // ПОМИЛКА! dynHero – це адреса, а не об'єкт.
    dynHero->name = "Elf"; // ПРАВИЛЬНО (Стрілка)
    dynHero->hp = 100;

    cout << dynHero->name;

    delete dynHero; // Не забуваємо чистити пам'ять
    
    return 0;
}

Практичні завдання до Лекції 12

Виконайте ці завдання в своєму середовищі розробки.

Завдання 1: Час

  1. Створіть структуру Time з трьома полями: hours, minutes, seconds (всі типу int).
  2. Напишіть функцію printTime, яка приймає структуру Time і виводить час у форматі HH:MM:SS.
  3. Бонус: Додайте провідний нуль для хвилин, якщо значення менше 10 (наприклад, 09:05:01 замість 9:5:1).

Завдання 2: Система інвентаризації (Масив структур)

  1. Створіть структуру Item (Товар) з полями: name (назва, string), quantity (кількість, int), price (ціна за одиницю, double).
  2. Створіть масив на 3 товари. Заповніть його даними (можна прямо в коді або через cin).
  3. Знайдіть товар з найвищою ціною і виведіть його назву.
  4. Обчисліть загальну вартість всього інвентаря (сума кількість × ціна для кожного товару).

Завдання 3: Геометрія (Відстань між точками)

  1. Створіть структуру Point з двома полями: x та y (координати).
  2. Створіть дві точки: p1 (наприклад, 0, 0) та p2 (наприклад, 3, 4).
  3. Напишіть функцію calculateDistance, яка приймає дві структури Point і повертає відстань між ними.
  4. Формула відстані: √(x₂ - x₁)² + (y₂ - y₁)²
  5. Підказка: Для цього потрібна бібліотека <cmath> (функції sqrt та pow).