Buscador

Propiedades - II

Como puede observar el lector, es posible establecer la condicin de entrada cuando la expresin sea cierta, o bien haya cambiado el contenido de una variable.Adicionalmente al establecimiento de una condicin, o bien, de forma alternativa a esta, en la ventana de propiedades del punto de interrupcin podemos pulsar el botn Recuento de visitas, mediante el que podemos establecer que dicho punto entre en funcionamiento cuando haya sido visitado en un determinado momento. Tomemos como ejemplo el cdigo de la Figura 90, en el que hemos insertado un punto de interrupcin dentro de un bucle.
Ahora procedemos a abrir la ventana de propiedades de dicho punto y en su recuento de visitas establecemos que el depurador se active cuando el punto de interrupcin haya sido visitado cinco veces. Ver Figura 91.
De este modo, cuando el bucle sea ejecutado por quinta vez, ser cuando el punto de interrupcin har que entremos en modo de depuracin.

Propiedades - I

El comportamiento por defecto de un punto de interrupcin es activar siempre el depurador cuando llegamos a dicho punto. No obstante esta caracterstica puede ser alterada para que la entrada en el modo de interrupcin slo sea realizada cuando se cumpla una condicin. Por ejemplo, supongamos que en el cdigo fuente de la figura anterior, slo queremos que se active el depurador cuando el contenido de la variable Importe sea 50. Para ello haremos clic derecho sobre el punto de interrupcin y seleccionaremos la opcin Propiedades del punto de interrupcin, del men contextual. Se abrir la ventana de propiedades de este punto, en la que pulsando su botn Condicin, podremos introducir una expresin que ser evaluada al llegar la ejecucin a este punto de interrupcin. Si la expresin devuelve verdadero, entraremos en modo de interrupcin; si devuelve falso, la ejecucin continuar normalmente. Ver la Figura 89.
Figura 89. Definicin de una condicin para un punto de interrupcin.

Insercin

El modo ms fcil de insertar un nuevo punto de interrupcin en el programa, consiste en hacer clic derecho sobre una lnea de cdigo, y seleccionar la opcin del men contextual Insertar punto de interrupcin. Tambin podemos conseguir el mismo resultado pulsando [F9], o haciendo clic en el margen del editor de cdigo. El resultado, como vemos en la Figura 88, ser la lnea resaltada con un color especial, indicativo de que tiene definido un punto de interrupcin.
Figura 88. Punto de interrupcin definido en el cdigo del programa.
Al ejecutar ahora el programa, cuando el flujo de la ejecucin pase por una lnea en la que se ha definido un punto de interrupcin, se activar el depurador, entrando en modo de interrupcin.

Puntos de interrupcin

A efectos de depuracin, un punto de interrupcin es una lnea de cdigo con una marca especial, que har que el flujo de la ejecucin al llegar a ella active el depurador, entrando en modo de interrupcin. Los puntos de interrupcin deben ser establecidos en lneas ejecutables de la aplicacin, por lo que no estn permitidos en declaraciones de variables sin asignacin, o comentarios

Formas de ejecución del código en el depurador

