Codificación aprenderaprogramar.com: CU00337A
SALIR DE UN BUCLE FOR CON EXIT FOR EN VISUAL BASIC
Cuando realizamos un esquema de programa usando pseudocódigo podemos reflejar la salida de un bucle For (Desde … Siguiente) con la instrucción SalirDesde. La sintaxis a emplear en Visual Basic es Exit For dentro de cualquier bucle For ... Next. Cuando existe anidamiento de bucles, se produce la salida del bucle más interno al inmediato superior
Si se escribe un Exit For fuera de un bucle aparece el mensaje: "Error de compilación. Exit For no está dentro de For ... Next".
EJERCICIO RESUELTO CON EXIT FOR
Transformar en código el ejemplo de aplicación de la Instrucción SalirDesde que se muestra a continuación en forma de pseudocódigo, considerando que Numerodatos tiene un valor fijo de 35, y que los datos están el archivo notas.dat, que habrá sido creado previamente.
Pseudocódigo ejemplo de uso de SalirDesde (Exit For):
1. Inicio [Algoritmo Media curso VB aprenderaprogramar.com] 2. Leer Numerodatos [Establece el nº de datos a extraer] 3. [El dato esperado en fichero debe valer entre 0 y10] 4. Desde i = 1 hasta Numerodatos Hacer Leer Dato(i) Si Dato(i) < 0 ó Dato(i) >10 Entonces [Dato no válido] Mostrar “No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo” Fallolectura = Verdadero [Interruptor] SalirDesde FinSi Suma = Suma + Dato(i) Siguiente 5. Si Fallolectura = Falso Entonces Media = Suma / Numerodatos Mostrar “La media es”, Media Sino Mostrar “Gracias por utilizar este programa” FinSi 6. Fin |
SOLUCIÓN AL EJERCICIO CON EXIT FOR
Como paso previo en tiempo de diseño crearemos un label para mostrar los resultados al que denominaremos LabelResultado así como un botón que el usuario debe pulsar para leer los datos desde el archivo.
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'Curso VB aprenderaprogramar.com Option Explicit Dim Canal%, i As Integer Dim Dato(35) As Single Dim Fallolectura As Boolean Dim Suma!, Media As Single Private Sub Form_Load() Show Form1.Caption = "Notas" CommandCalcular.Caption = "Leer archivo" End Sub Private Sub CommandCalcular_Click() LabelResultado.Alignment = 2 LabelResultado.FontBold = True '[Apertura del archivo] Canal = FreeFile Open "C:\notas.dat" For Input As Canal For i = 1 To 35 '[Lectura de datos desde archivo] Input #Canal, Dato(i) If Dato(i) < 0 Or Dato(i) > 10 Then '[Dato no válido] LabelResultado = "No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo" Fallolectura = True '[Interruptor] Exit For End If Suma = Suma + Dato(i) Next i Close Canal '[Cerramos el archivo] If Fallolectura = False Then Media = Suma / 35 LabelResultado = "La media es " & Media Else LabelResultado = LabelResultado & vbCrLf & "Gracias por utilizar este programa" End If End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Dim Dato(35) As Single Dim Fallolectura As Boolean Dim Suma, Media As Single Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Notas" ButtonCalcular.Text = "Leer archivo" End Sub Private Sub ButtonCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcular.Click Dim i As Integer LabelResultado.TextAlign = ContentAlignment.MiddleCenter LabelResultado.Font = New Font("Arial", 10, FontStyle.Bold) LabelResultado.Text = "" Dim myFileToRead As New System.IO.StreamReader("C:\Users\Asus\Desktop\notas.dat", False) For i = 1 To 35 '[Lectura de datos desde archivo] Dato(i) = myFileToRead.ReadLine() If Dato(i) < 0 Or Dato(i) > 10 Then '[Dato no válido] LabelResultado.Text = "No se pudo completar la extracción de datos. Motivo: " & _ "dato no válido. Revise archivo y vuelva a intentarlo" Fallolectura = True '[Interruptor] Exit For End If Suma = Suma + Dato(i) Next i myFileToRead.Close() If Fallolectura = False Then Media = Suma / 35 LabelResultado.Text = "La media es " & Media Else LabelResultado.Text = LabelResultado.Text & vbCrLf & "Gracias por utilizar este programa" End If End Sub End Class |
Para comprobar el funcionamiento del programa, lo ejecutaremos con un archivo de datos válidos y después modificaremos un dato para hacerlo no válido, con lo cual deberá mostrarse el mensaje "No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo".
SALIR DE UN BUCLE DO…LOOP WHILE CON EXIT DO EN VISUAL BASIC
La sintaxis a emplear es Exit Do dentro de cualquier bucle Do ... Loop While. Cuando existe anidamiento de bucles, se produce la salida del bucle más interno al inmediato superior. Si se escribe un Exit Do fuera de un bucle aparece el mensaje: "Error de compilación. Exit Do no está dentro de Do ... Loop".
INSTRUCCIÓN HACER … REPETIR CON DO … LOOP Y SALIRHACER CON EXIT DO
Dado que con Visual Basic Mientras ... Hacer se construye con el mismo comando (Do) que Hacer ... Repetir Mientras, la instrucción de salida de este tipo de bucles es siempre Exit Do, con las consideraciones que ya hemos hecho. La construcción Hacer...Repetir se consigue usando Do...Loop sin condicionantes a la entrada ni a la salida. Esto nos obliga, necesariamente, a que exista una condición de salida interna y a que exista un Exit Do dentro del bucle. Consideremos el siguiente ejemplo:
Do i = i + 1 Label1 = Label1 & i If i > 5 Then Exit Do Loop |
En caso de un fallo del contador o de la condición de salida se producirá un bucle infinito. Es poco recomendable usar construcciones tipo Do ... Loop como elemento habitual de programación. Lo más razonable es usarla únicamente en casos excepcionales y en líneas generales prescindir de ella.
EJERCICIO RESUELTO CON USO DE DO … LOOP Y EXIT DO
Transformar en código el pseudocódigo que se muestra a continuación como ejemplo de aplicación de SalirHacer y Hacer ... Repetir.
Nota: considerar que el valor de SecretCode se encuentra en el archivo code.dat creado previamente.
Pseudocódigo ejemplo de uso de SalirHacer (Exit Do) y de Hacer ... Repetir (Do…Loop).
1. Inicio [Mensaje si se acierta número secreto curso VB aprenderaprogramar.com] 2. Leer Secretcode [Valor del número secreto] 3. Hacer Mostrar “Introduzca número secreto” Pedir Numero Si Numero = Secretcode Entonces Mostrar “Bienvenido. Su clave para operar será 685297” SalirHacer SiNo Mostrar “Número erróneo” i = i + 1 Si i > 19 Entonces Mostrar “Excedido número de pruebas disponibles. Acceso denegado” SalirHacer FinSi FinSi Repetir 4. Fin |
SOLUCIÓN AL EJERCICIO CON USO DE DO … LOOP Y EXIT DO
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'[Curso VB aprenderaprogramar.com] '[Mensaje si se acierta número secreto] Option Explicit Dim Canal%, i As Integer Dim SecretCode!, Número As Single Private Sub Form_Load() Show LabelResultado.Alignment = 2 LabelResultado.FontBold = True '[Apertura del archivo] Canal = FreeFile Open "C:\code.dat" For Input As Canal '[Lectura de datos desde archivo] Input #Canal, SecretCode Close Canal '[Cerramos el archivo] Do Número = InputBox("Introduzca número secreto") If Número = SecretCode Then LabelResultado = "Bienvenido. Su clave para operar será 685297" Exit Do Else MsgBox "Número erróneo" i = i + 1 If i > 19 Then LabelResultado = "Excedido número de pruebas disponibles. Acceso denegado" Exit Do End If End If Loop 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 SecretCode, Número As Single Dim i As Integer Me.Text = "Secret Code" LabelResultado.TextAlign = ContentAlignment.MiddleCenter LabelResultado.Font = New Font("Arial", 10, FontStyle.Bold) LabelResultado.Text = "" '[Apertura del archivo] Dim myFileToRead As New System.IO.StreamReader("C:\Users\Asus\Desktop\code.dat", False) '[Lectura de datos desde archivo] SecretCode = myFileToRead.ReadLine() myFileToRead.Close() Do Número = InputBox("Introduzca número secreto") If Número = SecretCode Then LabelResultado.Text = "Bienvenido. Su clave para operar será 685297" Exit Do Else MsgBox("Número erróneo") i = i + 1 If i > 19 Then LabelResultado.Text = "Excedido número de pruebas disponibles. Acceso denegado" Exit Do End If End If Loop End Sub End Class |
INSTRUCCIÓN GOTO CON VISUAL BASIC
El uso de la instrucción IrA (GoTo) no debe contemplarse en la práctica habitual de la programación. La sintaxis a emplear es:
GoTo [número de línea] |
GoTo [etiqueta] |
Para ejecutar un GoTo no es necesario que todas las líneas estén identificadas, pero sí es necesario que la línea de destino esté numerada o etiquetada. No se puede hacer un GoTo a un procedimiento distinto del que se esté ejecutando en ese momento.
EJERCICIO RESUELTO CON USO DE GOTO
Generar el código correspondiente al pseudocódigo que se muestra a continuación, considerando que Numerodatos es un valor fijo de 35, y que los datos se encuentran en el fichero notas.dat, que se habrá creado previamente.
Pseudocódigo ejemplo de uso de IrA (GoTo)
1. Inicio [Ejemplo de IrA curso VB aprenderaprogramar.com] 2. Leer Numerodatos [Establece el nº de datos a extraer] 3. [El dato esperado en fichero debe valer entre cero y diez] 4. Desde i = 1 hasta Numerodatos Hacer Leer Dato(i)
Si Dato(i) < 0 ó Dato(i) > 10 Entonces [Dato no válido] IrA 99 [Envío a Gestión de Errores] FinSi Suma = Suma + Dato(i) Siguiente 5. Media = Suma / Numerodatos 6. Mostrar “La media es”, Media 7. Finalizar 99. [Gestión de Errores] 99.1 Mostrar “No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo” 99.2 Mostrar “Gracias por utilizar este programa” 100. Fin |
SOLUCIÓN AL EJERCICIO CON USO DE GOTO
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'[Curso VB aprenderaprogramar.com] '[Ejemplo de IrA] Option Explicit Dim Canal As Integer Dim i As Integer Dim Dato(35) As Single Dim Suma!, Media As Single Private Sub Form_Load() Show LabelResultado.Alignment = 2 LabelResultado.FontBold = True '[Apertura del archivo] Canal = FreeFile Open "C:\notas.dat" For Input As Canal For i = 1 To 35 '[Lectura de datos desde archivo] Input #Canal, Dato(i) If Dato(i) < 0 Or Dato(i) > 10 Then '[Dato no válido] GoTo 99 '[Envío a gestión de errores] End If Suma = Suma + Dato(i) Next i Media = Suma / 35 MsgBox("La media es " & Media) Close Canal '[Cerramos el archivo] Unload Form1 End 99 '[Gestión de errores] LabelResultado = "No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo" & vbCrLf & "Gracias por utilizar este programa" Close Canal '[Cerramos el archivo] 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 As Integer Dim Dato(35) As Single Dim Suma, Media As Single LabelResultado.TextAlign = ContentAlignment.MiddleCenter LabelResultado.Font = New Font("Arial", 10, FontStyle.Bold) LabelResultado.Text = "" '[Apertura del archivo] Dim myFileToRead As New System.IO.StreamReader("C:\Users\Asus\Desktop\notas.dat", False) For i = 1 To 35 '[Lectura de datos desde archivo] Dato(i) = myFileToRead.ReadLine() If Dato(i) < 0 Or Dato(i) > 10 Then '[Dato no válido] GoTo 99 '[Envío a gestión de errores] End If Suma = Suma + Dato(i) Next i Media = Suma / 35 MsgBox("La media es " & Media) myFileToRead.Close() Me.Close() End 99: '[Gestión de errores] LabelResultado.Text = "No se pudo completar la extracción de datos. Motivo: dato no válido. Revise archivo y vuelva a intentarlo" & vbCrLf & "Gracias por utilizar este programa" myFileToRead.Close() End Sub End Class |