24 - Métodos: parámetros

Vimos en el concepto anterior que un método resuelve una parte de nuestro algoritmo.

Tenemos por un lado la declaración del método por medio de un nombre y el algoritmo del método seguidamente. Luego para que se ejecute el método lo llamamos desde el bloque principal de nuestro programa.

Ahora veremos que un método puede tener parámetros para recibir datos. Los parámetros nos permiten comunicarle algo al método y lo hace más flexible.

Problema 1:

Confeccionar una aplicación que muestre una presentación en pantalla del programa. Solicite la carga de dos valores y nos muestre la suma. Mostrar finalmente un mensaje de despedida del programa.

Programa: ejercicio100.rb

def mostrar_mensaje(mensaje)
  puts "*" * 80
  puts mensaje
  puts "*" * 80
end

def carga_suma
  print "Ingrese el primer valor:"
  valor1 = gets.to_i
  print "Ingrese el segundo valor:"
  valor2 = gets.to_i
  suma = valor1 + valor2
  puts "La suma de los dos valores es: #{suma}"
end

# programa principal

mostrar_mensaje "El programa calcula la suma de dos valores ingresados por teclado."
carga_suma
mostrar_mensaje "Gracias por utilizar este programa"

métodos con parámetros en ruby

Ahora para resolver este pequeño problema hemos planteado un método llamado mostrar_mensaje que recibe un parámetro y lo muestra en pantalla, además de mostrar dos líneas con asteriscos

Los parámetros van seguidos del nombre del método pudiendo ir encerrados entre paréntesis o no (y en el caso de tener más de un parámetro los mismos deben ir separados por coma):

   
def mostrar_mensaje(mensaje)
  puts "*" * 80
  puts mensaje
  puts "*" * 80
end

Un parámetro podemos imaginarlo como una variable que solo se puede utilizar dentro del método.

Ahora cuando llamamos al método mostrar_mensaje desde el bloque principal de nuestro programa debemos pasar una variable o un valor:

mostrar_mensaje "Gracias por utilizar este programa"

El String que le pasamos: "El programa calcula la suma de dos valores ingresados por teclado." lo recibe el parámetro del método.

Un método con parámetros nos hace más flexible el mismo para utilizarlo en distintas circunstancias. En nuestro problema el método mostrar_mensaje lo utilizamos tanto para la presentación inicial de nuestro programa como para mostrar el mensaje de despedida. Si no existieran los parámetros estaríamos obligados a implementar dos métodos como vimos en el concepto anterior.

Problema 2:

Confeccionar un método que reciba tres enteros y nos muestre el mayor de ellos. La carga de los valores hacerlo por teclado.

Programa: ejercicio101.rb

def mostrar_mayor(v1, v2, v3)
  print "El valor mayor de los tres numeros es:"
  if v1>v2 && v1>v3
    puts v1
  elsif v2>v3
    puts v2
  else
    puts v3
  end
end  

def cargar
  print "Ingrese el primer valor:"
  valor1 = gets.to_i
  print "Ingrese el segundo valor:"
  valor2 = gets.to_i
  print "Ingrese el tercer valor:"
  valor3 = gets.to_i
  mostrar_mayor valor1,valor2,valor3
end

# programa principal

cargar

Es importante notar que un programa en Ruby no se ejecuta en forma lineal los métodos definidos en el archivo *.rb sino que arranca en la zona del bloque principal. En nuestro ejemplo se llama primero el método "cargar", este método no tiene parámetros.

El método cargar solicita el ingreso de tres enteros por teclado y llama al método mostrar_mayor y le pasa a sus parámetros las tres variable enteras valor1, valor2 y valor3.

El método mostrar_mayor recibe en sus parámetros v1, v2 y v3 los valores cargados en las variables valor1, valor2 y valor3.

Los parámetros son la forma que nos permite comunicar el método cargar con el método mostrar_mayor.

Dentro del método mostrar_mayor no podemos acceder a las variable valor1, valor2 y valor3 ya que son variables locales del método cargar.

