Curso B�sico de Programaci�n
en Visual Basic
Soluciones
de la entrega Diecisiete.
Fecha: 16/Abr/98
Empezaremos viendo la parte f�cil del ejercicio, es decir la que nos muestra la posici�n cuando la funci�n espera s�lo dos par�metros, el primero ser� la cadena en la que hay que encontrar lo que haya en la segunda cadena.
Private Function RInstr1(ByVal s1 As String, ByVal s2 As String) As Long Dim i As Long Dim sTmp As String RInstr1 = 0 For i = Len(s1) To 1 Step -1 sTmp = Mid$(s1, i, Len(s2)) If sTmp = s2 Then RInstr1 = i Exit For End If Next End Function
Este tiene poco que explicar.
Se hace un bucle desde la �ltima posici�n de la primera cadena Len(s1) hasta el principio, ya que lo que necesitamos es encontrar la posici�n de s2 empezando a "mirar" desde el final.
A continuaci�n guardamos en sTmp un trozo de cadena que va desde la posici�n actual y que contiene tantos caracteres como tenga la segunda cadena, si te fijas, el bucle se podr�a hacer tambi�n de esta forma:
For i = Len(s1) - Len(s2) + 1 To 1 Step -1
Ya que no nos sirve comparar el �ltimo caracter con la cadena s2 cuando esta �ltima tiene m�s de un caracter, por ejemplo.
Esto es inapreciable en cadenas cortas, pero en otras m�s largas, acortar� el tiempo del bucle.Para el segundo caso, hay que saber que los procedimientos (sub y function) permiten par�metros opcionales, estos se indican con la palabra Optional delante de los par�metros que vayan a ser opcionales.
La �nica pega es que cuando un par�metro es opcional los que le siguen tambi�n tienen que ser opcionales.
Entonces �c�mo indicar que el par�metro opcional sea el primero?
Pues... m�s o menos f�cil... aunque con truco.
Cuando un par�metro es opcional, se puede usar la funci�n IsMissing para comprobar si se ha especificado o no ese par�metro.
Esto es cierto siempre que el par�metro opcional sea de tipo Variant sin un valor por defecto. En el VB4 todos los par�metros opcinales deben ser Variant y sin valores por defecto, pero en VB5 (y posteriores) los par�metros opcionales pueden ser del tipo que queramos, adem�s de poder tener un valor por defecto, es decir, si no se especifica, se le da un valor "predeterminado".
Ahora vamos a usar s�lo los par�metros sin valores predeterminados, pero m�s adelante seguramente lo usaremos.Sabiendo que con IsMissing podemos averiguar si se ha especificado o no el par�metro en opcional, haremos lo siguiente:
Si se especifican los tres par�metros, el primero ser� la posici�n por la que se empezar� a comprobar.
Si no se especifica el �ltimo par�metro, enga�aremos al Visual Basic, dici�ndole que los dos par�metros introducidos son la primera y la segunda cadena...
Ya ves que s�lo es echarle un poco de "cabeza" al asunto...Vamos a ver la declaraci�n de esta funci�n:
Private Function RInstr(ByVal v1 As Variant, ByVal v2 As Variant, Optional ByVal v3 As Variant) As Long Dim i As Long Dim sTmp As String Dim s1 As String Dim s2 As String Dim posIni As Long If IsMissing(v3) Then 'Si no se especifican los tres par�metros s1 = CStr(v1) 'La primera cadena s2 = CStr(v2) 'la segunda cadena posIni = Len(s1) 'el �ltimo caracter de la cadena Else posIni = CLng(v1) 'la posici�n por la que empezar s1 = CStr(v2) 'la primera cadena (segundo par�metro) s2 = CStr(v3) 'la segunda cadena (tercer par�metro) End If 'Valor inicial de la b�squeda, si no se encuentra, es cero RInstr = 0 'Siempre se empieza a buscar por el final For i = posIni - Len(s2) + 1 To 1 Step -1 'Tomar el n�mero de caracteres que tenga la segunda cadena sTmp = Mid$(s1, i, Len(s2)) 'Si son iguales... If sTmp = s2 Then 'esa es la posici�n RInstr = i Exit For End If Next End FunctionAhora quedar�a hacer una funci�n que comtemple las mismas opciones que tiene el InStr normal, es decir que se pueda especificar un cuarto par�metro que nos indique si la comparaci�n se hace de una forma u otra.
�Que te parece esto como un ejercicio nuevo?
Sab�a que contestar�a de forma afirmativa... je, je...Pues int�ntalo... y si quieres ver la soluci�n, selecciona el contenido de la caja negra esa que hay al final y ver�s...
A ver si ya terminamos en la pr�xima entrega el acceso aleatorio a los ficheros.
Nos vemos.
Guillermo
Para ver la soluci�n, selecciona todo el contenido del siguiente cuadro y ver�s...
Nota:
He quitado lo de la selecci�n porque no siempre funciona... al menos ahora no se ve el texto al seleccionarlo...
' Private Function RInstr(ByVal v1 As Variant, ByVal v2 As Variant, _ Optional ByVal v3 As Variant, _ Optional ByVal v4 As Variant) As Long Dim i As Long Dim sTmp As String Dim s1 As String Dim s2 As String Dim posIni As Long If IsMissing(v3) Then 'Si no se especifican los tres par�metros s1 = CStr(v1) 'La primera cadena s2 = CStr(v2) 'la segunda cadena posIni = Len(s1) 'el �ltimo caracter de la cadena Else posIni = CLng(v1) 'la posici�n por la que empezar s1 = CStr(v2) 'la primera cadena (segundo par�metro) s2 = CStr(v3) 'la segunda cadena (tercer par�metro) End If 'Valor inicial de la b�squeda, si no se encuentra, es cero RInstr = 0 'Siempre se empieza a buscar por el final For i = posIni - Len(s2) + 1 To 1 Step -1 'Tomar el n�mero de caracteres que tenga la segunda cadena sTmp = Mid$(s1, i, Len(s2)) 'Si se especifica el tipo de comparaci�n If Not IsMissing(v4) Then 'Se usa StrComp con ese par�metro If StrComp(sTmp, s2, v4) = 0 Then 'esa es la posici�n RInstr = i Exit For End If Else 'Aqu� tambi�n se podr�a usar 'If StrComp(sTmp, s2) = 0 Then 'Si son iguales... If sTmp = s2 Then 'esa es la posici�n RInstr = i Exit For End If End If Next End FunctionA diferencia del Visual Basic, no dar� error si se especifica el cuarto par�metro y no se especifican los dem�s, por la sencilla raz�n de que si s�lo se especifican 3, el cuarto nunca llega a tener un valor... (elemental mi querido Guille).
De lo que tendr�s que tener "precauci�n", al menos si quieres que funcione todo bien, es de indicar los valores que se esperan... ya que sino es as�, no conseguir�s tu prop�sito... o al menos no el deseado.