11 - Estructura repetitiva For... Next


Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura Do While (condición) ... Loop. Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas situaciones.
En general, la estructura For... Next se usa en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 números, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita.

Representación gráfica:

estructura repetitiva  For... Next

En su forma más típica y básica, esta estructura requiere una variable que cumple la función de un CONTADOR de vueltas. El primer valor que indicamos es el valor inicial que toma el contador. Cada vez que se ejecuta el bloque a repetir el contador se incrementa en uno y si no supera el valor final especificado en el For vuelve a ejecutar el bloque.

Si conocemos la cantidad de veces que se repite el bloque es muy sencillo emplear un For, por ejemplo si queremos que se repita 50 veces el bloque de instrucciones puede hacerse así:

estructura repetitiva For... Next

La variable del For puede tener cualquier nombre. En este ejemplo se la ha definido con el nombre f.
Analicemos el ejemplo:

- La variable f  toma inicialmente el valor 1.
- Se ejecutan la/s operación/es.
- Al finalizar de ejecutarlas automáticamente se incrementa en 1 el contador f. 
- Si el contador f no supera a 50 vuelve a ejecutar el bloque. 
- El proceso se repetirá hasta que la variable f llegue al valor 51. 
En este momento finaliza el ciclo repetitivo.

La variable f no conviene modificarla dentro del For.
La variable f puede ser inicializada en cualquier valor y finalizar en cualquier valor.

Problema 1:

Realizar un programa que imprima en pantalla los números del 1 al 100.

Diagrama de flujo:

estructura repetitiva For... Next

Inicialmente f vale 1 y como no es superior a 100 se ejecuta el bloque, imprimimos el contenido de f, al finalizar el bloque repetitivo se incrementa la variable f en 1, como 2 no es superior a 100 se repite el bloque de instrucciones.
Cuando la variable del For llega a 101 sale de la estructura repetitiva y continúa la ejecución del algoritmo que se indica después del círculo.
La variable f (o como sea que se decida llamarla) debe estar definida como una variable más.

Programa:

Module Module1

    Sub Main()
        Dim f As Integer
        For f = 1 To 100
            Console.Write(f)
            Console.Write("-")
        Next
        Console.ReadKey()
    End Sub

End Module

El comienzo del bloque For es:

        For f = 1 To 100

f previamente está definida como variable entera.

El ciclo repetitivo For finaliza con la palabra clave:

        Next

La ejecución del programa da como resultado la siguiente pantalla:

estructura repetitiva For... Next

Problema 2:

: Desarrollar un programa que permita la carga de 10 valores por teclado y nos muestre posteriormente la suma de los valores ingresados y su promedio. Este problema ya lo desarrollamos, lo resolveremos empleando la estructura for.

Diagrama de flujo:

estructura repetitiva for

En este caso, a la variable del for (f) sólo se la requiere para que se repita el bloque de instrucciones 10 veces.

Programa:

Module Module1

    Sub Main()
        Dim suma, f, valor, promedio As Integer
        suma = 0
        For f = 1 To 10
            Console.Write("Ingrese valor:")
            valor = Console.ReadLine()
            suma = suma + valor
        Next
        Console.Write("La suma es:")
        Console.WriteLine(suma)
        promedio = suma / 10
        Console.Write("El promedio es:")
        Console.Write(promedio)
        Console.ReadKey()
    End Sub

End Module

El problema requiere que se carguen 10 valores y se sumen los mismos.
El promedio se calcula fuera del For luego de haber cargado los 10 valores.

Problema 3:

Escribir un programa que solicite por teclado 10 notas de alumnos y nos informe cuántos tienen notas mayores o iguales a 7 y cuántos menores.

Para resolver este problema se requieren tres contadores:

aprobados (Cuenta la cantidad de alumnos aprobados)
reprobados (Cuenta la cantidad de reprobados)
f (es el contador del For)
Dentro de la estructura repetitiva debemos hacer la carga de la variable nota y verificar con una estructura condicional si el contenido de la variable nota es mayor o igual a 7 para incrementar el contador aprobados, en caso de que la condición retorne falso debemos incrementar la variable reprobados.

Diagrama de flujo:

estructura repetitiva For

Los contadores aprobados y reprobados deben imprimirse FUERA de la estructura repetitiva.
Es fundamental inicializar los contadores aprobados y reprobados en cero antes de entrar a la estructura For.
Importante: Un error común es inicializar los contadores dentro de la estructura repetitiva. En caso de hacer esto los contadores se fijan en cero en cada ciclo del For, por lo que al finalizar el For como máximo el contador puede tener el valor 1.

Programa:

Module Module1

    Sub Main()
        Dim aprobados, reprobados, f, nota As Integer
        aprobados = 0
        reprobados = 0
        For f = 1 To 10
            Console.Write("Ingrese la nota:")
            nota = Console.ReadLine()
            If nota >= 7 Then
                aprobados = aprobados + 1
            Else
                reprobados = reprobados + 1
            End If
        Next
        Console.Write("Cantidad de aprobados:")
        Console.WriteLine(aprobados)
        Console.Write("Cantidad de reprobados:")
        Console.Write(reprobados)
        Console.ReadKey()
    End Sub

End Module

Definimos todas las variables de tipo entera:

        Dim aprobados, reprobados, f, nota As Integer

Iniciamos los dos contadores en cero previo al for:

        aprobados = 0
        reprobados = 0

El contador del For se inicia con el valor 1:

        For f = 1 To 10

Dentro del ciclo For cargamos la nota y según el valor ingresado incrementamos uno de los dos contadores:

            Console.Write("Ingrese la nota:")
            nota = Console.ReadLine()
            If nota >= 7 Then
                aprobados = aprobados + 1
            Else
                reprobados = reprobados + 1
            End If

Fuera del ciclo For procedemos a mostrar la cantidad de aprobados y reprobados:

        Console.Write("Cantidad de aprobados:")
        Console.WriteLine(aprobados)
        Console.Write("Cantidad de reprobados:")
        Console.Write(reprobados)

Problema 4:

Escribir un programa que lea 10 números enteros y luego muestre cuántos valores ingresados fueron múltiplos de 3 y cuántos de 5. Debemos tener en cuenta que hay números que son múltiplos de 3 y de 5 a la vez.

Diagrama de flujo:

estructura repetitiva for Next

Tengamos en cuenta que el operador matemático Mod retorna el resto de dividir un valor por otro, en este caso: valor Mod 3 retorna el resto de dividir el valor que ingresamos por teclado, por tres.
Veamos: si ingresamos 6 el resto de dividirlo por 3 es 0, si ingresamos 12 el resto de dividirlo por 3 es 0. Generalizando: cuando el resto de dividir por 3 al valor que ingresamos por teclado es cero, se trata de un múltiplo de dicho valor.

Ahora bien ¿por qué no hemos dispuesto una estructura If anidada? Porque hay valores que son múltiplos de 3 y de 5 a la vez. Por lo tanto con If anidados no podríamos analizar los dos casos.
Es importante darse cuenta cuando conviene emplear If anidados y cuando no debe emplearse.

Programa:

Module Module1

    Sub Main()
        Dim mul3, mul5, valor, f As Integer
        mul3 = 0
        mul5 = 0
        For f = 1 To 10
            Console.Write("Ingrese un valor:")
            valor = Console.ReadLine()
            If valor Mod 3 = 0 Then
                mul3 = mul3 + 1
            End If
            If valor Mod 5 = 0 Then
                mul5 = mul5 + 1
            End If
        Next
        Console.Write("Cantidad de valores ingresados múltiplos de 3:")
        Console.WriteLine(mul3)
        Console.Write("Cantidad de valores ingresados múltiplos de 5:")
        Console.Write(mul5)
        Console.ReadKey()
    End Sub