Una vez que hemos entrado en modo de interrupción, podemos controlar el flujo de la ejecución del código desde el depurador mediante alguna de las formas descritas a continuación: 
• Por instrucciones. Ejecuta el código del programa línea a línea, si encontramos una llamada a un procedimiento, el depurador se introduce en el código de ese procedimiento, procediendo a ejecutarlo también línea a línea. La opción de menú es Depurar + Ir a instrucciones. 
• Por procedimientos. Es similar al paso por instrucciones en cuanto a que ejecuta línea a línea el código del procedimiento en el que estamos situados. La diferencia en este caso, estriba en que si llegamos a una línea que realiza una llamada a un procedimiento, el depurador ejecutará el código del mismo sin permitirnos depurarlo, y nos situará en la siguiente línea después de la llamada al procedimiento. Esta opción resulta útil para evitar entrar con el depurador en el código de rutinas que ya están suficientemente probadas y depuradas, las cuales sabemos que funcionan correctamente. La opción de menú es Depurar + Paso a paso por procedimientos. 
• Para salir. Cuando nos encontramos depurando el código de un procedimiento, al utilizar esta opción, el depurador ejecutará todo el código restante del mismo, desde la línea en que nos encontramos hasta el final, sin permitirnos depurar. Al igual que la anterior opción, esta se utiliza en casos en los que sabemos que desde el punto en que nos encontramos, el código funciona correctamente. La opción de menú es Depurar + Paso a paso para salir. 
• Ejecutar hasta el cursor. Ejecuta todo el código hasta la línea en que hemos situado el cursor. Para usar esta opción, haremos clic con el botón derecho en la línea de código deseada y seleccionaremos del menú contextual la opción Ejecutar hasta el cursor. 
• Establecer instrucción siguiente. Permite alterar el flujo normal de la ejecución, desplazándolo al punto seleccionado por el usuario, sin ejecutar las líneas intermedias que pudiera haber entre la línea activa actual, y la seleccionada como instrucción siguiente. Se trata de una opción muy potente, ya que es posible establecer una línea anterior ya ejecutada, alterando el ritmo lógico de ejecución. Esta característica no está disponible entre procedimientos diferentes, y para usarla haremos clic con el botón derecho en la línea de código deseada y seleccionaremos del menú contextual la opción Establecer instrucción siguiente. 
• Mostrar instrucción siguiente. Sitúa el cursor en la siguiente línea a ejecutar. Esta instrucción es muy útil cuando nuestro programa tiene una considerable cantidad de código, estamos revisando un conjunto de líneas en otra ventana distinta de código en el IDE, y no recordamos en dónde se encuentra la siguiente instrucción a ejecutar. Para utilizar esta opción haremos clic con el botón derecho en la ventana del editor de código y seleccionaremos del menú contextual la opción Mostrar la instrucción siguiente. 
• Reiniciar. Tal y como indica su nombre, comienza de nuevo la ejecución del programa en modo de depuración. La opción de menú del IDE es Depurar + Reiniciar. 
• Continuar. Prosigue la ejecución del programa sin permitirnos utilizar el depurador. La opción de menú del IDE es Depurar + Continuar. 
• Detener depuración. Cancela la ejecución del programa y depurador. La opción de menú del IDE es Depurar + Detener depuración.

Modo de interrupción

Para interaccionar con el depurador durante la ejecución del programa, debemos hacer que este último entre en un estado especial de pausa denominado modo de interrupción, en el cual podemos acceder al depurador y todos sus elementos. Podemos conseguir entrar en modo de interrupción de las siguientes formas: 
• Iniciando la ejecución del programa expresamente en dicho modo. 
• Estableciendo puntos de interrupción en el código. 
• Situando la instrucción Stop en aquellos puntos de código en los que necesitemos entrar en modo de interrupción. 
El modo de interrupción pausará la ejecución del programa y nos mostrará la ventana del editor de código, remarcando aquella línea en que se haya producido la parada; recordemos que la línea resaltada por el depurador es la que está a punto de ejecutarse. Ver la Figura 87.
El medio más sencillo de entrar en modo de interrupción consiste en comenzar expresamente la ejecución del programa en dicho modo. Para ello, seleccionaremos en el IDE la opción de menú Depurar + Ir a instrucciones; que ejecutará el programa en el contexto del depurador y detendrá inmediatamente la ejecución en la primera línea de código. A partir de aquí, podemos seguir la ejecución por pasos, establecer inspecciones, y realizar diversas operaciones, de las cuales describiremos las más importantes.

Modo de depuracin

Aunque es un hecho que puede no ser percibido inicialmente, cada vez que ejecutamos la aplicacin desde el IDE de VS.NET lo hacemos a travs del depurador. 
Cuando seleccionamos la opcin de men Depurar + Iniciar, el IDE ejecuta el programa dentro del contexto del depurador. Sin embargo, si no establecemos ningn elemento de depuracin que provoque una pausa en la ejecucin, esta se producir normalmente, y no nos percataremos de que el depurador est activo. 
A este tipo de ejecucin se le denomina modo de depuracin o ejecucin virtual, ya que el ejecutable fsico no es directamente ejecutado por el programador, sino que la ejecucin se realiza a travs de un intermediario, el depurador, que es el elemento que nos permite alterar el flujo normal de la ejecucin.

El depurador

Un depurador es una herramienta que se suministra con el entorno de programacin, y que permite al programador realizar un seguimiento exhaustivo de todos los aspectos del cdigo existentes en su programa, de forma que pueda detectar y corregir los posibles errores producidos durante la fase de desarrollo de la aplicacin. 
El depurador es una pieza fundamental en el trabajo del programador, tanto como el propio compilador, y de su versatilidad a la hora de tratar el cdigo mediante puntos de interrupcin, evaluacin de expresiones, y otros aspectos propios de este tipo de elemento, depende que podamos desarrollar ms eficiente y rpidamente nuestro trabajo. Visual Studio .NET incorpora un excelente depurador, que nos permitir abordar la ejecucin del cdigo durante la fase de desarrollo de muy distintas formas, ayudndonos en la eliminacin de todos los errores de programacin existentes.

