Menu
CoddyTech

Итоги — класс Matrix

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 47 из 104.

challenge icon

Задание

Легко

Давайте создадим класс Matrix, который объединяет все изученные в этой главе приёмы перегрузки операторов. Вы создадите полноценную матрицу с поддержкой арифметических операций, сравнений, доступа к элементам и вывода в поток — и всё это с помощью интуитивно понятного синтаксиса операторов.

Ваш код будет состоять из двух файлов:

  • Matrix.h: Определите класс Matrix, который управляет двумерным массивом целых чисел с использованием динамической памяти. Ваша матрица должна поддерживать:
    • Закрытые поля: указатель int** для двумерных данных и поля типа size_t для количества строк и столбцов
    • Конструктор, принимающий количество строк и столбцов и инициализирующий все элементы значением 0. Выделите массив указателей на строки, а затем каждую строку: data = new int*[rows]; и data[r] = new int[cols]; для каждой строки r
    • Деструктор, который корректно освобождает всю выделенную память: сначала выполните delete[] для каждой строки, затем delete[] data;
    • Конструктор копирования и оператор присваивания копированием (глубокое копирование с проверкой на самоприсваивание)
    • Геттеры getRows() и getCols() (оба с квалификатором const)
    • Метод set(row, col, value) для установки отдельных элементов
    • Метод get(row, col) с квалификатором const для получения элементов

    Реализуйте следующие операторы:

    • Арифметические: + и - для сложения и вычитания матриц (возвращают новую матрицу по значению)
    • Сравнения: == и != для проверки, имеют ли две матрицы одинаковые размеры и идентичные элементы
    • Потоковый: << как дружественную функцию для вывода матрицы построчно, с элементами, разделёнными пробелами, и каждой строкой на новой строке
    • Индексирования: [], возвращающий указатель на строку и позволяющий использовать синтаксис matrix[row][col] (предоставьте версии как с квалификатором const, так и без него)

    Для арифметических операторов считайте, что обе матрицы имеют одинаковые размеры. Операторы сравнения должны возвращать false, если размеры отличаются.

  • main.cpp: Считайте входные данные для создания и обработки двух матриц размером 2x2. Формат входных данных:
    1. Четыре целых числа для первой матрицы (построчно): a00, a01, a10, a11
    2. Четыре целых числа для второй матрицы (построчно): b00, b01, b10, b11

    Создайте два объекта Matrix (каждый размером 2 строки и 2 столбца), заполните их с помощью метода set(), а затем продемонстрируйте работу операторов:

    Формат вывода:

    Matrix A:
    <row0>
    <row1>
    Matrix B:
    <row0>
    <row1>
    A + B:
    <row0>
    <row1>
    A - B:
    <row0>
    <row1>
    A == B: <true/false>
    A != B: <true/false>
    A[0][0]: <value>
    A[1][1]: <value>

    В каждой строке элементы должны разделяться одиночными пробелами. Для результатов сравнения выводите true или false (строчными буквами).

Например, если для Matrix A введены 1 2 3 4, а для Matrix B: — 5 6 7 8

Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4

Не забудьте реализовать != через ==, чтобы операторы работали согласованно. Не забудьте добавить защиту от повторного включения в заголовочный файл.

Попробуйте сами

#include <iostream>
#include <string>
#include "Matrix.h"

using namespace std;

int main() {
    // Считайте входные данные для первой матрицы (2x2): a00, a01, a10, a11
    int a00, a01, a10, a11;
    cin >> a00 >> a01 >> a10 >> a11;
    
    // Считайте входные данные для второй матрицы (2x2): b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: Создайте два объекта Matrix (по 2 строки и 2 столбца в каждом)
    
    // TODO: Заполните матрицы с помощью метода set()
    
    // TODO: Выведите матрицу A
    // cout << "Matrix A:" << endl;
    // Используйте оператор << для вывода матрицы
    
    // TODO: Выведите матрицу B
    // cout << "Matrix B:" << endl;
    // Используйте оператор << для вывода матрицы
    
    // TODO: Выведите A + B
    // cout << "A + B:" << endl;
    
    // TODO: Выведите A - B
    // cout << "A - B:" << endl;
    
    // TODO: Вывести результаты сравнения
    // cout << "A == B: " << (используйте тернарный оператор для true/false) << endl;
    // cout << "A != B: " << (используйте тернарный оператор для true/false) << endl;
    
    // TODO: Вывести результаты доступа по индексам
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++