Crea un mensaje de cumpleaños en Kotlin

1. Introducción

En este codelab, crearás un breve programa en Kotlin que imprimirá un mensaje de cumpleaños con un pastel y un banner de cumpleaños.

Requisitos previos

Qué aprenderás

  • Cómo imprimir texto más complejo desde el programa
  • Cómo realizar matemáticas básicas en Kotlin y almacenar los resultados en variables para usarlos más tarde
  • Cómo crear una función para imprimir la misma cadena varias veces
  • Cómo crear un bucle que imprima varias veces un fragmento de texto

Qué compilarás

  • Crearás un programa breve que podrás usar para imprimir mensajes de cumpleaños, una imagen de texto de un pastel y un banner.

Requisitos

  • Una computadora con acceso a Internet y un navegador web moderno, como la última versión de Chrome

2. Crea un mensaje de cumpleaños en Kotlin

Configura tu código de partida

  1. En tu navegador, abre https://developer.android.com/training/kotlinplayground. Se abrirá una herramienta de programación de Kotlin basada en el navegador.
  2. Dentro de la función fun main(), reemplaza el texto "Hello, world!" por "Happy Birthday, Rover!".
  3. Debajo, aún entre las llaves, agrega dos líneas más para imprimir: "You are already 5!" y "5 is the very best age to celebrate!"..

El código finalizado debería verse de la siguiente manera:

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. Ejecuta tu código.
  2. Verifica que el panel de resultados muestre el mensaje Happy Birthday, Rover! y, a continuación, You are already 5! y 5 is the very best age to celebrate!.
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

Agrega un pastel de cumpleaños

Un mensaje de cumpleaños debe ir acompañado de una imagen con temática de cumpleaños, como un pastel. Para agregar un pastel a tu mensaje de cumpleaños, imprime líneas adicionales que usen letras y símbolos del teclado y println().

Continúa desde el código de la solución anterior.

  1. En tu código, entre las dos declaraciones println() para Happy Birthday y You are already 5, agrega las siguientes líneas de declaraciones de impresión, como se muestra a continuación. Esto creará un pastel. La última declaración println() no tiene texto entre comillas, por lo que se imprime una línea vacía.
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")
    println("")

Para ayudar a que los demás comprendan tu código, puedes agregar un comentario antes de imprimirlo. Si ejecutas tu código, el resultado no se verá diferente, porque los comentarios son solo información para ti y otros desarrolladores, no comandos para el sistema. Un comentario intercalado comienza con // seguido de texto, como se muestra a continuación.

// This is a comment line
// This is another comment
  1. Agrega un comentario antes de imprimir el pastel: // Let's print a cake!.
  2. Agrega un comentario antes de imprimir la línea vacía: // This prints an empty line.

El código debería ser similar al siguiente.

