PROGRAMACIÓN I

Docente: Flor Cárdenas Mariño

Tema: El lenguaje de programación Kotlin

U202016866 – Yamile Izaguirre

U202015652 – Diego Albitres

Ciclo: 2020-I

ÍNDICE

Introducción

Kotlin es un lenguaje de programación de código abierto y gratuito, con usos múltiples. Tiene un tipado estático diseñado principalmente para la JVM (Máquina virtual de Java) y para desarrollo de aplicaciones para Android. Este combina características de programación funcional y la programación orientada a objetos. Además, se enfoca mucho en la interoperabilidad con Java, la claridad del lenguaje y el soporte de herramientas para su desarrollo.

Historia

La idea del lenguaje Kotlin surgió en 2011, cuando los programadores de la compañía JetBrains buscaban sustituir Java en proyectos de Android. Fue creado con el objetivo de que fuese un lenguaje con las características de Scala, pero sin todo el tiempo de compilación de este.

En 2012 empezó a ser un proyecto de código abierto bajo Licencia Apache y en 2014 se publicó un directorio de ejercicios para aprender este lenguaje. Finalmente, su primer versión estable (Kotlin v1.0) fue lanzada el 15 de febrero de 2016.

CONCEPTOS BÁSICOS

// archivo: holamundo.kt
package com.example.name

fun holaMundo() {
    println("¡Hola, mundo!")
    print("¡Kotlin!")
    println("¡Es genial!")
}

// archivo: app.kt
import com.example.name.holaMundo
import kotlin.text.*

fun main(): Int {
    holaMundo()
    return 0
}

/*
    Resultado:

    ¡Hola, mundo!
    ¡Kotlin! ¡Es genial!
*/

Packages & imports

FUNCIÓN PRINCIPAL

FUNCIONES

SINTÁXIS BÁSICA

MOSTRAR TEXTO EN PANTALLA

fun main() {
    val a: Int = 1
    val b = 2
    val c: Int
    c = 3
  
    var x = 5
    x += 1
  
    val entrada = readLine()
    val entero = readLine()!!.toInt()
  
    println("a + b + c es ${a + b + c + x}")
    println("Entrada 1: $entrada")
    println("Entrada 2: $entero")
}

/*
    Resultado:
    
    Dato1
    50
    a + b + c + x es 12
    Entrada 1: Dato1
    Entrada 2: 50
*/

variables de solo-lectura

VARIABLES

entrada de datos

STRING TEMPLATES

fun sumar(a: Int, b: Int) = a + b

fun mostrarSuma(a: Int, b: Int): Unit {
    println("La suma es ${a + b}")
}

fun main() {
    val a = readLine()!!.toInt()
    val b = readLine()!!.toInt()
    
    if (a >= 0 && b >= 0) {
    	println("Suma: ${sumar(a, b)}")
    } else {
        println("Solo números positivos.")
    }
}

/*
    Resultado:
    
    5
    25
    Suma: 30
*/

argumentos en funciones

valor de retorno

condicionales

tipos de datos

Tipo Valor Mínimo Valor Máximo
Byte -128 127
Short -32768 32767
Int -2,147,483,648 (-2^31) 2,147,483,647 (2^31 - 1)
Long -9,223,372,036,854,775,808 (-2^63) 9,223,372,036,854,775,807 (2^63- 1)
// El tipo de valor se infiere.
// Por defecto, los valores reciben el tipo Int a menos que se necesite un Long

val a = 1 // Int
val largo = 3000000000 // Long
val aLong = 1L // Long
val aByte: Byte = 1

// Para hacer los números largos más legibles, se puede utilizar _.

val millon = 1_000_000
val tarjeta = 1234_5678_9012_3456L
Tipo Cantidad de decimales
Float 6-7
Double 15-16
// El tipo de valor se infiere.
// Por defecto, los valores que tengan decimales reciben el tipo Double

