Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

Организуйте код в двух файлах:

  • Matrix.h: Определите класс Matrix, который управляет двумерным массивом целых чисел с использованием динамической памяти. Ваша матрица должна поддерживать:
    • Приватные члены: указатель int** для двумерных данных и члены типа size_t для строк и столбцов
    • конструктор, принимающий количество строк и столбцов и инициализирующий все элементы значением 0
    • деструктор, корректно освобождающий всю выделенную память
    • конструктор копирования и оператор присваивания копированием (глубокое копирование с проверкой самоприсваивания)
    • геттеры getRows() и getCols() (оба const)
    • метод set(row, col, value) для установки отдельных элементов
    • метод get(row, col) с квалификатором const для получения элементов

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

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

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

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

Используйте std::stoi() для преобразования входных данных. Не забудьте реализовать != через ==, чтобы операторы оставались согласованными. Также не забудьте добавить защитные макросы заголовка в файл заголовка.

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

#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: Вывести Matrix A
    // cout << "Matrix A:" << endl;
    // Использовать оператор << для вывода матрицы
    
    // TODO: Вывести Matrix 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++