fun main() {
    println("Happy Birthday, Rover!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. Ejecuta el código. El resultado debería ser similar al siguiente:
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 5!
5 is the very best age to celebrate!

3. Crea y usa variables

Almacena la edad de Rover en una variable

  1. En el código que tienes hasta el momento, puedes observar que se repite la misma edad dos veces.

En lugar de repetir este número, puedes almacenarlo, por ejemplo, en una variable. Es como poner el número en una caja y asignarle un nombre. Luego, podrás usar este nombre de variable cada vez que necesites el valor. Si cambia la edad, solamente tendrás que cambiar tu programa en un solo lugar. Al cambiar la variable, se muestra el valor correcto para la edad en todos los lugares donde se usa esa variable.

  1. En tu programa, como primera línea de código dentro de la función main(), agrega el siguiente código para crear una variable llamada age, con un valor de 5, como se muestra a continuación. (Debes colocar esta línea antes de las sentencias println()).
val age = 5

Esta línea significa lo siguiente:

  • val es una palabra especial, llamada palabra clave, que usa Kotlin para indicar que la información que sigue es el nombre de una variable.
  • age es el nombre de la variable.
  • = hace que el valor de age (a la izquierda) sea el mismo que el valor de la derecha. En matemáticas, se utiliza un signo igual para confirmar que los valores de cada lado son iguales. En Kotlin, a diferencia de las matemáticas, se usa un solo signo igual para asignar el valor de la derecha a la variable denominada de la izquierda.

Un desarrollador diría que esta línea declara una variable llamada age cuyo valor asignado es 5.

Para usar una variable dentro de una declaración de impresión, debes encerrarlo con símbolos que indiquen al sistema que lo que sigue no es texto, sino una variable. En lugar de imprimir texto, el sistema necesita imprimir el valor de la variable. Para ello, coloca la variable entre llaves antes de un signo de dólar, como en el siguiente ejemplo.

${variable}
  1. En tu código, reemplaza el número 5 de ambas instrucciones de impresión con la variable age como se muestra a continuación.
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. Ejecuta tu código; ambos mensajes deberían mostrar la misma edad.
  2. Cambia el valor de la variable por algo diferente. Por ejemplo, puedes mostrar la edad de Rover en días en lugar de en años. Para ello, multiplica la edad por 365 omitiendo los años bisiestos. Puedes hacer este cálculo cuando creas la variable, como se muestra a continuación.
val age = 5 * 365
  1. Vuelve a ejecutar el código y observa que ambos mensajes ahora muestran la edad en días.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 1825!
1825 is the very best age to celebrate!
  1. [Opcional] Cambia el texto de los mensajes de impresión para que funcionen mejor con días. Por ejemplo, cámbialo para que se lea lo siguiente:
You are already 1825 days old!
1825 days old is the very best age to celebrate!

Coloca texto en una variable

En las variables, puedes agregar números y también texto.

  1. Debajo de la variable de age, agrega una variable llamada name para el nombre de la persona del cumpleaños y establece su valor como "Rover".
val name = "Rover"
  1. Reemplaza el nombre Rover en el mensaje de cumpleaños con la variable, como se muestra a continuación.
println("Happy Birthday, ${name}!")

Además, puedes tener más de una variable en una declaración de impresión.

  1. Agrega Rover al mensaje de edad con la variable name, como se muestra a continuación.
println("You are already ${age} days old, ${name}!")

El código completo debería ser similar al siguiente.

fun main() {

    val age = 5 * 365
    val name = "Rover"

    println("Happy Birthday, ${name}!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already ${age} days old, ${name}!")
    println("${age} days old is the very best age to celebrate!")
}

¡Felicitaciones! Ahora puedes crear mensajes con texto y gráficos creados a partir de símbolos y usar variables para almacenar números y texto, así como también imprimir texto mediante variables.

4. Imprime un banner de cumpleaños con un borde

En esta tarea, crearás un banner de cumpleaños y, luego, aprenderás cómo simplificar ese código con técnicas para repetir y reutilizar código, y por qué resulta una buena idea hacerlo.

Crea un banner de cumpleaños inicial

  1. En https://developer.android.com/training/kotlinplayground, coloca el cursor en alguna parte del código.
  2. Haz clic con el botón derecho para abrir el menú y elige Seleccionar todo.
  3. Presiona la tecla de retroceso o de borrado para borrar todo el código.
  4. Copia y pega el siguiente código en el editor.
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. Ejecuta tu programa para ver un banner impreso en la consola.
=======================
Happy Birthday, Jhansi!
=======================

Crea una función para imprimir el borde

El código que acabas de pegar y ejecutar es una función llamada main() que contiene tres declaraciones de impresión. Cuando presionas el botón Ejecutar, el sistema ejecuta la función y todo el código que contiene.

Tu programa en Kotlin siempre debe tener una función main(). Además, puedes crear y usar tus propias funciones. Del mismo modo en que las variables te ayudan a evitar la duplicación de trabajos, las funciones pueden ayudarte a evitar escribir el mismo código varias veces. En tu código, las instrucciones de impresión de las partes superior e inferior del banner son exactamente iguales. Creemos una función para imprimir esos bordes y usémosla.

  1. En el editor, debajo de la función main(), inserta una línea vacía con el objetivo de que tenga más espacio para trabajar. El sistema ignora las líneas vacías, por lo que puedes insertarlas donde sea útil para organizar tu código.
  2. Crea una función. Comienza con la palabra clave fun seguida de un nombre, printBorder, un par de paréntesis (), y un par de llaves {}, como se muestra a continuación.
fun printBorder() {}

Aclaraciones sobre las funciones de nomenclatura:

  • Observa cómo el nombre de la función printBorder comienza con una letra minúscula y un verbo. Los nombres de las funciones casi siempre comienzan con una letra minúscula y un verbo. Además, el nombre debe describir lo que hace la función. Por ejemplo: print() o, aquí, printBorder().
  • Observa también que la segunda palabra del nombre comienza con mayúscula. Esta combinación de mayúsculas y minúsculas hace que los nombres sean mucho más fáciles de leer. Algunos ejemplos de nombres son drawReallyCoolFancyBorder y printBirthdayMessage.
  1. Coloca la llave de cierre } de la función printBorder en una línea nueva y agrega una línea vacía entre las dos llaves para que puedas agregar más código. Tener la llave de cierre } en su propia línea permite ver más fácilmente dónde termina la función.
  2. Dentro de la función main(), copia la declaración de impresión del borde y pégala entre las llaves de la función printBorder().

