27 - Métodos: retorno de un dato de tipo Array o Hash

Hemos avanzado y visto que un método puede recibir como parámetros tipos de datos simples como enteros, flotantes etc. y estructuras de datos tipo Array y Hash.

Lo nuevo en este concepto es que un método también puede retornar una estructura de datos tipo Array o Hash.

Problema 1:

Confeccionar un método que cargue por teclado un Array de 5 enteros y lo retorne. Un segundo método debe recibir un Array y mostrar todos los valores mayores a 10. Desde el bloque principal del programa llamar a ambos métodos.

Programa: ejercicio118.rb

def cargar()
  arreglo = []
  for x in 1..5
    print "Ingrese valor:"
    valor = gets.to_i
    arreglo << valor
  end
  return arreglo
end

def imprimir_mayor10(arreglo)
  print "Elementos del arreglo mayores a 10:"
  arreglo.each do |elemento|
    if elemento > 10
      print elemento, "-"
    end
  end
end

# bloque principal del programa

arreglo = cargar
imprimir_mayor10 arreglo

Recordemos que el programa empieza a ejecutarse desde el bloque principal y no se ejecutan cada método en forma lineal. Lo primero que hacemos en el bloque principal del programa es llamar al método cargar y se lo asignamos a una variable que recibirá el arreglo:

arreglo = cargar

En el método cargar definimos una variable local de tipo Array donde procedemos a insertar componentes por teclado. Al final del método mediante un return retornamos el arreglo para que lo reciba quien llamó al método:

def cargar
  arreglo = []
  for x in 1..5
    print "Ingrese valor:"
    valor = gets.to_i
    arreglo << valor
  end
  return arreglo
end

En el segundo método se muestran todas las componentes que tienen un valor mayor a 10:

def imprimir_mayor10(arreglo)
  print "Elementos del arreglo mayores a 10:"
  arreglo.each do |elemento|
    if elemento > 10
      print elemento, "-"
    end
  end
end

Problema 2:

Confeccionar un método que cargue por teclado un arreglo de 5 enteros y lo retorne. Un segundo método debe recibir un arreglo y retornar el mayor y el menor valor del mismo. Desde el bloque principal del programa llamar a ambos métodos e imprimir el mayor y el menor valor del arreglo.

Programa: ejercicio119.rb

def cargar()
  arreglo = []
  for x in 1..5
    print "Ingrese valor:"
    valor = gets.to_i
    arreglo << valor
  end
  return arreglo
end

def retornar_mayormenor(arreglo)
  ma = arreglo[0]
  me = arreglo[0]
  arreglo.each do |elemento|
    if elemento > ma
      ma = elemento
    elsif elemento < me
      me = elemento
    end
  end
  return [ma, me]
end

# bloque principal del programa

arreglo = cargar
rango = retornar_mayormenor arreglo
puts "Mayor elemento del arreglo: #{rango[0]}"
puts "Menor elemento del arreglo: #{rango[1]}"

Lo interesante que tenemos que sacar de este ejemplo es que cuando tenemos que retornar varios valores podemos utilizar un Array. El método retornar_mayormenor debe devolver dos enteros, y la forma de hacerlo en Ruby es mediante un Array.

En el método retornar_mayormenor definimos dos variables locales donde almacenamos el primer elemento del arreglo que recibimos como parámetro:

def retornar_mayormenor(arreglo)
  ma = arreglo[0]
  me = arreglo[0]

Luego mediante la llamada al método each analizamos cada elemento y verificamos si hay alguno que sea mayor al que hemos considerado mayor hasta ese momento, lo mismo con el menor:

  arreglo.each do |elemento|
    if elemento > ma
      ma = elemento
    elsif elemento < me
      me = elemento
    end
  end

Cuando sale del each ya tenemos almacenadas en las variables ma y me el valor mayor y el valor menor del arreglo.

La sintaxis para devolver ambos datos es crear una Array e indicando en cada elemento la variable respectiva:

  return [ma, me]

Ahora cuando llamamos a este método desde el bloque principal del programa sabemos que nos retorna un Array y que el primer elemento representa el mayor del Array y el segundo elemento representa el menor del Array:

rango = retornar_mayormenor arreglo
puts "Mayor elemento del arreglo: #{rango[0]}"
puts "Menor elemento del arreglo: #{rango[1]}"