Fusin

Esta tcnica, tambin denominada intercalacin, consiste en mezclar el contenido de dos arrays ya ordenados en un tercer array, obteniendo como resultado un nico array ordenado. El Cdigo fuente 214 muestra un ejemplo del desarrollo de este algoritmo.

Public Sub Main()
' arrays ordenados
Dim ValoresA() As String = {"C", "F", "J"}
Dim ValoresB() As String = {"A", "G", "K", "M", "T"}
' array vaco en el que se fusionarn los dos arrays,
' este array ser ampliado durante la ejecucin del algoritmo
' para dar cabida a nuevos elementos
Dim ValoresNuevo() As String
Dim IndiceA As Integer
Dim IndiceB As Integer
Dim IndiceC As Integer
Dim Contador As Integer
' establecer los ndices de recorrido para cada array
IndiceA = 0
IndiceB = 0
IndiceC = 0
' recorrer los dos arrays que tienen valores hasta llegar
' al final de alguno de ellos
While (IndiceA <= UBound(ValoresA)) And (IndiceB <= UBound(ValoresB))
' aadir un nuevo elemento vaco al array de fusin
ReDim Preserve ValoresNuevo(IndiceC)
' comprobar de los dos arrays, cul tiene el valor menor,
' y aadirlo en la nueva posicin libre que acabamos de crear
' en el array de fusin
If ValoresA(IndiceA) < ValoresB(IndiceB) Then
ValoresNuevo(IndiceC) = ValoresA(IndiceA)
IndiceA = IndiceA + 1
Else
ValoresNuevo(IndiceC) = ValoresB(IndiceB)
IndiceB = IndiceB + 1
End If
' actualizar el ndice del array de fusin
IndiceC = IndiceC + 1
End While
' cuando hayamos terminado de recorrer el array ms pequeo,
' seguir recorriendo el array que tiene ms elementos hasta
' el final, y aadir los valores restantes en el array de fusin
If IndiceA <= UBound(ValoresA) Then
For Contador = IndiceA To UBound(ValoresA)
ReDim Preserve ValoresNuevo(IndiceC)
ValoresNuevo(IndiceC) = ValoresA(Contador)
IndiceC = IndiceC + 1
Next
Else
For Contador = IndiceB To UBound(ValoresB)
ReDim Preserve ValoresNuevo(IndiceC)
ValoresNuevo(IndiceC) = ValoresB(Contador)
IndiceC = IndiceC + 1
Next
End If
End Sub
Cdigo fuente 214

Ordenacin rpida con valor de referencia al comienzo

La tcnica a seguir en este caso es muy similar al anterior algoritmo, pero cambiando la posicin de la cual obtenemos el valor de referencia. El Cdigo fuente 213 muestra un ejemplo.

' algoritmo de ordenacin rpida estableciendo como valor
' de referencia el primer elemento del array
Public Sub Main()
Dim Valores() As Integer = {51, 5, 67, 44, 72, 20, 19}
Dim PosIzquierda As Integer
Dim PosDerecha As Integer
Dim ValorRef As Integer
Dim Intercambio As Integer
' establecer ndices para los recorridos del array
' desde los elementos segundo y final respectivamente
PosIzquierda = 1 ' el segundo elemento est en la posicin 1 del array
PosDerecha = UBound(Valores)
' establecer el primer elemento como valor de referencia a comparar
ValorRef = Valores(0) ' el primer elemento est en la posicin 0 del array
While PosIzquierda <= PosDerecha
' recorrer hasta encontrar un valor mayor que el de referencia
While (Valores(PosIzquierda) < ValorRef) And _
(PosIzquierda < UBound(Valores))
PosIzquierda = PosIzquierda + 1
End While
' recorrer hasta encontrar un valor menor que el de referencia
While Valores(PosDerecha) > ValorRef
PosDerecha = PosDerecha - 1
End While
' intercambiar valores:
' el menor pasa a la izquierda --> zona de valores menores
' el mayor pasa a la derecha --> zona de valores mayores
If PosIzquierda <= PosDerecha Then
Intercambio = Valores(PosIzquierda)
Valores(PosIzquierda) = Valores(PosDerecha)
Valores(PosDerecha) = Intercambio
' actualizar ndices
PosIzquierda = PosIzquierda + 1
PosDerecha = PosDerecha - 1
End If
End While
' una vez situados todos los valores menores y mayores
' en su lado correspondiente, tomar el valor de referencia
' y mediante un intercambio, situarlo en su posicin correcta
If PosIzquierda < UBound(Valores) + 1 Then
Intercambio = Valores(PosDerecha)
Valores(PosDerecha) = Valores(0)
Valores(0) = Intercambio
Else
Intercambio = Valores(UBound(Valores))
Valores(UBound(Valores)) = Valores(0)
Valores(0) = Intercambio
End If
End Sub
Cdigo fuente 213

