20 - Estructura de datos tipo matriz


Una matriz es una estructura de datos que permite almacenar un CONJUNTO de datos del MISMO tipo.
Con un único nombre se define la matriz y por medio de DOS subíndices hacemos referencia a cada elemento de la misma (componente)

matriz

Hemos graficado una matriz de 3 filas y 5 columnas. Para hacer referencia a cada elemento debemos indicar primero la fila y luego la columna, por ejemplo en la componente 1,4 se almacena el valor 97.
En este ejemplo almacenamos valores enteros. Todos los elementos de la matriz deben ser del mismo tipo (int, float etc.)
Las filas y columnas comienzan a numerarse a partir de cero, similar a los vectores.
Hemos utilizado anteriormente una matriz para almacenar un conjunto de cadenas de caracteres

Problema 1:

Crear una matriz de 3 filas por 5 columnas con elementos de tipo int, cargar sus componentes y luego imprimirlas.

Programa:

#include<iostream>

using namespace std;

class Matriz1 {
private:
    int mat[3][5];
public:
    void cargar();
    void imprimir();
};

void Matriz1::cargar()
{
    for(int f = 0;f < 3;f++) 
    {
        for(int c = 0;c < 5;c++)
        {
            cout <<"Ingrese componente:";
            cin >>mat[f][c];
        }
    }
}

void Matriz1::imprimir()
{
    for(int f = 0;f < 3;f++) 
    {
        for(int c = 0;c < 5;c++) 
        {
            cout <<mat[f][c] <<" ";
        }
        cout <<"\n";;
    }
    cin.get();
    cin.get();
}

int main()
{
    Matriz1 m;
    m.cargar();
    m.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Matriz1.zip

Para definir una matriz debemos disponer como primer subíndice la cantidad de filas y como segundo subíndice la cantidad de columnas:

private:
    int mat[3][5];

Para cargar sus 15 componentes (cada fila almacena 5 componentes y tenemos 3 filas)
Lo más cómodo es utilizar un for anidado, el primer for que incrementa el contador "f" lo utilizamos para recorrer las filas y el contador interno llamado "c" lo utilizamos para recorrer las columnas.
Cada vez que se repite en forma completa el for interno se carga una fila completa, primero se carga la fila cero en forma completa, luego la fila uno y finalmente la fila 2.
Siempre que accedemos a una posición de la matriz debemos disponer dos subíndices que hagan referencia a la fila y columna mat[f][c]):

void Matriz1::cargar()
{
    for(int f = 0;f < 3;f++) 
    {
        for(int c = 0;c < 5;c++)
        {
            cout <<"Ingrese componente:";
            cin >>mat[f][c];
        }
    }
}

Para imprimir la matriz de forma similar utilizamos dos for para acceder a cada elemento de la matriz:

void Matriz1::imprimir()
{
    for(int f = 0;f < 3;f++) 
    {
        for(int c = 0;c < 5;c++) 
        {
            cout <<mat[f][c] <<" ";
        }
        cout <<"\n";;
    }
    cin.get();
    cin.get();
}

Cada vez que se ejecuta todas las vueltas del for interno tenemos en pantalla una fila completa de la matriz, por eso pasamos a ejecutar un salto de línea (con esto logramos que en pantalla los datos aparezcan en forma matricial):

        cout <<"\n";;

Problema 2:

Crear y cargar una matriz de 4 filas por 4 columnas. Imprimir la diagonal principal.

              x    -    -    -
              -    x    -    -
              -    -    x    -
              -    -    -    x

Programa:

#include<iostream>

using namespace std;

class Matriz2 {
private:
    int mat[4][4];
public:
    void cargar();
    void imprimirDiagonalPrincipal();
};

void Matriz2::cargar()
{
    for(int f = 0; f < 4; f++) 
    {
        for(int c = 0; c<4; c++) 
        {
            cout <<"Ingrese componente:";
            cin >>mat[f][c];
        }
    }
}

void Matriz2::imprimirDiagonalPrincipal()
{
    for(int k = 0; k < 4; k++) 
    {
        cout <<mat[k][k] <<" ";
    }
    cin.get();
    cin.get();
}