La función printBorder() terminada debería verse de la siguiente manera:

fun printBorder() {
    println("=======================")
}

Para usar una función o llamarla, usa su nombre seguido de paréntesis. Ten en cuenta que así has estado usando println(). Por lo tanto, para usar la función printBorder, llama a printBorder() en cualquier lugar del código en que necesites hacerlo.

  1. En la función main(), reemplaza las líneas de código que imprimen una línea de borde mediante println() por llamadas a la función printBorder(). El código finalizado debería verse de la siguiente manera:
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. Ejecuta tu código para asegurarte de que todo funcione como antes.

La acción de cambiar el código para mejorarlo o para que resulte más fácil trabajar con él sin cambiar el resultado se denomina "refactorización".

Repite un patrón de borde

Si observas la línea del borde, podrás ver que se repite el mismo símbolo. Entonces, en lugar de decir:

"Imprime esta cadena de 23 símbolos".

Podrías decir:

"Imprime este símbolo 23 veces".

En el código, esto se hace con una declaración repeat().

  1. En la función printBorder(), usa una declaración repeat() para imprimir el mismo signo 23 veces.
  2. En lugar de usar println(), usa print() para no saltar a una línea nueva después de imprimir cada "=".

Este es el código. Ahora tienes una sola declaración para imprimir el mismo signo y, para repetir esa declaración 23 veces, usas una declaración repeat().

fun printBorder() {
    repeat(23) {
        print("=")
    }
}
  • La sentencia repeat() comienza con la palabra repeat seguida de (). Este tipo de sentencia se conoce como "bucle", porque se repite o se reproduce en bucle el mismo código varias veces. Más adelante, aprenderás otras formas de crear bucles.
  • Dentro de los paréntesis (), se coloca la cantidad de repeticiones.
  • Luego, se agregan las llaves {},
  • y, dentro de las llaves {}, se agrega el código que se debe repetir.
  1. En la función printBorder(), después de la llave de cierre } de la declaración repeat(), que aparece después de imprimir la línea del borde, agrega una declaración println() para imprimir una línea nueva.

Ahora, el código debería ser similar al siguiente:

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}

El código de la función main() no cambia y todo tu programa debería verse de la siguiente manera:

fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}
  1. Ejecuta tu código. El resultado debería ser el mismo que antes, pero esta vez pudiste crear el borde con solo especificar el símbolo "=" una sola vez.
=======================
Happy Birthday, Jhansi!
=======================

Usa argumentos para cambiar el borde

¿Qué pasaría si quisieras crear bordes que usaran diferentes símbolos, como los que se muestran a continuación?