Ordenacin rpida con valor de referencia central

Como se indica, en primer lugar calculamos cul es la posicin central del array, y a partir de ah realizamos el proceso de ordenacin. Recordemos que este algoritmo realiza una reubicacin de valores, pero estos no tienen la obligacin de quedar ordenados, como se muestra en el ejemplo del Cdigo fuente 212.
' algoritmo de ordenacin rpida estableciendo como valor
' de referencia un elemento que se encuentre en la mitad del array
Public Sub Main()
Dim Valores() As Integer = {51, 5, 72, 44, 67, 20, 19}
Dim PosIzquierda As Integer
Dim PosDerecha As Integer
Dim ValorRef As Integer
Dim Intercambio As Integer
' establecer ndices para los recorridos del array
' desde el principio y final
PosIzquierda = 0
PosDerecha = UBound(Valores)
' calcular el valor de referencia a comparar
ValorRef = Valores(PosDerecha / 2)
While PosIzquierda <= PosDerecha
' recorrer hasta encontrar un valor mayor que el de referencia
While Valores(PosIzquierda) < ValorRef
PosIzquierda = PosIzquierda + 1
End While
' recorrer hasta encontrar un valor menor que el de referencia
While Valores(PosDerecha) > ValorRef
PosDerecha = PosDerecha - 1
End While
' intercambiar valores: el menor pasa a la izquierda del valor
' de referencia, y el mayor pasa a la derecha
If PosIzquierda <= PosDerecha Then
Intercambio = Valores(PosIzquierda)
Valores(PosIzquierda) = Valores(PosDerecha)
Valores(PosDerecha) = Intercambio
' actualizar ndices
PosIzquierda = PosIzquierda + 1
PosDerecha = PosDerecha - 1
End If
End While
End Sub
Cdigo fuente 212

Ordenacin rpida

Esta tcnica de ordenacin consiste en tomar como referencia el valor de una posicin del array, y situar en las posiciones de su izquierda todos los valores inferiores a dicho valor de referencia, y en las posiciones de su derecha los valores mayores. 
Se debe tener en cuenta que este algoritmo slo se encarga de situar a los lados del valor de referencia los valores adecuados, sin preocuparse de si quedan o no ordenados; para ello deberemos aplicar un algoritmo de ordenacin especfico sobre cada parte del array. 
Dependiendo de dnde situemos el valor de referencia, podemos desarrollar el algoritmo de las dos maneras descritas a continuacin.

Ordenacin por seleccin

Consiste en recorrer un array buscando el valor menor; cada vez que se encuentre dicho valor, intercambiarlo con la posicin actual de recorrido del array, de forma que los valores menores van quedando ordenados, mientras que los mayores se van desplazando hacia las posiciones superiores, siendo progresivamente ordenados. Veamos un ejemplo de esta tcnica en el Cdigo fuente 211.

Public Sub Main()
Dim Valores() As Integer = {85, 475, 100, 7, 98, 250}
Dim ContadorA As Integer
Dim ContadorB As Integer
Dim ValorActual As Integer
Dim Posicion As Integer
' recorrer el array
For ContadorA = 0 To UBound(Valores) - 1
' obtener valor de la posicin en curso y nmero de posicin
ValorActual = Valores(ContadorA)
Posicion = ContadorA
' recorrer el array desde la posicin actual ms uno
For ContadorB = ContadorA + 1 To UBound(Valores)
' si el valor del elemento del recorrido interior es
' menor que el valor actual obtenido del recorrido
' externo o principal
If Valores(ContadorB) < ValorActual Then
' tomar el valor hallado como menor
ValorActual = Valores(ContadorB)
Posicion = ContadorB
End If
Next
' intercambiar valores, situando el valor menor en la
' posicin inferior y el mayor en la posicin superior
Valores(Posicion) = Valores(ContadorA)
Valores(ContadorA) = ValorActual
Next
End Sub
Cdigo fuente 211

