Créer un message d'anniversaire en Kotlin

1. Introduction

Dans cet atelier de programmation, vous créerez un petit programme Kotlin qui affichera un message d'anniversaire avec l'image d'un gâteau et une bannière.

Conditions préalables

Objectifs de l'atelier

  • Imprimer un texte plus complexe depuis votre programme
  • Effectuer des calculs mathématiques de base en Kotlin et stocker les résultats dans des variables pour une utilisation ultérieure
  • Créer une fonction permettant d'imprimer plusieurs fois la même chaîne
  • Créer une boucle qui imprime un extrait de texte plusieurs fois

Ce que vous allez créer

  • Vous créerez un petit programme que vous pourrez utiliser pour imprimer des messages d'anniversaire, une image de gâteau avec du texte et une bannière.

Ce dont vous avez besoin

  • Un ordinateur avec accès à Internet et un navigateur Web récent, tel que la dernière version de Chrome

2. Créer un message d'anniversaire en Kotlin

Configurer votre code de démarrage

  1. Dans le navigateur, accédez à https://developer.android.com/training/kotlinplayground. Un outil de programmation Kotlin basé sur le navigateur s'ouvre.
  2. Dans la fonction fun main(), remplacez le texte "Hello, world!" par "Happy Birthday, Rover!".
  3. En dessous, toujours entre les accolades, ajoutez deux lignes supplémentaires : "You are already 5!" et "5 is the very best age to celebrate!"..