%%%%%%%%%%%%%%%%%%%%%%%

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Puedes definir una función separada para cada uno de estos símbolos diferentes. Sin embargo, hay una forma más eficiente de hacerlo. Puedes reutilizar la función que ya escribiste y hacerla más flexible, de modo que funcione con diferentes tipos de símbolos.

Un aspecto interesante de las funciones es que puedes agregarles entradas mediante argumentos. Ya viste esto brevemente en un codelab anterior, cuando aprendiste sobre main(). En este paso, agregarás un argumento a la función printBorder() para que pueda imprimir cualquier patrón de borde que proporciones.

  1. En la parte superior de main(), crea una variable llamada border para el patrón del borde. De esta manera, evitarás que el texto se repita para el borde.
val border = "%"
  1. Ahora, pasa la variable border de ambas llamadas a la función printBorder() como argumento. Para ello, coloca border entre el paréntesis (), de la misma manera que cuando proporcionaste texto para que println() se imprima.

Tu función main() debería verse como el siguiente código:

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

La función printBorder() tomará el valor de este border como entrada y determinará cómo imprimir el borde completo.

  1. Ejecuta tu código. Este no se ejecuta y, en su lugar, verás íconos de error junto al código. dd0286b7414cea42.png
  2. Observa el panel de resultados; aparecerá un mensaje de error.

Como antes, el mensaje indica dónde se encuentra el error y te da una pista sobre qué podría ser. La parte importante es Too many arguments for public fun printBorder(). Estás llamando a la función printBorder() y pasas un borde como entrada. Sin embargo, la definición de la función printBorder() no acepta ninguna entrada en este momento.

  1. Para corregir este error, agrega un argumento para el borde a la definición de la función printBorder(). Observa la primera línea de código a continuación.
fun printBorder(border: String) {
    repeat(23) {
        print("=")
    }
    println()
}
  • Ten en cuenta que el nombre del argumento es border.
  • Después del nombre, aparecen dos puntos :.
  • También aparece la palabra String, que es una descripción de qué tipo de argumento es.

Un elemento String es una porción de texto compuesta por caracteres entre comillas. Podríamos decir que es un collar de cuentas alineadas en una cadena, al igual que los caracteres se alinean para formar palabras y texto. Especificar que el argumento tiene que ser del tipo String ayuda al sistema a garantizar que tu argumento sea texto, y no, por ejemplo, un número.

  1. Ejecuta tu código. La función printBorder() ahora acepta un borde String como entrada. Y el código de main() llama a printBorder(border) con border como argumento. Tu código debería ejecutarse sin errores.
  2. Observa el resultado del programa en Console; ¿continúa mostrando el mismo borde que antes?
=======================
Happy Birthday, Jhansi!
=======================

Este no es el comportamiento previsto. Intentaste crear un borde con el símbolo "%", pero el programa sigue imprimiendo un borde con el símbolo "=". En los próximos pasos, investigarás el motivo.

  1. En el editor, se puede ver un signo de exclamación gris. Este ícono indica una advertencia. Las advertencias se refieren a problemas que tiene tu código para que les prestes atención, pero no impide su ejecución. 7579663a694ef6bd.png
  2. Coloca el cursor sobre el signo de exclamación y aparecerá un mensaje que dirá "Parameter 'border' is never used.". Esta advertencia explica el problema con el resultado. Estás pasando una cadena nueva para el borde de la función, pero no la estás usando para imprimir.
  3. Cambia la función printBorder() para usar el elemento border que pasaste, en lugar de imprimir el signo "=". Esto funciona exactamente igual que si border fuera una variable que hubieras definido dentro de la función.
fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}
  1. Vuelve a ejecutar tu código. El resultado debería ser como se muestra a continuación.
%%%%%%%%%%%%%%%%%%%%%%%
Happy Birthday, Jhansi!
%%%%%%%%%%%%%%%%%%%%%%%

¡Muy bien! Solucionaste el problema. Este es tu código terminado.

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}

Hiciste que la función printBorder() fuera mucho más flexible sin agregar mucho más código. Ahora puedes imprimir un borde de símbolos diferentes con solo hacer un pequeño cambio.

  1. [Opcional] Cambiando solo una línea de código en la función main(), ¿cómo imprimirías banners de cumpleaños como este?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

