viernes, 4 de octubre de 2024

Funciones. Matrices.

Buscar datos en una matriz.

Otra acción frecuente en el trabajo con matrices es buscar dentro de ella un dato o contenido concreto, o la posición en que se sitúa determinado dato. Para ello deberemos desarrollar funciones específicas ya que, hasta donde yo se, OOo Basic no dispone de funciones Built-In que realicen esta tarea (1).


En este caso se podría pensar en desarrollar al menos dos funciones, dado que los valores que puede devolver la función es de diferente naturaleza y posiblemente también de tipo diferente, en función del objetivo que nos planteemos: si buscamos un dato, estamos hablando del contenido de la matriz, que puede ser, por ejemplo, de tipo String o Integer; pero si lo que buscamos es la posición en la que se encuentra determinado dato, el valor numérico (necesariamente numérico) no hace referencia a contenido, sino a posición, esto es: se trata de un índice o referencia posicional, no de un dato cuantitativo propiamente dicho.

Dicho lo anterior, y aunque caben diferentes opciones de compromiso, me decido por crear dos funciones diferentes, una para cada objetivo (2): bPos() y bCon().

La función bPos() busca la posición que ocupa el contenido solicitado como criterio de búsqueda en el script y devuelve la posición que ocupa (el índice de la matriz). 

Function bPos(mDat(),sCon As String) As Long

Dim c As Integer, iResulta As Integer

For c = 0 To UBound(mDat())
If mDat(c) = sCon Then
iResulta = c
Exit For
Else
iResulta = -1
End If
Next

bPos = iResulta

End Function

Para ello recibe dos parámetros, la matriz (mDat()) y el contenido a buscar (sCon). Se define como de tipo Long, pero perfectamente podría ser de tipo Integer. Además cuenta con dos variables privadas: c o contador e iResulta para asignar el resultado de la función.

Su estructura es sencilla: mediante un ciclo For recorremos el contenido de la matriz-parámetro y un condicional anidado en el bucle se encarga de analizar si el contenido de dicha matriz se corresponde con el buscado (mDat(c) = sCon). En caso positivo (If) se asigna el índice correspondiente a la variable iResulta y se sale del bucle (Exit For); en caso negativo (Else) se devuelve -1.

Finalmente se ejecuta el Return (bPos = iResulta) (3)

La función bCon() ejecuta el proceso contrario: recibe un valor de posición y busca en la matriz el contenido asociado a dicho índice.

Function bCon(mDat(),iP As Integer) As String

Dim c As Integer
Dim sResulta As String

If iP > UBound(mDat()) or iP < LBound(mDat())Then
sResulta = "No exite este índice"
Else
For c = 0 To UBound(mDat())
If c = iP Then
sResulta = mDat(c)
Exit For
End If
Next
End If

bCon = sResulta

End Function

También recibe dos parámetro, la matriz (mDat()) y, en este caso, el índice (iP) que, como corresponde, es de tipo numérico. La función, por el contrario, se define de tipo String, ya que se supone que devolverá un valor alfanumérico.

Como variables privadas tiene un contador (c) y una variable String para contener el resultado de la función (sResulta).

También su estructura es similar a la de la otra función, pero algo más compleja: un condicional de dos opciones encierra (en la segunda) un ciclo que a su vez contiene un segundo condicional.

La primera opción del condicional superior analiza el valor del índice entregado y detecta si está dentro del rango de la matriz, detectando si no lo está (If iP > UBound(mDat()) or iP < LBound(mDat())Then). En caso positivo (no lo está), devuelve un mensaje (sResulta = "No exite este índice"). En caso de no cumplirse esa condición, se desarrolla la segunda opción (Else)

En esta segunda opción, un bucle recorre la matriz-parámetro (For c = 0 To UBound(mDat())) y, mediante un segundo condicional controla cuando el valor del contador coincide con el valor del índice pasado como segundo parámetro (If c = iP Then). En eses momento asigna a sResulta el contenido de la matriz-parámetro (sResulta = mDat(c)) y sale del bucle (Exit For), a la vez que finaliza el segundo condicional y el primero.

Finalmente, el Return (bCon = sResulta) devuelve el contenido encontrado o, en su caso, el mensaje alternativo.

NOTAS

(1) Me confirma en esta sospecha que [open-office.es] tenga publicada en su web una función con ese objetivo. En este caso no parto de ella más que como referencia, ya que no veo que funciones correctamente y resulta tautológica: si ya de mano le entrego la posición que quiero encontrar, sólo si esta posición no existe tendrá sentido buscarla, puesto que ya se la he pasado yo como argumento.
(2) Las opciones de compromiso son varias, incluyendo que la función realice las dos búsquedas y devuelva un String con el resultado combinado. Otra es dejar al script que realice la doble búsqueda o desarrollar una función intermedia que devuelva una u otra búsqueda en función del criterio aplicado. En cualquier caso, estas búsquedas están justificadas por el desconocimiento del usuario respecto al contenido de la matriz, por lo que esta condición es el criterio básico que se asume aquí. No tiene sentido buscar lo que ya se sabe que existe, o que no existe.
(3) Se deja en manos del script la interpretación y uso de estos valores numéricos.

No hay comentarios:

Publicar un comentario

Comenta esta entrada