Ordenacin por insercin

Si partimos de la idea de que un array es una lista de valores situados de izquierda a derecha, mediante este algoritmo de ordenacin tomamos cada elemento de un array comenzando por la izquierda, y cuando encontremos un valor que no est en el orden correcto, lo situamos en su posicin adecuada, desplazando a todos los valores superiores a las posiciones situadas a su derecha. En el Cdigo fuente 210 se muestra un ejemplo de este tipo de ordenacin.

Public Sub Main()
Dim Valores() As Integer = {10, 20, 30, 50, 60, 40, 70}
Dim Contador As Integer
Dim ValorActual As Integer
Dim Posicion As Integer
' recorrer el array comenzando por la segunda posicin
For Contador = 1 To UBound(Valores)
' obtener el valor correspondiente para comprobar si est en orden
ValorActual = Valores(Contador)
' calcular la posicin con la que vamos a trabajar
Posicion = Contador - 1
While (Posicion >= 1)
' si el valor obtenido no est en el orden correcto,
' dentro de este bucle ir desplazando a las posiciones
' superiores del array los elementos de mayor valor
If ValorActual < Valores(Posicion) Then
Valores(Posicion + 1) = Valores(Posicion)
Posicion = Posicion - 1
Else
Exit While
End If
End While
' situar el valor obtenido en su posicin ordenada
Valores(Posicion + 1) = ValorActual
Next
End Sub
Cdigo fuente 210

Ordenacin por intercambio

Este mtodo de ordenacin, tambin denominado de burbuja, consiste en comparar los elementos contiguos en el array, y si no estn en orden, intercambiar sus valores. El Cdigo fuente 209 muestra un ejemplo.

Public Sub Main()
Dim Numeros() As Integer = {20, 4, 12, 25, 6}
Dim Indice As Integer
Dim IndiceBis As Integer
Dim Intercambio As Integer
For Indice = 0 To UBound(Numeros) - 1
For IndiceBis = 0 To UBound(Numeros) - 1
' si valor del elemento inferior es mayor que
' el elemento superior, intercambiar utilizando
' una variable puente
If Numeros(IndiceBis) > Numeros(IndiceBis + 1) Then
Intercambio = Numeros(IndiceBis)
Numeros(IndiceBis) = Numeros(IndiceBis + 1)
Numeros(IndiceBis + 1) = Intercambio
End If
Next
Next
End Sub
Cdigo fuente 209

Ordenacin

Al desarrollar una aplicacin existen determinados procesos que requieren que los datos a manipular se encuentren ordenados; para ello recurriremos a la ordenacin, que es la tcnica que nos permite clasificar un conjunto de datos mediante un algoritmo basado en una condicin o valor. 
Existen diversos algoritmos de ordenacin, dependiendo de la cantidad de datos a ordenar y de la rapidez en realizar la ordenacin. Cuanto mayor nmero de datos debamos ordenar, mejor tendr que ser el algoritmo para que emplee el menor tiempo posible.

Bsqueda binaria

En el caso de que el array est ordenado, la bsqueda binaria proporciona un algoritmo ms veloz para la localizacin de datos. Esta tcnica consiste en proporcionar el array ordenado y obtener el valor a buscar. A continuacin se comprueba si el valor se encuentra en el intervalo de valores del array, abandonando el proceso si no lo est. 
En el caso de que el valor se encuentre entre los valores del array, se calcula la posicin central del array y se comprueba si en dicho elemento est el valor. Si no es as, se comprueba, partiendo del elemento central, si el valor est en la primera o segunda mitad del array, haciendo sucesivas divisiones a su vez dentro de estas dos partes, y comprobando el valor de su elemento central. El Cdigo fuente 208 muestra un ejemplo del caso.