Le code final devrait se présenter comme suit :

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. Exécutez votre code.
  2. Vérifiez que le volet de sortie affiche Happy Birthday, Rover! (Joyeux anniversaire, Rover !) et, en dessous, You are already 5! (Tu as déjà 5 ans !) et 5 is the very best age to celebrate (Il n'y a pas de meilleur âge que 5 ans âge pour fêter son anniversaire).
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

Ajouter un gâteau d'anniversaire

Vous devez associer une image au message d'anniversaire (un gâteau, par exemple). Pour ce faire, imprimez des lignes supplémentaires qui utilisent les lettres et les symboles de vos claviers et println().

Continuez à partir du code de solution ci-dessus.

  1. Dans le code, entre les deux instructions println() pour Happy Birthday et You are already 5, ajoutez les lignes d'instructions d'impression suivantes, comme indiqué ci-dessous. Celles-ci créeront un gâteau. La dernière instruction println() n'a pas de texte entre guillemets, ce qui affichera une ligne vide.
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")
    println("")

Pour aider les autres utilisateurs à comprendre le code, vous pouvez ajouter un commentaire avant d'imprimer le gâteau. Si vous exécutez le code, le résultat ne changera pas d'apparence, car les commentaires sont spécifiquement destinés à vous-même et aux autres développeurs, pas au système. Un commentaire intégré commence par //, suivi du texte souhaité, comme indiqué ci-dessous.

// This is a comment line
// This is another comment
  1. Ajoutez un commentaire avant d'imprimer le gâteau : // Let's print a cake!.
  2. Ajoutez un commentaire avant d'imprimer la ligne suivante : // This prints an empty line.

Le code devrait ressembler à l'exemple ci-dessous.

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. Exécutez le code pour générer la sortie ci-dessous.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

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

3. Créer et utiliser des variables

Stocker l'âge de Rover dans une variable

  1. Dans le code final, notez que vous répétez le même âge deux fois.

Au lieu de répéter ce nombre, vous pouvez le stocker à un seul et même endroit, en tant que variable. Cela revient à saisir un nombre dans un champ et à lui attribuer un nom. Vous pouvez ensuite utiliser le nom de cette variable à tout moment. Si l'âge change, il vous suffit de modifier le programme à un seul endroit. En modifiant la variable d'âge, la valeur correcte correspondant apparaîtra partout où elle est utilisée.

  1. Dans le programme, en tant que première ligne de code dans la fonction main(), ajoutez le code suivant pour créer une variable appelée age, avec la valeur 5, comme indiqué ci-dessous. Notez que vous devez placer cette ligne avant les instructions println().
val age = 5

Voici la signification de cette ligne :

  • val est un mot spécial utilisé par Kotlin, appelé mot clé. Il indique que le nom qui suit est le nom d'une variable.
  • age est le nom de la variable.
  • Avec =, la valeur age (à gauche) est identique à la valeur de droite. En mathématiques, un signe égal est utilisé pour confirmer que les valeurs de chaque côté sont identiques. En revanche, en langage Kotlin, le signe égal est utilisé pour attribuer la valeur de droite à la variable nommée à gauche.

Pour un développeur, cela signifie que cette ligne déclare une variable nommée age associée à la valeur 5.

Pour utiliser une variable dans une instruction d'impression, vous devez l'entourer de symboles qui indiquent au système que les éléments ajoutés ne correspondent pas à du texte, mais à une variable. Au lieu d'imprimer le texte, le système doit imprimer la valeur de la variable. Pour ce faire, placez la variable entre accolades, précédées du symbole dollar, comme dans l'exemple ci-dessous.

${variable}
  1. Dans le code, remplacez le chiffre 5 dans les deux instructions d'impression par la variable age, comme indiqué ci-dessous.
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. Exécutez le code. Les deux messages devraient afficher le même âge.
  2. Remplacez la valeur de la variable par une autre valeur. Par exemple, vous pouvez indiquer l'âge de Rover en jours plutôt qu'en années. Pour ce faire, multipliez l'âge par 365, en omettant les années bissextiles. Vous pouvez effectuer ce calcul directement lorsque vous créez la variable, comme indiqué ci-dessous.
val age = 5 * 365
  1. Exécutez à nouveau le code, et notez que les deux messages indiquent désormais l'âge en jours.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 1825!
1825 is the very best age to celebrate!
  1. [Facultatif] Modifiez le texte des messages imprimés pour qu'il soit davantage adapté à l'anniversaire indiqué en jours. Par exemple, écrivez :
You are already 1825 days old!
1825 days old is the very best age to celebrate!

Insérer du texte dans une variable

Vous pouvez non seulement insérer des nombres dans des variables, mais aussi du texte.

  1. Sous la variable age, ajoutez une autre variable appelée name pour spécifier le nom de la personne qui fête son anniversaire, puis définissez sa valeur sur "Rover".
val name = "Rover"
  1. Remplacez le nom Rover dans le message d'anniversaire par la variable, comme indiqué ci-dessous.
println("Happy Birthday, ${name}!")

Vous pouvez aussi inclure plusieurs variables dans une instruction d'impression.

  1. Ajoutez Rover au message concernant l'âge, à l'aide de la variable name, comme indiqué ci-dessous.
println("You are already ${age} days old, ${name}!")

Le code final devrait ressembler à ce qui suit.

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

Félicitations ! Vous pouvez désormais créer des messages contenant du texte et des images à partir de symboles, et utiliser des variables pour stocker des chiffres et du texte ou pour imprimer du texte.

4. Imprimer une bannière d'anniversaire avec une bordure

Au cours cette tâche, vous créerez une bannière d'anniversaire, puis découvrirez comment simplifier ce code à l'aide de techniques de répétition et de réutilisation du code. Vous verrez également pourquoi cette approche est conseillée.

Créer une bannière d'anniversaire de départ

  1. Dans https://developer.android.com/training/kotlinplayground, placez le curseur à un endroit quelconque dans le code.
  2. Effectuez un clic droit pour ouvrir le menu, puis choisissez Tout sélectionner.
  3. Appuyez sur la touche Retour arrière ou Suppr pour supprimer tout le code.
  4. Copiez et collez le code ci-dessous dans l'éditeur.
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. Exécutez le programme pour afficher une bannière imprimée dans la console.
=======================
Happy Birthday, Jhansi!
=======================

Créer une fonction pour imprimer la bordure

Le code que vous venez de coller et d'exécuter est une fonction appelée main() qui contient trois instructions d'impression. Lorsque vous appuyez sur le bouton Exécuter, le système exécute cette fonction et tout le code qu'elle contient.

Un programme Kotlin doit toujours avoir une fonction main(). En outre, vous pouvez créer et utiliser vos propres fonctions. Tout comme les variables vous permettent d'éviter de dupliquer des tâches, les fonctions évitent d'avoir à écrire le même code plusieurs fois. Dans le code, les instructions d'impression pour le haut et le bas de la bannière sont exactement les mêmes. Nous allons donc créer et utiliser une fonction pour imprimer ces bordures.

  1. Dans l'éditeur, sous la fonction main(), insérez une ligne vide juste pour avoir plus de place pour travailler. Le système ignore les lignes vides. Vous pouvez donc en insérer comme bon vous semble pour organiser votre code.
  2. Créez une fonction. Commencez par le mot clé fun, suivi d'un nom, printBorder, de parenthèses () et d'accolades {}, comme indiqué ci-dessous.
fun printBorder() {}

Remarque concernant l'attribution de noms aux fonctions :

  • Notez que le nom de la fonction printBorder commence par une lettre minuscule et un verbe. Les noms de fonction commencent presque toujours par une lettre minuscule et un verbe, et doivent décrire ce que fait la fonction (par exemple, print() ou printBorder() ici).
  • Notez également que le deuxième mot au sein du nom de la fonction commence par une majuscule. Ce style, appelé "casse mixte", facilite la lisibilité des noms. Voici d'autres exemples de noms : drawReallyCoolFancyBorder et printBirthdayMessage.
  1. Placez l'accolade de fermeture } de la fonction printBorder sur une nouvelle ligne et insérez une ligne vide entre les deux accolades afin de vous laisser de la place pour ajouter du code. Il est plus facile de déterminer où se termine la fonction lorsque l'accolade de fermeture } a sa propre ligne.
  2. Dans la fonction main(), copiez l'instruction d'impression de la bordure et collez-la entre les accolades de la fonction printBorder().

