10 - Estructura repetitiva Do ... Loop While (condición)


La estructura Do ... Loop While (condición) permite ejecutar al menos una vez su bloque repetitivo, a diferencia del Do While (condición) ... Loop que puede no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del Do While (condición) ... Loop que está en la parte superior.

Representación gráfica:

estructura repetitiva Do ... Loop While (condición)

El bloque de operaciones se repite MIENTRAS que la condición sea Verdadera.
Si la condición retorna Falso el ciclo se detiene.
Es importante analizar y ver que las operaciones se ejecutan como mínimo una vez.

Problema 1:

Escribir un programa que solicite la carga de un número entre 0 y 999, y nos muestre un mensaje de cuántos dígitos tiene el mismo. Finalizar el programa cuando se cargue el valor 0.

Diagrama de flujo:

estructura repetitiva Do ... Loop While (condición)

No hay que confundir los rombos de las estructuras condicionales con los de las estructuras repetitivas.
En este problema por lo menos se carga un valor. Si se carga un valor mayor o igual a 100 se trata de un número de tres cifras, si es mayor o igual a 10 se trata de un valor de dos dígitos, en caso contrario se trata de un valor de un dígito. Este bloque se repite mientras se ingresa en la variable valor un número distinto a cero. Cuando se ingresa el cero la condición del ciclo repetitivo se evalúa falsa y por lo tanto sale del bloque repetitivo.

Programa:

Module Module1

    Sub Main()
        Dim valor As Integer
        Do
            Console.Write("Ingrese un valor entre 0 y 999 (0 finaliza):")
            valor = Console.ReadLine()
            If valor >= 100 Then
                Console.WriteLine("Tiene 3 dígitos.")
            Else
                If valor >= 10 Then
                    Console.WriteLine("Tiene 2 dígitos.")
                Else
                    Console.WriteLine("Tiene 1 dígito.")
                End If
            End If
        Loop While (valor <> 0)
    End Sub

End Module

Problema 2:

Escribir un programa que solicite la carga de números por teclado, obtener su promedio. Finalizar la carga de valores cuando se cargue el valor 0.

Cuando la finalización depende de algún valor ingresado por el operador conviene el empleo de la estructura Do ... Loop While (condición), por lo menos se cargará un valor (en el caso más extremo se carga 0, que indica la finalización de la carga de valores)

Diagrama de flujo:

estructura repetitiva Do ... Loop While (condición)

Es importante analizar este diagrama de flujo.
Definimos un contador cant que cuenta la cantidad de valores ingresados por el operador (no lo incrementa si ingresamos 0)
El valor 0 no es parte de la serie de valores que se deben sumar.
Definimos el acumulador suma que almacena todos los valores ingresados por teclado.
La estructura repetitiva Do ... Loop While (condición) se repite mientras se ingrese un valor distinto a 0. Con el valor cero la condición del ciclo retorna falso y continúa con el flujo del diagrama.
Disponemos por último una estructura condicional para el caso que el operador cargue únicamente un 0 y por lo tanto no podemos calcular el promedio ya que no existe la división por 0.
En caso que el contador cant tenga un valor distinto a 0 el promedio se obtiene dividiendo el acumulador suma por el contador cant que tiene la cantidad de valores ingresados antes de introducir el 0.

Programa:

Module Module1

    Sub Main()
        Dim suma, cant, valor, promedio As Integer
        suma = 0
        cant = 0
        Do
            Console.Write("Ingrese un valor (0 para finalizar):")
            valor = Console.ReadLine()
            If valor <> 0 Then
                suma = suma + valor
                cant = cant + 1
            End If
        Loop While valor <> 0
        If cant <> 0 Then
            promedio = suma / cant
            Console.Write("El promedio de los valores ingresados es:")
            Console.Write(promedio)
        Else
            Console.Write("No se ingresaron valores.")
        End If
        Console.ReadKey()
    End Sub

End Module

El contador cant DEBE inicializarse antes del ciclo, lo mismo que el acumulador suma. El promedio se calcula siempre y cuando el contador cant sea distinto a 0.

Problema 3:

Realizar un programa que permita ingresar el peso (en kilogramos) de piezas. El proceso termina cuando ingresamos el valor 0. Se debe informar:
a) Cuántas piezas tienen un peso entre 9,8 Kg. y 10,2 Kg.?, cuántas con más de 10,2 Kg.? y cuántas con menos de 9,8 Kg.?
b) La cantidad total de piezas procesadas.

Diagrama de flujo:

estructura repetitiva do while

Los tres contadores cont1, cont2, y cont3 se inicializan en 0 antes de entrar a la estructura repetitiva.
A la variable suma no se la inicializa en 0 porque no es un acumulador, sino que guarda la suma del contenido de las variables cont1, cont2 y cont3.
La estructura se repite mientrasno se ingrese el valor 0 en la variable peso. Este valor no se lo considera un peso menor a 9,8 Kg., sino que indica que ha finalizado la carga de valores por teclado.

Programa:

Module Module1

    Sub Main()
        Dim cant1, cant2, cant3, suma As Integer
        Dim peso As Single
        cant1 = 0
        cant2 = 0
        cant3 = 0
        Do
            Console.Write("Ingrese el peso de la pieza (0 pera finalizar):")
            peso = Console.ReadLine()
            If peso > 10.2 Then
                cant1 = cant1 + 1
            Else
                If peso >= 9.8 Then
                    cant2 = cant2 + 1
                Else
                    If peso > 0 Then
                        cant3 = cant3 + 1
                    End If
                End If
            End If
        Loop While peso <> 0
        suma = cant1 + cant2 + cant3
        Console.Write("Piezas aptas:")
        Console.WriteLine(cant2)
        Console.Write("Piezas con un peso superior a 10,2:")
        Console.WriteLine(cant1)
        Console.Write("Piezas con un peso inferior a 9,8:")
        Console.WriteLine(cant3)
        Console.ReadKey()
    End Sub

End Module

Problemas propuestos

  1. Realizar un programa que acumule (sume) valores ingresados por teclado hasta ingresar el 9999 (no sumar dicho valor, indica que ha finalizado la carga). Imprimir el valor acumulado e informar si dicho valor es cero, mayor a cero o menor a cero.
  2. En un banco se procesan datos de las cuentas corrientes de sus clientes. De cada cuenta corriente se conoce: número de cuenta y saldo actual. El ingreso de datos debe finalizar al ingresar un valor negativo en el número de cuenta.
    Se pide confeccionar un programa que lea los datos de las cuentas corrientes e informe:
    a)De cada cuenta: número de cuenta y estado de la cuenta según su saldo, sabiendo que:
    Estado de la cuenta	'Acreedor' si el saldo es >0.
    			'Deudor' si el saldo es <0.
    			'Nulo' si el saldo es =0.
    
    b) La suma total de los saldos acreedores.
Solución
Module Module1

    Sub Main()
        Dim suma, valor As Integer
        suma = 0
        Do
            Console.Write("Ingrese un valor:")
            valor = Console.ReadLine()
            If valor <> 9999 Then
                suma = suma + valor
            End If
        Loop While (valor <> 9999)
        Console.Write("El valor acumulado es ")
        Console.WriteLine(suma)
        If suma = 0 Then
            Console.WriteLine("El valor acumulado es cero.")
        Else
            If suma > 0 Then
                Console.WriteLine("El valor acumulado es positivo.")
            Else
                Console.WriteLine("El valor acumulado es negativo")
            End If
        End If
        Console.ReadKey()
    End Sub

End Module





Module Module1

    Sub Main()
        Dim cuenta As Integer
        Dim saldo, suma As Single
        suma = 0
        Do
            Console.Write("Ingrese número de cuenta:")
            cuenta = Console.ReadLine()
            If cuenta >= 0 Then
                Console.Write("Ingrese saldo:")
                saldo = Console.ReadLine()
                If saldo > 0 Then
                    Console.WriteLine("Saldo Acreedor.")
                    suma = suma + saldo
                Else
                    If saldo < 0 Then
                        Console.WriteLine("Saldo Deudor.")
                    Else
                        Console.WriteLine("Saldo Nulo.")
                    End If
                End If
            End If
        Loop While cuenta >= 0
        Console.Write("Total de saldos Acreedores:")
        Console.Write(suma)
        Console.ReadKey()
    End Sub

End Module

Retornar