End Module

El If para verificar si el valor cargado es múltiplo de 3 (el contador mul3 lo iniciamos en cero antes del For):

            If valor Mod 3 = 0 Then
                mul3 = mul3 + 1
            End If

Problema 5:

Escribir un programa que lea n números enteros y calcule la cantidad de valores mayores o iguales a 1000.
Este tipo de problemas también se puede resolver empleando la estructura repetitiva for. Lo primero que se hace es cargar una variable que indique la cantidad de valores a ingresar. Dicha variable se carga antes de entrar a la estructura repetitiva For.
La estructura For permite que el valor inicial o final dependa de una variable cargada previamente por teclado.

Diagrama de flujo:

estructura repetitiva For Next

Tenemos un contador llamado cantidad y f que es el contador del For.
La variable entera n se carga previo al inicio del For, por lo que podemos fijar el valor final del for con la variable n, es decir previo a que inicie el For ya sabemos la cantidad de veces que debe repetirse.
Por ejemplo si el operador carga 5 en n la estructura repetitiva For se ejecutará 5 veces.
La variable valor se ingresa dentro de la estructura repetitiva, y se verifica si el valor de la misma es mayor o igual a 1000, en dicho caso se incrementa en uno el contador cantidad.
Fuera de la estructura repetitiva imprimimos el contador cantidad que tiene almacenado la cantidad de valores ingresados mayores o iguales a 1000.

Programa:

Module Module1

    Sub Main()
        Dim cantidad, n, f, valor As Integer
        cantidad = 0
        Console.Write("Cuantos valores ingresará:")
        n = Console.ReadLine()
        For f = 1 To n
            Console.Write("Ingrese el valor:")
            valor = Console.ReadLine()
            If valor >= 1000 Then
                cantidad = cantidad + 1
            End If
        Next
        Console.Write("La cantidad de valores ingresados mayores o iguales a 1000 son:")
        Console.Write(cantidad)
        Console.ReadKey()
    End Sub

End Module

Otra variante de la estructura repetitiva For...Next

Podemos en ciertos casos hacer que el contador del for se incremente en un valor distinto a uno.

Veamos como sería el programa para imprimir los números de 1 al 3 pero incrementando en 0,25 cada paso:

Module Module1

    Sub Main()
        Dim f As Single
        For f = 1 To 3 Step 0.25
            Console.Write(f)
            Console.Write(" - ")
        Next
        Console.ReadKey()
    End Sub

End Module

estructura repetitiva For Step...Next

El contador del For es una variable de tipo Single (es decir podemos guardar valores con decimal)

Aparece la nueva palabra clave Step dentro del For que le indica cuanto debe modificarse el contador en cada vuelta (cuando no indicamos Step luego el incremento por defecto es 1):

        For f = 1 To 3 Step 0.25

Problemas propuestos

