Buscador

Mostrando entradas con la etiqueta Programacin en Visual Basic. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programacin en Visual Basic. Mostrar todas las entradas

Ventana Resultados

Como acabamos de comprobar en el apartado anterior, cuando procedemos a ejecutar nuestro programa desde el IDE, se produce una carga de módulos en memoria. Esta ventana nos muestra información sobre dicho proceso de carga y su estado. Ver Figura 102.
Figura 102. Ventana Resultados del IDE. La opción de menú para esta ventana es Ver + Otras ventanas + Resultados.

Inspecciones - I

Una inspeccin consiste en un elemento de cdigo (identificador, expresin, etc.) que podemos seleccionar cuando nos encontramos en modo de depuracin, y sobre el que realizaremos una labor de supervisin durante la ejecucin del cdigo desde el depurador, para controlar los diferentes valores o estados que puede ir tomando durante el funcionamiento del programa. 
Tomemos como base para un ejemplo el Cdigo fuente 215.

Dim Valores() As Integer = {10, 20, 30, 40}
Dim Indice, Dato, Importe As Integer
Console.WriteLine("Introducir un valor")
Dato = Console.ReadLine()
For Indice = 0 To UBound(Valores)
Importe = Dato * Valores(Indice)
If Dato >= Valores(Indice) Then
Exit For
End If
Next
Cdigo fuente 215

La ventana Puntos de interrupcin

Esta ventana del IDE nos permite de un modo sencillo, la manipulacin de los puntos de interrupcin definidos en el proyecto. Ver Figura 95.
Figura 95. Ventana Puntos de interrupcin.
Como podemos observar, mediante esta ventana podemos realizar todas las operaciones posibles con los puntos de interrupcin, como definir nuevos, acceder a sus propiedades, eliminar, etc.

Eliminar

Podemos quitar un punto de interrupcin de varias formas: haciendo clic derecho sobre el punto, seleccionando la opcin Quitar punto de interrupcin del men contextual; pulsando [F9]; o haciendo clic en la marca del punto situada en el margen derecho del editor de cdigo. 
Podemos quitar todos los puntos establecidos seleccionando el men del IDE Depurar + Borrar todos los puntos de interrupcin.

Habilitar y deshabilitar

Durante el desarrollo del programa, puede que en ocasiones no estemos interesados en que un punto de interrupcin nos introduzca en el depurador, pero no queramos tampoco eliminarlo.Ante este tipo de situaciones, haremos clic derecho en el punto de interrupcin, y seleccionaremos del men contextual la opcin Deshabilitar punto de interrupcin, que lo dejar desactivado hasta que de igual modo seleccionemos la opcin de men Habilitar punto de interrupcin. La Figura 94 muestra el aspecto de un punto de interrupcin deshabilitado
Figura 94. Punto de interrupcin deshabilitado.
Para deshabilitar todos los puntos en un nico paso, emplearemos la opcin de men Depurar + Deshabilitar todos los puntos de interrupcin.

Punto de interrupcin a nivel de procedimiento - II

El punto de interrupcin en el editor de cdigo quedara en este caso como muestra la Figura 93. La entrada en el depurador por lo tanto, se producira en cuanto se comenzara a ejecutar el cdigo del procedimiento, siempre que lo permita la condicin y el recuento de visitas, en el caso de que estn establecidos.
Al definir puntos de interrupcin de esta manera hemos de ser cuidadosos, ya que si en el campo Funcin de su ventana de propiedades escribimos un valor que no corresponda a una rutina de cdigo, el IDE nos mostrar un error indicando que no puede crear el punto de interrupcin.

Punto de interrupcin a nivel de procedimiento - I

Existe otro modo de insertar un punto de interrupcin, no tan intuitivo como el que acabamos de describir, que consiste en utilizar la opcin de men Depurar + Nuevo punto de interrupcin. De esta forma, entramos directamente en la ventana de propiedades del punto de interrupcin, y en la pestaa Funcin, tenemos que escribir el nombre del procedimiento en el que estamos definiendo dicho punto. Suponiendo por ejemplo, que hemos escrito un procedimiento con el nombre VerFecha( ), y situados en cualquier lugar de su cdigo invocamos esta opcin, se mostrar la mencionada ventana de propiedades en la que escribiremos el nombre de esta rutina de cdigo. Ver Figura 92.
Figura 92. Definicin de un punto de interrupcin a nivel de procedimiento

Punto de interrupcin a nivel de procedimiento

Existe otro modo de insertar un punto de interrupcin, no tan intuitivo como el que acabamos de describir, que consiste en utilizar la opcin de men Depurar + Nuevo punto de interrupcin. De esta forma, entramos directamente en la ventana de propiedades del punto de interrupcin, y en la pestaa Funcin, tenemos que escribir el nombre del procedimiento en el que estamos definiendo dicho punto. Suponiendo por ejemplo, que hemos escrito un procedimiento con el nombre VerFecha( ), y situados en cualquier lugar de su cdigo invocamos esta opcin, se mostrar la mencionada ventana de propiedades en la que escribiremos el nombre de esta rutina de cdigo. Ver Figura 92.

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

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