Votre fonction printBorder() terminée devrait se présenter comme suit.

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

Pour utiliser ou appeler une fonction, indiquez son nom entre parenthèses. Il s'agit de l'approche que vous avez adoptée avec println(). Pour utiliser la fonction printBorder, appelez printBorder() là où vous avez besoin dans le code.

  1. Dans la fonction main(), remplacez les lignes de code qui impriment une ligne de bordure à l'aide de println() par des appels à la fonction printBorder(). Le code final devrait se présenter comme suit :
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. Exécutez le code pour vous assurer que tout fonctionne comme avant.

Notez que le processus qui consiste à modifier le code pour l'améliorer ou le rendre plus facile à utiliser sans affecter la sortie est appelé refactorisation.

Répéter un schéma de bordure

Comme vous pouvez le constater, la bordure correspond au même symbole répété plusieurs fois. Dès lors, au lieu de spécifier :

"Imprimer cette chaîne de 23 symboles"

vous pouvez indiquer :

"Imprimer ce symbole 23 fois".

Dans le code, utilisez une instruction repeat().

  1. Dans la fonction printBorder(), utilisez l'instruction repeat() pour imprimer le signe égal 23 fois.
  2. Au lieu d'utiliser println(), optez pour print() afin de ne pas passer à une nouvelle ligne après avoir imprimé chaque "=".

Voici le code. Vous avez maintenant une seule instruction pour imprimer le signe égal. Pour la répéter 23 fois, vous utiliserez une instruction repeat().

fun printBorder() {
    repeat(23) {
        print("=")
    }
}
  • L'instruction repeat() commence par le mot repeat, suivi de (). Ce type d'instruction est appelé "boucle", car vous répétez ou créez en boucle le même code. Vous découvrirez d'autres façons de créer des boucles ultérieurement.
  • Entre les parenthèses () figure le nombre de répétitions.
  • S'ensuivent des accolades {}.
  • Entre les accolades {}, figure le code à répéter.
  1. Dans la fonction printBorder(), après l'accolade de fermeture } de l'instruction repeat() (c'est-à-dire après avoir imprimé la bordure), ajoutez une instruction println() afin d'imprimer une nouvelle ligne.

Le code devrait se présenter comme suit.

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

Le code de la fonction main() ne change pas, et le programme entier devrait se présenter comme suit.

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

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}
  1. Exécutez votre code. La sortie devrait être comme avant, mais cette fois, vous avez pu créer la bordure en spécifiant le symbole "=" une seule fois.
=======================
Happy Birthday, Jhansi!
=======================

Utiliser des arguments pour modifier la bordure

Comment procéder si vous souhaitez créer des bordures avec différents symboles, comme ceux indiqués ci-dessous ?

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

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