int main()
{
    Matriz2 m;
    m.cargar();
    m.imprimirDiagonalPrincipal();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Matriz2.zip

La definición y carga de la matriz no varían con el ejemplo anterior.
Para imprimir la diagonal principal de la matriz lo más conveniente es utilizar un for que se repita 4 veces y disponer como subíndice dicho contador (los elementos de la diagonal principal coinciden los valores de la fila y columna):

void Matriz2::imprimirDiagonalPrincipal()
{
    for(int k = 0; k < 4; k++) 
    {
        cout <<mat[k][k] <<" ";
    }
    cin.get();
    cin.get();
}

Problema 3:

Crear y cargar una matriz de 3 filas por 4 columnas. Imprimir la primer fila. Imprimir la última fila e imprimir la primer columna.

Programa:

#include<iostream>

using namespace std;

class Matriz3 {
private:
    int mat[3][4];
public:
    void cargar();
    void primerFila();
    void ultimaFila();
    void primerColumna();
};

void Matriz3::cargar()
{
    for(int f = 0; f < 3; f++) 
    {
        for(int c = 0; c < 4; c++) 
        {
            cout <<"Ingrese componente:";
            cin >>mat[f][c];
        }
    }
}

void Matriz3::primerFila()
{
    cout <<"Primer fila de la matriz:" <<"\n";
    for(int c = 0; c < 4; c++) 
    {
        cout <<mat[0][c] <<"\n";
    }
}

void Matriz3::ultimaFila()
{
    cout <<"Ultima fila de la matriz:" <<"\n";
    for(int c = 0; c < 4; c++) 
    {
        cout <<mat[2][c] <<"\n";
    }
}

void Matriz3::primerColumna()
{
    cout <<"Primer columna:" <<"\n";
    for(int f = 0; f < 3; f++) 
    {
        cout <<mat[f][0] <<"\n";
    }
}

int main()
{
    Matriz3 m;
    m.cargar();
    m.primerFila();
    m.ultimaFila();
    m.primerColumna();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Matriz3.zip

Creamos una matriz de 3 filas y 4 columnas:

    int mat[3][4];

Luego de cargarla el primer método que codificamos es el que imprime la primer fila. Disponemos un for para recorrer las columnas, ya que la fila siempre será la cero. Como son cuatro los elementos de la primer fila el for se repite esta cantidad de veces:

void Matriz3::primerFila()
{
    cout <<"Primer fila de la matriz:" <<"\n";
    for(int c = 0; c < 4; c++) 
    {
        cout <<mat[0][c] <<"\n";
    }
}

Para imprimir la última fila el algoritmo es similar, disponemos un for que se repita 4 veces y en el subíndice de la fila disponemos el valor 2 (ya que la matriz tiene 3 filas):

void Matriz3::ultimaFila()
{
    cout <<"Ultima fila de la matriz:" <<"\n";
    for(int c = 0; c < 4; c++) 
    {
        cout <<mat[2][c] <<"\n";
    }
}

Para imprimir la primer columna el for debe repetirse 3 veces ya que la matriz tiene 3 filas. Dejamos constante el subíndice de la columna con el valor cero:

void Matriz3::primerColumna()
{
    cout <<"Primer columna:" <<"\n";
    for(int f = 0; f < 3; f++) 
    {
        cout <<mat[f][0] <<"\n";
    }
}

Problema propuesto

  1. Crear una matriz de 2 filas y 5 columnas. Realizar la carga de componentes por columna (es decir primero ingresar toda la primer columna, luego la segunda columna y así sucesivamente)
    Imprimir luego la matriz.
Solución
#include<iostream>

using namespace std;

class Matriz4 {
private:
    int mat[2][5];
public:
    void cargar();
    void imprimir();
};


void Matriz4::cargar()
{
    cout <<"Carga de la matriz por columna:" <<"\n";
    for(int c = 0; c < 5; c++) 
    {        
        for(int f = 0; f < 2; f++) 
        {
            cout <<"Ingrese componente  de la fila "  <<f  <<" y la columna " <<c <<" :";
            cin >>mat[f][c];
        }
    }
}

void Matriz4::imprimir()
{
    for(int f = 0; f < 2; f++) 
    {
        for(int c = 0; c < 5; c++) 
        {
            cout <<mat[f][c] <<" ";
        }
        cout <<"\n";
    }
    cin.get();
    cin.get();
}
        
int main()
{
    Matriz4 m;
    m.cargar();
    m.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace :Matriz4.zip

Retornar