Criar uma mensagem de aniversário em Kotlin

1. Introdução

Neste codelab, você vai criar um pequeno programa em Kotlin que mostra uma mensagem de aniversário com um bolo e um banner.

Pré-requisitos

O que você vai aprender

  • Como exibir textos mais complexos pelo programa.
  • Como fazer cálculos básicos no Kotlin e armazenar os resultados em variáveis para uso posterior.
  • Como criar uma função para exibir a mesma string várias vezes.
  • Como criar uma repetição que exibe um snippet de texto várias vezes.

O que você criará

  • Você criará um pequeno programa que poderá ser usado para exibir mensagens de aniversário, um desenho de um bolo baseado em texto e um banner.

O que é necessário

  • Um computador com acesso à Internet e um navegador da Web moderno, como a versão mais recente do Chrome.

2. Criar uma mensagem de aniversário em Kotlin

Configurar o código inicial

  1. No navegador, acesse https://developer.android.com/training/kotlinplayground. Isso abre uma ferramenta de programação Kotlin baseada em navegador.
  2. Dentro da função fun main(), substitua o texto "Hello, world!" por "Happy Birthday, Rover!".
  3. Abaixo disso, ainda dentro das chaves, adicione mais duas linhas para exibição: "You are already 5!" e "5 is the very best age to celebrate!".

O código finalizado ficará da seguinte forma:

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. Execute o código.
  2. Verifique se o painel de saída mostra Happy Birthday, Rover! e, abaixo disso, You are already 5! e 5 is the very best age to celebrate!.
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

Adicionar um bolo de aniversário

Uma mensagem de aniversário precisa de uma imagem com essa temática. Um bolo, por exemplo. É possível adicionar um bolo à mensagem de aniversário gerando outras linhas que usam letras e símbolos do teclado e println().

Continue usando o código de solução acima.

  1. No código, entre as duas instruções println() para Happy Birthday e You are already 5, adicione as seguintes linhas de instrução, conforme mostrado abaixo. Isso criará um bolo. A última instrução println() não tem texto entre aspas, o que gera uma linha vazia.
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")
    println("")

Para ajudar outras pessoas a entenderem seu código, é possível adicionar um comentário antes de gerar o bolo. Isso não fará com que o resultado seja diferente ao executar o código, já que os comentários são informações somente para você e outros desenvolvedores, e não comandos para o sistema. Um comentário in-line começa com // seguido de texto, conforme mostrado abaixo.

// This is a comment line
// This is another comment
  1. Adicione um comentário antes de gerar o bolo: // Let's print a cake!.
  2. Adicione um comentário antes de gerar a linha vazia: // This prints an empty line.

O código ficará parecido com este:

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. Execute o código. O resultado deve ficar assim:
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

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

3. Criar e usar variáveis

Armazenar a idade de Rover em uma variável

  1. No código finalizado até agora, a mesma idade foi repetida duas vezes.

Em vez de repetir esse número, é possível armazená-lo em um só lugar, como uma variável. Isso é como colocar o número em uma caixa e dar um nome a ela. Dessa forma, é possível usar o nome da variável sempre que você precisar do valor. Além disso, se a idade mudar, você precisará mudar o programa em um só lugar. Ao mudar a variável, o valor correto da idade é exibido em todos os lugares em que a ela é usada.

  1. No programa, adicione o seguinte código como a primeira linha dentro da função main() para criar uma variável chamada age, com valor 5, conforme mostrado abaixo. É preciso colocar essa linha antes das instruções println().
val age = 5

Essa linha significa que:

  • val é uma palavra especial usada pelo Kotlin, chamada de palavra-chave, que indica que a informação seguinte é o nome de uma variável;
  • age é o nome da variável;
  • = faz com que o valor de age (à esquerda) seja igual ao valor à direita. Na matemática, um sinal de igual é usado para declarar que os valores dos dois lados são iguais. No Kotlin, ao contrário da matemática, um sinal de igual é usado para atribuir o valor da direita para a variável nomeada à esquerda.

Um desenvolvedor afirmaria o seguinte: essa linha declara uma variável chamada age, cujo valor atribuído é 5.

Para usar uma variável dentro de uma declaração, é necessário cercá-la de alguns símbolos, que informam ao sistema que o item seguinte não é um texto, mas uma variável. Em vez de gerar um texto, o sistema precisa gerar o valor da variável. Para isso, coloque as variáveis entre chaves precedidas por um cifrão, como no exemplo abaixo.