' algoritmo de bsqueda binaria de una letra en un array
Public Sub Main()
' en los elementos del array no debe faltar ninguna letra,
' las letras deben estar todas consecutivas o se puede
' entrar en un bucle infinito
Dim Letras() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I"}
Dim LetraBuscada As String
Dim PosicCentral As Integer
Dim PosicPrimera As Integer
Dim PosicUltima As Integer
Console.WriteLine("Introducir letra a buscar")
' obtener valor a buscar
LetraBuscada = Console.ReadLine()
' inicializar valores
PosicPrimera = 0
PosicUltima = UBound(Letras)
' si la letra no est en el array, finalizar
If LetraBuscada < Letras(PosicPrimera) Or _
LetraBuscada > Letras(PosicUltima) Then
Console.WriteLine("Letra fuera de intervalo")
Exit Sub
End If
' si la letra est en el intervalo comenzar a buscar
Do
' calcular la posicin central del array
PosicCentral = (PosicPrimera + PosicUltima) / 2
' si se encuentra la letra, finalizar
If Letras(PosicCentral) = LetraBuscada Then
Console.WriteLine("Letra encontrada la posicin {0}", PosicCentral + 1)
Exit Do
End If
' si no se ha encontrado la letra:
' si la letra es menor que la que est
' en la posicin central del array, asignar
' como ltima posicin la que hasta ahora
' era la central
If LetraBuscada < Letras(PosicCentral) Then
PosicUltima = PosicCentral
Else
' si la letra es mayor que la que est
' en la posicin central del array, asignar
' como primera posicin la que hasta ahora
' era la central
PosicPrimera = PosicCentral
End If
Loop
Console.ReadLine()
End Sub
Cdigo fuente 208

Bsqueda lineal

Este algoritmo de bsqueda consiste en posicionarse en el primer elemento del array, e ir recorrindolos todos hasta encontrar el dato que queremos, o bien llegar al final si la bsqueda no tiene xito. Recuerde el lector que los arrays en VB.NET comienzan por la posicin cero, por dicho motivo, cuando vamos a visualizar la posicin en la que se encuentra el valor localizado, le sumamos uno. Esta particularidad de los arrays en el lenguaje debe ser tenida en cuenta para todos los ejemplos. En el Cdigo fuente 207 se muestra el algoritmo empleado para esta tcnica.

' algoritmo de bsqueda lineal
Public Sub Main()
' array con valores a buscar
Dim Ciudades() As String = {"Londres", "Pars", "Roma", "Venecia", _
"Tokio", "Madrid", "Sevilla", "Barcelona"}
' guarda valor a buscar
Dim Buscar As String
' indicador que informa si se ha encontrado el valor
Dim Encontrado As Boolean
' contador de iteraciones en el array
Dim Contador As Integer
Console.WriteLine("Que ciudad buscamos?")
' introducir el valor a buscar
Buscar = Console.ReadLine()
' establecer el indicador de localizacin a no encontrado
Encontrado = False
buscar desde principio a fin del array
For Contador = 0 To UBound(Ciudades)
' si encontramos el valor introducido...
If Ciudades(Contador) = Buscar Then
' ... establecer el indicador encontrado a cierto
Encontrado = True
Console.WriteLine("Ciudad encontrada en la posicin {0}", Contador + 1)
' salir del bucle porque ya no hace falta seguir buscando
Exit For
End If
Next
' si el indicador de localizacin es False, es que hemos recorrido
' todo el array sin encontrar el valor
If Not Encontrado Then
Console.WriteLine("No se ha encontrado")
End If
Console.ReadLine()
End Sub
Cdigo fuente 207

El presente algoritmo slo es recomendable aplicarlo cuando trabajamos con pequeas cantidades de datos, ya que de lo contrario, la bsqueda tomara un excesivo tiempo para completarse.

Bsqueda

Cuando en un programa se manipula una mediana o elevada cantidad de datos, se hace preciso el uso de un algoritmo que nos ayude a localizar uno de esos datos dentro del conjunto disponible. 
Las bsquedas toman sentido al utilizar en el programa arrays o archivos, los cuales, al poder disponer de un elevado nmero de informacin, nos permiten localizar rpidamente el dato deseado. 
Existen dos algoritmos bsicos de bsqueda de datos: lineal y binaria, que describiremos en los siguientes apartados. Para simplificar los ejemplos ilustrativos utilizaremos arrays en los mismos.

Recursividad

Denominamos recursividad a la capacidad que tiene un procedimiento en un determinado lenguaje para llamarse a s mismo. En esta situacin se dice que el procedimiento es recursivo. Uno de los ejemplos ms habituales de tcnica recursiva consiste en el clculo del factorial de un nmero. Para resolver este problema, debemos efectuar el producto de dicho nmero por todos los nmeros comprendidos entre 1 hasta el nmero a calcular. Debido a que este tipo de rutinas devuelven un valor, se codificar como una funcin. Veamos un ejemplo en el Cdigo fuente 206.