Modifica una función para que tenga dos argumentos

Si quieres utilizar un patrón diferente de más de 1 carácter, como por ejemplo "'-._,-'", no repetirías este patrón 23 veces, porque sería demasiado largo. Podrías repetirlo, tal vez, 4 veces. Para ello, podrías cambiar el número de repeticiones en la declaración repeat() de printBorder(). Pero puedes hacer algo aún mejor.

Puedes definir un borde más elaborado según dos aspectos:

  • El patrón que se debe repetir (que ya realizaste)
  • La cantidad de veces que deseas repetir el patrón

Puedes crear variables para cada uno, el patrón y la cantidad de repeticiones, y, luego, pasar estos dos datos a la función printBorder().

  1. En main(), cambia el borde para que sea el patrón "'-._,-'".
val border = "`-._,-'"
  1. Ejecuta tu código. Notarás que ahora el patrón es demasiado largo.
  2. En main(), debajo de la definición de border, crea una variable nueva llamada timesToRepeat para la cantidad de repeticiones. Establece el valor en 4.
val timesToRepeat = 4
  1. En main(), cuando llames a printBorder(), agrega la cantidad de repeticiones como un segundo argumento. Separa los dos argumentos con una coma.
printBorder(border, timesToRepeat)

La función main() debería verse de la siguiente manera:

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

Como antes, este código muestra un error, porque tienes más argumentos que llaman a printBorder() que en la definición de printBorder().

  1. Corrige printBorder() para aceptar también la cantidad de repeticiones como entrada. Agrega una coma después del argumento, seguida del argumento adicional: timesToRepeat: Int. La primera línea de la definición de tu función ahora se ve como se muestra a continuación.
