Menu
Coddy logo textTech

Podsumowanie — klasa Matrix

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 47 z 104.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Matrix, która łączy wszystkie poznane w tym rozdziale techniki przeciążania operatorów. Utworzysz w pełni funkcjonalną macierz obsługującą operacje arytmetyczne, porównania, dostęp do elementów i wypisywanie do strumienia — wszystko za pomocą intuicyjnej składni operatorów.

Rozmieścisz swój kod w dwóch plikach:

  • Matrix.h: Zdefiniuj klasę Matrix, która zarządza dwuwymiarową tablicą liczb całkowitych przy użyciu pamięci dynamicznej. Twoja macierz powinna obsługiwać:
    • Prywatne składowe: wskaźnik int** do danych 2D oraz składowe size_t określające liczbę wierszy i kolumn
    • Konstruktor przyjmujący liczbę wierszy i kolumn, inicjalizujący wszystkie elementy wartością 0
    • Destruktor, który prawidłowo zwalnia całą zaalokowaną pamięć
    • Konstruktor kopiujący i operator przypisania kopiującego (głęboka kopia z kontrolą przypisania do samego siebie)
    • Gettery getRows() i getCols() (oba const)
    • Metodę set(row, col, value) do ustawiania poszczególnych elementów
    • Metodę get(row, col) const do pobierania elementów

    Zaimplementuj następujące operatory:

    • Arytmetyczne: + i - do dodawania i odejmowania macierzy (zwracają nową macierz przez wartość)
    • Porównania: == i != do sprawdzania, czy dwie macierze mają takie same wymiary i identyczne elementy
    • Strumieniowy: << jako funkcję zaprzyjaźnioną do wypisywania macierzy wiersz po wierszu, z elementami oddzielonymi spacjami i każdym wierszem w nowej linii
    • Indeksowania: [], który zwraca wskaźnik do wiersza, umożliwiając składnię matrix[row][col] (udostępnij zarówno wersję const, jak i nie-const)

    W przypadku operatorów arytmetycznych załóż, że obie macierze mają takie same wymiary. Operatory porównania powinny zwracać false, jeśli wymiary się różnią.

  • main.cpp: Wczytaj dane wejściowe, aby utworzyć i modyfikować dwie macierze 2x2. Format danych wejściowych:
    1. Cztery liczby całkowite dla pierwszej macierzy (wiersz po wierszu): a00, a01, a10, a11
    2. Cztery liczby całkowite dla drugiej macierzy (wiersz po wierszu): b00, b01, b10, b11

    Utwórz dwa obiekty Matrix (każdy o 2 wierszach i 2 kolumnach), wypełnij je za pomocą metody set(), a następnie pokaż działanie operatorów:

    Format wyjściowy:

    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>

    Elementy każdego wiersza powinny być oddzielone pojedynczymi spacjami. Dla wyników porównań wypisz true lub false (małymi literami).

Na przykład, dla danych wejściowych 1 2 3 4 dla macierzy A oraz 5 6 7 8 dla 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

Użyj std::stoi() do konwersji danych wejściowych. Pamiętaj, aby zaimplementować != w oparciu o ==, dzięki czemu operatory będą spójne. Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym.

Spróbuj swoich sił

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

using namespace std;

int main() {
    // Wczytaj dane wejściowe dla pierwszej macierzy (2x2): a00, a01, a10, a11
    int a00, a01, a10, a11;
    cin >> a00 >> a01 >> a10 >> a11;
    
    // Wczytaj dane wejściowe dla drugiej macierzy (2x2): b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: Utwórz dwa obiekty Matrix (każdy o 2 wierszach i 2 kolumnach)
    
    // TODO: Wypełnij macierze za pomocą metody set()
    
    // TODO: Wyświetl macierz A
    // cout << "Matrix A:" << endl;
    // Użyj operatora <<, aby wyświetlić macierz
    
    // TODO: Wyświetl macierz B
    // cout << "Matrix B:" << endl;
    // Użyj operatora <<, aby wyświetlić macierz
    
    // TODO: Wyświetl A + B
    // cout << "A + B:" << endl;
    
    // TODO: Wyświetl A - B
    // cout << "A - B:" << endl;
    
    // TODO: Wyświetl wyniki porównań
    // cout << "A == B: " << (użyj operatora trójargumentowego dla true/false) << endl;
    // cout << "A != B: " << (użyj operatora trójargumentowego dla true/false) << endl;
    
    // TODO: Wyświetl wyniki dostępu przez indeksy
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online