Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
[Link] Coroutines → Explore what are coroutines in kotlin. Threads vs.
Coroutines
Exercice 1 :
Écrivez un programme qui demande à l’utilisateur un entier length et qui crée un thread qui
permet de créer une chaine de caractères aléatoire de longueur length, sachant que la chaine
ne peut pas contenir des caractères en double. La chaine doit contenir les caractères a ... z,
A … Z et 0 … 9.
fun main() {
print("The length of the password: ")
val length = readln().toInt()
thread {
// Todo …
}
print("The random password is: ")
}
Exercice 2 :
Faites l’exercice précédent en utilisant une coroutine au lieu du thread.
Exercice 3 :
Ressources / Ex03 / Todo.mp4
Indication :
Pensez à utiliser "\r"
[Link] Coroutine Builders → launch, async, and runBlocking along with
GlobalScope companion object
Exercice 4 :
En utilisant launch créez une coroutine qui calcule la factorielle d’un entier n saisi par
Page 1 sur 6
Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
l’utilisateur.
n ? 15
Factorial(15) = 2004310016
Exercice 5 :
En utilisant async créez une coroutine qui calcule la somme S(n) des factorielles de 0 jusqu’à
n:
S(n) = 0! + 1! + … + n!
n ? 9
S(9) = 409112
Exercice 6 :
Soit le tableau suivant :
val array = Array(10) { (1..100).random() }
▪ En utilisant launch, lancez une première coroutine qui calcule la somme des
éléménts de la première moitié de array.
▪ En utilisant async, lancez une deuxième coroutine qui calcule la somme des éléments
de la deuxième moitié de array.
▪ Afficher la somme des éléments de array comme suit :
45 + 87 + 74 + 10 + 15 + 44 + 1 + 51 + 81 + 69 = 477
[Link] Coroutine Cancellation → Cooperative cancellation, Handle
Exceptions and Timeouts
Exercice 7 :
Nous souhaitons incrémenter un compteur pendant une seconde, l’objectif est de connaitre
la valeur qu’il va atteindre.
Pour cela lancez une première coroutine qui incrémente le compteur infiniment, et une
deuxième coroutine qui annule la première au bout d’une seconde.
Page 2 sur 6
Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
Compteur = 7215418
Remarque : Le résultat que j’ai obtenu peut-être différent du votre.
Exercice 8 :
1. Ajoutez la fonction terme qui retourne le terme Un de la suite de Syracuse définie
somme suit :
U0 = valeur
Un = Un-1 / 2, Si Un - 1 est pair
Un = 3 * Un-1 + 1, Si Un - 1 est impair
2. Ajoutez La fonction tempsDeVol retourne le plus petit indice n tel que : Un = 1.
Il est de 17 pour la suite de Syracuse 15, et de 46 pour la suite de Syracuse 127.
Remarque :
La conjecture de Syracuse affirme que pour tout entier valeur > 0, il existe un indice n
tel que Un = 1.
Technique à utiliser :
Étape 1. On déclare une variable n initialisé à 0.
Étape 2. On lance une coroutine.
Étape 3. On vérifie que terme(n) = 1.
Étape 4. Si oui, on annule la coroutine et on retourne n.
Étape 5. Sinon on incrémente n et on refait les étapes à partir de l’étape 3.
Exercice 9 :
Faites l’exercice 6 en utilisant withTimeOut.
Exercice 10 :
Ressources / Ex10 / Todo.mp4
La suite de Fibonacci est définie comme suit :
Page 3 sur 6
Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
U0 = 1
U1 = 1
Un = Un - 1 + Un - 2, Si n >= 2
[Link] Coroutines → Composing Suspending Functions - Sequential,
Concurrent and Lazy Execution
Exercice 11 :
1. Développez la suspending fonction linearSearch(list: List<Int>, value: Int): Int qui
cherche l’indice de value dans list en implémentant l’algorithme de recherche
séquentielle.
2. Développez la suspending fonction binarySearch(list: List<Int>, value: Int): Int qui
cherche l’indice de value dans list en implémentant l’algorithme de recherche
dichotomique.
On suppose que le tableau est trié dans l’ordre croissant.
3. Soit le code suivant :
val list = Array(1_000_000) { (1..1_000_000).random() }.sortedArray().distinct()
val value = list[[Link]()]
Mesurer le temps nécessaire pour effectuer rechercher value dans array en utilisant les
fonctions précédentes.
Linear time = 11ms
Binary time = 1ms
[Link] Dispatchers, CoroutineContext and CoroutineScope
Exercice 12 :
1. Exécutez le code suivant :
import [Link].*
import [Link]
@OptIn(ExperimentalStdlibApi::class)
fun main() {
Page 4 sur 6
Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
val name: CoroutineContext = CoroutineName("C1")
val dispatcher: CoroutineContext = [Link]
runBlocking(name + dispatcher) {
println(this)
println([Link])
println([Link][CoroutineName])
println([Link][CoroutineDispatcher])
}
}
2. Qui ce que vous remarquez ?
Exercice 13 :
Soit le fichier suivant :
Ressources / Ex13 / [Link]
1. Développez la suspending fonction search(word: String): List<Pair<String, String>>
qui cherche les définitions de word dans le fichier.
2. Écrivez une fonction de test qui exploite la fonction précédente.
Word: aaaa
(No definition)
Word: aline
- v. t. To range or place in a line; to bring into line; to align.
Page 5 sur 6
Développement digital - Option Applications Mobiles
Anouar DERDOURI
Module 202 - Programmation sous Android
Chapitre 11 - Coroutines
Travaux pratiques 1
Word: aback
- adv. Toward the back or rear; backward.
- adv. Behind; in the rear.
- adv. Backward against the mast; -- said of the sails when pressed by the wind.
- n. An abacus.
Page 6 sur 6