val pi = 3.14 // Double
val ejemplo1 = 2.7182818284 // Double
val ejemplo2 = 2.7182818284f // Float, por lo tanto queda como 2.7182817 (se aproxima)

// No hay conversión implicita de datos

fun main() {
    fun mostrarDouble(d: Double) { print(d) }

    val flo = 1.1f
    val entero = 1
    val dou = 1.1
    
    mostrarDouble(dou)
    mostrarDouble(entero) // Error de tipo de dato
    mostrarDouble(flo) // Error de tipo de dato
}
#include <bits/stdc++.h>
using namespace std;

int main() {
    char letra;
    
    cout << "Ingrese una letra: ";
    cin >> letra;
    
    int num = letra;
    
    cout << "Código ASCII: " << num << endl; 
}

/*
    Resultado:
    
    Ingrese una letra: F
    Código ASCII: 70
*/

NO ES VÁLIDO EN KOTLIN

fun main() {
    print("Ingrese una letra:")
    
    val letra = readLine()!!.toCharArray()[0]
    val num = letra.toInt()
    println("Código ASCII: $num")
    
    /* o también: */
    val letra = readLine()!!.toCharArray()[0].toInt()
    println("Código ASCII: $letra")
}

/*
    Resultado:
    
    Ingrese una letra: F
    Código ASCII: 70
*/

versiones

Kotlin v1.0 se lanzó el 15 de febrero de 2016 y se considera la primera versión oficialmente estable.

Kotlin v1.1 se lanzó el 1 de marzo de 2017. En esta versión se incluye soporte oficial para compilar código a JavaScript y se introducen las co-rutinas como una función experimental.

Kotlin v1.2 se lanzó el 28 de noviembre de 2017. En esta versión se añadió la posibilidad de reusar el código entre plataformas (Java y JavaScript). Además, se añadió soporte experimental para proyectos multiplataforma.

Kotlin v1.3 fue lanzado el 29 de octubre de 2018, introduciendo soporte oficial para co-rutinas en funciones asíncronas.

APLICACIONES REALES

Se aventuró a usar Kotlin como el lenguaje principal para su aplicación móvil, incluso antes de que Google anuncie el soporte oficial para Kotlin en aplicaciones de Android.

Es una aplicación escrita completamente en Kotlin. Los desarrolladores afirmaron que al elegir este lenguaje hubo una gran diferencia de comodidad, calidad y velocidad a favor.

Al no tener organizaciones separadas de Android y iOS, decidieron usar Kotlin porque esta se parece mucho a Swift y eso ayuda a que haya una mejor comunicación, intercambio de conocimientos entre ingenieros y un desarrollo más eficiente.

EJEMPLOS

Ejemplo 1

Una empresa constructora vende terrenos con la Forma I (ver figura). Realice un programa en Kotlin para obtener el área respectiva de un terreno de medidas de cualquier valor.

Nota: Para resolver este problema se debe identificar que la forma A está compuesta por dos figuras: un triángulo de base B y de altura (A - C); y por otro lado, un rectángulo que tiene base B y altura C.

Ejercicio tomado de la primera hoja de ejercicios de Algoritmos.

Forma I

B

A

C

(A - C)

fun main() {
    print("Ingrese el valor de A: ")
    val a = readLine()!!.toInt()
    print("Ingrese el valor de B: ")
    val b = readLine()!!.toInt()
    print("Ingrese el valor de C: ")
    val c = readLine()!!.toInt()

    val areaTriangulo = (b * (a - c)) / 2
    val areaRectangulo = b * c
    val areaTotal = areaTriangulo + areaRectangulo

    println("El área de la figura es $areaTotal")
}

/*
    Ingrese el valor de A: 5
    Ingrese el valor de B: 10
    Ingrese el valor de C: 20
    El área de la figura es 125
*/

Ejemplo 2

En una entidad del estado se está realizando un proceso de calificación del personal que labora en la misma. Conocedores de su habilidad en la programación le solicitan que escriba una aplicación que ayude a determinar el puntaje que obtiene un empleado.

