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:
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))
Confeccionaremos un programa que permita crear una matriz irregular y luego imprimir la matriz en forma completa.
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:
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
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