${variable}
  1. No código, substitua o número 5 nas duas instruções pela variável age, conforme mostrado abaixo.
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. Execute o código, e as duas mensagens exibirão a mesma idade.
  2. Mude o valor da variável para um diferente. Por exemplo, você poderia mostrar a idade de Rover em dias em vez de anos. Para fazer isso, multiplique a idade por 365, omitindo anos bissextos. É possível fazer esse cálculo ao criar a variável, como mostrado abaixo.
val age = 5 * 365
  1. Execute o código novamente e observe que as duas mensagens agora mostram a idade em dias.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 1825!
1825 is the very best age to celebrate!
  1. [Opcional] Mude o texto das mensagens para que elas funcionem melhor com a idade em dias. Por exemplo, mude para:
You are already 1825 days old!
1825 days old is the very best age to celebrate!

Colocar texto em uma variável

Além de números, também é possível colocar textos em variáveis.

  1. Abaixo da variável de age, adicione uma variável chamada name para o nome do aniversariante e defina o valor como "Rover".
val name = "Rover"
  1. Substitua o nome Rover na mensagem de aniversário pela variável, conforme mostrado abaixo.
println("Happy Birthday, ${name}!")

É possível ter mais de uma variável em uma declaração.

  1. Adicione Rover à mensagem de idade usando a variável name, conforme mostrado abaixo.
println("You are already ${age} days old, ${name}!")

O código concluído terá esta aparência:

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!")
}

Parabéns! Agora você pode criar mensagens com texto, gráficos criados por símbolos, usar variáveis para armazenar números e textos e gerar texto usando variáveis.

4. Gerar um banner de aniversário com borda

Nesta tarefa, você vai criar um banner de aniversário e aprender a simplificar o código usando técnicas para repetir e reutilizar códigos. Você também vai aprender por que essa é uma boa opção.

Criar um banner de aniversário inicial

  1. Em https://developer.android.com/training/kotlinplayground, posicione o cursor em algum lugar do código.
  2. Clique com o botão direito do mouse para abrir o menu e escolha Selecionar tudo.
  3. Pressione a tecla "backspace" ou "delete" para excluir todo o código.
  4. Copie o código e cole-o abaixo no editor.
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. Execute o programa para ver um banner gerado no Console.
=======================
Happy Birthday, Jhansi!
=======================

Criar uma função para exibir a borda

O código que você colou e executou é uma função chamada main(), contendo três declarações. Quando o botão Executar é pressionado, o sistema executa a função e todo o código dentro dela.

O programa em Kotlin sempre precisa ter uma função main(). Além disso, você pode criar e usar funções próprias. Assim como as variáveis ajudam a evitar trabalho dobrado, as funções evitam que você tenha que escrever o mesmo código várias vezes. No código, as instruções de exibição para a parte superior e inferior do banner são exatamente as mesmas. Vamos criar e usar uma função para exibir essas bordas.

  1. No editor, abaixo da função main(), insira uma linha vazia, só para ter espaço para trabalhar. O sistema ignora linhas vazias, e é possível inseri-las sempre que elas forem úteis para organizar o código.
  2. Crie uma função. Comece com a palavra-chave fun, seguida de um nome, printBorder, um par de parênteses () e um par de chaves {}, como mostrado abaixo.
fun printBorder() {}

Informações sobre como nomear funções.

  • O nome da função printBorder começa com uma letra minúscula e um verbo. Os nomes das funções quase sempre começam com uma letra minúscula e um verbo, e o nome precisa descrever o que a função faz. Como: print() ou, neste caso, printBorder().
  • A segunda palavra dentro do nome começa com letra maiúscula. Esse estilo é chamado de concatenação e facilita bastante a leitura dos nomes. Mais alguns exemplos de nome são drawReallyCoolFancyBorder e printBirthdayMessage.
  1. Coloque a chave de fechamento } da função printBorder em uma nova linha e adicione uma linha vazia entre as duas chaves, para dar espaço para mais códigos. Deixar a chave de fechamento } em uma linha própria facilita a visualização do lugar em que a função termina.
  2. Dentro da função main(), copie a instrução de exibição da borda e cole-a entre as chaves da função printBorder().