Ha llegado nuevamente la parte fundamental, que es el momento donde uno desarrolla individualmente un algoritmo para la resolución de un problema.

  1. Confeccionar un programa que lea n pares de datos, cada par de datos corresponde a la medida de la base y la altura de un triángulo. El programa deberá informar:
    a) De cada triángulo la medida de su base, su altura y su superficie.
    b) La cantidad de triángulos cuya superficie es mayor a 12.
  2. Desarrollar un programa que solicite la carga de 10 números e imprima la suma de los últimos 5 valores ingresados.
  3. Desarrollar un programa que muestre la tabla de multiplicar del 5 (del 5 al 50)
  4. Confeccionar un programa que permita ingresar un valor del 1 al 10 y nos muestre la tabla de multiplicar del mismo (los primeros 12 términos)
    Ejemplo: Si ingreso 3 deberá aparecer en pantalla los valores 3, 6, 9, hasta el 36.
  5. Realizar un programa que lea los lados de n triángulos, e informar:
    a) De cada uno de ellos, qué tipo de triángulo es: equilátero (tres lados iguales), isósceles (dos lados iguales), o escaleno (ningún lado igual)
    b) Cantidad de triángulos de cada tipo.
  6. Escribir un programa que pida ingresar coordenadas (x,y) que representan puntos en el plano.
    Informar cuántos puntos se han ingresado en el primer, segundo, tercer y cuarto cuadrante. Al comenzar el programa se pide que se ingrese la cantidad de puntos a procesar.
  7. Se realiza la carga de 10 valores enteros por teclado. Se desea conocer:
    a) La cantidad de valores ingresados negativos.
    b) La cantidad de valores ingresados positivos.
    c) La cantidad de múltiplos de 15.
    d) El valor acumulado de los números ingresados que son pares.
  8. Se cuenta con la siguiente información:
    Las edades de 50 estudiantes del turno mañana.
    Las edades de 60 estudiantes del turno tarde.
    Las edades de 110 estudiantes del turno noche.
    Las edades de cada estudiante deben ingresarse por teclado.
    a) Obtener el promedio de las edades de cada turno (tres promedios)
    b) Imprimir dichos promedios (promedio de cada turno)
    c) Mostrar por pantalla un mensaje que indique cual de los tres turnos tiene un promedio de edades mayor.