Se le solicita que elabore un programa en Kotlin que reciba como datos la cantidad de años que el empleado labora en la entidad y los estudios realizados y nos determine e imprima el puntaje obtenido.

Ejercicio tomado de la sexta hoja de ejercicios de programación en C++.

Estudios Puntos
Primarios 5
Secundarios 10
Universitarios 20
Posgrado 30
Años Puntos
< 5 5
>= 5 10

Para realizar la calificación se tomará en cuenta los siguientes criterios de asignación de puntos:

fun main() {
    print("Ingrese la cantidad de años que labora: ")
    var years = readLine()!!.toInt()
    print("Estudios (P: Primaria; S: Secundaria; U: Universitario; G: Posgrado): ")
    var studies = readLine()!!.toCharArray()[0].toUpperCase()

    var points: Int = 0

    if (years < 5) {
        points = 5
    } else if (years >= 5) {
        points = 10
    }

    when (studies) {
        'P' -> points += 5
        'S' -> points += 10
        'U' -> points += 20
        'G' -> points += 30
    }

    println("Puntaje obtenido: $points")
}

/*
    Ingrese la cantidad de años que labora: 7
    Estudios (P: Primaria; S: Secundaria; U: Universitario; G: Posgrado): U
    Puntaje obtenido: 30
*/

Ejemplo 3

Una empresa de transporte desea contar con una aplicación, que permita descomponer el código de salida de sus buses y determinar el departamento de destino, hora de salida y si se realizan paradas o no. Para desarrollar la aplicación, se debe considerar que todos los códigos de salida tienen 4 dígitos, donde el primer dígito se utiliza para determinar el departamento de destino, los siguientes 2 dígitos indican la hora de salida y el último dígito señala si se realizan paradas o no.

Se le pide a usted elaborar un programa en Kotlin que solicite UN código de salida (de 4 dígitos, dato que tiene que validar) y determine el departamento, hora de salida y si se realizan paradas o no y muestre un mensaje en el siguiente formato: 

Nota: No se olvide de realizar las validaciones necesarias para que la aplicación funcione correctamente.

Ejercicio tomado de la novena hoja de ejercicios de programación en C++.

Código Departamento
1 Piura
2 Ica
3 Ayacucho
Código Paradas
1
2 No

Para determinar el departamento y si se realizan paradas o no deberá utilizar las siguientes tablas:

fun main() {
    print("Ingrese un código de salida: ")
    val code = readLine()!!.toInt()

    val cityCode: Int = code / 1000
    val hour: Int = (code % 1000) / 10
    val stopCode: Int = ((code % 1000) % 10)

    var city: String = ""
    var stop: String = ""

    when (cityCode) {
        1 -> city = "Piura"
        2 -> city = "Ica"
        3 -> city = "Ayacucho"
    }

    when (stopCode) {
        1 -> stop = "Sí"
        2 -> stop = "No"
    }

    println("Departamento de destino: $city")
    println("Hora de salida: $hour")
    println("Realizan paradas: $stop")
}

/*
    Ingrese un código de salida: 1182
    Departamento de destino: Piura
    Hora de salida: 18
    Realizan paradas: No
*/

Ejemplo 4

Una empresa de software tiene planificado comprar programas para el desarrollo de aplicaciones móviles. El costo es variable según el fabricante elegido. También deberá elegir el tipo de programa y si es Lenguaje de Programación debe elegir el dispositivo (Celulares, Tablas y Otros). La tabla de precios es la siguiente:

Se le pide elaborar un programa en Kotlin que permita determinar el costo total por la compra del programa elegido si se tienen como datos el fabricante (M: Microsoft; A: Apple; L: Linux), el tipo de programa (S: Sistema operativo; L: Lenguaje de programación) y el dispositivo (C: Celular; T: Tabla; O: Otros).

Nota: Debe validar los datos de entrada para una correcta ejecución de su programa.

