24 - Matrices irregulares o escalonadas


Visual Basic .Net nos permite crear matrices irregulares o escalonadas. Se dice que una matriz es irregular si la cantidad de elementos de cada fila varía. Luego podemos imaginar una matriz irregular:

matriz irregular

Como podemos ver la fila cero tiene reservado dos espacios, la fila uno reserva cuatro espacios y la última fila reserva espacio para tres componentes.

La sintaxis para declarar un atributo de tipo matriz irregular es:

        Private mat()() As Integer

Primero creamos la cantidad de filas dejando vacío el espacio que indica la cantidad de columnas, en nuestro ejemplo la matriz tiene 3 filas (disponemos un 2 ya que las filas comienzan a numerarse desde cero):

            mat = New Integer(2)() {}

Luego debemos ir creando cada fila de la matriz indicando el índice de la respectiva fila:

            mat(0) = New Integer(1) {}
            mat(1) = New Integer(3) {}
            mat(0) = New Integer(2) {}

Luego la forma para acceder a sus componentes debe ser utilizando paréntesis abiertos y cerrados para cada índice:

mat(0)(0) = 19

Dará un error si queremos cargar la tercer componente de la fila cero (esto debido a que no existe):

mat(0)(2) = 230

Luego si queremos saber la cantidad de filas que tiene la matriz:

Console.Write(mat.GetUpperBound(0))

Si queremos saber la cantidad de elementos de una determinada fila:

Console.Write("Cantidad de elementos de la fila 0:" & mat(0).GetUpperBound(0))
Console.Write("Cantidad de elementos de la fila 1:" & mat(1).GetUpperBound(0))
Console.Write("Cantidad de elementos de la fila 2:" & mat(2).GetUpperBound(0))

Problema 1:

Confeccionaremos un programa que permita crear una matriz irregular y luego imprimir la matriz en forma completa.

Programa:

Module Module1
    Public Class MatrizIrregular1

        Private mat()() As Integer

        Public Sub Cargar()
            Dim filas As Integer
            Console.Write("Cuantas fila tiene la matriz:")
            filas = Console.ReadLine()
            mat = New Integer(filas - 1)() {}
            Dim f, c As Integer
            For f = 0 To mat.GetUpperBound(0)
                Console.Write("Cuantas elementos tiene la fila " & f & ":")
                Dim elemento As Integer = Console.ReadLine()
                mat(f) = New Integer(elemento - 1) {}
                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write("Ingrese componente:")
                    mat(f)(c) = Console.ReadLine()
                Next
            Next
        End Sub

        Public Sub Imprimir()
            Dim f, c As Integer
            For f = 0 To mat.GetUpperBound(0)
                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write(mat(f)(c) & " ")
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
        End Sub
    End Class


    Sub Main()
        Dim mi As New MatrizIrregular1()
        mi.Cargar()
        mi.Imprimir()
    End Sub

End Module

El resultado de ejecutar este programa es:

matrices irregulares o escalonada

Declaramos una matriz irregular:

        Private mat()() As Integer

Primero creamos la cantidad de filas que tendrá la matriz (en los paréntesis para las columnas no disponemos valor):

            Dim filas As Integer
            Console.Write("Cuantas fila tiene la matriz:")
            filas = Console.ReadLine()
            mat = New Integer(filas - 1)() {}

Dentro del primer For pedimos que ingrese la cantidad de elementos que tendrá cada fila y utilizamos el operador New nuevamente, pero en este caso se están creando cada fila de la matriz (Visual Basic .Net trata a cada fila como un vector):

            For f = 0 To mat.GetUpperBound(0)
                Console.Write("Cuantas elementos tiene la fila " & f & ":")
                Dim elemento As Integer = Console.ReadLine()
                mat(f) = New Integer(elemento - 1) {}

Dentro del For interno hacemos la carga de las componentes propiamente dicho de la matriz irregular (podemos ir cargando cada fila a medida que las vamos creando):

                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write("Ingrese componente:")
                    mat(f)(c) = Console.ReadLine()
                Next