La definición mostrar_mayor debe estar escrita antes de la definición del método cargar que es donde la llamamos.

Otra cosa importante es notar que en la sección del programa principal solo llamamos al método cargar, es decir que en esta zona no es obligatorio llamar a cada una de los métodos que definimos.

Acotación

Hemos utilizado una variante del comando if/else en el método mostrar_mayor.

Cuando tenemos varios if anidados es común utilizar en Ruby el comando if/ elsif

Logramos con esta variante de if hacer más legible el algoritmo.

Problema 3:

Desarrollar un programa que permita ingresar el lado de un cuadrado. Luego preguntar si quiere calcular y mostrar su perímetro o su superficie.

Programa: ejercicio102.rb

def mostrar_perimetro(lado)
  per = lado * 4
  puts "El perimetro es #{per}"
end

def mostrar_superficie(lado)
  sup = lado * lado
  puts "La superficie es #{sup}"
end

def cargar_dato()
  print "Ingrese el valor del lado de un cuadrado:"
  la = gets.to_i
  print "Quiere calcular el perimetro o la superficie[ingresar texto: perimetro/superficie]?"
  respuesta = gets.chomp
  if respuesta=="perimetro"
    mostrar_perimetro la
  end
  if respuesta=="superficie"
    mostrar_superficie la
  end
end

# programa principal

cargar_dato

Definimos dos métodos que calculan y muestran el perimetro por un lado y por otro la superficie:

def mostrar_perimetro(lado)
  per = lado * 4
  puts "El perimetro es #{per}"
end

def mostrar_superficie(lado)
  sup = lado * lado
  puts "La superficie es #{sup}"
end

El tercer método permite cargar el lado del cuadrado e ingresar un String que indica que cálculo deseamos realizar si obtener el perímetro o la superficie. Una vez que se ingresó la variable respuesta procedemos a llamar al método que efectúa el calculo respectivo pasando como dato la variable local "la" que almacena el valor del lado del cuadrado.

Los parámetros son la herramienta fundamental para pasar datos cuando hacemos la llamada a una función.

Problemas propuestos

  • Desarrollar un método que reciba un String como parámetro y nos muestre la cantidad de vocales. Llamarlo desde el bloque principal del programa 3 veces con String distintos.
    Tener en cuenta que tenemos el método each_char para iterar con cada caracter del String:
      cadena.each_char do |caracter|
      ........
      end  
    
  • Confeccionar un método que reciba tres enteros y los muestre ordenados de menor a mayor.
    En otro método solicitar la carga de 3 enteros por teclado y proceder a llamar al primer método definido.
Solución
ejercicio103.rb

def cantidad_vocales(cadena)
  cant=0
  cadena.each_char do |caracter|
    if caracter=="a" || caracter=="e" || caracter=="i" || caracter=="o" || caracter=="u"
      cant = cant + 1
    end
  end  
  puts "Cantidad de vocales de la palabra #{cadena} es #{cant}"
end

# bloque principal
cantidad_vocales "hola"
cantidad_vocales "administracion"
cantidad_vocales "correr"




ejercicio104.rb

def ordenar_imprimir(v1, v2, v3)
  if v1<v2 && v1<v3
    if v2<v3
      print v1, "-", v2, "-", v3
    else
      print v1, "-", v3, "-",v2
    end
  elsif v2<v3
    if v1<v3
      print v2, "-", v1, "-", v3
    else
      print v2, "-", v3, "-", v1
    end
  elsif v1<v2
    print v3, "-", v1, "-", v2
  else
    print v3, "-", v2, "-", v1
  end
end            

def cargar()
  print "Ingrese primer valor:"
  num1 = gets.to_i
  print "Ingrese segundo valor:"  
  num2 = gets.to_i
  print "Ingrese tercer valor:"
  num3 = gets.to_i
  ordenar_imprimir num1, num2, num3
end

# bloue principal

cargar