Solución
Module Module1

    Sub Main()
        Dim basetri, altura, superficie, cantidad, f, n As Integer
        cantidad = 0
        Console.Write("Cuantos triángulos procesará:")
        n = Console.ReadLine()
        For f = 1 To n
            Console.Write("Ingrese el valor de la base:")
            basetri = Console.ReadLine()
            Console.Write("Ingrese el valor de la altura:")
            altura = Console.ReadLine()
            superficie = basetri * altura / 2
            Console.Write("La superficie es:")
            Console.WriteLine(superficie)
            If superficie > 12 Then
                cantidad = cantidad + 1
            End If
        Next
        Console.Write("La cantidad de triángulos con superficie superior a 12 son:")
        Console.Write(cantidad)
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, valor, suma As Integer
        suma = 0
        For f = 1 To 10
            Console.Write("Ingrese un valor:")
            valor = Console.ReadLine()
            If f > 5 Then
                suma = suma + valor
            End If
        Next
        Console.Write("La suma de los últimos 5 valores es:")
        Console.Write(suma)
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, tabla As Integer
        For f = 1 To 10
            tabla = f * 5
            Console.Write(tabla)
            Console.Write("-")
        Next
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, valor, tabla As Integer
        Console.Write("Ingrese un valor entre 1 y 10:")
        valor = Console.ReadLine()
        For f = 1 To 12
            tabla = valor * f
            Console.Write(tabla)
            Console.Write("-")
        Next
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, lado1, lado2, lado3, cant1, cant2, cant3, n As Integer
        cant1 = 0
        cant2 = 0
        cant3 = 0
        Console.Write("Ingrese la cantidad de triángulos:")
        n = Console.ReadLine()
        For f = 1 To n
            Console.Write("Ingrese lado 1:")
            lado1 = Console.ReadLine()
            Console.Write("Ingrese lado 2:")
            lado2 = Console.ReadLine()
            Console.Write("Ingrese lado 3:")
            lado3 = Console.ReadLine()
            If lado1 = lado2 And lado1 = lado3 Then
                Console.WriteLine("Es un triángulo equilatero.")
                cant1 = cant1 + 1
            Else
                If lado1 = lado2 Or lado1 = lado3 Or lado2 = lado3 Then
                    Console.WriteLine("Es un triángulo isósceles.")
                    cant2 = cant2 + 1
                Else
                    cant3 = cant3 + 1
                    Console.WriteLine("Es un triángulo escaleno.")
                End If
            End If
        Next
        Console.Write("Cantidad de triángulos equilateros:")
        Console.WriteLine(cant1)
        Console.Write("Cantidad de triángulos isósceles:")
        Console.WriteLine(cant2)
        Console.Write("Cantidad de triángulos escalenos:")
        Console.WriteLine(cant3)
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim n, f, x, y, cant1, cant2, cant3, cant4 As Integer
        cant1 = 0
        cant2 = 0
        cant3 = 0
        cant4 = 0
        Console.Write("Cantidad de puntos:")
        n = Console.ReadLine()
        For f = 1 To n
            Console.Write("Ingrese coordenada x:")
            x = Console.ReadLine()
            Console.Write("Ingrese coordenada y:")
            y = Console.ReadLine()
            If x > 0 And y > 0 Then
                cant1 = cant1 + 1
            Else
                If x < 0 And y > 0 Then
                    cant2 = cant2 + 1
                Else
                    If x < 0 And y < 0 Then
                        cant3 = cant3 + 1
                    Else
                        If x > 0 And y < 0 Then
                            cant4 = cant4 + 1
                        End If
                    End If
                End If
            End If
        Next
        Console.Write("Cantidad de puntos en el primer cuadrante:")
        Console.WriteLine(cant1)
        Console.Write("Cantidad de puntos en el segundo cuadrante:")
        Console.WriteLine(cant2)
        Console.Write("Cantidad de puntos en el tercer cuadrante:")
        Console.WriteLine(cant3)
        Console.Write("Cantidad de puntos en el cuarto cuadrante:")
        Console.WriteLine(cant4)
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, valor, negativos, positivos, mult15, sumapares As Integer
        negativos = 0
        positivos = 0
        mult15 = 0
        sumapares = 0
        For f = 1 To 10
            Console.Write("Ingrese valor:")
            valor = Console.ReadLine()
            If valor < 0 Then
                negativos = negativos + 1
            Else
                If valor > 0 Then
                    positivos = positivos + 1
                End If
            End If
            If valor Mod 15 = 0 Then
                mult15 = mult15 + 1
            End If
            If valor Mod 2 = 0 Then
                sumapares = sumapares + valor
            End If
        Next
        Console.Write("Cantidad de valores negativos:")
        Console.WriteLine(negativos)
        Console.Write("Cantidad de valores positivos:")
        Console.WriteLine(positivos)
        Console.Write("Cantidad de valores múltiplos de 15:")
        Console.WriteLine(mult15)
        Console.Write("Suma de los valores pares:")
        Console.WriteLine(sumapares)
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim f, edad, suma1, suma2, suma3, pro1, pro2, pro3 As Integer
        suma1 = 0
        suma2 = 0
        suma3 = 0
        For f = 1 To 50
            Console.Write("Ingrese edad:")
            edad = Console.ReadLine()
            suma1 = suma1 + edad
        Next
        pro1 = suma1 / 50
        Console.Write("Promedio de edades del turno mañana:")
        Console.WriteLine(pro1)
        For f = 1 To 60
            Console.Write("Ingrese edad:")
            edad = Console.ReadLine()
            suma2 = suma2 + edad
        Next
        pro2 = suma2 / 60
        Console.Write("Promedio de edades del turno tarde:")
        Console.WriteLine(pro2)
        For f = 1 To 110
            Console.Write("Ingrese edad:")
            edad = Console.ReadLine()
            suma3 = suma3 + edad
        Next
        pro3 = suma3 / 110
        Console.Write("Promedio de edades del turno noche:")
        Console.WriteLine(pro3)
        If pro1 < pro2 And pro1 < pro3 Then
            Console.Write("El turno mañana tiene un promedio menor de edades.")
        Else
            If pro2 < pro3 Then
                Console.Write("El turno tarde tiene un promedio menor de edades.")
            Else
                Console.Write("El turno noche tiene un promedio menor de edades.")
            End If
        End If
        Console.ReadKey()
    End Sub

End Module

Retornar