A função printBorder() concluída ficará parecida com esta:

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

Para usar ou chamar uma função, coloque o nome dela entre parênteses. Essa é a forma que você tem usado println(). Para usar a função printBorder, chame printBorder() em qualquer lugar do código em que você precisar.

  1. Na função main(), substitua as linhas do código que exibem uma linha de borda usando println(), com chamadas para a função printBorder(). O código finalizado ficará da seguinte forma:
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. Execute o código para conferir se tudo está funcionando como antes.

Uma mudança no código com o objetivo de melhorar ou facilitar o trabalho, sem mudar o resultado, é chamada de "refatoração".

Repetir um padrão de borda

Analisando a linha da borda, notamos que trata-se da repetição do mesmo símbolo. Portanto, em vez de dizer:

"Exiba esta string de 23 símbolos"

você pode dizer:

"Exiba 1 símbolo 23 vezes".

Em programação, isso é feito usando uma instrução repeat().

  1. Na função printBorder(), use uma instrução repeat() para mostrar o sinal de igual 23 vezes.
  2. Em vez de usar println(), use print(), para que você não pule para uma nova linha depois de cada "=".

Veja o código: Agora você tem uma única instrução para exibir o sinal de igual. Para repeti-la 23 vezes, use uma instrução repeat().

fun printBorder() {
    repeat(23) {
        print("=")
    }
}
  • A instrução repeat() começa com a palavra repeat, seguida de (). Esse tipo de instrução é chamado de "repetição", porque você está repetindo o mesmo código várias vezes. Você aprenderá sobre outras formas de criar repetições posteriormente.
  • Dentro dos parênteses, () é o número de repetições.
  • Ele é seguido de chaves {},
  • Dentro das chaves {}, é incluído o código a ser repetido.
  1. Na função printBorder(), depois da chave de fechamento } da instrução repeat(), ou seja, depois de terminar de gerar a linha de borda, adicione uma instrução println() para gerar uma nova linha.

Agora, o código ficará da seguinte forma:

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

O código na função main() não muda, e o programa todo terá esta aparência:

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

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}
  1. Execute o código. O resultado será o mesmo de antes. Contudo, agora foi possível criar a borda especificando o símbolo "=" apenas uma vez.
=======================
Happy Birthday, Jhansi!
=======================

Usar argumentos para mudar a borda

E se você quisesse criar bordas que usam símbolos diferentes, como os mostrados abaixo?

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

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

Você poderia definir uma função separada para cada um desses símbolos. No entanto, existe uma forma mais eficiente de fazer isso. É possível reutilizar a função que já foi escrita e torná-la mais flexível, para que ela funcione com diferentes tipos de símbolos.

Uma vantagem das funções é que você pode inseri-las usando argumentos. Isso foi abordado brevemente em um codelab anterior, ao apresentar main(). Nesta etapa, você adicionará um argumento à função printBorder(), para que ela possa exibir qualquer padrão de borda que você fornecer.

  1. Em main(), na parte superior, crie uma variável chamada border para o padrão de borda. Dessa forma, o texto será repetido para a borda.
val border = "%"
  1. Agora, transmita essa variável border como um argumento para as duas chamadas da função printBorder(). Para fazer isso, coloque border entre os parênteses (), da mesma forma como quando você inseriu o texto para a exibição de println().

Sua função main() ficará como o exemplo abaixo.

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

A função printBorder() assumirá o valor de border como uma entrada e descobrirá como exibir a borda completa.

  1. Execute o código. Ele não vai ser executado, e você vai ver ícones de erro ao lado dele. dd0286b7414cea42.png
  2. Uma mensagem de erro será exibida no painel de saída.

Como antes, a mensagem indica o local em que erro está localizado e fornece uma dica sobre o que pode ter causado esse erro. A parte importante é: Too many arguments for public fun printBorder(). Você está chamando a função printBorder() e transmitindo uma borda como entrada. No entanto, a definição da função printBorder() não aceita nenhuma entrada no momento.

  1. Para corrigir esse erro, adicione um argumento para a borda na definição da função printBorder(). Veja a primeira linha do código conforme mostrado abaixo.
fun printBorder(border: String) {
    repeat(23) {
        print("=")
    }
    println()
}
  • O nome do argumento é border.
  • O nome é seguido de dois-pontos :
  • Ele também é seguido da palavra String, que é uma descrição do tipo de argumento.

