Перейти до змісту

Задачі: Основи шаблонів

Практичні задачі на тему шаблонних функцій, шаблонних структур та перевантаження операторів потоків.

Формат задач

У кожній задачі дано сигнатуру функції або методу. Потрібно написати реалізацію замість ....


Простий рівень

Задача 1: Шаблонна функція min

Напишіть шаблонну функцію, що знаходить мінімум двох значень.

template<typename T>
T my_min(T a, T b) {
    ...
}

Приклади виклику:

my_min(5, 3);        // 3
my_min(2.5, 8.1);    // 2.5
my_min('a', 'z');    // 'a'

Задача 2: Перевантажена функція для різних типів

Напишіть три перевантажені функції print_info, які виводять інформацію про число, текст та символ.

void print_info(int x) {
    ...
}

void print_info(const char* text) {
    ...
}

void print_info(char c) {
    ...
}

Вимоги: - Для int: вивести "Number: X" - Для const char*: вивести "Text: X" - Для char: вивести "Character: X"


Середній рівень

Задача 3: Структура point з оператором <<

Створіть структуру point з полями x та y типу int. Реалізуйте оператор виведення <<.

struct point {
    int x;
    int y;
};

std::ostream& operator<<(std::ostream& out, const point& p) {
    ...
}

Приклад виводу:

point p{5, 10};
std::cout << p;  // (5, 10)

Задача 4: Структура point з оператором >>

Розширьте задачу 3. Реалізуйте оператор введення >>.

std::istream& operator>>(std::istream& in, point& p) {
    ...
}

Приклад використання:

point p;
std::cin >> p;  // User enters: 5 10
std::cout << p; // Output: (5, 10)

Задача 5: Розширена структура student

Створіть структуру student з полями: - id (int) - age (int) - grade (double)

Реалізуйте operator<< для виведення в форматі: "Student #ID (age: A, grade: G)"

struct student {
    int id;
    int age;
    double grade;
};

std::ostream& operator<<(std::ostream& out, const student& s) {
    ...
}

Задача 6: Шаблонна структура pair

Напишіть шаблонну структуру pair, яка зберігає два значення різних типів.

template<typename T, typename U>
struct pair {
    T first;
    U second;

    pair(T a, U b) {
        ...
    }
};

Приклади виклику:

pair<int, double> p1(5, 3.14);
pair<char, int> p2('A', 42);


Складний рівень

Задача 7: Універсальний print для вектора

Розширьте шаблонну структуру vector методом print(), який виводить всі елементи.

template<typename T>
struct vector {
    T* data;
    int size;
    int capacity;

    // ... інші методи ...

    void print() {
        ...
    }
};

Вимоги: - Вивести елементи у форматі: [1, 2, 3] - Працює з будь-яким типом, для якого визначено operator<<

Приклади:

vector<int> v = {1, 2, 3};
v.print();  // [1, 2, 3]

vector<point> points = {{0, 0}, {1, 1}};
points.print();  // [(0, 0), (1, 1)]

Задача 8: 3D точка з відстанню

Розширьте структуру point на 3D: - Додайте поле z типу int - Оновіть operator<< для виведення (x, y, z) - Оновіть operator>> для введення трьох координат

struct point {
    int x;
    int y;
    int z;
};

// Implement operator<< and operator>>

Задача 9: Контейнер для точок

Створіть vector<point> та: 1. Заповніть його зі списку ініціалізації (мінімум 3 точки) 2. Виведіть всі точки 3. Додайте нову точку через введення з std::cin 4. Виведіть остаточний список

Приклад коду:

vector<point> points = {{0, 0, 0}, {1, 1, 1}, {-5, 3, 2}};
// ... виведення ...
// ... введення нової точки ...
// ... виведення оновленого списку ...

Задача 10: Шаблонна функція swap

Напишіть шаблонну функцію, яка обмінює місцями два значення.

template<typename T>
void swap(T& a, T& b) {
    ...
}

Приклади:

int x = 5, y = 10;
swap(x, y);  // x = 10, y = 5

double a = 3.14, b = 2.71;
swap(a, b);  // a = 2.71, b = 3.14


Попередня: Основи шаблонів