Luego imprimimos la matriz en forma completa teniendo cuidado los valores finales de cada For.
El primer For se repite tantas veces como filas tiene la matriz: mat.GetUpperBound(0) y
el For interno se repite tantas veces como elementos tiene la fila que estamos procesando mat(f).GetUpperBound(0):

        Public Sub Imprimir()
            Dim f, c As Integer
            For f = 0 To mat.GetUpperBound(0)
                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write(mat(f)(c) & " ")
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
        End Sub

Problemas propuestos

  1. Confeccionar una clase para administrar una matriz irregular de 5 filas y 1 columna la primer fila, 2 columnas la segunda fila y así sucesivamente hasta 5 columnas la última fila (crearla sin la intervención del operador)
    Realizar la carga por teclado e imprimir posteriormente.
  2. Confeccionar una clase para administrar los días que han faltado los 3 empleados de una empresa.
    Definir un vector de 3 elementos de tipo string para cargar los nombres y una matriz irregular para cargar los días que han faltado cada empleado (cargar el número de día que faltó)
    Cada fila de la matriz representan los días de cada empleado.
    Mostrar los empleados con la cantidad de inasistencias.
    Cuál empleado faltó menos días.
Solución
Module Module1

    Public Class MatrizIrregular2

        Private mat()() As Integer

        Public Sub Cargar()
            mat = New Integer(4)() {}
            Dim f, c As Integer
            For f = 0 To mat.GetUpperBound(0)
                mat(f) = New Integer(f) {}
                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write("Ingrese componente:")
                    mat(f)(c) = Console.ReadLine()
                Next
            Next
        End Sub

        Public Sub Imprimir()
            Dim f, c As Integer
            For f = 0 To mat.GetUpperBound(0)
                For c = 0 To mat(f).GetUpperBound(0)
                    Console.Write(mat(f)(c) & " ")
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
        End Sub
    End Class


    Sub Main()
        Dim ma As New MatrizIrregular2()
        ma.Cargar()
        ma.Imprimir()
    End Sub

End Module





Module Module1
    Public Class MatrizIrregular3

        Private nombres(2) As String
        Private dias()() As Integer

        Public Sub Cargar()
            dias = New Integer(2)() {}
            Dim f, c As Integer
            For f = 0 To nombres.GetUpperBound(0)
                Console.Write("Ingrese el nombre del empleado:")
                nombres(f) = Console.ReadLine()
                Console.Write("Cuantas días faltó el empleado:")
                Dim faltas As Integer
                faltas = Console.ReadLine()
                dias(f) = New Integer(faltas - 1) {}
                For c = 0 To dias(f).GetUpperBound(0)
                    Console.Write("Ingrese nro de día:")
                    dias(f)(c) = Console.ReadLine()
                Next
            Next
        End Sub

        Public Sub Inasistencias()
            Dim f As Integer
            For f = 0 To nombres.GetUpperBound(0)
                Console.WriteLine(nombres(f) & " faltó " & (dias(f).GetUpperBound(0) + 1) & " días")
            Next
        End Sub

        Public Sub EmpleadoMensosFaltas()
            Dim faltas As Integer = dias(0).GetUpperBound(0)
            Dim nom As String = nombres(0)
            Dim f As Integer
            For f = 1 To dias.GetUpperBound(0)
                If dias(f).GetUpperBound(0) < faltas Then
                    faltas = dias(f).GetUpperBound(0)
                    nom = nombres(f)
                End If
            Next
            Console.WriteLine("El empleado que faltó menos es " & nom & " con " & (faltas + 1) & " faltas.")
            Console.ReadKey()
        End Sub
    End Class


    Sub Main()
        Dim ma = New MatrizIrregular3()
        ma.Cargar()
        ma.Inasistencias()
        ma.EmpleadoMensosFaltas()
    End Sub

End Module

Retornar