fun printBorder(border: String, timesToRepeat: Int) {

Ten en cuenta que:

  • La coma separa los dos argumentos.
  • timesToRepeat es el nombre del argumento.
  • El símbolo de dos puntos : viene después del argumento.
  • El tipo : Int. timesToRepeat es un número, por lo cual, en lugar de que sea del tipo String, debes convertirlo en tipo Int, que es la abreviatura de "integer" (número entero).
  1. Dentro de printBorder(), cambia repeat para usar el argumento timesToRepeat (en lugar del número 23). El código printBorder() debería verse de la siguiente manera:
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. Ejecuta tu código. El resultado se ve como se muestra a continuación.
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. Para que el resultado sea perfecto, inserta dos espacios al comienzo del mensaje "Happy Birthday". El resultado será como el que se muestra a continuación.
`-._,-'`-._,-'`-._,-'`-._,-'
  Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'

Este es el código final de tu banner:

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("  Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}

¡Felicitaciones! Mediante funciones, argumentos, variables y un bucle de repetición, aprendiste los conceptos básicos y fundamentales que se usan en casi todos los programas.

Toma un descanso y, luego, comienza con la siguiente tarea, en la que crearás más funciones y bucles, y aprenderás a construir un pastel gigante con la cantidad correcta de velas con solo unas pocas líneas de programación.

5. Crea un pastel con capas y velas

En esta tarea, actualizarás el código del pastel de cumpleaños para que sea del tamaño adecuado y tenga la cantidad correcta de velas para cualquier edad.

  • Crearás un total de tres funciones para dibujar un pastel en capas con velas.
  • Usarás un elemento repeat() dentro de otro repeat() para crear lo que se llama un "bucle anidado".
  • De la misma manera en que compilarás este código, podrás crear cualquier programa, comenzando por lo general y agregando detalles. Esto se denomina "desarrollo vertical".
  • Las instrucciones no son tan detalladas para esta práctica, por lo que puedes consultar el código finalizado si no puedes avanzar.

Este será el pastel que prepararás:

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

Y estas son las instrucciones:

Crea la función main()

  1. Restablece tu código en el editor para el programa Hello, world!.
  2. Puedes quitar el argumento para main(), ya que no lo usarás.
  3. En main(), crea una variable age y establécela en 24.
  4. En main(), crea una segunda variable layers y establécela en 5.
  5. En main(), llama a una función printCakeCandles() y pasa age. Aparecerá un error, dado que todavía no creaste esa función.
  6. Del mismo modo, llama a una función printCakeTop() y pasa age.
  7. Finalmente, llama a una función printCakeBottom() y pasa el elemento age y el número de layers.
  8. Para eliminar los errores, comenta las tres llamadas a la función. Para ello, agrega // al principio de cada línea, como se muestra a continuación. Esta técnica te permite crear un borrador de tu código sin que se produzcan errores.
  9. Cuando ejecutes tu programa, no deberían producirse errores y tampoco debería hacer nada.

Tu función main() debería verse como el siguiente código:

fun main() {
    val age = 24
    val layers = 5
    // printCakeCandles(age)
    // printCakeTop(age)
    // printCakeBottom(age, layers)
}

Crea printCakeTop()

La función printCakeTop() para imprimir la parte superior del pastel, una línea de signos igual, es casi la misma que la función printBorder() que creaste antes en este codelab.

==========================
  1. Debajo de la función main(), agrega una línea en blanco y, luego, crea una función printCakeTop() que tome un argumento, age, del tipo Int.
  2. Adentro, usa una declaración repeat() para imprimir un signo igual la cantidad de veces correspondiente a age + 2. Los dos signos igual adicionales son para que las velas no queden por fuera del pastel.
  3. Al final, cuando repeat() esté listo, imprime una línea vacía.
  4. En main(), quita los dos símbolos // del comienzo de la línea de código para printCakeTop(), ya que ahora existe esa función.
printCakeTop(age)

Esta es la función finalizada:

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. Ejecuta tu código para ver la parte superior del pastel.

Crea printCakeCandles()

Cada vela está formada por dos símbolos: una coma (,) para la llama y una línea vertical (|) para el cuerpo de la vela.

,,,,,,,,,,,,,,,,,,,,,,,,

||||||||||||||||||||||||

Para lograr esto en una función, coloca dos sentencias repeat(), una para las llamas y otra para los cuerpos.

  1. Debajo de la función main() y la función printCakeTop(), crea una nueva función, printCakeCandles(), que tome un argumento age del tipo Int.
  2. Adentro, usa una declaración repeat() para imprimir una coma , con el valor de la llama.
  3. Repite esto age veces.
  4. Al final, imprime una línea vacía.
  5. Agrega una declaración impresa para imprimir un espacio que permita la inserción de las velas.
  6. Debajo, repite los pasos para crear una segunda declaración repeat(), que permitirá imprimir los cuerpos de las velas con una línea vertical |.
  7. Al final, imprime una nueva línea con println().
  8. En main(), quita los dos símbolos // del principio de la línea de código para printCakeCandles().
printCakeCandles(age)
  1. Ejecuta el código para ver la parte superior del pastel y las velas.

Solución:

fun printCakeCandles(age: Int) {
    print(" ")
    repeat(age) {
        print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

Crea printCakeBottom()

En esta función, dibujarás la parte inferior del pastel, que tiene el mismo ancho que age + 2. La dibujarás según la altura de una cantidad de capas determinada.

@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
  • Esto significa que tu función necesita dos argumentos: uno para el ancho (age) y otro para la altura (layers).
  • Con el objetivo de imprimir la parte inferior del pastel, primero repite el símbolo @ (arroba) la cantidad de veces correspondiente a age + 2 para imprimir una capa. Luego, repite la impresión de una capa según la cantidad de layers.

Dibuja el símbolo @ age+2 veces para crear una capa

  1. Debajo de las funciones existentes, crea una función printCakeBottom() con dos argumentos, age y layers, ambos del tipo Int.
  2. Dentro de la función, usa una sentencia repeat() para imprimir una capa de símbolos @ (arroba) age + 2 veces. Para terminar, imprime una línea vacía como se muestra a continuación.
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. En main(), quita los dos símbolos // del principio de la línea de código para printCakeBottom(age, layers).
  2. Ejecuta tu código para verificar que se imprima una línea inferior.
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

Declaraciones repeat() anidadas

Para imprimir varias capas idénticas de la parte inferior del pastel, puedes decir:

Para la capa 1, repite el símbolo 12 veces: @@@@@@@@@@@@

Para la capa 2, repite el símbolo 12 veces: @@@@@@@@@@@@

Para la capa 3, repite el símbolo 12 veces: @@@@@@@@@@@@

También puedes decirlo de una manera más concisa:

Repite el procedimiento para las tres capas:

Repite el símbolo 12 veces.

@@@@@@@@@@@@

@@@@@@@@@@@@

@@@@@@@@@@@@

Con las sentencias repeat(), también puedes llevar a cabo otra acción. Puedes colocar una declaración repeat() dentro de otra declaración repeat(). Por lo tanto, puedes crear una sentencia repeat() dentro de una sentencia repeat() para imprimir el símbolo una cantidad determinada de veces para una cantidad determinada de capas.

Usa la declaración repeat() anidada para imprimir capas del pastel

  1. Coloca una segunda declaración repeat() alrededor de todo el código dentro de la función. Repite este bucle layers veces.
  2. En main(), quita solamente las dos // de la línea de código para printCakeBottom().
printCakeBottom(age, layers)
  1. Ejecuta tu código para ver todo el pastel.

Solución para printCakeBottom().

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

¡Felicitaciones! Acabas de terminar un programa bastante complejo con varias funciones y una declaración repeat anidada. Además, tu pastel siempre tendrá la cantidad de velas adecuada.

El resultado final de tu programa debería ser el siguiente:

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

6. Código de solución

fun main() {
    val age = 24
    val layers = 5
    printCakeCandles(age)
    printCakeTop(age)
    printCakeBottom(age, layers)
}

fun printCakeCandles(age: Int) {
    print (" ")
    repeat(age) {
          print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

7. Solución de problemas

Si la herramienta de programación de Kotlin basada en el navegador no ejecuta el código o te muestra un error inesperado que no está relacionado con tu código, puedes probar lo siguiente:

  • Vuelve a cargar la página con Mayús + Volver a cargar.
  • Espera un minuto y vuelve a intentarlo.

8. Resumen

  • Usa ${} para rodear las variables y los cálculos en el texto de las declaraciones de impresión. Por ejemplo: ${age} donde age es una variable.
  • Crea una variable con la palabra clave val y un nombre. Una vez establecida, no se puede cambiar. Asigna un valor a una variable con el signo igual. El valor puede ser, por ejemplo, texto y números.
  • Un elemento String es el texto entre comillas, como "Hello".
  • Un elemento Int es un número entero positivo o negativo, como 0, 23 o -1024.
  • Puedes pasar uno o más argumentos para que la función pueda usarlos, por ejemplo: fun printCakeBottom(age:Int, layers:Int) {}.
  • Usa una declaración repeat() {} para repetir un conjunto de instrucciones varias veces. Por ejemplo, repeat (23) { print("%") } o repeat (layers) { print("@@@@@@@@@@") }.
  • Un bucle es una instrucción para repetir instrucciones varias veces. Una declaración repeat() es un ejemplo de un bucle.
  • Puedes anidar bucles, es decir, colocar bucles dentro de bucles. Por ejemplo, puedes crear una declaración repeat() dentro de una declaración repeat() para imprimir un símbolo varias veces durante una cantidad de filas, como lo hiciste con las capas del pastel.

Resumen de cómo usar los argumentos de función. Para usar argumentos con una función, debes realizar las siguientes tres tareas:

  • Agrega el argumento y el tipo a la definición de la función: printBorder(border: String).
  • Usa el argumento dentro de la función: println(border).
  • Proporciona el argumento cuando llames a la función: printBorder(border).

9. Más información

A continuación, puedes encontrar la documentación oficial para los conceptos de Kotlin que aprendiste en este codelab.