Vous pouvez définir une fonction distincte pour chacun de ces symboles. Il existe toutefois une méthode plus efficace. Vous pouvez réutiliser la fonction que vous avez déjà écrite et la rendre plus flexible afin qu'elle fonctionne avec différents types de symboles.

L'avantage des fonctions est que vous pouvez y ajouter des entrées à l'aide d'arguments. Vous vous êtes brièvement familiarisé avec ce concept dans un atelier de programmation précédent, lorsque vous avez découvert la fonction main(). Au cours de cette étape, vous ajouterez un argument à la fonction printBorder() afin qu'elle puisse imprimer tout schéma de bordure que vous fournissez.

  1. Dans main(), en haut, créez une variable appelée border pour le format de la bordure. Cette section contiendra le texte à répéter pour la bordure.
val border = "%"
  1. Transmettez maintenant cette variable border aux deux appels de fonction printBorder() en tant qu'argument. Pour ce faire, placez border entre parenthèses (), comme lorsque vous avez fourni du texte à imprimer dans println().

Votre fonction main() devrait ressembler au code ci-dessous.

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

La fonction printBorder() utilisera la valeur de cet élément border comme entrée et déterminera comment imprimer la bordure complète.

  1. Exécutez le code. Le code ne s'exécute pas, et des icônes d'erreur s'affichent à côté. dd0286b7414cea42.png
  2. Le panneau de sortie affiche un message d'erreur.

Comme précédemment, le message indique où se trouve l'erreur et vous donne une indication sur son origine. La partie importante est : Too many arguments for public fun printBorder(). Vous appelez la fonction printBorder() et transmettez une bordure en entrée. Cependant, la définition de la fonction printBorder() n'accepte pas d'entrée pour le moment.

  1. Afin de corriger cette erreur, ajoutez un argument de bordure à la définition de la fonction printBorder(). Consultez la première ligne de code, comme illustré ci-dessous.
fun printBorder(border: String) {
    repeat(23) {
        print("=")
    }
    println()
}
  • Notez que le nom de l'argument est border.
  • Ce nom est suivi du signe deux-points :.
  • Figure ensuite le mot String, qui est une description du type d'argument.

Un élément String désigne un extrait de texte constitué de caractères entourés par des guillemets. Comme une lignée de perles enfilées sur une chaîne afin de former un collier, les caractères sont alignés pour former des mots et du texte. En spécifiant que l'argument doit être un élément de type String, le système fait en sorte que votre argument corresponde à du texte, et non à un nombre par exemple.

  1. Exécutez votre code. La fonction printBorder() accepte désormais un élément String comme entrée pour la bordure. Le code dans main() appelle printBorder(border) avec border comme argument. Le code devrait s'exécuter sans erreur.
  2. La sortie du programme dans la console s'affiche-t-elle toujours comme avant ?
=======================
Happy Birthday, Jhansi!
=======================

Ce comportement n'est pas prévu. Vous avez essayé de créer une bordure avec le symbole "%", mais le programme continue à imprimer une bordure avec le symbole "=". Au cours des prochaines étapes, vous allez découvrir pourquoi.

  1. Dans l'éditeur, vous remarquerez un point d'exclamation gris. Cette icône indique un avertissement. Les avertissements concernent des problèmes de code auxquels vous devez prêter attention, mais ils n'empêchent pas son exécution. 7579663a694ef6bd.png
  2. Passez la souris sur le point d'exclamation pour afficher un message. "Parameter 'border' is never used." indique que le problème est lié à la sortie. Vous transmettez à la fonction une nouvelle chaîne pour la bordure, mais vous ne l'utilisez pas pour l'impression.
  3. Modifiez la fonction printBorder() pour utiliser la valeur border transmise au lieu d'imprimer le caractère "=". Cela fonctionne exactement comme si border était une variable que vous avez définie dans la fonction.
fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}
  1. Exécutez à nouveau le code. La sortie devrait ressembler à ce qui suit.
%%%%%%%%%%%%%%%%%%%%%%%
Happy Birthday, Jhansi!
%%%%%%%%%%%%%%%%%%%%%%%

Bravo, vous avez résolu le problème ! Voici le code finalisé.

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

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

Vous avez rendu la fonction printBorder() beaucoup plus flexible sans ajouter beaucoup plus de code. Vous pouvez désormais imprimer une bordure constituée de différents symboles en effectuant une légère modification.

  1. [Facultatif] En ne modifiant qu'une seule ligne de code dans la fonction main(), comment procéderiez-vous pour imprimer des bannières d'anniversaire de ce type ?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

