16 - Funciones: con retorno de datos

Vimos 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 desde otra función que desarrollemos)

Problema 1

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

Proyecto79 - Principal.kt

fun retornarSuperficie(lado: Int): Int {
    val sup = lado * lado
    return sup
}

fun main(parametro: Array<String>) {
    print("Ingrese el valor del lado del cuafrado:")
    val la = readln().toInt()
    val superficie = retornarSuperficie(la)
    println("La superficie del cuadrado es $superficie")
}

Aparece una nueva palabra clave en Kotlin para indicar el valor devuelto por la función: return

La función retornarSuperficie recibe un parámetro llamado lado de tipo Int. Al final de la declaración de la función disponemos dos puntos y el tipo de dato que retorna la función, en este caso un Int:

fun retornarSuperficie(lado: Int): Int {

definimos una variable local llamada sup donde almacenamos el producto del parámetro lado por sí mismo.

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

fun retornarSuperficie(lado: Int): Int {
    val sup = lado * lado
    return sup
}

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

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

    val superficie = retornarSuperficie(la)

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

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

retornarSuperficie(la)

El dato devuelto (en nuestro caso la superficie del cuadrado) no se almacena.

Si podemos utilizar el valor devuelto para pasarlo a otra función:

    print("La superficie del cuadrado es ")
    println(retornarSuperficie(la))

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

En Kodlin podemos llamar dentro de un String a una función:

    print("La superficie del cuadrado es ${retornarSuperficie(la)}")

Debemos encerrarlo entre llaves y anteceder el caracter $ (luego esto es sustituido por el valor devuelto por la función)

Problema 2

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

Proyecto80 - Principal.kt

fun retornarMayor(v1: Int, v2: Int): Int {
    if (v1 > v2)
        return v1
    else
        return v2
}

fun main(parametro: Array<String>) {
    print("Ingrese el primer valor:")
    val valor1 =readln().toInt()
    print("Ingrese el segundo valor:")
    val valor2 =readln().toInt()
    println("El mayor entre $valor1 y $valor2 es ${retornarMayor(valor1, valor2)}")
}

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

fun retornarMayor(v1: Int, 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.

Problema 3

Confeccionar una función que le enviemos como parámetro un String y nos retorne la cantidad de caracteres que tiene. En la función main solicitar la carga de dos nombres por teclado y llamar a la función dos veces. Imprimir en la main cual de las dos palabras tiene más caracteres.

Proyecto81 - Principal.kt

fun largo(nombre: String): Int {
    return nombre.length
}

fun main(parametro: Array<String>) {
    print("Ingrese un nombre:")
    val nombre1 = readln()
    print("Ingrese otro nombre:")
    val nombre2 = readln()
    if (largo(nombre1) == largo(nombre2))
        print("Los nombres: $nombre1 y $nombre2 tienen la misma cantidad de caracteres")
    else
        if (largo(nombre1) > largo(nombre2))
            print("$nombre1 es mas largo")
        else
            print("$nombre2 es mas largo")
}

Hemos definido una función llamada largo que recibe un parámetro llamado nombre y retorna la cantidad de caracteres que tiene dicha cadena (accedemos a la propiedad length que tiene la clase String para obtener la cantidad de caracteres)

Desde la función main de nuestro programa llamamos a la función largo pasando las variables nombre1 y nombre2:

    if (largo(nombre1) == largo(nombre2))
        print("Los nombres: $nombre1 y $nombre2 tienen la misma cantidad de caracteres")
    else
        if (largo(nombre1) > largo(nombre2))
            print("$nombre1 es mas largo")
        else
            print("$nombre2 es mas largo")

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 del 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:
    fun retornarSuperficie(lado1: Int,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
Proyecto82

fun retornarPromedio(v1: Int, v2: Int, v3: Int): Int {
    val promedio = (v1 + v2 + v3) / 3
    return promedio
}

fun main(parametro: Array<String>) {
    print("Ingrese primer valor:")
    val valor1 = readln().toInt()
    print("Ingrese segundo valor:")
    val valor2 = readln().toInt()
    print("Ingrese tercer valor:")
    val valor3 = readln().toInt()
    println("Valor promedio de los tres números ingresados es ${retornarPromedio(valor1, valor2, valor3)}")
}




Proyecto83

fun retornarPerimetro(lado: Int): Int {
    val perimetro = lado * 4
    return perimetro
}

fun main(parametro: Array<String>) {
    print("Ingrese el lado del cuadrado:")
    val lado = readln().toInt()
    print("El perimetro es: ${retornarPerimetro(lado)}")
}




Proyecto84

fun retornarSuperficie(lado1: Int,lado2: Int): Int {
    return lado1 * lado2
}
fun main(parametro: Array<String>) {
    println("Primer rectangulo")
    print("Ingrese lado menor del rectangulo:")
    val lado1 = readln().toInt()
    print("Ingrese lado mayor del rectangulo:")
    val lado2 = readln().toInt()
    println("Segundo rectangulo")
    print("Ingrese lado menor del rectangulo:")
    val lado3 = readln().toInt()
    print("Ingrese lado mayor del rectangulo:")
    val lado4 = readln().toInt()
    if (retornarSuperficie(lado1,lado2) == retornarSuperficie(lado3,lado4))
        print("Los dos rectangulos tiene la misma superficie")
    else
        if (retornarSuperficie(lado1,lado2) > retornarSuperficie(lado3,lado4))
            print("El primer rectangulo tiene una superficie mayor")
        else
            print("El segundo rectangulo tiene una superficie mayor")
}