8 - Estructura repetitiva loop

Ruby nos provee distintas instrucciones para resolver un problema, queda en manos del programador seleccionar cual es la más expresiva.

Si bien con la instrucción while podemos resolver cualquier problema repetitivo veremos que Ruby nos ofrece un gran cantidad de formas para repetir bloques de instrucciones.

En este concepto introducimos el ciclo infinito llamado loop.

loop do
  [bloque a repetir]
end

En principio todo lo contenido entre las palabras claves loop y end se repetirá en forma infinita, pero nosotros podemos disponer una instrucción condicional que cuando sea verdadera proceda con la palabra clave break a terminar el ciclo loop y continúe con la siguiente instrucción fuera de la estructura repetitiva.

Problema 1:

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

Programa: ejercicio039.rb

loop do
  print "Ingrese un valor entre 0 y 999 (0 finaliza):"
  valor = gets.to_i
  if valor == 0
    break
  end
  if valor >= 100
    puts "Tiene 3 digitos."
  else
    if valor >= 10
      puts "Tiene 2 digitos."
    else
      puts "Tiene 1 digito."
    end
  end
end

En este problema no sabemos cuantos valores ingresará el operador.
Cuando ingrese el valor 0 se debe terminar la carga de valores.

Disponemos el ciclo repetitivo loop do donde en su interior se carga un valor entero por teclado y se verifica primero con un if si el valor es cero procediendo a abortar la estructura repetitiva mediante la palabra clave break:

loop do
  print "Ingrese un valor entre 0 y 999 (0 finaliza):"
  valor = gets.to_i
  if valor == 0
    break
  end

Si el valor ingresado no es 0 mediante una serie de if verificamos si tiene 1, 2 o 3 dígitos el valor ingresado:

  if valor >= 100
    puts "Tiene 3 digitos."
  else
    if valor >= 10
      puts "Tiene 2 digitos."
    else
      puts "Tiene 1 digito."
    end
  end

Tener en cuenta que un loop do finaliza con un end.

Problema 2:

Escribir un programa que solicite la carga de números por teclado, obtener su promedio. Finalizar la carga de valores cuando se ingrese el valor 0 (utilizar el ciclo loop do)

Programa: ejercicio040.rb

suma = 0
cant = 0
loop do
  print "Ingrese un valor (0 para finalizar):"
  valor = gets.to_i
  if valor == 0 
    break
  end
  suma = suma + valor
  cant = cant + 1
end
if cant != 0 
  promedio = suma / cant
  print "El promedio de los valores ingresados es:",promedio
else
  print "No se ingresaron valores."
end

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, ya que no existe la división por 0

El ciclo infinito loop do finaliza cuando el operador ingresa el valor 0:

loop do
  print "Ingrese un valor (0 para finalizar):"
  valor = gets.to_i
  if valor == 0 
    break
  end

Solo se suma y cuenta cuando se ingresa un valor distinto a cero:

  suma = suma + valor
  cant = cant + 1

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.
Utilizar el ciclo loop do

Programa: ejercicio041.rb

cant1 = 0
cant2 = 0
cant3 = 0
loop do
  print "Ingrese el peso de la pieza (0 pera finalizar):"
  peso = gets.to_f
  if peso == 0 
    break
  end
  if peso > 10.2
    cant1 = cant1 + 1
  else
    if peso >= 9.8
      cant2 = cant2 + 1
    else
      if peso > 0
        cant3 = cant3 + 1
      end
    end
  end
end
suma = cant1 + cant2 + cant3
print "Piezas procesadas: ", suma, "\n"
print "Piezas aptas: ", cant2, "\n"
print "Piezas con un peso superior a 10.2: ", cant1, "\n"
print "Piezas con un peso inferior a 9.8: ", cant3

Definimos 3 contadores:

cant1 = 0
cant2 = 0
cant3 = 0

Dentro del ciclo repetitivo se carga el peso de una pieza y verificamos con un if si se terminó el ingreso de pesos al cargar el 0:

loop do
  print "Ingrese el peso de la pieza (0 pera finalizar):"
  peso = gets.to_f
  if peso == 0 
    break
  end

Todos los pesos distintos a 0 se verifican en que rango se encuentran para incrementar el contador respectivo:

  if peso > 10.2
    cant1 = cant1 + 1
  else
    if peso >= 9.8
      cant2 = cant2 + 1
    else
      if peso > 0
        cant3 = cant3 + 1
      end
    end
  end

Fuera del ciclo repetitivo procedemos a sumar los 3 contadores que nos genera la cantidad total de piezas procesadas:

suma = cant1 + cant2 + cant3
print "Piezas procesadas: ", suma, "\n"

Mostramos también la cantidad de piezas aptas y las que tienen pesos superiores e inferiores a los márgenes definidos:

print "Piezas aptas: ", cant2, "\n"
print "Piezas con un peso superior a 10.2: ", cant1, "\n"
print "Piezas con un peso inferior a 9.8: ", cant3

Problemas propuestos

  • 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.
  • 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
ejercicio042.rb

suma = 0
loop do
  print "Ingrese un valor (9999 para finalizar):"
  valor = gets.to_i
  if valor == 9999
    break
  end
  suma = suma + valor
end
print "El valor acumulado es ", suma, "\n"
if suma == 0
  print "El valor acumulado es cero."
else
  if suma > 0
    print "El valor acumulado es positivo."
  else
    print "El valor acumulado es negativo."
  end
end




ejercicio043.rb

suma = 0
loop do
  print "Ingrese numero de cuenta:"
  cuenta = gets.to_i
  if cuenta < 0
    break
  end
  print "Ingrese saldo:"
  saldo = gets.to_f
  if saldo > 0
    puts "Saldo Acreedor."
    suma = suma + saldo
  else
    if saldo < 0
      puts "Saldo Deudor."
    else
      puts "Saldo Nulo."
    end
  end
end
print "Total de saldos Acreedores:", suma