Modifier une fonction pour inclure deux arguments

Que se passe-t-il si vous voulez utiliser un format différent composé de plusieurs caractères, comme "'-._,-'" ? Vous ne pourriez pas répéter ce format 23 fois, car le résultat serait beaucoup trop long. Toutefois, vous pourriez le répéter environ quatre fois. Pour ce faire, vous pouvez modifier le nombre de répétitions dans l'instruction repeat() de printBorder(). Toutefois, une approche plus efficace est possible.

Vous pouvez définir une bordure plus sophistiquée en fonction de deux critères :

  • Le schéma à répéter (ce que vous avez déjà fait)
  • Le nombre de fois que vous souhaitez répéter ce format

Vous pouvez créer des variables pour le format et le nombre de répétitions, puis transmettre ces deux informations à la fonction printBorder().

  1. Dans main(), modifiez la bordure pour qu'elle corresponde au format "'-._,-'".
val border = "`-._,-'"
  1. Exécutez le code et notez que ce format est désormais beaucoup trop long.
  2. Dans main(), sous la définition de border, créez une variable nommée timesToRepeat pour indiquer le nombre de répétitions. Attribuez-lui la valeur 4.
val timesToRepeat = 4
  1. Dans main(), lors de l'appel de printBorder(), ajoutez le nombre de répétitions en tant que deuxième argument. Séparez les deux arguments par une virgule.
printBorder(border, timesToRepeat)

La fonction main() devrait désormais se présenter comme ceci :

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

Comme précédemment, ce code génère une erreur, car vous avez plus d'arguments appelant printBorder() que dans la définition de printBorder().

  1. Corrigez printBorder() pour que le nombre de répétitions soit également accepté en entrée. Ajoutez une virgule après l'argument, suivi de l'argument supplémentaire timesToRepeat: Int.. La première ligne de la définition de la fonction ressemble maintenant à ceci :