Public Function Factorial(ByVal Numero As Integer) As Double
If Numero = 0 Then
Return 1
Else
Return (Numero * Factorial(Numero - 1))
End If
End Function
Public Sub Main()
Dim Resultado As Double
Resultado = Factorial(5)
Console.WriteLine("Factorial de 5 -->: {0}", Resultado)
End Sub
Cdigo fuente 206

Tcnicas y depuracin

Tcnicas de programacin 
Las tcnicas de programacin consisten en un conjunto de guas o patrones para la escritura de algoritmos, que ayudan al programador a resolver operaciones de clculo, manipulacin de valores en procesos, bsqueda, ordenacin, etc. Existe un gran nmero de tcnicas para aplicar a los ms diversos problemas; en los prximos apartados se describirn algunas de las ms importantes.

Mltiples entradas al programa mediante distintos Main( ) - II

Por defecto, y ya que as se establece al crear el proyecto, la ejecucin comenzar por el Main( ) del mdulo Module1. Pero podemos hacer que el procedimiento de inicio sea el Main( ) que est en el mdulo Calculos, abriendo la ventana de propiedades del proyecto y seleccionando como objeto inicial dicho mdulo. Ver Figura 86.
Figura 86. Establecer un mdulo como objeto inicial del proyecto.
Con esta tcnica, podremos disponer de tantos procedimientos de inicio como mdulos contenga nuestro proyecto. No obstante, si slo deseamos que exista un nico procedimiento Main( ) a lo largo de todo el cdigo de nuestra aplicacin, en la lista desplegable Objeto inicial, de la ventana de propiedades del proyecto, tendremos que seleccionar la opcin Sub Main; esto nos obligar a tener slo un procedimiento Main() dentro de cualquiera de los mdulos, producindose un error si al comienzo de la ejecucin se detecta ms de un Main( ) en el cdigo del proyecto.

Mltiples entradas al programa mediante distintos Main( ) - I

Otro aspecto de los procedimientos Main( ) en VB.NET consiste en que podemos tener varios dentro de un mismo proyecto. 
Una vez creado un proyecto de tipo consola, si le aadimos nuevos mdulos, bien en archivos separados, o agrupando varios mdulos en un mismo archivo, podemos escribir un procedimiento Main( ) para cada uno de los mdulos de nuestro proyecto. El Cdigo fuente 205 muestra un ejemplo en el que tenemos dos mdulos en un proyecto, con un procedimiento Main( ) dentro de cada uno.

Module Module1
Public Sub Main()
Console.WriteLine("Iniciamos el programa en el modulo Module1")
Console.ReadLine()
End Sub
End Module
Module Calculos
Public Sub Main()
Console.WriteLine("Iniciamos el programa en el modulo Calculos")
Console.ReadLine()
End Sub
End Module
Cdigo fuente 205

Configurar el punto de entrada al programa - V

Si slo tenemos un nico procedimiento Main( ) en el proyecto, tambin podemos optar por seleccionar el valor Sub Main de esta lista desplegable. El resultado de dicha accin ser que al ejecutar el programa se buscar entre todos los mdulos de cdigo aquel que contenga Main( ), y se ejecutar. Esta es la opcin ms recomendable en este tipo de situaciones. La otra va, ms rpida en este caso, consiste en abrir la ventana Lista de tareas, que ya hemos visto antes, y hacer doble clic sobre la lnea correspondiente al error. Ello nos mostrar una ventana para cambiar el nombre del mdulo de inicio del programa. Debemos hacer clic sobre el mdulo que contiene Main( ) y aceptar esta ventana. Ver Figura 85.

Figura 85. Cambio de objeto inicial del proyecto desde Lista de tareas.

Cualquiera de estas acciones modificar las propiedades del proyecto, de modo que ahora ya sabr que Main( ) est en otro mdulo de cdigo, no producindose error al ejecutar.

Configurar el punto de entrada al programa - IV

El motivo del error radica en que todo proyecto debe tener un objeto inicial, que en este caso es Module1, si dentro del módulo hay un procedimiento Main( ) todo funcionará correctamente, pero si lo quitamos o cambiamos de nombre, el IDE al ejecutar el programa buscará Main( ) dentro de Module1, y al no encontrarlo se producirá el error. 
Tenemos dos formas de solucionar el problema: Una vía consiste en hacer clic sobre el nombre del proyecto dentro de la ventana del Explorador de soluciones, y a continuación seleccionar la opción de menú del IDE Proyecto + Propiedades. Esto abrirá la ventana de propiedades del proyecto, y en la lista desplegable Objeto inicial, seleccionaremos Pruebas, como nombre del módulo en el que ahora está contenido Main( ). Ver Figura 84.

