19 - Matrices estáticas (Arreglos bidimensionales)

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 estatica Delphi/pascal

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 400.
En este ejemplo almacenamos valores enteros. Todos los elementos de la matriz deben ser del mismo tipo (Integer, Double, String etc.)

Problema 1

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

Proyecto75

program Proyecto75;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TMatriz = array[1..3, 1..5] of Integer;

var
  Mat: TMatriz;
  f, c: Integer;
begin
  for f:= 1 to 3 do
  begin
    for c:=1 to 5 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Mat[f,c]);
    end;
  end;
  WriteLn('Listado completo de la matriz');
  for f:= 1 to 3 do
  begin
    for c:=1 to 5 do
    begin
      Write(Mat[f,c]:6);
    end;
    WriteLn;
  end;
  ReadLn;
end.

Para declarar el tamaño y tipo de elementos de la matriz lo hacemos en la sección de la type:

type
  TMatriz = array[1..3, 1..5] of Integer;

Realmente se reserva espacio cuando definimos una variable del tipo de dato declarado previamente:

var
  Mat: TMatriz;

Luego debemos pasar a cargar sus 15 componentes (cada fila almacena 5 componentes y tenemos 3 filas)
Lo más cómodo es utilizar dos for anidados, 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 uno en forma completa, luego la fila dos y finalmente la fila tres.
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]:

  for f:= 1 to 3 do
  begin
    for c:=1 to 5 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Mat[f,c]);
    end;
  end;

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

  for f:= 1 to 3 do
  begin
    for c:=1 to 5 do
    begin
      Write(Mat[f,c]:6);
    end;
    WriteLn;
  end;

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 un WriteLn (con esto logramos que en pantalla los datos aparezcan en forma matricial):

Para que cada dato se muestre ocupando 6 espacios disponemos el elemento de la matriz y seguido del caracter dos puntos el valor 6: Write(Mat[f,c]:6)

matriz estatica Delphi/pascal

Problema 2

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

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

Proyecto76

program Proyecto76;

{$APPTYPE CONSOLE}

type
  TMatriz = array[1..4,1..4] of Integer;

var
  Matriz: TMatriz;
  f, c, k: Integer;
begin
  for f:= 1 to 4 do
  begin
    for c:=1 to 4 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Matriz[f,c]);
    end;
  end;
  WriteLn('Elementos de la diagonal principal');
  for k:=1 to 4 do
  begin
    Write(Matriz[k,k], '-');
  end;
  ReadLn;
end.

La declaración, 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):

  WriteLn('Elementos de la diagonal principal');
  for k:=1 to 4 do
  begin
    Write(Matriz[k,k], '-');
  end;

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.

Proyecto77

program Proyecto77;

{$APPTYPE CONSOLE}

type
  TMatriz = array[1..3,1..4] of Integer;

var
  Matriz: TMatriz;
  f, c: Integer;
begin
 for f:= 1 to 3 do
  begin
    for c:=1 to 4 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Matriz[f,c]);
    end;
  end;
  Write('Primer fila de la matriz:');
  for c:=1 to 4 do
  begin
    Write(Matriz[1,c]:6);
  end;
  WriteLn;
  Write('Ultima fila de la matriz:');
  for c:=1 to 4 do
  begin
    Write(Matriz[3,c]:6);
  end;
  WriteLn;
  Write('Primer columna de la matriz:');
  for f:=1 to 3 do
  begin
    Write(Matriz[f,1]:6);
  end;
  ReadLn;
end.

Declaramos y creamos una matriz de 3 filas y 4 columnas:

type
  TMatriz = array[1..3,1..4] of Integer;

var
  Matriz: TMatriz;

Luego de cargarla la matriz para mostrar la primer fila disponemos un for para recorrer las columnas, ya que la fila siempre será la 1. Como son cuatro los elementos de la primer fila el for se repite esta cantidad de veces:

  Write('Primer fila de la matriz:');
  for c:=1 to 4 do
  begin
    Write(Matriz[1,c]:6);
  end;

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 3(ya que la matriz tiene 3 filas):

  Write('Ultima fila de la matriz:');
  for c:=1 to 4 do
  begin
    Write(Matriz[3,c]:6);
  end;

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 1:

  Write('Primer columna de la matriz:');
  for f:=1 to 3 do
  begin
    Write(Matriz[f,1]:6);
  end;

Problemas propuestos

  • 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.
  • Crear una matriz de 3x4. Realizar la carga y luego imprimir el elemento mayor almacenado en la matriz.
  • Definir una matriz de 2 filas y 5 columnas. Realizar su carga e impresión.
    Intercambiar los elementos de la primera fila con la segunda y volver a imprimir la matriz.
Solución
program Proyecto78;

{$APPTYPE CONSOLE}

type
  TMatriz = array[1..2,1..5] of Integer;

var
  Matriz: TMatriz;
  f, c: Integer;

begin
  for c:= 1 to 5 do
  begin
    for f:=1 to 2 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Matriz[f,c]);
    end;
  end;
  WriteLn('Listado completo de la matriz');
  for f:= 1 to 2 do
  begin
    for c:=1 to 5 do
    begin
      Write(Matriz[f,c]:6);
    end;
    WriteLn;
  end;
  ReadLn;
end.




program Proyecto79;

{$APPTYPE CONSOLE}

type
  TMatriz = array[1..3,1..4] of Integer;

var
  Matriz: TMatriz;
  f, c: Integer;
  mayor: Integer;
begin
  for f:= 1 to 3 do
  begin
    for c:=1 to 4 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Matriz[f,c]);
    end;
  end;
  mayor := Matriz[1,1];
  for f:= 1 to 3 do
  begin
    for c:=1 to 4 do
    begin
      if Matriz[f,c] > mayor then
      begin
        mayor := Matriz[f,c];
      end;
    end;
  end;
  WriteLn('El elemento mayor de la matriz es el valor:', mayor);
  ReadLn;
end.




program Proyecto80;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TMatriz = array[1..2, 1..5] of Integer;

var
  Matriz: TMatriz;
  f, c: Integer;
  aux: Integer;

begin
  for f:= 1 to 2 do
  begin
    for c:=1 to 5 do
    begin
      Write('Ingrese elemento de la matriz de la fila ', f, ' y la columna ', c, ':');
      ReadLn(Matriz[f,c]);
    end;
  end;
  WriteLn('Listado completo de la matriz');
  for f:= 1 to 2 do
  begin
    for c:=1 to 5 do
    begin
      Write(Matriz[f,c]:6);
    end;
    WriteLn;
  end;
  for c:=1 to 5 do
  begin
    aux := Matriz[2][c];
    Matriz[2][c] := Matriz[1][c];
    Matriz[1][c] := aux;
  end;
  WriteLn('Listado completo de la matriz luego de intercambiar filas');
  for f:= 1 to 2 do
  begin
    for c:=1 to 5 do
    begin
      Write(Matriz[f,c]:6);
    end;
    WriteLn;
  end;
  ReadLn;
end.