fun printBorder(border: String, timesToRepeat: Int) {

Remarques :

  • La virgule sépare les deux arguments.
  • timesToRepeat est le nom de l'argument.
  • S'ensuit le signe deux-points :.
  • Le type Int. timesToRepeat est un nombre. Dès lors, au lieu de le définir en tant que String, vous devez le définir comme Int, qui est l'abréviation de "integer" en anglais et qui désigne un nombre entier.
  1. Dans printBorder(), modifiez repeat pour utiliser l'argument timesToRepeat (au lieu du nombre 23). Le code printBorder() devrait se présenter comme suit.
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. Exécutez votre code. La sortie doit ressembler à ce qui suit.
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. Pour que cette sortie soit parfaite, insérez deux espaces au début du message "Happy Birthday" (Joyeux anniversaire). La sortie se présentera comme illustrée ci-dessous.
`-._,-'`-._,-'`-._,-'`-._,-'
  Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'

Voici le code final de la bannière :

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

Félicitations ! À l'aide de fonctions, d'arguments, de variables et d'une boucle de répétitions, vous avez découvert les principaux composants de base utilisés dans presque tous les programmes.

Faites une pause, puis passez à la tâche suivante, qui vous permettra de créer d'autres fonctions et boucles. Vous aurez également la possibilité de concevoir un gâteau gigantesque avec le bon nombre de bougies en seulement quelques lignes de programmation.

5. Créer un gâteau à plusieurs étages et avec des bougies

Au cours de cette tâche, vous mettrez à jour le code du gâteau d'anniversaire afin qu'il soit toujours à la bonne taille et avec le nombre approprié de bougies pour chaque âge.

  • Vous créerez un total de trois fonctions pour dessiner un gâteau à plusieurs étages avec des bougies.
  • Vous utiliserez repeat() dans un autre élément repeat() afin de créer une "boucle imbriquée".
  • La façon dont vous allez créer ce code est semblable à la création de n'importe quel programme, en commençant par la vue d'ensemble et en ajoutant des détails au fur et à mesure. C'est ce que l'on appelle le "développement descendant".
  • Les instructions ne sont pas aussi détaillées pour cet exercice pratique. Si vous rencontrez des difficultés, vous pouvez consulter le code final.

Voici une image du gâteau que vous préparerez :

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

Et voici les instructions.

Créer la fonction main()

  1. Remplacez le code dans l'éditeur par le programme Hello, world!.
  2. Vous pouvez supprimer l'argument correspondant à main(), car vous ne l'utiliserez pas.
  3. Dans main(), créez une variable age et définissez-la sur 24.
  4. Dans main(), créez une deuxième variable layers et définissez-la sur 5.
  5. Dans main(), appelez une fonction printCakeCandles() et transmettez la variable age. Un message d'erreur s'affiche, car vous n'avez pas encore créé cette fonction.
  6. De même, appelez une fonction printCakeTop() et transmettez également la variable age.
  7. Enfin, appelez une fonction printCakeBottom() et transmettez la variable age ainsi que le nombre d'étages (layers).
  8. Pour corriger les erreurs, mettez en commentaire les trois appels de fonction en ajoutant // au début de chaque ligne, comme indiqué ci-dessous. Cette technique vous permet d'écrire une ébauche de code sans déclencher d'erreurs.
  9. Exécutez le programme. Il ne devrait pas contenir d'erreur et il ne devrait rien faire de particulier.

Votre fonction main() devrait ressembler au code ci-dessous.

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

Créer une fonction printCakeTop()

La fonction printCakeTop() pour imprimer le haut du gâteau, qui correspond à une ligne de signes égal, est presque identique à la fonction printBorder() que vous avez créée précédemment dans cet atelier de programmation.

==========================
  1. Sous la fonction main(), ajoutez une ligne vide, puis créez une fonction, printCakeTop(), qui utilise un argument, age, de type Int.
  2. À l'intérieur, utilisez une instruction repeat() pour imprimer un signe égal correspond à l'attribut age, plus 2. Les deux signes égal supplémentaires permettent d'éviter que les bougies ne tombent sur le côté du gâteau.
  3. À la fin, lorsque la tâche repeat() est terminée, imprimez une ligne vide.
  4. Dans main(), supprimez les deux symboles // au début de la ligne de code de printCakeTop(), car la fonction existe désormais.
printCakeTop(age)

Voici la fonction terminée.

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. Exécutez le code pour générer le haut du gâteau.

Créer une fonction printCakeCandles()

Chaque bougie est composée de deux symboles : une virgule (,) pour la flamme et une ligne verticale (|) pour le corps de la bougie.

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

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

Pour générer les bougies en une seule fonction, insérez deux instructions repeat() (l'une pour les flammes et l'autre pour le corps des bougies) dans la fonction.

  1. Sous les fonctions main() et printCakeTop(), créez une fonction printCakeCandles() qui utilise un argument age de type Int.
  2. À l'intérieur, utilisez une instruction repeat() pour imprimer une virgule , pour la flamme.
  3. Répétez ce schéma pour que le nombre de flammes correspondent à la variable age.
  4. À la fin, imprimez une ligne vide.
  5. Ajoutez une instruction d'impression afin d'imprimer un espace pour insérer les bougies.
  6. Répétez la procédure pour créer une deuxième instruction repeat() afin d'imprimer le corps des bougies avec une ligne verticale |.
  7. Pour terminer, imprimez une nouvelle ligne avec println().
  8. Dans main(), supprimez les deux symboles // au début de la ligne de code pour printCakeCandles().
printCakeCandles(age)
  1. Exécutez le code pour afficher le haut du gâteau et les bougies.

Solution :

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

Créer une fonction printCakeBottom()

Dans cette fonction, vous dessinerez le bas du gâteau dont la largeur est égale à la variable age + 2. La hauteur correspondra à un nombre donné d'étages.

@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
  • Dès lors, votre fonction nécessite deux arguments : un pour la largeur (age) et un pour la hauteur (layers).
  • Pour imprimer le bas du gâteau, vous devez d'abord répéter l'arobase ("@") autant de fois qu'indiqué par la variable age + 2 afin d'imprimer un étage. Répétez ensuite l'impression d'un étage en fonction de la variable layers.

Dessinez l'arobase autant de fois que défini par la variable "age", plus deux arobases supplémentaires, pour créer un étage.

  1. Sous les fonctions existantes, créez une fonction printCakeBottom() avec deux arguments, age et layers, de type Int.
  2. Dans cette fonction, utilisez une instruction repeat() pour imprimer un étage d'arobases @ correspondant à la variable age + 2. Pour terminer, imprimez une ligne vide, comme illustré ci-dessous.
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. Dans main(), supprimez les deux symboles // au début de la ligne de code pour printCakeBottom(age, layers).
  2. Exécutez le code pour vérifier qu'il affiche le bas du gâteau.
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

Instructions repeat() imbriquées

Pour imprimer plusieurs étages identiques de gâteau, vous pouvez spécifier l'instruction :

Pour l'étage 1, répéter le symbole 12 fois : @@@@@@@@@@@@@@

Pour l'étage 2, répéter le symbole 12 fois : @@@@@@@@@@@@@@

Pour l'étage 3, répéter le symbole 12 fois : @@@@@@@@@@@@@@

Vous pouvez également créer une instruction plus concise :

Répéter l'opération sur trois étages :

Répéter le symbole 12 fois.

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

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

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

Cela est facile à faire avec les instructions repeat(). Vous pouvez placer une instruction repeat() dans une autre instruction repeat(). Par exemple, vous pouvez créer une instruction repeat() dans une instruction repeat() pour afficher le symbole un certain nombre de fois pour un certain nombre d'étages.

Utiliser une fonction repeat() imbriquée pour imprimer les étages du gâteau

  1. Placez une deuxième instruction repeat() ciblant tout le code à l'intérieur de la fonction. Répétez cette boucle un nombre de fois équivalant à la variable layers.
  2. Dans main(), supprimez uniquement les deux // de la ligne de code pour printCakeBottom().
printCakeBottom(age, layers)
  1. Exécutez le code pour voir l'ensemble du gâteau.

Solution pour printCakeBottom().

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

Félicitations ! Vous venez de terminer un programme assez complexe avec plusieurs fonctions et une instruction repeat imbriquée. Qui plus est, votre gâteau aura toujours le nombre approprié de bougies.

La sortie finale du programme devrait se présenter comme suit :

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

6. Code de solution

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. Dépannage

Si l'outil de programmation Kotlin basé sur un navigateur n'exécute pas votre code ou génère une erreur inattendue non liée au code lui-même, essayez les solutions suivantes :

  • Appuyez sur Maj + Actualiser pour actualiser la page.
  • Patientez une minute, puis réessayez.

8. Résumé

  • Utilisez ${} autour des variables et des calculs dans le texte des instructions d'impression. Par exemple, utilisez ${age}, où age est une variable.
  • Créez une variable à l'aide du mot clé val et d'un nom. Une fois définie, cette valeur ne pourra pas être modifiée. Attribuez une valeur à une variable à l'aide du signe égal. Du texte et des nombres sont des exemples de valeurs possibles.
  • Un élément String désigne du texte entouré de guillemets, comme "Hello".
  • Un élément Int est un nombre entier positif ou négatif, comme 0, 23 ou -1 024.
  • Vous pouvez transmettre un ou plusieurs arguments à une fonction, par exemple fun printCakeBottom(age:Int, layers:Int) {}.
  • Utilisez une instruction repeat() {} pour répéter un ensemble d'instructions plusieurs fois (repeat (23) { print("%") } ou repeat (layers) { print("@@@@@@@@@@") }, par exemple).
  • Une boucle est une instruction qui permet de répéter des instructions plusieurs fois. Une instruction repeat() est un exemple de boucle.
  • Vous pouvez imbriquer des boucles. Autrement dit, vous pouvez insérer des boucles dans des boucles. Par exemple, vous pouvez créer une instruction repeat() dans une instruction repeat() pour imprimer un symbole plusieurs fois pour un nombre de lignes, comme vous l'avez fait pour les étages du gâteau.

Récapitulatif de l'utilisation des arguments de fonction : pour utiliser des arguments avec une fonction, vous devez effectuer trois opérations.

  • Ajoutez l'argument et le type à la définition de la fonction : printBorder(border: String).
  • Utilisez l'argument dans la fonction : println(border).
  • Fournissez l'argument lorsque vous appelez la fonction : printBorder(border).

9. En savoir plus

Voici la documentation officielle sur les concepts Kotlin que vous avez appris dans cet atelier de programmation.