Jump to content

[C++] Matrice folosind std::vector


MAMRETRAS
 Share

Recommended Posts

In tutorialul acesta va voi prezenta cum se foloseste o matrice utilizand std::vector.

Problema este propusa de @shanker'. Se da o matrice, sa se calculeze suma pe fiecare diagonala.

Am sa las comentarii unde este cazul:

#include <iostream>
#include <map>
#include <numeric>
#include <vector>

const int columns_num = 3; // numarul de coloane ale matricei
const int rows_num = 3; // numarul de linii ale matricei

std::vector<std::vector<int>> initialize_matrix() {
    std::vector<std::vector<int>> matrix(columns_num); // initializam un vector de vectori in functie de cate coloane are matricea

    for (auto& col : matrix) {
        col = std::vector<int>(rows_num); // pentru fiecare coloana din matrice alocam loc pentru elementele acesteia (numarul de linii)
    }

    return matrix;
}

void read_matrix(std::vector<std::vector<int>>& matrix) {
    for (int y = 0; y < rows_num; ++y) { // pentru fiecare linie
        for (int x = 0; x < columns_num; ++x) { // pentru fiecare coloana
            std::cin >> matrix[x][y]; // citim elementul de pe linia Y si coloana X (vezi axa xOy)
        }
    }
}

void print_sum_for_each_diagonal(std::vector<std::vector<int>> matrix) {
    std::map<int, std::vector<int>> diagonal_id_elements;

    for (int y = rows_num - 1; y >= 0; --y) { // pentru fiecare linie
        for (int x = columns_num - 1; x >= 0; --x) { // pentru fiecare coloana
            diagonal_id_elements[y + x].push_back(matrix[x][y]); // adaugam la diagonala respectiva elementul de pe linia Y si coloana X
        }
    }

    for (const auto& diagonal : diagonal_id_elements) { // pentru fiecare pereche [id_diagonala, elemente_diagonala]
        std::cout << "Sum of elements for diagonal #" << diagonal.first << ": "; // afisam id-ul diagonalei
        for (const auto& element : diagonal.second) { // pentru fiecare element al diagonalei
            std::cout << element << " + "; // il afisam
        }
        std::cout << "0 = " << std::accumulate(diagonal.second.begin(), diagonal.second.end(), 0) << '\n'; // afisam suma pe diagonala respectiva
        // NOTE: Am pus + 0 pentru infrumusetarea afisarii (ramanea un '+' la final, asadar am adaugat si un 0, element neutru la adunare)
    }
}

int main() {
    std::vector<std::vector<int>> matrix = initialize_matrix(); // initializam matricea
    read_matrix(matrix); // o citim

    print_sum_for_each_diagonal(matrix); // si afisam suma pe fiecare diagonala

    return 0;
}

 

Reprezentarea matricei si a diagonalelor:

image.thumb.png.eeac3f0f01c50c74136a8dc063e41c01.png

 

Un exemplu de element si de accesare a acestuia:

matrix[2][1] = 9 (X = 2, Y = 1) X = 2 reprezinta locatia acestuia pe axa X (coloana) iar Y = 1 pe axa Y (linia)

Aceasta reprezentare este des intalnita si in procesarea imaginilor, unde se foloseste axa xOy.

 

Consola:

2 4 3
5 2 9
1 3 4
Sum of elements for diagonal #0: 2 + 0 = 2
Sum of elements for diagonal #1: 5 + 4 + 0 = 9
Sum of elements for diagonal #2: 1 + 2 + 3 + 0 = 6
Sum of elements for diagonal #3: 3 + 9 + 0 = 12
Sum of elements for diagonal #4: 4 + 0 = 4

 

Edited by Vesca
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.