This shows you the differences between two versions of the page.
sde2:laboratoare:02_microbit_fr [2021/03/17 11:59] alexandra.state2607 [Structures de données] |
sde2:laboratoare:02_microbit_fr [2021/03/24 10:43] (current) ioana_maria.culic [TP 3 - Set up BBC micro:bit] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== TP 3 - Set up BBC micro:bit ====== | + | ====== TP 03 - Set up BBC micro:bit ====== |
==== Support pour TP ==== | ==== Support pour TP ==== | ||
Line 46: | Line 46: | ||
</code> | </code> | ||
- | Pour accéder le simulateur si vous utilisez Linux ou MacOS, tapez la commande: | + | Pour accéder le simulateur ouvrir un browser et ouvrez: ''http://localhost:8000/editor.html'' |
- | <code> | + | |
- | $ firefox editor.html | + | |
- | </code> | + | |
- | Si vous utilisez Windows, vous pouvez soit utiliser la commande précédente, soit aller dans le dossier "PythonEditor" et cliquer sur "editor.html". | ||
Pour simuler le code, cliquez sur "Sim". Testez l '** Exemple 1 ** du section suivante. | Pour simuler le code, cliquez sur "Sim". Testez l '** Exemple 1 ** du section suivante. | ||
Line 408: | Line 404: | ||
=== La boucle "for" === | === La boucle "for" === | ||
+ | |||
+ | Contrairement aux autres langages, qui ont la forme standard **for(...) { code }** pour la boucle //for//, Python élimine les parantheses qui marquent l'itération d'une liste et utilise les **:** pour indiquer le début du bloc de code qui sera exécuté a l'intérieur de la boucle, comme dans l'exemple suivant: | ||
+ | <code python> | ||
+ | listaDeNume = ["Ana", "Maria", "Ioana", "Irina", "Andreea", "Cristina"] | ||
+ | |||
+ | for nume in listaDeNume: | ||
+ | print (nume) | ||
+ | </code> | ||
+ | |||
+ | En Python, l'indice du pas ou l'on se trouve a chaque moment lorsqu'on parcourt une séquence n'est pas visible. Cependant, il y a une méthode pour compter les pas: la fonction **enumerate**: | ||
+ | |||
+ | <code python> | ||
+ | cours= [ "Analyse", "SdE", "ALF"] | ||
+ | |||
+ | |||
+ | for index, hobby in enumerate(cours): | ||
+ | print (index, hobby) | ||
+ | |||
+ | # Output: | ||
+ | 0 Analyse | ||
+ | 1 SdE | ||
+ | 2 ALF | ||
+ | </code> | ||
+ | |||
+ | Une autre fonctionnalité est l'utilitaire **zip**, qui permet de parcourir 2 listes simultanément: | ||
+ | |||
+ | <code python> | ||
+ | lista1 = [ 3, 9, 17, 15, 19] | ||
+ | lista2 = [ 2, 4, 30, 24, 3] | ||
+ | |||
+ | for a, b in zip( lista1, lista2 ): | ||
+ | if a > b: | ||
+ | print (a) | ||
+ | else: | ||
+ | print (b) | ||
+ | |||
+ | # Output: | ||
+ | |||
+ | 3 | ||
+ | 9 | ||
+ | 30 | ||
+ | 24 | ||
+ | 19 | ||
+ | </code> | ||
+ | |||
+ | Une autre particularité du langage Python est le fait qu'on peut appliquer la condition //"else"// aussi pour la boucle //"for"//. Dans ce cas, la branche "else" sera executée après la boucle "for", si et seulement si à l'intérieur de "for" on n'a pas une déclaration de type "break". | ||
+ | Par exemple: | ||
+ | |||
+ | <code python> | ||
+ | listeAnimaux = [ "loup", "lapin", "lion", "ours" ] | ||
+ | |||
+ | for i in listeAnimaux: | ||
+ | print (i) | ||
+ | if i == "lapin" | ||
+ | print ("Le lapin n'est pas sauvage") | ||
+ | break | ||
+ | else: | ||
+ | print ("Tous les animaux!") | ||
+ | |||
+ | # Output | ||
+ | loup | ||
+ | lapin | ||
+ | Le lapin n est pas sauvage | ||
+ | |||
+ | #Si on execute la sequence suivante: | ||
+ | for i in listeAnimaux: | ||
+ | print (i) | ||
+ | if i == "lapin" | ||
+ | print ("Le lapin n'est pas sauvage") | ||
+ | else: | ||
+ | print ("Tous les animaux!") | ||
+ | |||
+ | # Output | ||
+ | loup | ||
+ | lapin | ||
+ | Le lapin n est pas sauvage | ||
+ | lion | ||
+ | ours | ||
+ | Tous les animaux! | ||
+ | </code> | ||
+ | |||
+ | === La boucle "while" === | ||
+ | |||
+ | <code python> | ||
+ | #Afficher les chiffres de 0 a 9 | ||
+ | |||
+ | count = 0 | ||
+ | |||
+ | while count < 10: | ||
+ | print (count) | ||
+ | count = count + 1 | ||
+ | </code> | ||
+ | |||
+ | Comme pour la boucle "for" on a aussi la possiblité d'appliquer la condition "else" a la boucle "while". La différence est que le bloc "else" sera exécuté chaque fois que la condition de la structure répétitive sera évaluée comme fausse: | ||
+ | |||
+ | <code python> | ||
+ | print ("Dévinez de numéro de l'intervalle [ 1, 10 ]") | ||
+ | |||
+ | monNr = 7 | ||
+ | votreNr = 0 | ||
+ | |||
+ | while votreNr!= monNr: | ||
+ | votreNr = int( input("Choisissez. ") ) | ||
+ | else: | ||
+ | print ("Félicitations!") | ||
+ | </code> | ||
+ | |||
+ | === Déclarations "break" et "continue" === | ||
+ | |||
+ | L'instruction //"break"// est utilisée pour sortir d'une structure répétitive, en étant une alternative pour la condition de sortie. Par exemple, on peut afficher les numéros de 0 a 9 de la facon suivante: | ||
+ | |||
+ | <code python> | ||
+ | count = 0 | ||
+ | |||
+ | while True: | ||
+ | print (count) | ||
+ | count = count + 1 | ||
+ | if count > 10: | ||
+ | break | ||
+ | </code> | ||
+ | |||
+ | La déclaration //"continue"// est utilisée pour ignorer un bloc d'instructions. Par exemple, on peut l'utiliser pour afficher les nombres pairs de 0 a 20: | ||
+ | |||
+ | <code python> | ||
+ | number = 0 | ||
+ | |||
+ | while number < 21: | ||
+ | if number % 2 == 1 | ||
+ | continue | ||
+ | print (number) | ||
+ | </code> | ||
+ | |||
+ | ===== Fonctions ===== | ||
+ | |||
+ | === Déclaration === | ||
+ | |||
+ | <code python> | ||
+ | def myFunction(): | ||
+ | print ("Welcome") | ||
+ | |||
+ | # ou | ||
+ | |||
+ | def simpleSum( a, b ): | ||
+ | return a + b | ||
+ | </code> | ||
+ | |||
+ | === Appel === | ||
+ | <code python> | ||
+ | myFunction() | ||
+ | |||
+ | # ou | ||
+ | |||
+ | first = 1 | ||
+ | second = 1 | ||
+ | sum = simpleSum( first, second ) | ||
+ | print (sum) | ||
+ | |||
+ | print (simpleSum( first, second )) | ||
+ | </code> | ||
+ | |||
+ | ===== Classes et Objets ===== | ||
+ | |||
+ | On appelle **objet** une encapsulation de variables et fonctions dans une seule entité, tandis qu'une **classe** représente un modèle pour la création des objets. Donc, in objet prend ses données d'une classe. | ||
+ | |||
+ | <code python> | ||
+ | # Classe simple | ||
+ | |||
+ | class MaClasse: | ||
+ | variable = "Bonjour" | ||
+ | |||
+ | def maFonction(self): | ||
+ | print ("Bonjour de l'autre part!") | ||
+ | |||
+ | |||
+ | # Association classe objet | ||
+ | monObjet = MaClasse() | ||
+ | |||
+ | |||
+ | # Afficher le contenu de la variable de MaClasse | ||
+ | print (monObjet.variable) | ||
+ | |||
+ | # Appeler la fonction maFonction, qui va afficher sur l'écran le message "Bonjour de l'autre part!" | ||
+ | monObjet.maFonction() | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | En Python **self** représente l'instance d'une classe, en étant identique a **this** de Java. En utilisant le mot-clé **self**, on peut accéder aux attributs et aux méthodes définis dans la classe. | ||
+ | </note> | ||
+ | |||
+ | Le nombre d'objets qu'on peut créer a partir d'une classe n'est pas limité, tous les objets en héritant touts les particularités de la classe (variables et fonctions). Cependant, chaque objet contient des copies indépendantes des variables définies a l'interieur de la classe. Donc, si on crée un nouvel objet de la classe mere, on peut modifier son contenu sans affecter la definition initiale de la classe: | ||
+ | |||
+ | <code python> | ||
+ | |||
+ | class MaClasse: | ||
+ | variable = "Bonjour" | ||
+ | |||
+ | def maFonction(self): | ||
+ | print ("Bonjour de l'autre part!") | ||
+ | |||
+ | monObjet1 = MaClasse() | ||
+ | monObjet2 = MaClasse() | ||
+ | |||
+ | monObjet2.variable = "au revoir" | ||
+ | |||
+ | print (monObjet1.variable) | ||
+ | print (monObjet2.variable) | ||
+ | |||
+ | #Output | ||
+ | bonjour | ||
+ | au revoir | ||
+ | </code> | ||
+ | |||
+ | ====== Fonctions mathématiques ===== | ||
+ | |||
+ | Pour pouvoir utiliser des fonctions qui exécutent des opérations mathématiques en Python, il faut importer et utiliser le module **math**. | ||
+ | |||
+ | <code python> | ||
+ | import math | ||
+ | </code> | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | Chaque fonction de la bibliotheque math sera appelée de la façon suivante: | ||
+ | |||
+ | <code python> | ||
+ | math.functionName( params ) | ||
+ | </code> | ||
+ | |||
+ | Quelques fonctions élémentaires de ce type sont: **floor**, **ceil**, **pow**, **sqrt**. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Il y a aussi des fonctions prédéfinies qui ne doivent pas être importées d'un module auxiliaire. Elles sont appelées comme il suit: | ||
+ | |||
+ | <code python> | ||
+ | functionName( params ) | ||
+ | </code> | ||
+ | |||
+ | Quelques exemple de cette catégires sont: **abs**, **round**, **sum**. | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Une liste complète des fonctions mathématiques de Python peut être trouvée [[https://docs.python.org/2/library/math.html|ici]]. | ||
+ | </note> | ||
+ | |||
+ | ===== Lecture du clavier ===== | ||
+ | Comme l'entrée des données peut provenir du clavier en nombreuses situations, Python 3 fournit la fonction **input()**. Cette fonction peut recevoir aussi un parametre supplémentaire, qui sera le string affiché dans la ligne de commande au moment de la lecture des données nécessaires: | ||
+ | |||
+ | <code python> | ||
+ | name = input("Quel est votre nom? ") | ||
+ | print("Bienvenue, " + name + "!") | ||
+ | </code> | ||
+ | |||
+ | <code bash> | ||
+ | # Output dans la ligne de commande | ||
+ | Quel est votre nom? "Ana" | ||
+ | Bienvenue, Ana! | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Exécuter l'exemple ci-dessus sur BBC micro:bit. Connectez la plaque et ouvrir l'éditeur du code. Connecter le micro:bit et puis appuyez //Flash//. Après quelques secondes vous devez ouvrir //Open Serial// clique sur l'icône. Vous avez avoir un output similaire avec celui ci-dessous. Maintenait, vous devez taper l'input. Pour revenir au vôtre code appuyez //Close Serial//. | ||
+ | |||
+ | {{ :sde2:laboratoare:open_serial.png?450 |}} | ||
+ | </note> | ||
+ | |||
+ | ===== Exceptions en Python ===== | ||
+ | |||
+ | En Python, on a 2 types d'erreurs: //erreurs de syntaxe// et //exceptions//. | ||
+ | |||
+ | Les **erreurs de syntaxe**, connues aussi sur le nom d'erreurs d'analyse (parsing error) sont les plus communes: | ||
+ | |||
+ | <code python> | ||
+ | >>> while True print('Hello world') | ||
+ | File "<stdin>", line 1 | ||
+ | while True print('Hello world') | ||
+ | ^ | ||
+ | SyntaxError: invalid syntax | ||
+ | </code> | ||
+ | |||
+ | Les **exceptions** sont détectées au moment de l'exécution: | ||
+ | |||
+ | <code python> | ||
+ | >>> 10 * (1/0) | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | ZeroDivisionError: division by zero | ||
+ | </code> | ||
+ | |||
+ | === Gestion des exceptions === | ||
+ | |||
+ | Pour gérer les exceptions en Python, on utilise le bloc **try - except**, comme dans l'exemple suivant: | ||
+ | |||
+ | <code python> | ||
+ | while True: | ||
+ | try: | ||
+ | x = int(input("Please enter a number: ")) | ||
+ | break | ||
+ | except ValueError: | ||
+ | print("Oops! That was no valid number. Try again...") | ||
+ | </code> | ||
+ | |||
===== Exercices ===== | ===== Exercices ===== | ||
- | - Écrivez un programme qui en appuyant simultanément les boutons A et B, va afficher une image qui représente "OUI". Si pas de boutons est appuyé sur l'écran va affiche une image qui représente "NON" "NON". Voir les image sur [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/images.html|documentation]]. | + | - Créez 3 variables de types différents, comme il suit: **(0.5p)** |
- | -Modifier l’exercice antérieur tel que en appuyant le bouton A va afficher sur l’écran la lettre "A" et en appuyant le bouton B va afficher sur l’écran la lettre "B". | + | - une variable "int", qui va recevoir la valeur 80 |
- | -Écrivez un programme qui affiche le nombre actuel de secousses sur l’écran. Lorsque le micro-bit enregistre 9 secousses, une image apparaît sur l’affichage. | + | - une variable "float", ayant la valeur 20.2 |
- | -Créez un programme qui enregistre le nombre des inclinaisons à gauche et à droite. Chaque fois que le micro: bit est pointé dans l’un des deux côtés, il doit afficher sur l’écran le nombre actuel d’inclinaisons de ce côté. //Hint//: utilisez la méthode [[https://microbit-micropython.readthedocs.io/en/v1.0.1/microbit.html#microbit.sleep|sleep]] | + | - une variable "string", qui va retenir la chaîne "python" |
- | -Écrivez un programme qui en atteignant le logo (le capteur tactile) va faire toggle entre une image avec un diamant et une image avec un petit diamant. | + | - En utilisant la fonction [[https://docs.python.org/2/library/functions.html#type|type]], déterminez le types des variables suivantes: **(0.5p)** |
- | -Écrivez un programme qui, lors de l’enregistrement d’un son, affichera une image sur l’écran et parlera avec la parole "ON". Si aucun son n’est pas enregistré, l’affichage reste vide. Affichez le niveau sonore pour une action a votre choix (appui sur un bouton, logo tactile, inclinaison, etc.) | + | - var1 = 80 |
- | -Changer le code de [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#senzorul_de_temperatura_si_de_lumina|exemple 7]] pour que le micro:bit détecte la lumière pour utiliser le haut-parleur pour lire de la musique JUMP_UP, et lorsque la lumière est éteinte pour lire de la musique JUMP_DOWN. Pour accéder à la bibliothèque "musique", voir la [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/music.html|documentation]]. | + | - var2 = 20.2 |
+ | - var3 = "microbit" | ||
+ | - Ecrivez un programme qui recoit comme parametres de la ligne de commande 4 nombres (a,b,c,d) et affiche sur l'écran le résultat de l'opération **a+b*c+d**. **(1p)** | ||
+ | - Créez une liste avec les noms des camarades de classe. Les noms peuvent ne pas etre distincts. Résolvez les demandes suivantes: **(2p)** | ||
+ | - Copier la liste intaille dans une autre liste appelle copyList et trier lui dans l ordre alphabétique. | ||
+ | - Déterminez le numéro d'occurrences du chaque nom en utilisant une liste auxiliaire, qui contient des éléments distincts. | ||
+ | - Déterminez le nom, qui a le numéro maxime d'occurrences dans la liste initiale et le nom avec le numéro minime d'occurrence (s’il y a plusieurs éléments qui respect la condition toutes vont être affichées). | ||
+ | - Inversez la liste de copyList et supprimez le dernier élément de la liste initiale. | ||
+ | - Créez une base de données d'un magasin avec des appareils électroménagers à l'aide du dictionnaire. Ajoutez des fonctionnalités: lorsqu'un produit est lu à partir du clavier, son prix soit affiché. Une erreur s'affichera si le produit n'existe pas "Erreur" et les produits seront recherchés jusqu'à ce que le texte "stop" soit entré. | ||
+ | - Ecrivez un programme qui affichera le résultat retourne par la fonction // digitize (n) //. Cette fonction va recevoir un int comme paramètre et va retourner une liste de chiffres du nombre dans l'ordre inverse. ** (1p) ** Exemple: 348597 => [7,9,5,8,4,3] | ||
+ | - Créez une classe Capteurs utilisée pour stocker les valeurs des capteurs suivants: température, lumière, humidité. Pour chaque capteur, vous pouvez lire et modifier les valeurs par des appels de fonction. ** (1p) ** | ||
+ | - Créez un programme qui, en utilisant la classe définie ci-dessus, stocker des valeurs provenant du différent ensembles de capteurs pour les suivantes chambres d'une maison et les affiche à l'écran: la cuisine, le hall, la chambre a couché, la salle a mangé. Le programme effectue les opérations en recevant les commandes de la console comme suit: ** (2p) ** | ||
+ | * ''insert <chambre> <capteru> <valeur>'' - où ''<chambre>'' , ''<capteur>'' et ''<valeur>'' vont être remplacés avec un de les 3 capteurs et une valeur - insérer une nouvelle valeur pour le capteur respectif | ||
+ | * ''delete <chambre> <chambre> <capteru> <valeur>'' - supprimer la valeur de ce capteur, la valeur après suppression sera 0 | ||
+ | * ''print <chambre><sensor>'' - afficher la valeur pour le capteur de la chambre précise | ||
+ | * ''print <chambre>'' - afficher tous capteurs el les valerus correspondantes pour la chambre spécifiée | ||
+ | * ''add_room <chambre>'' - ajoute un nouvel ensemble de capteurs pour une nouvelle chambre | ||
+ | * ''del_room <chambre>'' - efface l'ensmeble de capteurs pour une chambre | ||
+ | S’il va être introduit une autre commande, le programme lèvera une exception. | ||
+ | |||
+ | == Bonus == | ||
+ | - Modifiez les programmes précédents pour afficher les valeurs sur micro: bit, pas sur la console. | ||
+ | - Créez un programme qui allume tour à tour chaque LED du micro:bit. | ||
+ | - Créez un programme qui lit la température ambiante à l'aide du capteur existant sur micro:bit et l'affiche à l'aide des LED. | ||
+ | |||
+ | |||
+ | ==== ==== | ||
+ | |||
+ | [[https://github.com/UPB-FILS-SdE2/Solutions/tree/main/TP3|Solutions]] | ||
+ | |||
+ | |||
+ | |||
+ |