20 - Funciones: con retorno de un único valor

Hemos visto que una función la definimos mediante un nombre y que puede recibir datos por medio de sus parámetros.

Los parámetros son la forma para que una función reciba datos para ser procesados. Ahora veremos otra característica de las funciones que es la de devolver un dato a quien invocó la función (recordemos que una función la podemos llamar desde la función main o inclusive desde otras funciones de nuestro programa)

Problema 1:

Confeccionar una función que le enviemos como parámetro el valor del lado de un cuadrado y nos retorne su superficie.

Programa: ejercicio096.go

package main

import "fmt"

func retornarSuperficie(lado int) int {
    superficie := lado * lado
    return superficie
}

func main() {
    var valor int
    fmt.Print("Ingrese el valor del lado del cuadrado:")
    fmt.Scan(&valor)
    sup := retornarSuperficie(valor)
    fmt.Print("La superficie del cuadrado es ", sup)
}

Cuando una función retorna un valor indicamos al final de la función el tipo de dato que retorna (puede ser alguno de los tipos de datos que conocemos: int, float32, float64, string u otros tipos que veremos más adelante):

func retornarSuperficie(lado int) int {

En nuestro ejemplo la función retornarSuperficie devuelve un int.

La función retornarSuperficie recibe un parámetro llamado lado, definimos una variable local llamada superficie donde almacenamos el producto del parámetro lado por sí mismo.

La variable local superficie es la que retorna la función mediante la palabra clave return:

func retornarSuperficie(lado int) int {
    superficie := lado * lado
    return superficie
}

Hay que tener en cuenta que las variables locales (en este caso superficie) solo se pueden consultar y modificar dentro de la función donde se las define, no se tienen acceso a las mismas en la función main del programa o dentro de otra función.

Hay un cambio importante cuando llamamos o invocamos a una función que devuelve un dato:

    sup := retornarSuperficie(valor)

Es decir el valor devuelto por la función retornarSuperficie se almacena en la variable sup.

Es un error lógico llamar a la función retornarSuperficie y no asignar el valor a una variable:

retornarSuperficie(valor)

El dato devuelto por la función (en nuestro caso la superficie del cuadrado) no se almacena y se pierde sin que podamos imprimirlo.

Si podemos utilizar el valor devuelto para pasarlo a otra función como por ejemplo a Print:

    fmt.Print("La superficie del cuadrado es ", retornarSuperficie(valor))

La función retornarSuperficie devuelve un entero y se lo pasamos a la función Print para que lo muestre.

Problema 2:

Confeccionar una función que defina dos parámetros enteros y nos retorne el mayor.

Programa: ejercicio097.go

package main

import "fmt"

func retornarMayor(v1, v2 int) int {
    var mayor int
    if v1 > v2 {
        mayor = v1
    } else {
        mayor = v2
    }
    return mayor
}

func main() {
    var valor1, valor2 int
    fmt.Print("Ingrese el primer valor:")
    fmt.Scan(&valor1)
    fmt.Print("Ingrese el segundo valor:")
    fmt.Scan(&valor2)
    fmt.Print("El valor mayor es ", retornarMayor(valor1,valor2))
}

Estamos definiendo una función que recibe dos parámetros y retorna el mayor de ellos:

func retornarMayor(v1, v2 int) int {
    var mayor int
    if v1 > v2 {
        mayor = v1
    } else {
        mayor = v2
    }
    return mayor
}

Si queremos podemos hacerla más sintética a esta función sin tener que guardar en una variable local el valor a retornar:

func retornarMayor(v1, v2 int) int {
    if v1 > v2 {
        return v1
    } else {
        return v2
    }
}

Cuando una función encuentra la palabra return no sigue ejecutando el resto de la función sino que sale a la línea del programa desde donde llamamos a dicha función.

Problemas propuestos

  • Elaborar una función que reciba tres enteros y nos retorne el valor promedio de los mismos.
  • Elaborar una función que nos retorne el perímetro de un cuadrado pasando como parámetros el valor de un lado.
  • Confeccionar una función que calcule la superficie de un rectángulo y la retorne, la función recibe como parámetros los valores de dos de sus lados:
    func retornarSuperficie(lado1,lado2 int) int {
    
    En la función main del programa cargar los lados de dos rectángulos y luego mostrar cual de los dos tiene una superficie mayor.
Solución
ejercicio098.go

package main

import "fmt"

func promedio(v1, v2, v3 int) int {
    suma := v1 + v2 + v3
    pro := suma / 3
    return pro
}

func main() {
    var valor1, valor2, valor3 int
    fmt.Printf("Ingrese primer valor:")
    fmt.Scan(&valor1)
    fmt.Print("Ingrese segundo valor:")
    fmt.Scan(&valor2)
    fmt.Print("Ingrese tercer valor:")
    fmt.Scan(&valor3)
    fmt.Print("El promedio de los tres valores es ", promedio(valor1,valor2,valor3))
}



ejercicio099.go

package main

import "fmt"

func retornarPerimetro(lado int) int {
    perimetro := lado * 4
    return perimetro
}

func main() {
    var lado int
    fmt.Print("Ingrese el lado de un cuadrado:")
    fmt.Scan(&lado)
    fmt.Print("El perimetro es: ", retornarPerimetro(lado))
}




ejercicio100.go

package main

import "fmt"

func retornarSuperficie(lado1,lado2 int) int {
    superficie := lado1 * lado2
    return superficie
}

func main() {
    var lado1, lado2, lado3, lado4 int
    fmt.Println("Primer rectangulo")
    fmt.Print("Ingrese lado menor del rectangulo:")
    fmt.Scan(&lado1)
    fmt.Print("Ingrese lado mayor del rectangulo:")
    fmt.Scan(&lado2)
    fmt.Println("Segundo rectangulo")
    fmt.Print("Ingrese lado menor del rectangulo:")
    fmt.Scan(&lado3)
    fmt.Print("Ingrese lado mayor del rectangulo:")
    fmt.Scan(&lado4)
    if retornarSuperficie(lado1, lado2) == retornarSuperficie(lado3, lado4) {
        fmt.Print("Los dos rectangulos tiene la misma superficie")
    } else {
        if retornarSuperficie(lado1, lado2) > retornarSuperficie(lado3, lado4) {
            fmt.Print("El primer rectangulo tiene una superficie mayor")
        } else {
            fmt.Print("El segundo rectangulo tiene una superficie mayor")
        }
    }
}