25 - Métodos: retorno de datos

Con esta nueva metodología de organizar un programa buscamos dividir un problema en subproblemas y plantear algoritmos en Ruby que los resuelvan.

Vimos que un método lo definimos mediante un nombre y que puede recibir datos por medio de sus parámetros.

Los parámetros son la forma para que un métodos reciba datos para ser procesados. Ahora veremos otra característica de los métodos que es la de devolver un dato a quien invocó al método (recordemos que a un método lo podemos llamar desde el bloque principal de nuestro programa o desde otro método que desarrollemos)

Problema 1:

Confeccionar un método que le enviemos como parámetro el valor del lado de un cuadrado y nos retorne su superficie.

Programa: ejercicio105.rb

 
def retornar_superficie(lado)
    lado * lado
end

# bloque principal del programa
print "Ingrese el valor del lado del cuafrado:"
va = gets.to_i
superficie = retornar_superficie va
puts "La superficie del cuadrado es #{superficie}"

El método retornar_superficie recibe un parámetro llamado lado.

El algoritmo para obtener la superficie de un cuadrado consiste en multiplicar el valor de su lado por si mismo. No es necesario asignar el producto de lado * lado a una variable local. En Ruby el resultado de la última línea del método se retorna a quien llamó el método.

def retornar_superficie(lado)
    lado * lado
end

Hay un cambio importante cuando llamamos o invocamos a un método que devuelve un dato:

superficie = retornar_superficie va

Es decir el valor devuelto por el método retornar_superficie se almacena en la variable superficie.

Es un error lógico llamar al método retornar_superficie y no asignar el valor a una variable:

retornar_superficie va

El dato devuelto se pierde (en nuestro caso el producto de lado * lado)

Si podemos utilizar el valor devuelto para pasarlo a otro método:

puts "La superficie del cuadrado es #{retornar_superficie va}"

El método retornar_superficie devuelve un entero y se lo pasamos al método puts para que lo muestre.

Problema 2:

Confeccionar un método que le enviemos como parámetro un String y nos retorne la cantidad de caracteres que tiene. En el bloque principal solicitar la carga de dos nombres por teclado y llamar al método dos veces. Imprimir en el bloque principal cual de las dos palabras tiene más caracteres.

Programa: ejercicio106.rb

def largo(cadena)
  cadena.length
end  

# bloque principal

print "Ingrese primer nombre:"
nombre1 = gets.chomp
print "Ingrese segundo nombre:"
nombre2 = gets.chomp
la1 = largo nombre1
la2 = largo nombre2
if la1==la2
  puts "Los nombres: #{nombre1},#{nombre2} tienen la misma cantidad de caracteres"
elsif la1>la2
  puts "#{nombre1} es mas largo"
else
  puts "#{nombre2} es mas largo"
end  

Hemos definido un método llamado largo que recibe un parámetro llamado cadena y retorna la cantidad de caracteres que tiene dicha cadena (utilizamos el método length para obtener la cantidad de caracteres del String)

Desde el bloque principal de nuestro programa llamamos al método largo pasando primero un String y guardando en una variable el entero devuelto:

la1 = largo nombre1

En forma similar calculamos el largo del segundo nombre:

la2 = largo nombre2

Solo nos queda analizar cual de las dos variables tiene un valor mayor para indicar cual tiene más caracteres:

if la1==la2
  puts "Los nombres: #{nombre1},#{nombre2} tienen la misma cantidad de caracteres"
elsif la1>la2
  puts "#{nombre1} es mas largo"
else
  puts "#{nombre2} es mas largo"
end  

Problema 3:

Confeccionar un método que le enviemos como parámetros dos enteros y nos retorne el mayor.

Programa: ejercicio107.rb

 
def retornar_mayor(v1, v2)
  if v1 > v2
    return v1
  end
    return v2
end

# bloque principal

print "Ingrese el primer valor:"
valor1 = gets.to_i
print "Ingrese el segundo valor:"
valor2 = gets.to_i
puts retornar_mayor(valor1, valor2)

Tenemos un método que recibe dos parámetros y debe retornar el mayor de ellos.

En Ruby si queremos que finalice el método y retorne inmediatamente un valor podemos utilizar la palabra clave return y el valor a retornar:

def retornar_mayor(v1, v2)
  if v1 > v2
    return v1
  end
    return v2
end

Cuando un método encuentra la palabra return no sigue ejecutando el resto del método sino que sale a la línea del programa desde donde llamamos a dicho método.

Si queremos podemos implementarlo sin utilizar return definiendo una variable local:

def retornar_mayor(v1, v2)
  if v1 > v2
    mayor = v1
  else
    mayor = v2
  end
  mayor    
end

Problemas propuestos

  • Elaborar un método que reciba tres enteros y nos retorne el valor promedio de los mismos.
  • Elaborar un método que nos retorne el perímetro de un cuadrado pasando como parámetros el valor de un lado.
  • Confeccionar un método que calcule la superficie de un rectángulo y la retorne, el método recibe como parámetros los valores de dos de sus lados:
    def retornar_superficie(lado1, lado2)
    
    En el bloque principal del programa cargar los lados de dos rectángulos y luego mostrar cual de los dos tiene una superficie mayor.
  • Plantear un método que reciba un String en mayúsculas o minúsculas y retorne la cantidad de letras 'a' o 'A'.
Solución
ejercicio108.rb

def retornar_promedio(v1, v2, v3)
  (v1 + v2 + v3) / 3
end


# bloque principal

print "Ingrese primer valor:"
valor1 = gets.to_i
print "Ingrese segundo valor:"
valor2 = gets.to_i
print "Ingrese tercer valor:"
valor3 = gets.to_i
puts "Valor promedio de los tres numeros #{retornar_promedio(valor1,valor2,valor3)}"




ejercicio109.rb

def retornar_perimetro(lado)
  lado * 4
end

# bloque principal

print "Lado del cuadrado:"
lado = gets.to_i
puts "El perimetro es: #{retornar_perimetro(lado)}"




ejercicio110.rb

def retornar_superficie(lado1, lado2)
  lado1 * lado2
end

# bloque principal

puts "Primer rectangulo"
print "Ingrese lado menor del rectangulo:"
lado1 = gets.to_i
print "Ingrese lado mayor del rectangulo:"
lado2 = gets.to_i
puts "Segundo rectangulo"
print "Ingrese lado menor del rectangulo:"
lado3 = gets.to_i
print "Ingrese lado mayor del rectangulo:"
lado4 = gets.to_i
if retornar_superficie(lado1, lado2) == retornar_superficie(lado3,lado4)
  puts "Los dos rectangulos tiene la misma superficie"
elsif retornar_superficie(lado1, lado2) > retornar_superficie(lado3, lado4)
  puts "El primer rectangulo tiene una superficie mayor"
else
  puts "El segundo rectangulo tiene una superficie mayor"
end




ejercicio111.rb

def cantidad_vocal_a(palabra)
  cant=0
  palabra.each_char do |letra| 
    if letra == "a" || letra == "A"
      cant = cant + 1
    end
  end
  cant
end

# bloque principal
print "Ingrese una palabra:"
palabra = gets.chomp
puts "La palabra #{palabra} tiene #{cantidad_vocal_a(palabra)} letras a o A"