Ejercicio tomado de la tercera hoja de ejercicios de estructuras selectivas en C++.

import kotlin.system.exitProcess

fun getPricing(fabr: Char, disp: Char?): Int {
    if (disp == null) {
        when (fabr) {
            'M' -> return 1500
            'A' -> return 2500
            'L' -> return 1000
        }
    } else {
        when (fabr) {
            'M' -> {
                if (disp == 'C') return 1800
                if (disp == 'T') return 1200
                if (disp == 'L') return 900
            }
            'A' -> {
                if (disp == 'C') return 1900
                if (disp == 'T') return 1800
                if (disp == 'L') return 1600
            }
            'L' -> {
                if (disp == 'C') return 100
                if (disp == 'T') return 150
                if (disp == 'L') return 50
            }
        }
    }

    return 0
}
fun main() {
    print("Fabricante: ")
    val fabr = readLine()!!.toCharArray()[0].toUpperCase()

    if (!(fabr == 'M' || fabr == 'A' || fabr == 'L')) {
        println("El fabricante ingresado no es válido.")
        exitProcess(1)
    }

    print("Tipo de programa: ")
    val type = readLine()!!.toCharArray()[0].toUpperCase()

    if (!(type == 'S' || type == 'L')) {
        println("El tipo de programa ingresado no es válido.")
        exitProcess(1)
    }

    if (type == 'L') {
        print("Ingrese el tipo de dispositivo: ")
        val disp = readLine()!!.toCharArray()[0].toUpperCase()

        if(!(disp == 'C' || disp == 'T' || disp == 'O')) {
            print("El tipo de dispositivo ingresado no es válido.")
            exitProcess(1)
        }

        println("Precio final: ${getPricing(fabr, disp)} soles.")
    } else {
        println("Precio final: ${getPricing(fabr, null)} soles.")
    }
}
/*
    Fabricante: M
    Tipo de programa: L
    Ingrese el tipo de dispositivo: C
    Precio final: 1800 soles.
*/

Conclusiones

  • Kotlin es un lenguaje de tipado estático que combina programación orientada a objetos y la programación funcional.
  • Tiene como puntos clave su interoperabilidad con Java, la claridad del lenguaje y un gran soporte de herramientas para su desarrollo.
  • Está desarrollado en base a la JVM, pero también se puede usar para web.
  • Surgió en 2011 como la idea de JetBrains para reemplazar Java.
  • Diversas empresas ya han empezado a utilizarlo como lenguaje principal de sus aplicaciones al tener gran soporte de Google para Android.

Bibliografía

Popko, A. (2018). 10 Android Apps Written in Kotlin - Examples of Successful Applications. Recuperado de: https://bit.ly/2xjgVbw.

Alcón, I. (2019). Kotlin, el lenguaje de programación de Android que usamos en Geographica. Recuperado de: https://bit.ly/2yTxJq8.

Kotlin Docs – Basic Syntax. (s.f.). Recuperado de: https://bit.ly/3aO74bt.

Kotlin Docs – Basic Types. (s.f.). Recuperado de: https://bit.ly/2zIMigz.

Kotlin Docs – Coding Conventions. (s.f.). Recuperado de: https://bit.ly/3bRqNZ5.

Primera hoja de ejercicios de Algoritmos. (2020). Recuperado de: https://bit.ly/2yR0Vho.

Sexta hoja de ejercicios de Programación en C++. (2020). Recuperado de: https://bit.ly/3aQpTKY.

Novena hoja de ejercicios de programación en C++. (2020). Recuperado de: https://bit.ly/2VOvYn2.

Tercera hoja de ejercicios de estructuras selectivas. (2020). Recuperado de: https://bit.ly/2xjRiaF.

El lenguaje de programación Kotlin

By Diego Albitres

El lenguaje de programación Kotlin

Presentación sobre el lenguaje de programación Kotlin. Trabajo Parcial del curso de Programación I de la UPC - Ciclo: 2020-I.

  • 158