Resumen: Entrega nº49 del curso Aprender a programar en Visual Basic desde cero.
Codificación aprenderaprogramar.com: CU00350A
DEPURAR ALGORITMOS
Vamos a reflejar en forma de código enfoques para la verificación de algoritmos. Partimos del siguiente bucle ejemplo:
For i = a To b For j = m To n R = i * j Next j Next i |
Los enfoques para depurar el algoritmo los podemos establecer a partir de puntos de interrupción. Sin embargo, en general es más rápido hacer una simple constatación del valor de variables que establecer una interrupción del programa, ya que por cada parada estaremos perdiendo un tiempo. Con este razonamiento, usaremos un Labelpara dejar constancia del valor de una variable en un punto dado del programa. Sólo cuando no seamos capaces de llegar a conclusiones sin tener que detener el programa, estableceremos puntos de interrupción.
Enfoque al resultado
Nos centramos en comprobar un valor final, en este caso R, suponiendo que si este valor es correcto el resto de procesos también lo son. Por ejemplo:
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'Curso VB aprenderaprogramar.com Option Explicit Dim i%, j% Dim a%, b% Dim m%, n% Dim R% Private Sub Form_Load() Label1 = "" a = 1: b = 3: m = 1: n = 3 For i = a To b For j = m To n R = i * j Label1 = Label1 & R & vbCrLf Next j Next i End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i%, j% Dim a%, b% Dim m%, n% Dim R% Label1.Text = "" a = 1 : b = 3 : m = 1 : n = 3 For i = a To b For j = m To n R = i * j Label1.Text = Label1.Text & R & vbCrLf Next j Next i End Sub End Class |
En el programa anterior hemos verificado qué valor toma R en cada pasada del bucle. El objetivo del bucle va a ser transferir el valor de R a otros procesos, pero antes de hacer eso hemos querido comprobar qué resultado era el que obteníamos con este diseño de bucle.
Enfoque al proceso
Analizamos qué ocurre en uno o varios pasos del programa que resultan de nuestro interés, estudiando los valores que van tomando las variables. Por ejemplo:
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'Curso VB aprenderaprogramar.com Option Explicit Dim i%, j% Dim a%, b% Dim m%, n% Private Sub Form_Load() Label1 = "" a = 1: b = 3: m = 1: n = 3 Label1 = Label1 & "a =" & a & " b =" & b & vbCrLf For i = a To b Label1 = Label1 & "m =" & m & " n =" & n & " i =" & i & vbCrLf For j = m To n Label1 = Label1 & "j =" & j & vbCrLf Next j Next i End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i%, j% Dim a%, b% Dim m%, n% Label1.Text = "" a = 1 : b = 3 : m = 1 : n = 3 Label1.Text = Label1.Text & "a =" & a & " b =" & b & vbCrLf For i = a To b Label1.Text = Label1.Text & "m =" & m & " n =" & n & " i =" & i & vbCrLf For j = m To n Label1.Text = Label1.Text & "j =" & j & vbCrLf Next j Next i End Sub End Class |
Este programa da lugar a que se nos muestre lo siguiente:
a = 1 b = 3 m = 1 n = 3 i = 1 j = 1 j = 2 j = 3 m = 1 n = 3 i = 2 j = 1 j = 2 j = 3 m = 1 n = 3 i = 3 j = 1 j = 2 j = 3 |
A partir de estos valores de variables el programador analiza si el programa está respondiendo a lo que él tenía previsto o si se está produciendo un resultado indeseado. En caso de detectar algún error, procede a la corrección y a una nueva prueba.
Enfoques zonales
Analizamos qué ocurre en una zona de código donde estimamos ocurren procesos de interés o donde pensamos que puede existir un problema. Siguiendo con nuestro ejemplo, un enfoque zonal a la entrada del bucle sería:
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'Curso VB aprenderaprogramar.com Option Explicit Dim i%, j% Dim a%, b%, m%, n%, R% Private Sub Form_Load() Label1 = "" a = 1: b = 3: m = 1: n = 3 Label1 = Label1 & "a = " & a & " b = " & b & vbCrLf Label1 = Label1 & "m = " & m & " n = " & n & vbCrLf Label1 = Label1 & "i = " & i & " j = " & j & vbCrLf Label1 = Label1 & "R = " & R & vbCrLf For i = a To b For j = m To n R = i * j Label1 = Label1 & R & " ," Next j Next i End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i%, j% Dim a%, b%, m%, n%, R% Label1.Text = "" a = 1 : b = 3 : m = 1 : n = 3 Label1.Text = Label1.Text & "a = " & a & " b = " & b & vbCrLf Label1.Text = Label1.Text & "m = " & m & " n = " & n & vbCrLf Label1.Text = Label1.Text & "i = " & i & " j = " & j & vbCrLf Label1.Text = Label1.Text & "R = " & R & vbCrLf For i = a To b For j = m To n R = i * j Label1.Text = Label1.Text & R & " ," Next j Next i End Sub End Class |
El resultado obtenido es:
a = 1 b = 3 m = 1 n = 3 i = 0 j = 0 R = 0 1, 2, 3, 2, 4, 6, 3, 6, 9 |
Se han verificado todas las variables a la entrada del bucle. Algunas no tiene demasiada lógica que se verifiquen, pero a veces los errores saltan donde menos son de esperar, y toda información es valiosa.