Problemas propuestos

  • En una empresa se necesita almacenar los nombres de 5 empleados y sus sueldos (utilizar un Hash)
    Desarrollar los siguientes métodos y llamarlas desde el bloque principal:
    1) Carga de los sueldos.
    2) Impresión de todos los empleados y sus sueldos.
    3) Cuántos tienen un sueldo superior a $4000.
    3) Retornar el promedio de los sueldos.
    4) Mostrar todos los sueldos que están por debajo del promedio.
  • Desarrollar una aplicación que permita ingresar por teclado los nombres de 5 artículos y sus precios (Hash)
    Definir los siguientes métodos:
    1) Cargar los nombres de articulos y sus precios.
    2) Imprimir los nombres y precios.
    3) Imprimir el nombre de artículo con un precio mayor
    4) Ingresar por teclado un importe y luego mostrar todos los artículos con un precio menor igual al valor ingresado.
  • Confeccionar un programa que permita:
    1) Cargar un Array de 10 elementos enteros.
    2) Generar dos Arrays a partir del primero. En uno guardar los valores positivos y en el otro los negativos.
    3) Imprimir las dos Arrays generadas.
Solución
ejercicio120.rb

def cargar
  empleados = Hash.new
  for x in 1..5
    print "Ingrese el nombre del empleado:"
    nombre = gets.chomp
    print "Ingrese su sueldo:"
    sueldo = gets.to_f
    empleados[nombre] = sueldo
  end
  return empleados
end

def imprimir(empleados)
  empleados.each do |nombre, sueldo|
    puts "Nombre: #{nombre} sueldo=#{sueldo}"
  end
end

def sueldos_mayor_4000(empleados)
  puts "Empleados con sueldo superior a 4000."
  empleados.each do |nombre, sueldo|
    if sueldo > 4000
      puts "Nombre: #{nombre} sueldo=#{sueldo}"
    end
  end
end

def promedio_sueldos(empleados)
  suma = 0
  empleados.each do |nombre, sueldo|
    suma = suma + sueldo
  end
  suma / empleados.length
end

def sueldos_inferior_promedio(empleados, pro)
  puts "Empleados con sueldo inferior al promedio."
  empleados.each do |nombre, sueldo|
    if sueldo < pro
      puts "Nombre: #{nombre} sueldo=#{sueldo}"
    end
  end
end

# bloque principal del programa

empleados = cargar
imprimir empleados
sueldos_mayor_4000 empleados
pro = promedio_sueldos empleados
puts "Promedio de los sueldos #{pro}"
sueldos_inferior_promedio empleados, pro




ejercicio121.rb

def cargar
  articulos = Hash.new
  for x in 1..5
    print "Ingrese la descripción del artículo:"
    descripcion = gets.chomp
    print "Ingrese el precio:"
    precio = gets.to_f
    articulos[descripcion] = precio
  end
  return articulos
end

def imprimir(articulos)
  puts "Listado completo de artículos"
  articulos.each do |descripcion, precio|
    puts "Descripción: #{descripcion} precio=#{precio}"
  end
end

def articulo_precio_mayor(articulos)
  mayor = 0
  nom = ""
  articulos.each do |descripcion, precio|
    if precio > mayor
      mayor = precio
      nom = descripcion
    end
  end
  puts "Artículo con un precio mayor: #{nom}"
end

def precio_menor(articulos)
  print "Ingrese un importe:"
  importe = gets.to_f
  puts "Listado de artículos con un precio menor al ingresado"
  articulos.each do |descripcion, precio|
    if precio < importe
      puts "Descripción: #{descripcion} precio=#{precio}"
    end
  end
end

# bloque principal del programa

articulos = cargar
imprimir articulos
articulo_precio_mayor articulos
precio_menor articulos



ejercicio122.rb

def cargar
  arreglo=[]
  for x in 1..10
    print "Ingrese valor:"
    valor = gets.to_i
    arreglo << valor
  end
  return arreglo
end

def generar(arreglo)
  arreglo1 = []
  arreglo2 = []
  arreglo.each do |elemento|
    if elemento > 0 
      arreglo1 << elemento
    elsif elemento < 0
      arreglo2 << elemento
    end
  end
  return [arreglo1, arreglo2]  
end

def imprimir(arreglo)
  arreglo.each do |elemento|
    print elemento,"  "
  end
  print "\n"
end


# bloque principal del programa

arreglo = cargar
arreglos = generar(arreglo)
puts "Arreglo generado con valores positivos"
imprimir(arreglos[0])
puts "Arreglo generado con valores negativos"
imprimir(arreglos[1])