Uma String é um trecho de texto composto por caracteres entre aspas. Imagine um cordão de miçangas alinhadas para formar um colar. Os caracteres ficam alinhados da mesma forma para formar as palavras e os textos. Especificar que o argumento precisa ser uma String ajuda o sistema a determinar que o argumento é um texto, e não um número, por exemplo.

  1. Execute o código. A função printBorder() agora aceita uma borda String como entrada. E o código em main() chama printBorder(border) com border como o argumento. Agora, o código será executado sem erros.
  2. Veja o resultado do programa no Console. A mesma borda anterior continua sendo exibida?
=======================
Happy Birthday, Jhansi!
=======================

Esse não é o comportamento esperado. Você tentou criar uma borda com o símbolo "%", mas o programa ainda está exibindo uma borda com o símbolo "=". Nas próximas etapas, você vai investigar o que causou isso.

  1. No editor, é possível observar um ponto de exclamação cinza. Esse ícone indica um aviso. Os avisos indicam problemas com o código que precisam ser verificados, mas eles não impedem a execução do código. 7579663a694ef6bd.png
  2. Passe o cursor do mouse sobre o ponto de exclamação para ver uma mensagem "Parameter 'border' is never used.". Esse aviso explica o problema do resultado. Você está transmitindo uma nova string da borda para a função, mas não está usando a string para exibição.
  3. Mude a função printBorder() para usar a transmitida em border em vez de exibir o "=". Isso funciona exatamente da mesma forma que funcionaria se border fosse uma variável definida na função.
fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}
  1. Execute o código novamente. O resultado será como no exemplo a seguir:
%%%%%%%%%%%%%%%%%%%%%%%
Happy Birthday, Jhansi!
%%%%%%%%%%%%%%%%%%%%%%%

Muito bem! Você corrigiu o problema. Este é seu código finalizado.

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

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

Você deixou a função printBorder() bem mais flexível, sem precisar adicionar muito mais código. Agora, você pode exibir uma borda de símbolos diferentes com apenas uma pequena mudança.

  1. [Opcional] Mudando uma única linha de código na função main(), como você exibiria banners de aniversário como os seguintes?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

Modificar uma função para ter dois argumentos

E se você quisesse usar um padrão diferente, com mais de um caractere, como "'-._,-'"? Não seria necessário repetir esse padrão 23 vezes, porque isso ficaria longo demais. Você poderia repeti-lo 4 vezes, por exemplo. Para fazer isso, uma opção seria mudar o número de repetições na instrução repeat() de printBorder(). No entanto, é possível fazer algo ainda melhor.

Você pode definir uma borda mais elaborada com base em duas informações:

  • O padrão a ser repetido (que você já fez)
  • O número de vezes que você quer repetir o padrão

É possível criar diferentes variáveis para o padrão e o número de repetições e transmitir as duas informações para a função printBorder().

  1. Em main(), mude a borda para o padrão "'-._,-'".
val border = "`-._,-'"
  1. Execute o código e observe como agora o padrão ficou longo demais.
  2. Em main(), abaixo da definição de border, crie uma nova variável chamada timesToRepeat para o número de repetições. Defina o valor como 4.
val timesToRepeat = 4
  1. Em main(), ao chamar printBorder(), adicione o número de repetições como um segundo argumento. Separe os dois argumentos com uma vírgula.
printBorder(border, timesToRepeat)

A função main() agora terá esta aparência:

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

Assim como antes, esse código gera um erro, porque você tem mais argumentos chamando printBorder() do que na definição de printBorder().

  1. Corrija printBorder() para aceitar também o número de repetições como entrada. Adicione uma vírgula depois do argumento, seguida pelo argumento extra: timesToRepeat: Int.. A primeira linha da definição da sua função agora terá a seguinte aparência:
fun printBorder(border: String, timesToRepeat: Int) {

Aviso:

  • A vírgula separa os dois argumentos.
  • timesToRepeat é o nome do argumento.
  • Ele é seguido por um sinal de dois-pontos (:).
  • O tipo Int. timesToRepeat é um número. Por isso, em vez de usar o tipo String, use Int, abreviação de "integer", que significa "número inteiro" em inglês.
  1. Dentro de printBorder(), mude repeat para usar o argumento timesToRepeat (em vez do número 23). O código printBorder() ficará assim:
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. Execute o código. O resultado terá a seguinte aparência:
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. Para deixar o resultado perfeito, insira dois espaços no início da mensagem "Happy Birthday". O resultado ficará como o mostrado abaixo.
`-._,-'`-._,-'`-._,-'`-._,-'
  Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'

Veja o código final do 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()
}

Parabéns! Com funções, argumentos, variáveis e repetições, você aprendeu os elementos básicos usados em quase todos os programas.

Faça uma pausa antes de começar a próxima tarefa. Nela você vai criar mais funções e repetições e aprender a construir um bolo gigante com o número certo de velas, usando só algumas linhas de programação.

5. Criar um bolo com camadas e velas

Nesta tarefa, você fará um upgrade no código do bolo de aniversário para que ele sempre seja do tamanho certo de acordo com o número de velas para cada idade.

  • Você criará um total de três funções para desenhar um bolo com várias camadas e velas.
  • Você usará um repeat() dentro de outro repeat(), criando o que é conhecido como "repetição aninhada".
  • A forma como esse código é criado é semelhante à de qualquer programa, começando com o panorama geral e acrescentando mais detalhes. Isso é chamado de "desenvolvimento de cima para baixo".
  • As instruções para essa prática não são tão detalhadas. Você pode consultar o código final se tiver dificuldades.

Este é o bolo que você vai preparar:

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

As instruções são apresentadas a seguir.

Criar a função main()

  1. Redefina seu código no editor para o programa Hello, world!.
  2. Você pode remover o argumento de main(), porque ele não será usado.
  3. Em main(), crie uma variável age e a defina como 24.
  4. Em main(), crie uma segunda variável layers e a defina como 5.
  5. Em main(), chame uma função printCakeCandles() e transmita a age. Você verá um erro, já que essa função ainda não foi criada.
  6. Da mesma forma, chame uma função printCakeTop() e transmita a age.
  7. Por fim, chame uma função printCakeBottom() e transmita a age e o número de layers.
  8. Para evitar erros, deixe comentários nas três chamadas de função adicionando // no início de cada linha, conforme mostrado abaixo. Com essa técnica, é possível elaborar o código sem acionar erros.
  9. Execute o programa. Ele não apresentará erros e não fará nada.

Sua função main() ficará como o exemplo abaixo.

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

Criar printCakeTop()

A função printCakeTop() para exibir a parte superior do bolo, que é uma linha de sinais de igual, é quase igual à função printBorder() criada anteriormente neste codelab.

==========================
  1. Abaixo da função main(), adicione uma linha em branco e crie uma função printCakeTop(), que usa um argumento age do tipo Int.
  2. Dentro dela, use uma instrução repeat() para exibir um sinal de igual age vezes mais dois. Os outros dois sinais de igual servem para que as velas não passem da lateral do bolo.
  3. No final, quando repeat() estiver concluído, gere uma linha vazia.
  4. Em main(), remova os dois símbolos // do início da linha de código de printCakeTop(), já que agora a função existe.
printCakeTop(age)

Veja abaixo a função finalizada.

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. Execute o código para ver a parte superior do bolo.

Criar printCakeCandles()

Cada vela é composta por dois símbolos: uma vírgula (,) para a chama e uma linha vertical (|) para o corpo da vela.

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

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

Para fazer isso em uma função, coloque nela duas instruções repeat(): uma para as chamas e outra para as velas.

  1. Abaixo da função main() e printCakeTop(), crie uma nova função printCakeCandles() que use um argumento age do tipo Int.
  2. Dentro dela, use uma instrução repeat() para exibir uma vírgula , para a chama.
  3. Repita isso o número de vezes de age.
  4. No final, gere uma linha vazia.
  5. Adicione uma instrução de impressão para exibir um espaço para inserir as velas.
  6. Abaixo disso, repita as etapas para criar uma segunda instrução repeat() de modo a exibir os corpos de velas, com uma linha vertical |.
  7. No final, gere uma nova linha usando println().
  8. Em main(), remova os dois símbolos // do início da linha de código de printCakeCandles().
printCakeCandles(age)
  1. Execute o código para ver a parte de cima do bolo e as velas

Solução:

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()
}

Criar printCakeBottom()

Nessa função, você está desenhando um pedaço de bolo com largura de age + 2. A altura equivale a um determinado número de camadas do bolo.

@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
  • Isso significa que a função precisa de dois argumentos, um para a largura (age) e outro para a altura (layers).
  • Para exibir a parte de baixo do bolo, primeiro é necessário repetir o símbolo de arroba @ age + 2 vezes para gerar uma camada. Em seguida, repita a geração de uma camada pelo número de vezes de layers.

Desenhar o símbolo de arroba age+2 vezes para criar uma camada

  1. Abaixo das funções existentes, crie uma função printCakeBottom() com dois argumentos (age e layers), ambos do tipo Int.
  2. Dentro da função, use uma instrução repeat() para gerar uma camada de símbolos de arroba @ age + 2 vezes. Para finalizar, gere uma linha vazia, conforme mostrado abaixo.
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. Em main(), remova os dois símbolos // do início da linha de código de printCakeBottom(age, layers).
  2. Execute o código para verificar se ele gera uma linha da parte inferior do bolo.
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

Instruções repeat() aninhadas

Para gerar várias camadas idênticas de bolo, você pode fazer o seguinte:

Para a camada 1, repita o símbolo 12 vezes: @@@@@@@@@@

Para a camada 2, repita o símbolo 12 vezes: @@@@@@@@@@

Para a camada 3, repita o símbolo 12 vezes: @@@@@@@@@@

Ou você pode fazer isso de modo mais conciso:

Repita para as três camadas:

Repita o símbolo 12 vezes.

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

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

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

Isso é algo simples que pode ser feito com instruções repeat(). É possível colocar uma instrução repeat() dentro de outra instrução repeat(). Então, você poderia criar uma instrução repeat() em uma repeat() para mostrar o símbolo um determinado número de vezes para um determinado número de camadas.

Usar a instrução repeat() aninhada para exibir camadas do bolo

  1. Coloque uma segunda instrução repeat() em torno de todo o código dentro da função. Faça a repetição pelo número de vezes de layers.
  2. Em main(), remova apenas os dois // da linha de código de printCakeBottom().
printCakeBottom(age, layers)
  1. Execute o código para ver o bolo todo.

Solução para printCakeBottom().

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

Parabéns! Você acabou de concluir um programa bastante complexo, com várias funções e uma instrução repeat aninhada. E seu bolo sempre terá o número certo de velas.

O resultado final do programa será este:

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

6. Código da solução

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. Solução de problemas

Se a ferramenta de programação Kotlin baseada no navegador não estiver executando seu código ou gerar um erro inesperado não relacionado ao código, tente o seguinte:

  • Atualize a página usando Shift+Atualizar.
  • Aguarde um minuto e tente novamente.

8. Resumo

  • Use ${} para cercar variáveis e cálculos no texto de declarações. Por exemplo: ${age}, em que age é uma variável.
  • Crie uma variável usando a palavra-chave val e um nome. Depois de definido, não é possível mudar esse valor. Atribua um valor a uma variável usando o sinal de igual. Alguns exemplos de valores são texto e números.
  • Uma String é um texto entre aspas, como "Hello".
  • Um Int é um número inteiro positivo ou negativo, como 0, 23 ou -1024.
  • É possível transmitir um ou mais argumentos em uma função para uso, por exemplo: fun printCakeBottom(age:Int, layers:Int) {}
  • Use uma instrução repeat() {} para repetir um conjunto de instruções várias vezes. Por exemplo, repeat (23) { print("%") } ou repeat (layers) { print("@@@@@@@@@@") }.
  • Uma repetição é uma instrução para replicar instruções várias vezes. Uma instrução repeat() é um exemplo de repetição.
  • É possível aninhar repetições, ou seja, colocá-las dentro de repetições. Por exemplo, você pode criar uma instrução repeat() em uma instrução repeat() para exibir um símbolo um determinado número de vezes para um determinado número de linhas, como você fez para as camadas de bolo.

Resumo do uso de argumentos de função: para usar argumentos com uma função, é necessário fazer as três ações a seguir.

  • Adicione o argumento e o tipo à definição da função: printBorder(border: String)
  • Use o argumento dentro da função: println(border)
  • Forneça o argumento ao chamar a função: printBorder(border)

9. Saiba mais

Veja a documentação oficial dos conceitos Kotlin que você aprendeu neste codelab.