Figura 84. Ventana de propiedades del proyecto.

Configurar el punto de entrada al programa - III

Al ejecutar de nuevo el programa se producirá un error en esta ocasión. Una vez que aceptemos el cuadro de mensaje del error, se debería de mostrar en el IDE la ventana Lista de tareas con la información sobre el error producido, en caso de que no aparezca esta ventana automáticamente, podemos abrirla con la opción de menú Ver + Otras ventanas + Lista de tareas. Ver Figura 83.

Figura 83. Ventana Lista de tareas con la descripción de un error.

Configurar el punto de entrada al programa - II

Ya que todo funciona bien, vamos a hacer ahora una pequeña travesura, escribiremos en el archivo de código en el que estamos situados un nuevo módulo con el nombre Pruebas, y dentro de él un nuevo procedimiento Main( ). Además cambiaremos el nombre del procedimiento Main( ) de Module1 a Entrada( ). Veamos todo ello en el Código fuente 204.

Module Module1
Sub Entrada()
Console.WriteLine("Comienza el programa")
Console.ReadLine()
End Sub
End Module
Module Pruebas
Sub Main()
Console.WriteLine("Comienza el programa")
Console.ReadLine()
End Sub
End Module
Código fuente 204

Configurar el punto de entrada al programa - I

Cuando creamos proyectos de consola desde VS.NET hemos visto que el propio IDE genera el código básico para el programa, añadiendo un archivo de código con un módulo, y el procedimiento Main( ) de entrada a la aplicación. También hemos visto que es posible añadir nuevos módulos de código al proyecto, bien en un mismo archivo de código o en archivos separados. 
Es importante destacar que no es obligatorio tener el procedimiento Main( ) en el módulo creado por el IDE, por lo que podemos escribir este procedimiento en cualquier otro módulo del proyecto. Sin embargo, cuando esto sucede, debemos tener en cuenta ciertas consideraciones. 
En primer lugar vamos a crear un nuevo proyecto de tipo consola como hemos hecho en otras ocasiones, de forma que se añadirá un archivo de código con el módulo Module1 que contendrá el procedimiento Main( ). Si dentro de este procedimiento mostramos un mensaje, la ejecución del programa transcurrirá sin más problemas. Ver el Código fuente 203.

Module Module1
Sub Main()
Console.WriteLine("Comienza el programa")
Console.ReadLine()
End Sub
End Module
Código fuente 203

Funciones de fecha y hora - III

DatePart( )

' Sintaxis
DatePart(TipoIntervalo, Fecha)

Extrae la parte de una fecha indicada en TipoIntervalo. Podemos obtener, el día, mes, año, día de la semana, etc.
El Código fuente 202 muestra un conjunto de ejemplos que utilizan las funciones para manipular fechas que hemos descrito anteriormente.

Dim MiFecha As Date
Dim FechaPosterior As Date
Dim DiasDiferencia As Long
Dim ParteFecha As Integer
MiFecha = Now() ' #1/19/2002 12:27:08 PM#
FechaPosterior = DateAdd(DateInterval.Month, 2, MiFecha) ' #3/19/2002 12:27:08 PM#
DiasDiferencia = DateDiff(DateInterval.Day, MiFecha, FechaPosterior) ' 59
ParteFecha = DatePart(DateInterval.Year, MiFecha) ' 2002

Código fuente 202

Funciones de fecha y hora - II

DateDiff( )

' Sintaxis
DateDiff(TipoIntervalo, FechaPrimera, FechaSegunda)

Calcula la diferencia existente entre dos fechas. En función de TipoIntervalo, la diferencia calculada serán días, horas, meses, años, etc.

Funciones de fecha y hora - I

Now( )

' Sintaxis
Now()

Devuelve un valor de tipo Date con la fecha y hora del sistema.

DateAdd( )

' Sintaxis
DateAdd(TipoIntervalo, ValorIntervalo, Fecha)

Suma o resta a una fecha, un intervalo determinado por el parámetro TipoIntervalo. El intervalo a utilizar pueden ser días, semanas, meses, etc. Para determinar si se realiza una suma o resta, ValorIntervalo deberá ser positivo o negativo respectivamente.