INTRODUCCION A LA PROGRAMACION

Lección 13: Estructuras Repetitivas Condicionales

 

            13.1 Introducción

            13.2 El Ciclo While Comprobado al Inicio

            13.3 Ejecución de un Bucle Cero Veces

            13.4 Ciclo Infinito

            13.5 El Ciclo Until Comprobado al Inicio

            13.6 Estructuras Repetitivas Comprobadas al Final

13.7 Ejercicios

 

13.1 Introducción

 

No siempre es posible conocer de antemano cuantas veces debe repetirse un bucle para cumplir los objetivos de una aplicación. Eventualmente el programador puede establecer una condición de manera tal que el resultado (verdadero o falso) de la expresión booleana determine si es necesaria una iteración mas o no. Dicha condición puede comprobarse al comienzo o al final del bucle. En ambos casos el ciclo puede ser de tipo while o del tipo until.

 

El ciclo while se repite mientras la expresión booleana es verdadera y se detiene (el bucle) y continua el flujo cuando la expresión booleana es falsa.

 

El ciclo until se repite mientras la expresión booleana es falsa y se detiene (el bucle) y continua el flujo cuando la expresión booleana es verdadera.

 

En resumen: el ciclo while se repite mientras la expresión es verdadera y el until hasta que la expresión sea verdadera.

 

La estructura de repetición condicional, con evaluación al comienzo o al final, tiene que ser diseñada con sumo cuidado para evitar caer en un ciclo infinito. Esto ocurre si la expresión booleana nunca llega a tomar el valor falsa en un ciclo while o nunca alcanza el valor verdadera en un ciclo until.

 

En el ejemplo de abajo se muestra un ciclo infinito provocado por la omisión de la cláusula while o la cláusula until

 

Ejemplo 1

 

En una forma (caption: Ciclo infinito) que solamente contiene el botón Start inserte el siguiente código fuente:

 

Private Sub cmdStart_Click()

 

Do ‘ Comienza el ciclo

   

    Print ‘Imprime una línea en blanco

    Form1.ForeColor = QBColor(15 * Rnd) ‘Cambia aleatoriamente el color del texto

    Print Tab; "Oprima Ctrl + Break para detener el ciclo" ‘Imprime el texto

   

    For i = 1 To 2000000 ‘Ciclo de espera

    Next i

 

    Cls ‘Borra el texto

 

Loop ‘Termina el ciclo

 

End Sub

 

La función Rnd genera en cada iteración un numero aleatorio de valor mayor que cero (0) y menor que uno (1). En la codificación del ejemplo al multiplicar dicho número por 15 se obtiene un valor que VB redondea automáticamente al entero más próximo y establece un color para el texto que cambia en cada iteración.

 

Arriba

 

13.2 El Ciclo While Comprobado al Inicio

 

El ciclo while comprobado al inicio se puede representar gráficamente como se ilustra abajo:

 

 

La sintaxis general en VB es:

 

                                                                        Do While <condición lógica>

                                                                        <Instrucciones>

                                                                        Loop

 

El ejemplo de abajo ilustra una interesante aplicación del ciclo while comprobado al inicio:

 

Ejemplo 2

 

Modifique el código fuente del ejemplo 1 de la siguiente manera

 

Private Sub cmdStart_Click()

  

   For green = 50 To 255

 

Form1.BackColor = RGB(0, green, 0)

 

start = Timer

Do While Timer < start + 0.1

Loop

 

  Next

 

  End

 

End Sub

 

Timer es la cantidad de segundos transcurridos desde que comenzó el día, y RGB permite obtener un color combinando rojo, verde y azul (las tonalidades de cada color cambian desde 0 hasta 255, siendo el tono más claro mientras mayor es su valor).

 

En el ejemplo 2 el ciclo while ha sido utilizado como ciclo de espera para retardar el cambio de tono en una décima (0.1) de segundo.

 

¿Por qué el ciclo definido empieza en green = 50 y no en green = 0?

 

Estudie cuidadosamente, implemente y pruebe el siguiente ejemplo:

 

Ejemplo 3

 

GUI

 

 

Código Fuente

---------------------------------------------------------------

Private Sub cmdExit_Click()

 

  End

 

End Sub

­---------------------------------------------------------------

Private Sub cmdReset_Click()

 

  imgRocket1.Top = 3000

  imgRocket2.Top = 3000

 

End Sub

---------------------------------------------------------------

Private Sub cmdStart_Click()

 

   Dim intRnd1 As Integer, intRnd2 As Integer

 

   Randomize

 

   Do While imgRocket1.Top > 0 And imgRocket2 > 0

       intRnd1 = Int((40 * Rnd) + 10)

       intRnd2 = Int((40 * Rnd) + 10)

       imgRocket1.Top = imgRocket1.Top - intRnd1

       imgRocket2.Top = imgRocket2.Top - intRnd2

   Loop

 

   If imgRocket1.Top = imgRocket2.Top Then

      MsgBox "Empatados!"

   Else

      If imgRocket1.Top < imgRocket2.Top Then

         MsgBox "Gano el Rocket 1!"

      Else

         MsgBox "Gano el Rocket 2!"

     End If

   End If

   

