Лекція 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: Час
- Створіть структуру
Timeз трьома полями:hours,minutes,seconds(всі типуint). - Напишіть функцію
printTime, яка приймає структуруTimeі виводить час у форматіHH:MM:SS. - Бонус: Додайте провідний нуль для хвилин, якщо значення менше 10 (наприклад,
09:05:01замість9:5:1).
Завдання 2: Система інвентаризації (Масив структур)
- Створіть структуру
Item(Товар) з полями:name(назва,string),quantity(кількість,int),price(ціна за одиницю,double). - Створіть масив на 3 товари. Заповніть його даними (можна прямо в коді або через
cin). - Знайдіть товар з найвищою ціною і виведіть його назву.
- Обчисліть загальну вартість всього інвентаря (сума
кількість × цінадля кожного товару).
Завдання 3: Геометрія (Відстань між точками)
- Створіть структуру
Pointз двома полями:xтаy(координати). - Створіть дві точки:
p1(наприклад, 0, 0) таp2(наприклад, 3, 4). - Напишіть функцію
calculateDistance, яка приймає дві структуриPointі повертає відстань між ними. - Формула відстані:
√(x₂ - x₁)² + (y₂ - y₁)² - Підказка: Для цього потрібна бібліотека
<cmath>(функціїsqrtтаpow).