19 - Funciones: con parámetros de tipo int, float32, float64, string

Una función puede recibir uno o más parámetros para que sea más flexible y se adapte a varias situaciones.

Veremos primero funciones que reciban uno o más parámetros de tipo int, float32, float64 y string (más adelante veremos como pasar arrays, slices y otras estructuras de datos)

La sintaxis cuando una función recibe parámetros es:

func [nombre de la función] ([parámetros de la función]) [valor que retorna] {
    [altoritmo]
}

Los parámetros se disponen luego del nombre de la función encerrado entre paréntesis y separados por coma, algunos ejemplos:

func funcion1(v1 int) {
    ....
}

func funcion2(v1 int, v2 int) {
    ....
}

func funcion3(f1 float64, v1 int) {
    ....
}

func funcion4(nombre string) {
    ....
}

Arriba vemos como declarar funciones con uno o más parámetros de tipos int, float64 y string.

Problema 1:

Confeccionar una función que reciba dos enteros e imprima el mayor de ellos. Llamar a la función desde la main cargando previamente dos valores por teclado.

Programa: ejercicio089.go

package main

import "fmt"

func imprimirMayor(v1 int, v2 int) {
    if v1>v2 { 
        fmt.Print("El mayor es ", v1)
    } else {
        fmt.Print("El mayor es ", v2)
    }
}

func main() {
    var valor1,valor2 int
    fmt.Print("Ingrese primer valor:")
    fmt.Scan(&valor1)
    fmt.Print("Ingrese segundo valor:")
    fmt.Scan(&valor2)
    imprimirMayor(valor1, valor2)
}

En este problema se requiere implementar una función que reciba dos enteros y muestre el mayor de ellos. Los parámetros van después del nombre de la función entre paréntesis y separados por coma:

func imprimirMayor(v1 int, v2 int) {

Los parámetros de la función solo se pueden utilizar dentro de dicha función y luego que finaliza de ejecutarse dicha función los mismos se borran de la memoria.

Cuando llamamos a la función desde la main le debemos pasar dos variables enteras, las variables que le pasamos deben estar cargadas con información:

    imprimirMayor(valor1, valor2)

En el momento que se llama la función el contenido de valor1 se copia en el parámetro v1 y el contenido de valor2 se copia en el parámetro v2:

parametros int lenguaje Go

Si por algún motivo modificamos v1 o v2 dentro de la función las variables definidas en la main no cambian.

Los parámetros son la forma de comunicarse entre una función y otra.

Podemos inclusive desde la main llamar a la función inprimirMayor pasando directamente valores enteros:

imprimirMayor(70, 5)

Tengamos en cuenta que en este caso v1 recibe el número 70 y v2 recibe el número 5.

Problema 2:

Confeccionar un programa que solicite el pago por hora de un empleado y la cantidad de horas trabajadas dentro de una estructura repetitiva en la función main. Elaborar una función que reciba como parámetro el valor de la hora y la cantidad de horas trabajadas y nos muestre el total a pagar.

Programa: ejercicio090.go

package main

import "fmt"

func calcularSueldo(costoHora float64, cantidadHoras int) {
    sueldo := costoHora * float64(cantidadHoras)
    fmt.Println("El sueldo total a pagar es ", sueldo)
}

func main() {
    var costoHora float64
    var cantidadHoras int
    var opcion string
    for {
        fmt.Print("Ingrese cuanto se le paga por hora:")
        fmt.Scan(&costoHora)
        fmt.Print("Cuantas horas trabajo:")
        fmt.Scan(&cantidadHoras)
        calcularSueldo(costoHora, cantidadHoras)
        fmt.Print("Desea calcular los datos de otro empleado[s/n]:")
        fmt.Scan(&opcion)
        if (opcion=="n") {
            break
        }
    }
}

Para resolver este problema planteamos una función que reciba como parámetros un float64 y un int, dentro del bloque de la función definimos una variable local llamada sueldo y procedemos a guardar el producto de los dos parámetros. Mostramos finalmente el sueldo total a pagar:

func calcularSueldo(costoHora float64, cantidadHoras int) {
    sueldo := costoHora * float64(cantidadHoras)
    fmt.Println("El sueldo total a pagar es ", sueldo)
}

En la función main procedemos a llamar a la función calcularSueldo y le pasamos a los parámetros dos variables que definimos en la main:

        calcularSueldo(costoHora, cantidadHoras)

No hay ningún problema que las variables que definimos en la función main se llamen igual que los parámetros definidos en la otra función:

func main() {
    var costoHora float64
    var cantidadHoras int

Y los parámetros de la otra función:

func calcularSueldo(costoHora float64, cantidadHoras int) {

Pero recordar que en la memoria de la computadora se almacenan en lugares distintos las variables de la función main y los parámetros de la función calcularSueldo.

Problema 3:

Desarrollar dos funciones que reciban como parámetro el valor del lado de un cuadrado. La primera debe calcular y mostrar la superficie y la segunda calcular y mostrar el perímetro.
En la main llamar a las funciones pasando los valores enteros comprendidos entre 10 y 20

Programa: ejercicio091.go

package main

import "fmt"

func calcularSuperficie(lado int) {
    superficie := lado * lado
    fmt.Println("La superficie de un cuadrado de lado ", lado, " es de ", superficie)
}

func calcularPerimetro(lado int) {
    perimetro := lado * 4
    fmt.Println("El perimetro de un cuadrado de lado ", lado, " es de ", perimetro)
}


func main() {
    for x := 10; x <= 20; x++ {
        calcularSuperficie(x)
        calcularPerimetro(x)
    }
}

Hemos planteado dos funciones que reciben un parámetro de tipo int y cada una implementa el algoritmo:

func calcularSuperficie(lado int) {
    superficie := lado * lado
    fmt.Println("La superficie de un cuadrado de lado ", lado, " es de ", superficie)
}

func calcularPerimetro(lado int) {
    perimetro := lado * 4
    fmt.Println("El perimetro de un cuadrado de lado ", lado, " es de ", perimetro)
}

Desde la función main llamamos a dichas funciones 11 veces a cada una pasando en la primer llamada el valor 10, ya que x vale 10:

func main() {
    for x := 10; x <= 20; x++ {
        calcularSuperficie(x)
        calcularPerimetro(x)
    }
}

Problema 4:

Desarrollar una función que reciba como parámetro un string. Si llega una "h" mostrar por pantalla el mensaje "hombre", si llega una "m" mostrar el mensaje "mujer".
Llamar desde la función main pasando una vez una "h" y otra vez una "m".

Programa: ejercicio092.go

package main

import "fmt"

func mostrarGenero(tipo string) {
    if tipo=="h" {
        fmt.Println("Hombre")
    } else {
        if tipo=="m" {
            fmt.Println("Mujer")
        }
    }
}

func main() {
    mostrarGenero("h")
    mostrarGenero("m")
}

La función mostrarGenero recibe un solo parámetro de tipo string. Dentro del bloque de las llaves según el valor que llega muestra el mensaje "Hombre", "Mujer" según corresponda:

func mostrarGenero(tipo string) {
    if tipo=="h" {
        fmt.Println("Hombre")
    } else {
        if tipo=="m" {
            fmt.Println("Mujer")
        }
    }
}

Desde la función main llamamos a la función mostrarGenero y le pasamos directamente el string "h" en la primer llamada y el string "m" en la segunda llamada:

func main() {
    mostrarGenero("h")
    mostrarGenero("m")
}

Recordar que cuando llamamos a la función no es obligatorio pasar variables sino podemos pasar un valor del mismo tipo que tiene el parámetro.

Otra sintaxis para declarar los parámetros de una función.

Cuando declaramos los parámetros de una función podemos indicar uno a uno su tipo (esta sintaxis hemos estado utilizando en la declaración de los parámetros en los ejercicios anteriores):

func imprimirMayor(v1 int, v2 int) {

Pero si son del mismo tipo podemos agruparlos con la sintaxis:

func imprimirMayor(v1, v2 int) {

Como los dos parámetros son de tipo int se pueden agrupar en la declaración.

Problemas propuestos

  • Confeccionar una función que reciba tres enteros y nos muestre el mayor de ellos. La carga de los valores hacerlo por teclado en la función main.
  • Elaborar una función que reciba un valor entero y nos muestre desde el 1 hasta dicho valor. Si la función recibe un valor negativo mostrar un mensaje de error.
  • Desarrollar una función que reciba como parámetro un string con un único caracter. La función debe mostrar un mensaje si es una vocal o no es una vocal. Debe funcionar tanto con mayúsculas y minúsculas.

Solución
ejercicio093.go

package main

import "fmt"

func mayor(v1, v2, v3 int) {
    fmt.Print("Mayor:")
    if v1 > v2 && v1 > v3 {
        fmt.Println(v1)
    } else {
        if v2 > v3 {
            fmt.Println(v2)
        } else {
            fmt.Println(v3)
        }
    }
}

func main() {
    var valor1, valor2, valor3 int
    fmt.Print("Ingrese primer valor:")
    fmt.Scan(&valor1)
    fmt.Print("Ingrese segundo valor:")
    fmt.Scan(&valor2)
    fmt.Print("Ingrese tercer valor:")
    fmt.Scan(&valor3)
    mayor(valor1, valor2, valor3)
}




ejercicio094.go

package main

import "fmt"

func mostrarHasta(valor int) {
    if valor<0 {
        fmt.Print("Error")
    } else {
        for x := 1; x <= valor; x++ {
            fmt.Print(x," ")
        }
    }
}

func main() {
    mostrarHasta(1000)
}




ejercicio095.go

package main

import "fmt"

func esVocal(letra string) {
    if letra=="a" || letra=="e" || letra=="i" || letra=="o" || letra=="u" ||
       letra=="A" || letra=="E" || letra=="I" || letra=="O" || letra=="U" {
        fmt.Println("El caracter ", letra, " es una vocal.")
    } else {
        fmt.Println("El caracter ", letra, " no es una vocal.")
    }
}


func main() {
    esVocal("A");
    esVocal("a");
    esVocal("z");        
}