15 - Arreglos: recorrido mediante el método each

En Ruby la mayoría de las veces se utilizan métodos y el concepto de bloques para recorrer arreglos en lugar de estructuras repetitivas while y for.

El método más común para iterar un arreglo en Ruby se llama each y tiene dos sintaxis para implementarlo.

Veamos las sintaxis para recorrer el arreglo:

  • arreglo = [10, 5, 25, 4, 3]
    
    arreglo.each do |elemento|
      print elemento, "-"
    end
    

    Estamos llamando al método each y le pasamos un bloque encerrado entre las palabras claves do y end. En concepto de bloques lo veremos en profundidad más adelante, por ahora tenemos que entender que todo lo que se encuentra encerrado entre do y end se ejecuta por cada elemento que tiene el arreglo.

    El bloque tiene acceso en casa iteración o repetición a un elemento del arreglo que se almacena en la variable indicada entre los símbolos |variable|

    Si ejecutamos este programa vemos que aparecen todos los elementos del arreglo: 10-5-25-4-3-

  • Cuando el algoritmo del bloque es muy reducido es común utilizar los símbolos {} en remplazo de las palabras claves do y end.

    arreglo = [10, 5, 25, 4, 3]
    
    arreglo.each { |elemento| print elemento, "-" }
    

    Normalmente los bloques de llaves se utilizan en una sola línea.

Problema 1:

Definir un arreglo que almacene 5 enteros. Sumar todos sus elementos y mostrar dicha suma, utilizar el método each para recorrerlo.

Programa: ejercicio070.rb

arreglo = [10, 5, 2, 20, 50]

suma = 0
arreglo.each {|elemento| suma = suma + elemento}
puts "Arreglo completo", arreglo
puts "La suma de sus componentes es #{suma}"

Definimos un arreglo de 5 elementos enteros:

arreglo = [10, 5, 2, 20, 50]

Inicializamos un acumulador en cero:

suma = 0

Llamamos al método each del arreglo y en cada iteración acumulamos el elemento:

arreglo.each {|elemento| suma = suma + elemento}

Finalmente imprimimos el arreglo y el acumulador:

puts "Arreglo completo", arreglo
puts "La suma de sus componentes es #{suma}"

Problema 2:

Definir por asignación un arreglo con 8 elementos enteros. Contar cuantos de dichos valores almacenan un valor superior a 100.

Programa: ejercicio071.rb

arreglo = [10, 200, 30, 400, 50, 34, 1, 67]

cant = 0
arreglo.each do |elemento|
  if elemento > 100
    cant = cant + 1
  end
end

puts "Arreglo completo", arreglo
puts "La cantidad de elementos mayores a 100 es #{cant}"

En cada ejecución del bloque verificamos si el elemento del arreglo es superior a 100, en dicho caso incrementamos un contador en uno:

cant = 0
arreglo.each do |elemento|
  if elemento > 100
    cant = cant + 1
  end
end

Problemas propuestos

  • Definir un arreglo por asignación con 5 enteros. Mostrar por pantalla solo los elementos con valor iguales o superiores a 7.
  • Definir un arreglo que almacene por asignación los nombres de 5 personas. Contar cuantos de esos nombres tienen 5 o más caracteres.
  • Almacenar en un arreglo los sueldos (valores flotantes) de 5 operarios. Imprimir el arreglo y el promedio de sueldos.
  • Cargar por teclado y almacenar en un arreglo las alturas de 5 personas (valores flotantes)
    Obtener el promedio de las mismas. Contar cuántas personas son más altas que el promedio y cuántas más bajas.
Solución
ejercicio072.rb

arreglo = [8, 1, 9, 2, 10]
puts "Elementos del arreglo con valores iguales o superiores a 7"
arreglo.each do |elemento|
  if elemento >= 7
    puts elemento
  end  
end




ejercicio073.rb

nombres = ["juan", "ana", "marcos", "carlos", "luis"]
cantidad = 0
nombres.each do |elemento|
  if elemento.length >= 5
    cantidad = cantidad + 1
  end
end
puts "Todos los nombres son #{nombres}"
puts "Cantidad de nombres con 5 o mas caracteres: #{cantidad}"




ejercicio074.rb

sueldos = [1000, 2500.54, 1222, 2100, 1333.25]
suma = 0
sueldos.each {|elemento| suma = suma + elemento}
puts "Listado de sueldos: #{sueldos}"
promedio = suma / 5
puts "Promedio de sueldos #{promedio}"




ejercicio075.rb

alturas = []
suma = 0
x = 0
while x < 5
  print"Ingrese la altura:"
  valor = gets.to_f
  alturas << valor
  suma = suma + valor
  x = x + 1
end
puts "Las alturas ingresadas son #{alturas}"
promedio = suma / 5
puts "El promedio de las alturas es #{promedio}"
altas = 0
bajas = 0
alturas.each do |elemento| 
  if elemento > promedio
       altas = altas + 1
  else
    if elemento < promedio
      bajas = bajas + 1
    end
  end  
end
puts "La cantidad de personas mas bajas al promedio es #{bajas}"
puts "La cantidad de personas mas altas al promedio es #{altas}"