From 19c2f22bf5c300c8e56655c8e925eadca8a29181 Mon Sep 17 00:00:00 2001 From: Alexis Fourmaux Date: Thu, 24 Jul 2025 13:28:16 +0200 Subject: [PATCH] tp 1 --- .../CIEL1/01-bases-python/tp/01_decouverte.md | 405 +++++++++++++++++- .../CIEL1/01-bases-python/tp/image-1.png | Bin 0 -> 15058 bytes .../CIEL1/01-bases-python/tp/image-2.png | Bin 0 -> 15984 bytes .../CIEL1/01-bases-python/tp/image-3.png | Bin 0 -> 1145 bytes 4 files changed, 389 insertions(+), 16 deletions(-) create mode 100644 src/cours/CIEL1/01-bases-python/tp/image-1.png create mode 100644 src/cours/CIEL1/01-bases-python/tp/image-2.png create mode 100644 src/cours/CIEL1/01-bases-python/tp/image-3.png diff --git a/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md b/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md index a28de6e..3f6e5f4 100644 --- a/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md +++ b/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md @@ -129,11 +129,11 @@ Nous allons donc affecter et utiliser nos premières variables. 2. Essayez d'entrer un nom de variable **illégal** (c'est à dire qu'il n'est pas autorisé dans le langage et qu'il causera une erreur). Notez-le. Que se passe-t-il ? 3. Essayez d'écrire `3 = x`. que se passe-t-il ? 4. Ecrivez le code suivant. Expliquez ce qu'il fait -~~~python ->>> mon_age = 19 ->>> mon_age = mon_age * 2 ->>> mon_age -~~~ + ~~~python + >>> mon_age = 19 + >>> mon_age = mon_age * 2 + >>> mon_age + ~~~ 5. a. Le code suivant calcule le prix TTC d'un article à partir de sont prix hors taxes (45€), en lui ajoutant la TVA. Ecrivez-le dans l'interpréteur. Quel résultat obtenez-vous pour le prix TTC ? ~~~python @@ -189,19 +189,392 @@ Vous pourrez utiliser des `"` lorsque que votre chaîne contiendra des `'` et in - `'Elle a dit "Hello"'` ``` - ## Un premier script -- print -- chaines de caractères + formatage + +Pour la suite de ce TP nous allons arrêter d'utiliser l'interpréteur. L'interpréteur est très pratique pour tester des expressions ou des commandes. Mais il n'est pas pratique pour réexécuter ou modifier des programmes : il faut retaper toutes les commandes dans le bon ordre à chaque fois. Et en plus de ça, dès que l'on ferme l'interpréteur, tout ce qui a été écrit est perdu. + +Nous allons utiliser des fichiers, désormais, pour écrire nos programmes. Pour cela on peut utiliser n'importe quel **éditeur de texte**. + +```admonish warning title="Important" +Un **éditeur de texte** est différent d'un logiciel de **traitement de texte** comme peut l'être Microsoft Word ou Libre Office Writer. + +Il permet d'écrire du texte brut, sans aucune mise en forme, contrairement aux logiciels de traitement de texte qui contiennent des informations invisibles. Pour écrire du code, il faut uniquement du texte brut, c'est pour cela qu'on utilisera un éditeur de texte : par exemple, on peut utiliser Thonny comme dans ce TP, ou Notepad++ ou Visual Studio Code sous Windows, Geany, Gedit, nano, vim ou également VSCode sous Linux. Il en existe plein d'autres, avec plus ou moins de fonctionnalités avancées. + +L'une d'entre elles, probablement la plus importante, c'est la **coloration syntaxique** : les mots du code sont colorés de différentes manières pour vous aider à identifier la structure et les mots clés, les variables etc... +``` + +Dans Thonny, nous allons utiliser l'autre encadré, celui qui s'appelle `` pour l'instant. Nous verrons dans un prochain TP comment travailler avec Visual Studio Code, un logiciel très performant et puissant pour écrire du code. Pour l'instant, gardons les choses simples et continuons avec Thonny. Vous pouvez continuer à utiliser Thonny chez vous également, il comporte le nécessaire pour utiliser Python. + +Nous allons donc écrire un premier fichier comportant du code que vous pourrez exécuter autant de fois que nécessaire pour le tester, le modifier etc. + +```admonish success title="À retenir" +Un fichier contenant du code Python s'appelle un **script**. Les scripts python ont un nom se finissant par l'**extension** `.py` +``` + +Pour commencer nous allons enregistrer notre script dans un fichier. Cliquez sur le bouton Enregistrer comme sur l'image ci-dessous. Vous pouvez aussi appuyer sur CTRL+S. + +![enregistrer le fichier](image-1.png) + +Allez dans votre espace personnel, choisissez un nom, par exemple `tp01-hello-world.py`, et cliquez sur `Sauvegarder`. Voilà, nous sommes prêts à travailler. + +### La fonction print + +```admonish travail +1. Recopiez le code suivant, sauvegardez vos modifications, et cliquez sur le bouton en forme de rond vert avec un triangle à l'intérieur. Vous pouvez aussi appuyer sur F5 pour exécuter le script. Que fait-il ? + + ~~~python + print("Hello, world!") + ~~~ + + ![Exécuter votre script](image-2.png) + +2. Créez, à la suite du programme existant, une variable `a` à laquelle vous affecterez la valeur 3. Donnez maintenant l'expression pour d'afficher la valeur de `a` à l'aide de `print`. +3. Copiez le programme suivant : + ~~~python + a = 3 + print(a) + a = a + 3 + b = a - 2 + ~~~ + + Que valent `a` et `b` à votre avis ? Vérifiez à l'aide de print en écrivant la ligne suivante : `print("a =", a, "et b =", b)` + +4. Nous allons voir une autre manière d'écrire le print précédent, avec une **chaîne de caractères formatée**. Ajoutez la ligne : `print(f"a = {a} et b = {b}")`. Vérifiez que le résultat est bien identique au print précédent. + +5. Donnez le code qui permettra, sur le même modèle, d'afficher la chaîne `Je m'appelle ` où prénom sera remplacé par votre prénom. +``` + +```admonish question +Pourquoi utiliser la fonction print, alors que dans l'interpréteur, écrire une chaîne de caractères ou le nom d'une variable permet déjà de l'afficher ? +``` + +L'interpréteur affiche les valeurs des variables pour vous aider à comprendre les étapes du programme, mais dans un script cela n'aura aucun effet. De plus l'interpréteur affiche les guillemets, et parfois d'autres informations que vous ne voulez pas forcément voir affichées. La fonction print permet d'afficher les informations dans la console, et de les **formater** (c'est à dire les organiser) comme cela vous arrange. + +```admonish success title="À retenir" +- La fonction `print` permet d'afficher des chaînes de caractères et/ou des variables. +- Elle peut prendre plusieurs arguments, et affichera les arguments séparés par un espace +- Elle peut également prendre une chaîne de caractères **formatée** : on l'écrira sous la forme `f"chaine de caractère {variable}"`, ce qui permettra de remplacer les variables entre accolades `{}` par leur valeur dans la chaîne de caractères. Le `f` avant les guillemets est important car il permet de dire à Python que la chaîne est formatée. Si vous l'oubliez, il ne cherchera pas à remplacer les variables par leur valeur. + +Les chaînes formatées sont très utilisées en python. Elles servent à afficher des informations dynamiques en fonction de variables, mais vous aideront aussi à comprendre ce que font vos programmes et vous aider à les corriger. +``` + +### La fonction input + +Pouvoir afficher du texte est déjà très bien, mais pouvoir en saisir est également très utile, par exemple pour que la personne qui utilisera votre programme puisse entrer des données sans modifier votre programme. Nous allons maintenant voir comment faire ça. + +- La fonction `input` permet de demander une saisie de texte dans la console, et il suffit de taper Entrée pour valider votre saisie. +- Cette fonction prend un argument *optionnel* : une chaîne de caractères à afficher dans la console, pour dire ce que vous demandez de saisir. +- On peut affecter le résultat de input à une variable directement, comme dans l'exemple ci-dessous. + +```admonish travail +1. Testons dans un premier temps dans l'interpréteur. Utilisez la fonction `type` pour vérifier le type de la variable `nombre`. Quel est ce type ? + ~~~python + >>> nombre = input("Saisissez un nombre : ") + Saisissez un nombre : 42 + ~~~ +2. Nous allons donc devoir convertir la variable `nombre` en un nombre entier. Pour cela, utilisons la fonction `int` sur `nombre` + ~~~python + >>> nombre = int(nombre) + ~~~ +3. Repassons sur un fichier de script : ouvrez un nouvel onglet, et sauvegardez le fichier sous le nom `tp01-input.py`. + + Ensuite, écrivez un programme permettant de saisir un nombre et de l'afficher avec `print`. Votre programme devra afficher `Vous avez entré le nombre : ` suivi du nombre saisi. Aidez vous des questions précédentes. + + Mettez le script dans votre compte rendu. +``` + +```admonish success title="À retenir" +- La fonction `input` permet de demander la personne utilisant votre programme de saisir du texte +- Elle prend en argument optionnel une chaîne de caractère qui s'affichera avant la saisie +- Elle renvoie ce qui a été saisi sous forme d'une chaîne de caractères. Il faut donc penser à convertir si vous avez besoin d'un autre type. +- Le résultat de la fonction peut être immédiatement affecté à une variable. +``` ## Structure conditionnelle -- if -- if elif else -- opérateurs de comparaison -- booléens -- opérateurs logiques and, or, not + +### if ... elif ... else ... +Nous allons maintenant voir l'un des éléments les plus importants dans l'écriture d'un programme. Jusqu'à maintenant nos programmes exécutaient les instructions les unes à la suite des autres. Mais il est parfois pratique d'effectuer quelque chose dans un cas, et autre chose dans un autre cas. Pour cela, il nous faut un moyen de séparer les cas : les **structures conditionnelles**. + +En python, pour écrire une structure conditionnelle, on va utiliser le mot clé `if`, qui signifie "si" en anglais. Par exemple, pour faire quelque chose si une variable vaut `1`, on va écrire le programme suivant : + +```python +ma_variable = 1 +if ma_variable == 1: + print("Ma variable vaut 1") +``` + +Décorticons un peu ce programme. +- Nous avons le mot clé `if`, qui veut dire "si" +- puis `ma_variable == 1`, ce qui s'appelle un **test**. + - `ma_variable` est le nom de notre variable, celle que l'on veut tester + - `==` est un **opérateur de comparaison** pour tester l'égalité. Ici on veut vérifier que `ma_variable` vaut la valeur `1`. Remarquez qu'il est différent du `=` simple, qui sert pour affecter une variable. +- Nous avons `:` à la fin de la ligne. C'est pour marquer la fin de la condition, et indiquer qu'après cela, nous passerons aux instructions exécutées si la condition est vraie +- Enfin, nous avons la ligne ` print("Ma variable vaut 1")` qui vient afficher du texte. Mais remarquons une chose très importante : elle est décalée par rapport à la ligne précédente avec des espaces. C'est ce qu'on appelle **l'indentation**, et en python c'est indispensable. Si le code n'est pas correctement identé, c'est une erreur et votre programme ne marchera pas. Ici on indente tout ce qui sera exécuté si la condition est réalisée. Notez aussi que cela permet de rendre le code beaucoup plus facile à lire, car il s'organise en blocs plus ou moins décalés, ce qui vous permet de savoir en un coup d'oeil ce qui est exécuté ou non. + +```admonish travail +Dans un nouveau fichier que vous appellerez `tp-01-conditions.py` + +1. + a. Copiez et exécutez le code de l'exemple ci-dessus. Vérifiez que la phrase `Ma variable vaut 1` s'affiche correctement. + b. Au début du programme, nous avons déclaré `ma_variable`. Remplacez cette déclaration pour pouvoir saisir un nombre de manière interactive, avec `input`. Mettez la ligne modifiée dans le compte rendu. + c. Réexécutez le programme en testant différentes valeurs (dont `1` pour vérifier qu'il marche toujours comme en a.). Qu'affiche le programme et pourquoi ? + +2. Maintenant, nous allons essayer d'écrire quelque chose lorsque la condition est respectée mais autre chose quand elle ne l'est pas. Pour cela, nous allons utiliser le mot clé `else` qui signifie "sinon". En faisant ça on pourra avoir un programme qui fera "**Si** ma condition est vraie *alors* je fais ça, **sinon** je fais ça". + + Écrivez le programme suivant, et modifiez la valeur d'âge en réexécutant le programme pour voir dans quel cas s'affiche quel texte. Que signifie le symbole `>` à votre avis ? + ~~~python + age = 17 + if age > 18: + print("Vous êtes majeur.e") + else: + print("Vous êtes mineur.e") + ~~~ + +3. Imaginons maintenant que nous ayons 3 cas possibles : majeur, mineur et retraité. + + Nous pouvons enchaîner plusieurs conditions grâce au mot clé `elif` (contraction de de "else if", c'est à dire "sinon, si..."). `elif` s'utilise exactement comme `if` mais doit forcément se trouver après une première condition `if`. + + Modifiez le code précédent en rajoutant le cas des retraités, pour afficher une phrase `Vous êtes en retraite` lorsque la variable `age` est supérieure à 60 (Allez, on y croit !). Mettez ce code dans votre rapport de TP. + +4. **Bonus :** Imaginons maintenant que l'on ait une autre variable, `annees_de_cotisation`. À partir de 60 ans, si on a 40 années de cotisation, on peut prendre la retraite. Sinon, il faut atteindre 40 années de cotisation. + +Nous allons donc devoir rajouter une condition supplémentaire pour les personnes ayant plus de 60 ans, en fonction de la variable `annee_cotisation`. Rajoutez cette variable, et rajoutez une **condition imbriquée** dans la branche qui concerne les plus de 60 ans. +``` + +```admonish success title='À retenir' +En résumé, les **structures conditionnelles** ressemblent à ceci : +~~~python +if condition: + # Faire quelque chose +elif autre_condition: + # Faire autre chose +else: + # Dans tous les autres cas, faire cette chose +~~~ + +- Elles permettent d'exécuter un code différent selon des conditions. +- Le mot-clé `if` est celui qui indique le début d'une structure conditionnelle. Il est obligatoire. +- Le mot-clé `elif` permet de rajouter des conditions. On peut en mettre autant que l'on veut. Il est optionnel. +- Le mot-clé `else` permet de gérer tous les cas qui n'entrent pas dans les précédentes conditions. Il est forcément en dernier et est optionnel. +- Il est important de ne pas oublier + - Le symbole `:` à la fin de chaque ligne + - D'indenter votre code, pour indiquer à python ce qui est concerné par une condition. +- Ne pas indenter correctement un code python est une **erreur de syntaxe**, c'est à dire que le code n'est pas valide et ne pourra pas s'exécuter +``` + +```admonish tip title='Astuce' +Il est possible d'imbriquer plusieurs conditions, en indentant correctement votre code de la manière suivante: +~~~python +if condition: + if sous_condition: + # Faire qqch + elif sous_condition_2 : + # Faire autre chose +else: + # Traiter les autres cas +~~~ +``` + +### Les opérateurs de comparaison + +```admonish success title='À retenir' +Nous avons vu dans l'activité précédente les opérateurs `==`, `<` et `>`. On les appelle les **opérateurs de comparaison**. Il en existe d'autres : + +|Opérateur|Description| +|---------|-----------| +|`==`| Égal à| +|`!=`| Différent de| +|`<`| Strictement inférieur à| +|`>`| Strictement supérieur à| +|`<=`| Inférieur ou égal à| +|`>=`| Supérieur ou égal à| + +Attention, l'opérateur d'égalité est bien `==`, et non pas `=`. Utiliser l'opérateur d'affectation `=` pourra produire un code qui s'exécute, mais n'aura pas le résultat que vous attendez. +``` + +```admonish travail +Reprenez l'interpréteur python, déclarez les variables `a = 1`, `b = 3` et `c = 4` et testez les expressions suivantes. Que retournent-elles ? + +1. `b > a` +1. `c <= a` +1. `a != b` +1. `b == '3'` (attention aux guillemets simples). Qu'en déduisez-vous ? +1. `a < b < c` +``` + +Ces opérateurs de comparaison retournent des booléens (le type `bool` que nous avons vu plus haut). Nous pouvons même stocker le résultat d'une comparaison dans une variable (qui sera de type `bool`) pour la réutiliser plus tard. + +De même, si vous écrivez `if True: ...` la condition sera toujours vraie, donc toujours réalisée. L'inverse également. + +```admonish tip title="Astuce" +Les opérateurs `>`, `<`, `>=`, `<=` peuvent être chaînés pour faire des comparaisons d'intervalles. Par exemple, pour vérifier que la variable a est comprise entre 0 et 100, vous pouvez écrire '0 < a < 100' +``` + +### Les opérateurs booléens + +```admonish travail +En utilisant l'interpréteur, déclarez les variables `a = 3`, `b = 1`, `c = 4` puis donnez le résultat des expressions suivantes: +1. `a == 3 and (a + b) == c` +1. `a < 0 or b > 1` +1. `not a != b` +1. `bool(c)` +1. `bool(0)` +1. Que déduisez-vous des deux questions précédentes ? +``` + +```admonish success title='À retenir' +Les **opérateurs booléens** servent à faire des opérations avec des types `bool` ou pour créer des conditions plus complexes. + +|Opérateur| Description| +|---------|------------| +|`and`| Si les deux conditions sont vraies, retourne `True`, sinon `False`| +|`or` | Si **au moins** l'une des deux conditions est vraie, retourne `True`, sinon `False`| +|`not`| Inverse le résultat de la condition| + +Les opérateurs booléens peuvent être chainés et combinés pour faire des conditions plus complexes. + +Les nombres (et plein d'autres types) peuvent être considérés comme `True` ou `False` dans une condition (ou convertis avec la fonction `bool`). +- Un entier non nul sera considéré comme `True`, un `0` sera considéré comme `False` +- Une chaîne de caractères sera considérée comme `True`, sauf si elle est vide. +``` + ## Les boucles -- while -- for -- break + continue \ No newline at end of file + +```admonish travail +Créez un nouveau script que vous appellerez `tp01-boucles.py` +1. À l'aide de la fonction print et d'une chaîne formatée, donnez un code vous permettant d'afficher la table de multiplication par 7, en allant de 0 à 5. + + **Aide**: La chaîne de caractères pourra avoir la forme suivante : `f"0 x 7 = {0 * 7}"` + +1. C'était pénible, n'est-ce pas 😁 ? Imaginez si j'avais poussé en vous demandant d'aller jusqu'à 1000... On ne vas pas pouvoir continuer comme ça, bien évidemment. Les répétitions de code, en plus d'être pénibles sont une source d'erreurs infinie, et à chaque changement il faut mettre toutes les copies à jour. Pour cela nous allons donc utiliser des **boucles**, parfois appelées **structures répétitives**. + + a. Nous allons utiliser le mot-clé `while` ("tant que" en anglais). `while` fonctionne un peu comme if : il prend une condition, et tant que cette condition est vraie, il continue de répéter les instructions qui sont dans son bloc. Commençons par écrire le code suivant. Exécutez-le et expliquez ce qu'il fait, ligne par ligne. + ~~~python + i = 0 + while i <= 5: + print(f"{i} x 7 = {i * 7}") + i = i + 1 + ~~~ + b. Modifiez le pour qu'il affiche la même table de multiplication, mais cette fois de 0 à 100. Donnez la ligne modifiée dans votre compte rendu. + + c. Modifiez le pour qu'il commence à partir de 50 jusqu'à 100. Donnez la ligne modifiée dans le compte rendu + + d. Modifiez le pour qu'il n'affiche qu'une ligne sur deux. Donnez la ligne modifiée dans le compte rendu + +2. La boucle `while` permet déjà bcp de choses, mais il en existe une autre encore plus pratique pour ce cas : la boucle `for`. Modifiez le code précédent de la manière suivante, exécutez-le et vérifiez que le résultat soit identique à celui de la question 1.a. : + ~~~python + for i in range(0, 6): + print(f"{i} x 7 = {i * 7}") + ~~~ + + Quels sont les changements que vous remarquez par rapport à la boucle `while` ? + + **Aide**: `range` renvoie une sorte de liste des nombres entiers situés dans l'intervalle de nombres qu'on lui passe en paramètre. Ici il renvoie les nombres de 0 à 5 (6 est exclu). + +``` + +```admonish success title="À retenir" +- Les boucles permettent de répéter des instructions plusieurs fois. +- Il y a deux formes, la boucle `while` et la boucle `for`. En pratique, en Python, on préfère utiliser la boucle `for` la majorité du temps. +- La boucle `while` a la syntaxe suivante : + ~~~python + while condition_est_respectee : + # Je fais quelque chose + ~~~ + - Elle peut se lire de la manière suivante : "Tant que la condition est vraie, faire ..." + - Dès que la condition n'est plus respectée la boucle se termine. + - Si la condition n'est jamais respectée, le code de la boucle n'est jamais exécuté. + - Si la condition est toujours respectée, la boucle s'exécute à l'infini. + - Il faut donc prévoir, dans votre boucle, un moyen de faire évoluer la condition. + - Attention au `:` et à l'indentation ! +- La boucle `for` a la syntaxe suivante : + ~~~python + for variable in ensemble: + # Je fais quelque chose + ~~~ + - Elle peut se lire de la manière suivante : "Pour tous les éléments dans l'ensemble, faire ..." + - La boucle `for` va **itérer** sur un ensemble de données. Itérer signifie répéter sur chaque élément de l'ensemble en passant au suivant, dans l'ordre. + - L'ensemble peut être une liste, une chaîne de caractères, mais également plein d'autres choses. Nous aurons un TP quasiment entier consacré à ça. + - Attention au `:` et à l'indentation +``` + +## Mises en pratique + +L'heure de faire des vrais programmes est venue. N'hésitez pas à tester vos syntaxes dans l'interpréteur de commande avant de les mettre dans votre script. Procédez par étapes, prenez le temps de réfléchir avec un papier et un crayon. + +Ces exercices sont moins guidés que le reste du TP. N'hésitez donc pas à vous entraider, ou demander de l'aide si vous êtes coincés. + +### Les années bissextiles + +Nous allons commencer par écrire un programme qui permet de déterminer si une année saisie par l'utilisateur ou l'utilisatrice est une année bissextile. + +Ce script va vous permettre de mettre en pratique les structures conditionnelles mais également les entrées sorties (`print` et `input`), les variables, et certains opérateurs. N'hésitez donc pas à revenir à ces sections en cas de doute pour bien comprendre. + +Une année est bissextile si c'est un multiple de 4, sauf si c'est un multiple de 100. Mais si c'est un multiple de 400 alors elle est quand même bissextile. + +Si on pose les choses de manière structurée : +- Si une année n'est pas un multiple de 4, on s'arrête là : elle n'est pas bissextile. +- Si une année est un multiple de 4 alors on regarde si elle est multiple de 100 + - Si oui, on regarde si c'est un multiple de 400 + - Si oui elle est bissextile + - Sinon elle ne l'est pas + - Si elle n'est pas un multiple de 100, elle est bissextile + +Les termes du problème sont bien posés, prenez le temps d'y réfléchir et de bien comprendre. Un fois que vous pensez avoir bien compris, vous pouvez passer à la suite. + +```admonish travail +1. Commencez par dessiner un schéma permettant de bien distinguer toutes les possibilités, sous forme d'arbre, chaque embranchement représentant une condition. L'important à ce stade est de bien cerner le problème. +1. Créez un nouveau script appelé `tp01-bissextile.py` +1. Écrivez le code vous permettant de saisir une année, et de la stocker dans une variable. N'oubliez pas de convertir en nombre votre année. +1. Ensuite, écrivez la première condition, la plus simple pour vérifier si votre nombre est un multiple de 4 ou non. Nous ne tenons pas compte tout de suite des multiples de 100 et 400. Ecrivez dans chaque branche votre `print` pour dire si l'année est bissextile ou non. + + Pour rappel, pour vérifier si un nombre est un multiple de 4, vous pouvez utiliser l'opérateur `%` : `nombre % 4`. Si cela renvoie 0, c'est un multiple de 4. Par ailleurs, le zéro est considéré comme `False` dans une condition. + + Testez bien votre programme, avec différents nombres. Pour vous aider, utilisez le tableau plus bas qui contient quelques années bissextiles ou non. + + Vous pouvez ajouter le code de votre script à cette étape au compte rendu. +1. Maintenant que vous savez vérifier si une année est multiple de 4, vérifions les autres conditions. + + Modifiez votre code pour ajouter la nouvelle condition. Testez bien cette nouvelle condition. + +1. Maintenant, pour finaliser, vous allez devoir **valider** votre programme, c'est à dire vérifier qu'il fonctionne avec un certain nombre de cas prévus. Testez avec les années du tableau ci-dessous, et vérifiez que les résutats correspondent bien à la dernière colonne. Prenez des captures d'écran de vos résultats pour le compte rendu, et ajoutez le code final de votre script dedans également. +``` + +Quelques années, selon les critères : + +|Année|Multiple de 4|Multiple de 100|Multiple de 400|Bissextile| +|-----|-------------|---------------|---------------|----------| +|2025|non|non|non|non| +|2024|oui|non|non|oui| +|1900|oui|oui|non|non| +|2000|oui|oui|oui|oui| + + +### Le jeu du plus ou moins + +Nous allons maintenant réaliser un petit jeu où la personne qui y joue doit deviner un nombre entre 1 et 100 choisi aléatoirement par l'ordinateur. L'ordinateur renvoie l'information "Plus" quand le nombre qu'il a choisi est plus grand que celui saisi, et "Moins" dans l'autre cas. + +Pour que l'ordinateur vous fournisse un nombre aléatoire, vous pouvez utiliser le code suivant : +```python +import random # On importe le module random + +random.seed() # On initialise la génération de nombres aléatoires +nombre_aleatoire = random.randint(1,100) # On récupère le nombre +``` +```admonish note +Les portions de code qui se trouvent après des `#` en python sont considérées comme des **commentaires**, c'est à dire du texte que la personne ayant écrit le code a mis pour aider les personnes lisant le code. Ce qui se trouve en commentaire est totalement ignoré par Python. +``` + +```admonish travail +1. Créez un nouveau script appelé `tp01-plus-ou-moins.py` +1. Écrivez le code permettant à l'ordinateur de générer le nombre aléatoire. Affichez-le pour vérifier que cela fonctionne. +1. Écrivez le code permettant de demander à la personne qui joue d'entrer un nombre. N'oubliez pas les conversions +1. Écrivez le code permettant de comparer les deux nombres et afficher "Plus", "Moins" ou "Gagné !" selon les cas. Mettez le code de votre programme à ce stade dans le compte rendu. +1. Il faut maintenant boucler pour laisser plusieurs chances à l'utilisateur sans devoir relancer le programme à chaque fois. Écrivez une première version de votre boucle avec `while`. + La boucle devra demander de saisir un nombre, le comparer, et afficher le texte. Si l'utilisateur a trouvé le bon nombre, le programme doit afficher "Gagné !" et s'arrêter tout seul. En revanche, le nombre aléatoire ne devra être choisi qu'une seule fois, faites donc attention. + + Mettez le code de votre programme à ce stade dans le compte rendu. +1. Ecrivez une nouvelle version de votre boucle, en utilisant `for` cette fois. L'utilisateur aura maximum 10 essais, et s'il dépasse le jeu affichera "Perdu !" avant de s'arrêter. + Mettez le code final de votre programme dans le compte rendu. +``` \ No newline at end of file diff --git a/src/cours/CIEL1/01-bases-python/tp/image-1.png b/src/cours/CIEL1/01-bases-python/tp/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1968d9a4aa6dc8b4390b22561379ba08eb9ed244 GIT binary patch literal 15058 zcmXYY1zc3m_x43Pln`M-Nu|4_Q*!B0y1PN7J470k?(XjHZs~66X6gLj@9%y0vnh3tCzHhP=*h9 zt)}~#>NfB7OJ3EwDae@dR#NY4pTG3|5QsPUS9CJb!WL28VrW%0A3rn4}}m?dOmMyfpC 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 Zo*EE~jOa##-x&u0B{_B38W~9F{{ZMgbS(e? literal 0 HcmV?d00001 diff --git a/src/cours/CIEL1/01-bases-python/tp/image-3.png b/src/cours/CIEL1/01-bases-python/tp/image-3.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4d2102bf964d5b02dad51ea745933ff8747f5a GIT binary patch literal 1145 zcmeAS@N?(olHy`uVBq!ia0vp^mx1^k2NRIg)?IL#fq})r)5S5QV$RzeiDkE}L|OxX zujQNBqtv|2{>rBqj{^=5Ji@E{58SwK<+VkQubuVYyX%{D=Fgx1@_2%tyuAGXrSls- zHT!vvVP6iXY5Va$Y1|nN%(&9l=Ak|^*Vo6e>8adwy5k}o@KH8 zVxXtWZ%;j#edZoB$ai@=EGv3%?w-A;40k8hXnk^Xjn_Kw7z-JkYt{XFMx(X)5U zfjYi#WoKJ&SZxgom)eI9LAvEmS$_|{*zw*9DDd;Qpt+8@=6iYnd7Gop-FXc%_}}+t zkXy9D>>nRNTFR$v*IB=xQSiR%)4v~gRSTHw#0TA5eeR}i`a9L96Ah~?^Ck8idoy?D zUYnq0dhc^V+SgW|_I6d+mv-;dv?I0c($gk;p056Ex%=svTs7VP9g?TH`QnnlO|v|` znEmopae1Kbv!QYM^1HV`uUx+KRCLv@>o1;rDyeC$pIls){mi(0(We)ube@)4RGi(i z+1$1AZ~d)*^FJK-4ZL^h`~1(g_P1YO(O-WXsPvHW_PWY1D=R9UdE$(3zY*2%&kNPd zUvMyc*{r>rp7#FcJYM^0_Y~cH$nARrxZt{PUQ@&02Vec|s=oA8bk<$3kYBpfUrh;rHs`KZ&9iHo{ToFz*FSk+ z8k)Y|qmpO2Q)MgrdQHpf!_&jxPp(;hLtl2^o~6IuItRZu?~9H5SzNaI#!Tz7%AV{8 zpO#7OS$63SZ;YI?^wvF`KwZYw&eOslU$tL+Kw4tco~4g;57(L2{jPZGTYWB1)S~#f zcE1#x_W1{Md+e&4r@BijPfh=Dj>oq8@D%fR+I3qU@B4^9UHf|1^RJS7ydUqItamDV z-I3>W_9k60-roJmFZ8X9J=cpxdyLcnO75BMHfL|#sogo*f3-i^C`-ML{p)3aKreZ3 z@V6IxZJy_Z?wwM;Gi%oBwbMUsGcj-0J7vu~@7c49r~hy3exr8z=(Ef`C)r%N;J^XT lUGTiU5m+32F*aCy|HeY6j)j4f6@WzwgQu&X%Q~loCIGGyJ<