End Sub

 

La instrucción Randomize se utiliza para evitar que el bucle produzca siempre la misma secuencia de números aleatorios. Note el uso de estructuras condicionales anidadas.

 

Arriba

 

13.3 Ejecución de un Bucle Cero Veces

 

Si la en un ciclo while comprobado al inicio la condición se evalúa falsa de primera intención, entonces no ocurre ninguna iteración, es decir: el bucle es ejecutado cero veces. Esto puede ser útil en ciertos casos. El ejemplo de abajo (escrito en pseudocódigo) ilustra un modulo que suma números positivos.

 

Ejemplo 4

 

leer (numero)

 

mientras numero>=0 hacer

 

  suma = suma + numero

  leer numero

 

fin_mientras

 

Si el primer número es negativo, el bucle no se ejecuta. Si es positivo, el bucle se ejecutara hasta que se lea un número negativo. Este tipo de estructura se utiliza frecuentemente para leer datos salvados en un archivo. Para ello se marca el final de la lista de datos con un número negativo (EOF: End Of File). Si el archivo no contiene ningún dato, la aplicación solamente leerá el EOF (única cosa contenida en dicho archivo) y el ciclo no se ejecutará.

 

Arriba

 

13.4 Ciclo Infinito

 

Si en un ciclo while comprobado al inicio la condición nunca se hace falsa, el ciclo nunca se interrumpirá y se ejecutarán infinitas iteraciones. Esto se utiliza en ciertas aplicaciones (por ejemplo: reservaciones, entradas de datos, etc.), donde se implementa un botón para finalizar la aplicación y el bucle solamente se interrumpe se  usa ese botón (o en su defecto ctrl. + Break)

 

En el ejemplo de abajo se muestra como el diseño descuidado del bucle puede producir un ciclo infinito.

 

Ejemplo 5

 

GUI

 

 

Codificación básica del botón Enter

 

Private Sub cmdEnter_Click()

 

capital = Val(Text1.Text)

tasa = 10

 

Do While tasa <> 20

    interes = tasa * 0.01 * capital

    Picture1.Print interes

    tasa = tasa + 3

Loop

 

End Sub

 

¿Por qué  este código produce un ciclo infinito?

 

Arriba

 

13.5 El Ciclo Until Comprobado al Inicio

 

El ciclo Until se repite mientras la expresión booleana es falsa.

 

 

 

El ejemplo 6 ilustra como un bucle Until permite escribir invertido el número entrado por el usuario.

 

Ejemplo 6

 

Private Sub cmdEnter_Click()

 

Dim n As Integer

Dim resto As Integer

Dim invertido As String

 

n = Val(txtN.Text)

 

Do Until n = 0

   

    resto = n Mod 10

    invertido = invertido & Str$(resto)

    lblInvertido.Caption = invertido

    n = n / 10

Loop

 

End Sub

 

Arriba

 

13.6 Estructuras Repetitivas Comprobadas al Final

 

En las estructuras repetitivas comprobadas al final del ciclo la condición de control forma parte de la última línea de instrucción del ciclo. Esto se utiliza cuando se desea garantizar que el bucle se ejecute al menos una vez. Otra de sus características es que el valor inicial de la variable de control puede obtenerse dentro del ciclo, cosa esta imposible en las estructuras repetitivas comprobadas al inicio.

 

La sintaxis VB de los ciclos While y Until comprobados al final es:

 

Ciclo While     

Ciclo Until

Do

 

[bloque de códigos]

 

Loop While <condición>

Do

 

[bloque de códigos]

 

Loop Until <condición>

 

Ejemplo 7

 

La interfase de esta aplicación es una forma que contiene un letrero que dice: WELCOME TO MY CLUB!

 

Private Sub Form_Load()

 

Dim strAge As String

Dim intAge As Integer

Dim intPress As Integer

 

Do

 

strAge = InputBox("How old are you?", "Age Ask")

' Check for the Cancel command button

If (strAge = "") Then

End ' Terminate program

End If

intAge = Val(strAge)

If ((intAge < 20) Or (intAge > 30)) Then

' The user's age is out of range

intPress = MsgBox("Your age must be between 10 and 99", vbExclamation, "Error!")

End If

 

Loop While ((intAge < 20) Or (intAge > 30))

 

End Sub

 

¿qué ventajas tiene en este ejemplo que la comprobación se realice al final?

 

Arriba

 

13.7 Ejercicios

 

 

 

 

 

 

 

 

 

 

Arriba

 

PROBLEMA RETO: Implemente una versión simplificada (4x4 y sin limite de tiempo)del juego  buscaminas. (Sugerencia: utilice un picture box, botones (propiedad visible) e image boxes)