420-SN1-RE / Programmation en sciences
Copyright © 2025-2026 Marc-André Bélanger, Maël Charpentier, Christian Côté, Marc Feeley, Olivier Melançon
1. Les programmes
Copyright © 2025-2026
2. Arithmétique et variables
Copyright © 2025-2026
3. Entrées et conditions
Copyright © 2025-2026
4. Les fonctions
Copyright © 2025-2026
5. Boucles while
Copyright © 2025-2026
6. Boucles for
Copyright © 2025-2026
7. Texte
Copyright © 2025-2026
8. Tableaux
Copyright © 2025-2026
9. Fichiers CSV
Copyright © 2025-2026

Bienvenue au cours de Programmation en sciences!

Lors de ce cours, nous allons apprendre les bases de la programmation. À la fin du cours, vous serez en mesure d'écrire des programmes pour faire des calculs scientifiques, analyser des données, créer des simulations physiques, et plus encore!


0111111011101111101001000101001010000010111110010110001101101000000100011010011001011011010101111101001110101000010100101110100011101100010100001001111110110010100110101010011101110100011000111010010101010100100001110110010000001010110011010000010000100010101010000000000101101000001000110001011100100111110000101111000110000110010111010000011101111111011011011010010000011100110111101011011001111100110101001000101100001111011101110100010111010010111011100011000111000011101001101001110100001110001110110001001010011100001011010001000110001100100111010001010001010111111010101111010100111011010111111001011110000100101


Table des matières

1. Les programmes Qu'est-ce qu'un programme informatique ? 2. Arithmétique et variables Comment faire des calculs mathématiques ? 3. Entrées et conditions Comment un programme prend-il des décisions ? 4. Les fonctions Comment créer nos propres fonctions pour réutiliser du code ? 5. Boucles while Comment répéter des actions avec des boucles while ? 6. Boucles for Comment répéter des actions avec des boucles for ? 7. Texte Comment traiter les données textuelles ? 8. Tableaux Comment traiter des grand nombres de données ? 9. Fichiers CSV Comment traiter les fichiers CSV ?

Qu'est-ce que la programmation?

Les programmes peuvent prendre toutes sortes de formes : une page web, un jeu vidéo, une application mobile ou même le logiciel qui fait fonctionner un robot. Peu importe leur apparence, ils suivent tous le même principe : ils exécutent des instructions dans un certain ordre. Un programme c'est en quelque sorte une recette pour que l'ordinateur accomplisse une tâche. L'écriture de ces instructions, c’est ce qu’on appelle la programmation.

Pour donner ces instructions à l’ordinateur, on utilise un langage de programmation. C'est un langage qui comprend un ensemble de mot-clés et de symboles qui ont un sens pour l'ordinateur. Le code c'est l'ensemble des instructions du programme dans un langage de programmation spécifique. Dans ce manuel, nous allons apprendre à programmer en utilisant le langage Python, un langage populaire dont le code est simple à lire et à comprendre.

Voici un premier exemple de programme :

  • premier_programme.py
  • print("Bonjour!")
    print("Bienvenue au cours de programmation.")
    

    Dans ce manuel, il est possible de cliquer sur les exemples de programmes pour les ouvrir dans un environnement de développement. Un environnement de développement permet de créer, modifier et exécuter du code. Cliquez sur l'exemple précédent pour l'exécuter.

    Afficher un résultat

    Les programmes peuvent afficher du texte ou le résultat d'un calcul à l'écran. C'est avec print qu'on demande à l’ordinateur d'afficher quelque chose.

    Par exemple, voici un programme qui calcule le nombre de cheveux humains sur une tête typique :

  • nombre_de_cheveux.py
  • print("Nombre de cheveux moyen par cm² :", 200)
    print("Superficie moyenne d'un cuir chevelu en cm² :", 1000)
    print("Nombre de cheveux sur une tête typique :", 200 * 1000)
    

    L'exécution de ce programme va afficher à la console le texte suivant :

    Nombre de cheveux moyen par cm² : 200
    Superficie moyenne d'un cuir chevelu en cm² : 1000
    Nombre de cheveux sur une tête typique : 200000
    

    L'instruction print permet d'afficher des lignes contenant plusieurs choses, ci-dessus un texte suivi d'un nombre. Dans le code on se sert du symbole * pour la multiplication.

    Exercice 1

    Maintenant utilisez l'environnement de développement à droite pour modifier le programme afin qu'il calcule le nombre de cheveux pour toutes les personnes sur la planète, en supposant que la population mondiale est 8 milliards.

    Une fois le programme modifié, cliquez sur le bouton (Exécuter) de l'environnement de développement pour voir le résultat de son exécution. Quand on clique sur Exécuter, le programme redémarre du début. On peut donc exécuter le programme autant de fois qu'on le veut.

  • exercice-1.py
  • print("Nombre de cheveux moyen par cm² :", 200)
    print("Superficie moyenne d'un cuir chevelu en cm² :", 1000)
    print("Nombre de cheveux sur une tête typique :", 200 * 1000)
    

    Solution

    On modifie le calcul en ajoutant une multiplication par la population mondiale.

    Pour un affichage plus clair on peut également adapter le texte affiché par les print.

  • exercice-1-solution.py
  • print("Nombre de cheveux moyen par cm² :", 200)
    print("Superficie moyenne d'un cuir chevelu en cm² :", 1000)
    print("Population mondiale estimée :", 8000000000)
    print("Nombre de cheveux dans le monde :",
          200 * 1000 * 8000000000)
    

    La dernière instruction print s'étend sur 2 lignes, ce qui ne cause pas de problème car la parenthèse fermante va signaler la fin de l'instruction print. Même si ce print s'étend sur 2 lignes ça causera l'affichage d'une seule ligne, car chaque print affiche une ligne.

    Exercice 2

    Il est possible d'utiliser print pour afficher du texte qui représente une image.

    Utilisez print pour afficher la forme pyramidale suivante à la console :

       #
      ###
     #####
    #######
    
  • exercice-2.py
  • Solution

    On imprime les quatre étages de la pyramide un à la fois. Il faut donc utiliser quatre print.

  • exercice-2-solution.py
  • print("   #")
    print("  ###")
    print(" #####")
    print("#######")
    

    Ce genre d'image se nomme Art ASCII. Une recherche de ce terme sur le Web permet de constater la richesse artistique de ce genre d'art. En voici un exemple :

  • art-ascii.py
  • print("               __")
    print("              / _)")
    print("     _.----._/ /")
    print("    /         /")
    print(" __/ (  | (  |")
    print("/__.-'|_|--|_|")
    

    Les dessins avec la tortue

    Les programmes ne servent pas seulement à faire des calculs : ils peuvent aussi vous permettre de dessiner ! Une façon amusante de le faire est d'utiliser une tortue. Imaginez une petite tortue qui se promène sur une feuille de papier quadrillé. Lorsqu'elle se déplace, elle laisse une trace derrière elle et dessine des lignes partout où elle passe.

    Dans l'image ci-dessous, la tortue a dessiné un carré. Le petit triangle rouge montre où se trouve la tortue en ce moment et dans quelle direction elle regarde - comme une flèche indiquant le chemin qu'elle suivra si on la fait avancer !

    Ce dessin a été créé par le programme suivant :

  • dessiner_un_carré.py
  • fd(50)
    
    rt(90)
    fd(50)
    
    rt(90)
    fd(50)
    
    rt(90)
    fd(50)
    

    Mouvement de la tortue

    Voici les instructions pour déplacer la tortue :

    • fd(n) : avancer de n pixels
    • bk(n) : reculer de n pixels
    • rt(n) : tourner à droite de n degrés
    • lt(n) : tourner à gauche de n degrés

    On peut aussi faire des déplacements en diagonale avec fd et bk:

    • fd(x, y) : avancer de x et se déplacer lattéralement de y à gauche
    • bk(x, y) : reculer de x et se déplacer lattéralement de y à droite

    Parfois, il est utile d'exécuter un programme lentement, une instruction à la fois. Débutez l'exécution du programme ci-dessous en cliquant sur (Exécuter le premier pas), puis continuez avec (Exécuter le prochain pas).

  • mouvement_tortue.py
  • lt(45)
    fd(100)
    
    rt(45)
    bk(100)
    
    fd(100, -50)
    bk(70, 20)
    

    Comme beaucoup de mot-clés en programmation, les noms de ces instructions proviennent de l'anglais. fd vient par exemple de forward qui signifie avant, et rt vient de right turn qui signifie tournant à droite.

    Trait de la tortue

    On peut changer le trait utilisé par la tortue avec ces instructions :

    • pensize(n) : dessiner des traits d'une largeur de n pixels
    • pencolor(couleur) : changer la couleur du trait

    Il y a deux façons de choisir une couleur avec pencolor. On peut donner le nom d'une couleur en anglais, par exemple pencolor("pink") pour le rose. On peut aussi donner une couleur précise en utilisant trois nombres entre 0 et 1 qui représentent les proportions de rouge, vert et bleu. Par exemple, pencolor(1, 1, 0) pour le jaune.

    On peut aussi cacher ou montrer la tortue, et effacer un dessin :

    • ht() : cacher la tortue
    • st() : montrer la tortue
    • clear() : effacer le dessin et réinitialiser la tortue

    Voici un exemple qui utilise ces instructions pour dessiner une tour colorée.

  • dessiner_une_tour.py
  • lt(90)
    bk(60)
    
    pencolor(1, 0, 0)
    pensize(60)
    fd(60)
    
    pencolor("green")
    pensize(40)
    fd(40)
    
    pencolor(1, 0, 1)
    pensize(30)
    fd(30)
    
    ht()
    

    N'oubliez pas que vous pouvez toujours utiliser les boutons (Exécuter le premier pas) et (Exécuter le prochain pas) pour faire l'exécution du programme pas-à-pas.

    Dans le dessin de la tour l'instruction bk(60) va faire un trait noir. Cependant l'instruction fd(60) va ajouter un trait rouge au dessus. Le trait noir n'est donc pas visible.

    Positionner la tortue

    Pour se déplacer sans laisser de trait on utilise hop(). Le déplacement qui vient après hop() bougera la tortue sans laisser de trait.

    Par exemple, on peut utiliser hop() suivi d'un déplacement pour positionner la tortue au bon endroit au début d'un dessin.

  • carre_centré.py
  • hop()
    fd(50, 50)
    
    fd(0, -100)
    bk(100)
    fd(0, 100)
    fd(100)
    

    Quand on connait les composantes x et y d'un déplacement, il est parfois plus simple d'utiliser fd(x, y) ou bk(x, y) que d'utiliser des rotations.

    Exercice 3

    Utilisez la tortue pour dessiner un triangle rectangle dont la longueur de la base est 120 pixels et la hauteur est 90 pixels comme celui-ci :

    12090

  • exercice-3.py
  • Solution

    On décide de placer les coins de notre triangle comme sur le dessin aux coordonnées (0, 0), (120, 0) et (120, 90), et on utilise fd pour tracer les traits entre ces coins.

  • exercice-3-solution-1.py
  • fd(120)
    fd(0, 90)
    bk(120, 90)
    ht()
    

    Exercice 4

    Utilisez la tortue pour dessiner le drapeau de la France :

    Les dimensions de ce drapeau sont de 150 pixels de large par 100 pixels de haut. Chaque bande de couleur mesure 50 pixels de large.

  • exercice-4.py
  • Solution

    En utilisant pensize(100), on peut dessiner le drapeau en trois large traits de gauche à droite.

    On utilise pencolor("blue") pour le bleu, pencolor("white") pour le blanc, et pencolor("red") pour le rouge.

  • exercice-4-solution.py
  • hop()
    bk(75)
    
    pensize(100)
    
    pencolor("blue")
    fd(50)
    
    pencolor("white")
    fd(50)
    
    pencolor("red")
    fd(50)
    
    ht()
    

    Les erreurs

    Il est normal de faire des erreurs lorsqu'on écrit un programme. Lorsqu'une erreur survient, le programme arrête, l'environnement de développement affiche un message d'erreur et la position de l'erreur dans le code est surlignée. Voici quelques exemples d'erreurs. Portez attention au message d'erreur!

    Une parenthèse fermante a été oubliée :

  • parenthèse_oubliée.py
  • print("Bonjour!"
    

    On a mal écrit print.

  • mauvais_nom.py
  • pint("Bonjour!")
    

    On a oublié d'indiquer la distance d'un trait en utilisant l'instruction fd de la tortue.

  • paramètre_oublié.py
  • fd()
    

    En programmant, il est normal de faire des erreurs. Ce qui est important est de bien lire le message d'erreur pour comprendre ce qui s'est passé.

    Exercice 5

    Le programme dans votre environnement de développement doit imprimer la facture d'un restaurant, mais le code contient des erreurs. Exécutez le programme et lisez attentivement les messages d'erreurs. Corrigez les erreurs jusqu'à ce que le programme affiche :

    Menu du jour
    -------------------------
    Soupe du jour ....  4.50$
    Sandwich .........  6.75$
    Café .............  2.00$
    -------------------------
    Total ............ 13.25$
    
  • exercice-5.py
  • print("Menu du jour")
    print( ------------------------- )
    print("Soupe du jour ....  4.50$")
    print("Sandwich .........  6.75$")
    print("Café .............  2.00$")
    prnit("-------------------------")
    print("Total ............ 13.25$"
    

    Solution

    Pour résoudre ce problème, on exécute le programme. L'environnement de développement nous montre alors où une erreur se trouve dans le code et affiche un message d'erreur qu'il faut lire pour comprendre le problème.

    Le programme contenait trois erreurs.

    1. Les guillemets sont manquants autour du texte de la deuxième ligne.
    2. print a été mal écrit à l'avant dernière ligne.
    3. Il manque une parenthèse fermante à la dernière ligne.
  • exercice-5-solution.py
  • print("Menu du jour")
    print("-------------------------")
    print("Soupe du jour ....  4.50$")
    print("Sandwich .........  6.75$")
    print("Café .............  2.00$")
    print("-------------------------")
    print("Total ............ 13.25$")
    

    Exercice 6

    Le programme dans votre environnement de développement doit dessiner une pyramide rouge de six étages comme ci-dessous. Malheureusement ce programme contient des erreurs. Corrigez les erreurs jusqu'à ce que le programme complète son dessin.

  • exercice-6.py
  • rt(90)
    pencolor("rouge")
    pensize(15)
    fd(15)
    pensize(45)
    fd(15)
    pensize(75)
    fd(15)
    pensize(105)
    ht(15)
    pensize(135)
    fd(15)
    pensize(165)
    fd(15)
    ht()
    

    Solution

    Comme dans l'exercice précédent, on exécute le programme, on observe ce qui se passe dans le dessin et on lit les messages d'erreur.

    Cette fois-ci, le programme contient deux erreurs.

    1. pencolor ne connait pas la signification de "rouge". Il faut plutôt écrire pencolor("red").
    2. Dans l'une des instructions, ht a été utilisé par erreur au lieu de fd.
  • exercice-6-solution.py
  • rt(90)
    pencolor("red")
    pensize(15)
    fd(15)
    pensize(45)
    fd(15)
    pensize(75)
    fd(15)
    pensize(105)
    fd(15)
    pensize(135)
    fd(15)
    pensize(165)
    fd(15)
    ht()
    

    La console

    Les programmes que nous avons vu jusqu'à présent étaient enregistrés dans des fichiers. Parfois, on veut tester de petits segments de code, par exemple pour apprendre ou pour trouver des erreurs.

    Pour exécuter de petits segments de code, on peut utiliser la console. Dans l'environnement de développement à droite, la fenêtre contenant >>> est appelée la console. Les caractères >>> sont appelés l'invite de commande (prompt en anglais).

    Écrivez du code après l'invite de commande, puis appuyez sur la touche Entrée pour l'exécuter. Essayez d'exécuter les instructions suivantes et observez le résultat :

    • 1+2
    • print("bonjour!")
    • fd(100)

    À la console la touche de clavier Entrée a la même fonctionalité que le bouton (Exécuter). Sur un clavier anglais cette touche de clavier a souvent l'étiquette Return ou Enter ou le symbole .

  • Exercice 7

    123456789101112

    Utilisez la console pour calculer le nombre de secondes dans une année commune, c'est à dire une année qui n'est pas bissextile.

    Quel est le nombre de secondes dans une année commune?

    31536000

  • Solution

    Le bonne réponse est 31536000 qu'on peut obtenir en exécutant le calcul 60 * 60 * 24 * 365 à la console.

    Exercice 8

    À quelle couleur correspond l'instruction pencolor(1, 0, 1)?

  • Solution

    Exécutez pencolor(1, 0, 1) dans la console, puis fd(100) pour voir la couleur du trait.

    Résumé

    Instruction Description Exemple
    print(x) Afficher du texte ou un résultat dans la console. print("Bonjour!")
    fd(n) Avancer la tortue de n pixels vers l’avant. (forward) fd(50)
    fd(x, y) Avancer de x et se déplacer lattéralement de y à gauche fd(30, 40)
    bk(n) Reculer la tortue de n pixels. (backward) bk(30)
    bk(x, y) Reculer de x et se déplacer lattéralement de y à droite. bk(20, 10)
    rt(angle) Tourner la tortue vers la droite d’un certain nombre de degrés. (right turn) rt(90)
    lt(angle) Tourner la tortue vers la gauche d’un certain nombre de degrés. (left turn) lt(45)
    clear() Retourner la tortue à sa position de départ et efface le dessin et la grille de fond. clear()
    hop() Lever le crayon de la tortue pour le prochain trait pour se déplacer sans dessiner. hop(); fd(100)
    ht() Cacher la tortue. (hide turtle) ht()
    st() Montrer la tortue. (show turtle) st()
    pensize(n) Changer l’épaisseur du trait à n pixels. pensize(10)
    pencolor(couleur) Changer la couleur du trait par son nom anglais. pencolor("red") dessinera un trait rouge
    pencolor(r,g,b) Changer la couleur du trait à la proportion donnée de rouge, vert et bleu (entre 0 et 1). pencolor(1, 0, 0) dessinera un trait rouge

    Exercice 9

    Affichez à la console l’aire et le périmètre d’un rectangle de largeur 120 et de hauteur 80. Utilisez deux print, le premier pour afficher l'aire et le second pour le périmètre.

    12080

  • exercice-9.py
  • Solution

    On utilise les formules largeur × hauteur pour l'aire et 2 × (largeur + hauteur) pour le périmètre. On affiche les résultats avec print.

    On se rappelle qu'il faut utiliser le symbole * pour la multiplication.

  • exercice-9-solution.py
  • # Aire
    print(120 * 80)
    
    # Périmètre
    print(2 * (120 + 80))
    

    Cette solution contient des commentaires. Un commentaire est du texte commençant par le symbole #. Tout ce qui suit le # sur la ligne sera ignoré par l'ordinateur. Ça permet d'inclure dans le code des explications pour les humains qui veulent comprendre son fonctionnement.

    Exercice 10

    En utilisant des appels à print, affichez à la console ce carré fait de # autour d’un espace vide :

    #########
    #       #
    #       #
    #       #
    #########
    
  • exercice-10.py
  • Solution

    Le carré est composé de cinq lignes de texte, on utilise donc cinq print.

  • exercice-10-solution.py
  • print("#########")
    print("#       #")
    print("#       #")
    print("#       #")
    print("#########")
    

    Exercice 11

    Pour convertir une température de Celsius à Fahrenheit, on utilise la formule suivante.

    °F = (°C × 9/5) + 32

    Avec la tortue, dessinez le graphique de cette fonction dans le plan cartésien. L'axe des x doit représenter la température en Celsius et l'axe des y, les Fahrenheit. Vous devez dessiner l'axe des x et l'axe des y en noir, et la courbe de la fonction en rouge pour l'intervalle allant de -100°C à 100°C comme ceci :

  • exercice-11.py
  • Solution

    On résout le problème en deux étapes.

    1. On trace les axes x et y.
    2. On utilise l'équation de la fonction pour calculer les coordonnées de deux points avec x = -100 et x = 100, puis on utilise fd pour tracer un trait rouge entre ces points.

    N'oubliez pas d'utiliser le bouton Exécuter le prochain pas pour observer chaque étape de la solution.

  • exercice-11-solution.py
  • # Tracer les axes
    hop()
    fd(-100, 0)
    fd(200)
    hop()
    fd(-100, -100)
    fd(0, 200)
    
    # Tracer la fonction °F = (°C × 9/5) + 32
    
    # On place la tortue à l'origine de la fonction (y=32)
    hop()
    fd(0, -100)
    hop()
    fd(0, 32)
    
    # Tracer la ligne de la fonction
    pencolor("red")
    fd(100, 9 / 5 * 100)
    bk(200, 9 / 5 * 200)
    
    ht()
    

    Exercice 12

    Utilisez la tortue pour dessiner un hexagone régulier dont chaque côté mesure 50 pixels. Le centre de l'hexagone doit se trouver aux coordonnées (0, 0).

  • exercice-12.py
  • Solution

    On résout le problème en deux étapes.

    Premièrement, on utilise hop et fd pour donner une position initiale à la tortue sur l'arête du haut et rt(30) pour orienter la tortue dans la direction d'un côté de l'hexagone.

    On dessine ensuite l'hexagone en avançant de 50 pixels et en tournant de 60 degrés six fois, une pour chaque côté de l'hexagone.

  • exercice-12-solution.py
  • hop()         # Centrer l'hexagone
    fd(0, 50)
    rt(30)
    
    fd(50)        # Dessiner le côté #1
    
    rt(60)        # Dessiner le côté #2
    fd(50)
    
    rt(60)        # Dessiner le côté #3
    fd(50)
    
    rt(60)        # Dessiner le côté #4
    fd(50)
    
    rt(60)        # Dessiner le côté #5
    fd(50)
    
    rt(60)        # Dessiner le côté #6
    fd(50)
    
    ht()
    

    Le code contient plusieurs répétitions des instructions fd(50) et rt(60). Dans les prochains chapitres nous verrons une meilleure façon de répéter une séquence d'instructions en boucle.

    Exercice 13

    Utilisez la tortue pour reproduire le dessin suivant. Les côtés des carrés rouge et vert sont de 130 pixels. Les côtés du carré bleu sont de 92 pixels.

  • exercice-13.py
  • Solution

    Cette forme peut être construite en superposant trois carrés. On dessine les carrés dans un ordre précis (rouge, vert, bleu) pour qu’ils soient superposés correctement. On a utilisé pencolor(0, 1, 0) pour obtenir la bonne teinte de vert.

  • exercice-13-solution.py
  • hop(); bk(65)
    
    pensize(130)
    pencolor("red")
    fd(130)
    
    hop(); bk(65)
    lt(45)
    hop(); bk(65)
    pencolor(0, 1, 0)
    fd(130)
    
    hop(); bk(65)
    lt(45)
    hop(); bk(46)
    pensize(92)
    pencolor("blue")
    fd(92)
    
    ht()
    

    Pour rendre le code plus compact, on peut utiliser un point-virgule (;) pour séparer des instructions placées sur une même ligne.

    Exercice 14

    Utilisez la tortue pour reproduire le dessin suivant.

  • exercice-14.py
  • Indice

    Il est possible de créer cette image en superposant des carrés.

    Solution

    Cette forme peut être construite en superposant quatre carrés jaunes, chacun tourné de 22.5 degrés par rapport au précédent.

  • exercice-14-solution.py
  • hop(); bk(70)
    
    pensize(140)
    pencolor(0.95,0.95,0)
    fd(140)
    
    hop(); bk(70)
    lt(22.5)
    hop(); bk(70)
    fd(140)
    
    hop(); bk(70)
    lt(22.5)
    hop(); bk(70)
    fd(140)
    
    hop(); bk(70)
    lt(22.5)
    hop(); bk(70)
    fd(140)
    
    ht()
    

    Exercice 15

    Utilisez la tortue pour dessiner le drapeau de la Suisse :

    Ce drapeau est un carré de 100 × 100 pixels.

    Les dimensions de la croix au centre du drapeau sont de 60 × 60 pixels.

    L'épaisseur des bandes formant la croix est de 20 pixels.

  • exercice-15.py
  • Solution

    On utilise d'abord un seul trait avec pensize(100) pour dessiner le fond rouge du drapeau. La croix est ensuite dessinée avec deux plus petits traits avec pensize(20). Le programme débute par l'instruction clear() pour que la grille de fond n'apparaisse pas dans le dessin final.

  • exercice-15-solution.py
  • # Positionner la tortue
    hop()
    bk(50)
    
    # Fond rouge
    pencolor("red")
    pensize(100)
    fd(100)
    
    # Bande horizontale pour la croix
    hop()
    bk(80)
    pencolor("white")
    pensize(20)
    fd(60)
    
    # Bande verticale pour la croix
    hop()
    bk(30, -30)
    rt(90)
    fd(60)
    
    ht()
    

    Exercice 16

    Utilisez la tortue pour dessiner le drapeau de la Norvège :

    601020101206010201060

    Ce drapeau est de dimensions 220 × 160 pixels. Les dimensions des parties sont inscrites dans le dessin ci-dessus.

  • exercice-16.py
  • Solution

    Une astuce pour dessiner ce drapeau est de d'abord dessiner un fond rouge, puis une croix blanche et finalement une croix bleue par-dessus la croix blanche.

  • exercice-16-solution.py
  • # Positionner la tortue
    hop()
    bk(110)
    
    # Dessiner le fond rouge
    pencolor("red")
    pensize(160)
    fd(220)
    
    # Dessiner la croix blanche
    pencolor("white")
    pensize(40)
    bk(220)
    fd(80)
    lt(90)
    fd(80)
    bk(160)
    fd(80)
    
    # Dessiner la croix bleue
    pencolor("blue")
    pensize(20)
    fd(80)
    bk(160)
    fd(80)
    rt(90)
    bk(80)
    fd(220)
    
    ht()
    

    Exercice 17

    Le programme dans votre environnement de développement doit dessiner le drapeau de la Suède, mais contient des erreurs. Corrigez les erreurs jusqu'à ce que le programme complète son dessin.

  • exercice-17.py
  • # Positionner la tortue
    hop()
    bk(80)
    
    # Fond bleu
    pensize(0, 0.29, 0.53)
    pencolor(100)
    fd(160)
    
    # Barre jaune horizontale
    pencolor(1, 0.8, 0)
    pensize(20)
    bk(160
    
    # Barre jaune verticale
    hop()
    fd(60, -50)
    fd(0 100)
    
    ht()
    

    Solution

    Le programme contient trois erreurs :

    • Les noms pencolor et pensize ont été inversés lors du dessin du fond bleu.
    • Il manque une parenthèse au deuxième bk.
    • Une virgule a été oubliée au dernier fd.
  • exercice-17-solution.py
  • # Positionner la tortue
    hop()
    bk(80)
    
    # Fond bleu
    pencolor(0, 0.29, 0.53)
    pensize(100)
    fd(160)
    
    # Barre jaune horizontale
    pencolor(1, 0.8, 0)
    pensize(20)
    bk(160)
    
    # Barre jaune verticale
    hop()
    fd(60, -50)
    fd(0, 100)
    
    ht()
    

    Lorsqu'on oublie une parenthèse, la parenthèse fermante sera cherchée sur la ligne suivante et l'erreur sera donc signalée sur cette ligne. C'est ce qui est arrivé ici lorsqu'on a oublié la parenthèse fermante de bk(160). Il est donc aussi important de vérifier si l'erreur est en fait survenue sur la ligne précédente.

    Exercice 18

    Utilisez la console pour calculer le nombre de grains de sable sur les plages à travers le monde.

    On suppose les faits suivants :

    • Il y a 500 000 kilomètres de rivages.
    • Un tier des rivages est couvert de sable.
    • Un rivage sablonneux a en moyenne 30 mètres de largeur et 2 mètres de profondeur.
    • Il y a environ 10 milliards de grains de sable par mètre cube.

    Quel est le nombre de grains de sable sur les plages du monde?

    1e+20

  • Indice

    Utilisez le symbole / pour la division.

    Le résultat sera un très grand nombre! L'affichage des grands nombres décimaux se fait avec la notation scientifique, par exemple 3.4e+21 signifie 3.4×10²¹.

    Solution

    On peut faire le calcul suivant dans la console. La partie 500000 * 1000 / 3 calcule la longueur de rivages sablonneux en mètres. On multiplie par 30 * 2 pour obtenir le volume de sable en mètres cube. Finalement, on multiplie par 10000000000 qui est le nombre de grains par mètre cube.

    >>> 500000 * 1000 / 3 * 30 * 2 * 10000000000
    1e+20
    

    Le résultat du calcul est 1e+20 qui signifie 10²⁰.

    Exercice 19

    ?

    La vitesse de la lumière est d'exactement 299 972 458 m/s.

    Depuis la Terre, on dirige un laser vers un miroir réfléchissant se trouvant sur la Lune. On calcule que la faisceau laser prend 2.6 secondes pour faire l'aller-retour Terre-Lune.

    À l'aide de la console, calculez la distance entre la Terre et la Lune.

    Quelle est la distance entre la Terre et la Lune en kilomètres arrondie au kilomètre près?

    389964

  • Solution

    On fait le calcul 299972458 / 1000 * 2.6 / 2. Il ne faut pas oublier de diviser par 2, puisque le faisceau parcourt la distance Terre-Lune deux fois.

    >>> 299972458 / 1000 * 2.6 / 2
    389964.19539999997
    

    La réponse est donc 389964 kilomètres.

    Les opérations arithmétiques

    On écrire un programme qui fait des calculs en utilisant les opérations mathématiques comme +, -, /. En Python on utilise * pour la multiplication et ** pour les exposants. On peut aussi utiliser des parenthèses pour regrouper des expressions.

    Python utilise l'ordre des opérations habituelle: parenthèses, exposants, multiplication/division, addition/soustraction.

    Par exemple, voici un programme qui calcule les fonds dans un compte d'épargne avec un taux d'intérêt composé.

  • intérêts_composés.py
  • print("Montant initial:", 100)
    print("Taux d'intérêt:", 0.05)
    print("Périodes composant une année:", 3)
    print("Nombre d'années écoulées:", 10)
    print("Montant actuelle:", 100 * (1 + 0.05 / 3) ** (10 * 3))
    

    Les types de nombres

    Pour faire des calculs, on peut utiliser des nombres entiers (par exemple 42, ou 2026) ou des nombres décimaux (3.14, ou 9.81), aussi appelés nombres flottants.

    Pour rendre les calculs plus lisibles, on peut utiliser le séparateur _ pour écrire de grands entiers. Par exemple, 1000000 peut être écrit 1_000_000.

    On peut aussi écrire des nombres flottants avec la notation scientifique. Par exemple, pour représenter 6.02 × 10²³ on écrit 6.02e23.

  • attraction_terre_lune.py
  • print("Masse de la Lune:", 7.3e22)
    print("Masse de la Terre:", 6e24)
    print("Distance:", 389_964_000)
    print("Constante gravitationnelle:", 6.67e-11)
    print("Force d'attraction en newtons:")
    print(6.67e-11 * 7.3e22 * 6e24 / 389_964_000 ** 2)
    

    Certains langages de programmation ne permettent pas de mélanger des entiers et des nombres flottants dans le même calcul, mais Python le permet.

    Exercice 1

    La masse d'un proton est d'environ 1.672 × 10⁻²⁷ kg, celle d'un électron est environ 9.109 × 10⁻³¹ kg.

    On peut approximer la masse d'un atome d'hydrogène en additionnant la masse d'un proton et d'un électron.

    En se rappellant qu'une mole contient 6.02 × 10²³ particules, écrivez un programme estimant la masse d'un mole d'atomes d'hydrogène.

    Le programme doit utiliser print pour afficher les masses d'un proton, d'un électron, d'un atome d'hydrogène et d'une mole d'atomes d'hydrogène.

  • exercice-1.py
  • Solution

    1.672 × 10⁻²⁷ est écrit 1.672e-27.

    9.109 × 10⁻³¹ est écrit 9.109e-31.

    6.02 × 10²³ est écrit 6.02e23.

  • exercice-1-solution.py
  • print("Masse d'un proton:", 1.672e-27)
    print("Masse d'un électron:", 9.109e-31)
    print("Masse d'un atome d'hydrogène:", 1.672e-27 + 9.109e-31)
    print("Masse d'une mole d'hydrogène:", (1.672e-27 + 9.109e-31) * 6.02e23)
    

    Les variables

    Un programme a souvent besoin de réutiliser une valeur ou le résultat d'un calcul. Pour éviter d'avoir à réécrire le calcul plusieurs fois, on peut sauvegarder son résultat dans une variable.

    Pour assigner une valeur à une variable on utilise le symbole =.

  • variable_simple.py
  • x = 100
    print(x)
    

    En plus de permettre de réutiliser des résultats, les variables aident à organiser le code et à le rendre plus lisible.

  • masse_molaire_carbone_12.py
  • proton = 1.672e-27
    neutron = 1.675e-27
    
    # carbone-12 (6 protons, 6 neutrons)
    numero_atomique = 6
    isotope = 12
    nombre_neutrons = isotope - numero_atomique
    mole = 6.02e23
    
    masse_atome = numero_atomique * proton + nombre_neutrons * neutron
    masse_molaire = mole * masse_atome
    
    print("Masse d'un atome de carbone-12:", masse_atome)
    print("Masse d'une mole de carbone-12:", masse_molaire)
    

    Les variables rendent le code facile à modifier. Par exemple, pour calculer la masse molaire du carbone-13, il suffit de remplacer "isotope = 12" par "isotope = 13".

    Noms de variables

    Le nom d'une variable peut être composé de lettre, de chiffre, et du caractère _. Il ne peut pas commencer par un chiffre.

    Par exemple, ces noms sont valides:

  • noms_valides.py
  • temperature_exterieure = 23.5
    prix_en_2026 = 299
    distance_terre_lune = 389_964
    

    Mais ceux-ci sont invalides:

  • noms_invalides.py
  • 3_petits_chats = 3
    prix_en_$ = 2.99
    

    Puisque les espaces ne sont pas permis dans les noms de variables, on utilise souvent le caractère _ pour séparer les mots. Ce style de nom s'appelle le snake_case.

    Utilisez des noms clairs et descriptifs pour nommer les variables et évitez les abbréviations et les noms d'une seule lettre. Par exemple utilisez temperature et non t.

    Exercice 2

  • Parmis les noms de variable suivants, lesquels sont valides?

    Solution

    Bien que d'utiliser des noms d'une seule lettre comme x et T ne soit par recommandés, il s'agit quand même de noms valides.

    Exercice 3

  • Parmis les noms de variable suivants, lesquels sont invalides?

    Solution

    Le nom "_" respecte la règle de n'être composé que de lettres, chiffres et du caractère _.

    Les accents sont permis, comme dans "température". Il sont cependant déconseillés, car certains environnements ne le supportent pas.

    Les lettres majuscule sont permises. "PROPORTION_DES_COTES" est donc valide.

    "10degres_celsius" est invalide, car il commence par un chiffre.

    Répéter un calcul avec différentes valeurs

    En plus de faciliter la modification d'un paramètre dans un programme, les variables permettent de répéter un même calcul avec différentes valeurs.

    Par exemple, ce programme affiche les nombres de 1 à 5.

  • print_5_fois.py
  • print(1)
    print(2)
    print(3)
    print(4)
    print(5)
    print("fin!")
    

    On peut simplifier le programme en répétant la même instruction print(nombre) où la variable nombre prend les valeurs de 1 à 5.

  • print_avec_répétition.py
  • for nombre in 1, 2, 3, 4, 5:
        print(nombre)
    print("fin!")
    

    C'est ce qu'on appelle une boucle. Une boucle indique un nom de variable (après le mot-clé for) et les valeurs que prendra cette variable (après le in). Le code a répéter est indenté, c'est à dire qu'on utilise quatre espaces avant chaque instruction à répéter.

    Les boucles sont très importantes en programmation. Nous en apprendrons plus sur les boucles dans les prochains chapitres.

    Exercice 4

  • exercice-4.py
  • Utilisez un boucle for pour dessiner un rectangle avec la tortue. Le programme doit commencer par deux variables qui permettent de facilement modifier la largeur et la hauteur du rectangle.

    Par exemple, pour une largeur de 150 et un hauteur de 100, votre programme doit faire le dessin suivant:

    Solution

    Si on voulait seulement dessiner un rectangle 150 × 100, on pourrait utiliser la boucle suivante:

    for cote in 150, 100, 150, 100:
        fd(cote)
        rt(90)
    

    On peut faire mieux en utilisant des variables pour paramétrer la largeur et la hauteur. Ça évite de les répéter et les rend facile à modifier.

  • exercice-4-solution.py
  • largeur = 150
    hauteur = 100
    
    hop()
    bk(largeur / 2, -hauteur / 2)
    
    for cote in largeur, hauteur, largeur, hauteur:
        fd(cote)
        rt(90)
    
    ht()
    

    La fonction d'arrondissement

    Pour arrondir un nombre on utilise round, qui arrondi à l'entier le plus proche.

  • arrondir_au_plus_proche_entier.py
  • print(round(3.14))
    print(round(9.81))
    

    On peut aussi ajouter un deuxième paramètre à round pour choisir à quelle précision arrondir. Par exemple, arrondir à deux chiffres après la virgule:

  • arrondir_deux_chiffres.py
  • print(round(3.14159265, 2))
    

    Exercice 5

  • exercice-5.py
  • Pour une expérience, une boîte de Petri contient une population initiale de 2000 de bactéries. À chaque heure, la population de bactéries augmente de 75%.

    Écrivez un programme qui affiche la population à chaque heure lors des cinq premières heures de l'expérience. Puisqu'il ne peut y avoir qu'un nombre entier de bactéries, assurez-vous que la valeur affichée soit un entier.

    Indice

    Pour calculer le nombre de bactéries, utilisez la formule suivante:

    P(t)=Pinitiale1.75t

    P(t) est la population à t heures et Pinitiale est la population initiale.

    Solution

    On calcule la population avec l'équation:

    population = population_initiale * 1.75 ** heures
    

    Ensuite, on utilise round(population), qui arrondit à l'entier le plus près, pour afficher une valeur entière.

  • exercice-5-solution.py
  • population_initiale = 2_000
    
    for heures in 0, 1, 2, 3, 4, 5:
        population = population_initiale * 1.75 ** heures
        print("Après", heures, "h, la population est de", round(population))
    

    La fonction valeur absolue

    La valeur absolue d'un nombre est sa valeur sans tenir compte de son signe. Pour trouver la valeur absolue d'un nombre, on utilise abs.

  • valeur_absolue.py
  • print(abs(-123))
    print(abs(-3.14))
    print(abs(2026))
    

    Exercice 6

    La fonction valeur absolue est fréquemment utilisée en statistiques pour calculer l'écart moyen. L'écart moyen mesure à quel point des données sont dispersées autour de la moyenne.

    Dans un ensemble de données, on peut calculer l'écart d'un seul point x à la moyenne x avec:

    |xx|

    |...| est la fonction valeur absolue.

    L'écart moyen est la moyenne de tous les écarts.

    Par exemple, on peut regarder la moyenne d'un groupe d'étudiants pour savoir si un examen a été bien réussi. On peut également regarder l'écart moyen pour savoir si les notes varient beaucoup d'une personne à l'autre.

    Écrivez un programme qui calcule la moyenne et l'écart moyen des notes d'examen d'un petit groupe ayant obtenu les notes 93, 67, 87, et 71.

  • exercice-6.py
  • note1 = 93
    note2 = 67
    note3 = 87
    note4 = 71
    
    # Complétez le programme
    

    Solution

    On doit d'abord calculer la moyenne du groupe, car il faut la moyenne pour calculer un écart de chaque étudiant. Ensuite, on additionne les écarts et on en prend la moyenne.

  • exercice-6-solution.py
  • note1 = 93
    note2 = 67
    note3 = 87
    note4 = 71
    
    moyenne = (note1 + note2 + note3 + note4) / 4
    
    ecart_moyen = (abs(note1 - moyenne) +
                   abs(note2 - moyenne) +
                   abs(note3 - moyenne) +
                   abs(note4 - moyenne)) / 4
    
    print("Moyenne:", moyenne)
    print("Écart moyen:", ecart_moyen)
    

    On aurait également pu utiliser une boucle pour éviter de répéter l'expression abs(note - moyenne).

  • exercice-6-solution-avec-boucle.py
  • note1 = 93
    note2 = 67
    note3 = 87
    note4 = 71
    
    moyenne = (note1 + note2 + note3 + note4) / 4
    
    ecart_moyen = 0
    for note in note1, note2, note3, note4:
        ecart_moyen = ecart_moyen + abs(note - moyenne) / 4
    
    print("Moyenne:", moyenne)
    print("Écart moyen:", ecart_moyen)
    

    Les minimum et maximum

    On utilise min et max pour trouver le minimum ou le maximum de deux valeurs.

  • min_et_max.py
  • print(min(2.71, 3.14))
    print(max(2**3, 3**2))
    

    On utilise souvent min et max pour borner le résultat d'un calcul. Si, par exemple, on veut que le résultat d'un calcul soit borné entre 0 et 100, on peut écrire max(0, min(100, resultat)).

  • borner_un_calcul.py
  • resultat1 = 3 * 25 + 40
    print("Résultat #1:", resultat1)
    print("Résultat #1 borné:", max(0, min(100, resultat1)))
    
    resultat2 = -3 * 25 + 15
    print("Résultat #2:", resultat2)
    print("Résultat #2 borné:", max(0, min(100, resultat2)))
    

    Exercice 7

    La batterie d'un téléphone cellulaire est initialement chargée à 10%. On branche le téléphone qui commence à se recharger de 2% chaque minute. Lorsqu'elle atteint 100%, la batterie est pleine et sa charge ne change plus.

    Écrivez un programme qui affiche la charge de la batterie après un certain temps de chargement. Le programme doit commencer par la définition d'une variable temps qui représente le nombre de minutes de chargement.

  • exercice-7.py
  • temps = 0
    
    # Complétez le programme
    

    Solution

  • exercice-7-solution.py
  • # Paramètres
    temps = 0
    charge_initial = 10
    taux_de_chargement = 2
    
    # Calcul et affichage du chargement
    charge = min(100, taux_de_chargement * temps + charge_initial)
    print("Charge:", charge, "%")
    

    Les fonctions mathématiques

    On peut calculer avec des fonctions mathématiques en utilisant la bibliothèque mathématique de Python. Une bibliothèque, c'est un ensemble de fonctions similaires rassemblées ensemble.

    La bibliothèque mathématique de Python s'appelle math. On écrit math.fonction pour utiliser une de ses fonctions. Voici quelques exemples:

    Fonction Description
    math.sqrt(x) racine carrée
    math.sin(angle) sinus (en radians)
    math.cos(angle) cosinus (en radians)
    math.tan(angle) tangente (en radians)
    math.asin(x) arc-sinus (en radians)
    math.acos(x) arc-cosinus (en radians)
    math.atan(x) arc-tangente (en radians)
    math.ceil(x) arrondir vers le haut
    math.floor(x) arrondir vers le bas
    math.log(x) logarithme en base e
    math.log10(x) logarithme en base 10

    Les fonctions trigonométriques prennent toutes un angle en radian.

    Exercice 8

    Une boîte de 5 kg repose sur un plan incliné. Son poids peut être décomposé en deux composantes : la force normale, et la force du plan.

    La force normale est la force du plan sur l'objet, en réaction à la gravité. Elle est perpendiculaire au plan.

    La force du plan est la composante de la force gravitationnelle qui fait glisser l'objet. Elle est parallèle au plan.

    Écrivez un programme qui dessine le diagramme de forces du plan incliné avec la tortue. Le programme doit commencer par une déclarer deux variables pour paramétrer l'angle du plan et la masse de la boîte.

    Dessinez la force normale en bleue, et la force du plan en vert. Utilisez l'amplitude de la force (en Newtons) comme longueur des trait représentant chaque force.

    diagramme de force

  • exercice-8.py
  • Indice

    On peut calculer les forces gravitationnelles ( Fg ), normale ( Fn ) et du plan ( Fp ) avec ces formules:

    Fg=9.81Nkg×mFn=Fg×cos(θ)Fp=Fg×sin(θ)

    m est la masse de l’objet (en kg), et θ est l’angle du plan incliné.

    Attention! Les fonctions math.sin et math.cos sont en radians, mais la tortue utilise des degrés. Il faut convertir avec cette formule:

    θrad=π180θdeg

    Solution

    On utilise force * math.cos(angle_radian) pour calculer la force normale.

    On utilise force * math.sin(angle_radian) pour calculer la force du plan.

    Une fois qu'on a les forces, tous les calculs sont faits et il ne reste qu'à dessiner.

    On peut changer la valeur de la variable angle, relancer le programme, et observer comment les composantes réagissent.

  • exercice-8-solution.py
  • # Paramètres
    angle = 30
    masse = 5
    cote_boite = 40
    acceleration_gravitationnelle = 9.81
    angle_radian = angle / 180 * math.pi
    
    # Calcul des composantes de la force
    force_gravitationnelle = masse * acceleration_gravitationnelle
    force_normale = force_gravitationnelle * math.cos(angle_radian)
    force_plan = force_gravitationnelle * math.sin(angle_radian)
    
    # Dessin de la pente
    lt(angle)
    fd(100)
    bk(200)
    fd(100)
    lt(90)
    
    # Dessin de la boite
    pensize(cote_boite)
    pencolor(1, 0, 0)
    fd(cote_boite)
    
    # Dessin force normale
    pensize(2)
    pencolor(0, 0, 1)
    fd(force_normale)
    
    # Dessin force parallèle au plan
    hop(); bk(force_normale + cote_boite / 2)
    lt(90)
    hop(); fd(cote_boite / 2)
    
    pensize(2)
    pencolor(0, 1, 0)
    fd(force_plan)
    

    La division entière et le modulo

    Une division peut être décomposée en une partie entière et un reste. Par exemple, dans la division 13÷5 , la partie entière est 2 et le reste est 3 , parce que 13=2×5+3 .

    La division entière calcule la partie entière d'une division. Elle est aussi appelée quotient. En Python, on l'écrit avec le symbol //.

    Le modulo est une opération qui calcule le reste d'une division. En Python, on l'écrit avec le symbol %.

  • quotient_et_reste.py
  • dividende = 13
    diviseur = 5
    
    print(dividende, "÷", diviseur)
    print("partie entière:", dividende // diviseur)
    print("reste:", dividende % diviseur)
    print("division:", dividende / diviseur)
    

    Exercice 9

    Si aujourd'hui est un lundi, quel jour sera-t-il dans 63410 jours?

    Utilisez la console ou écrivez un programme faisant les calculs nécessaires pour obtenir la réponse.

  • exercice-9.py

    Indice

    Le modulo (%) est utile pour faire des calculs sur des valeurs cycliques.

    Par exemple les jours de la semaine forment un cycle. On peut associer chaque jour à un nombre allant de 0 à 6: dimanche=0, lundi=1, ..., samedi=6. Après le jour 6, samedi, on recommence au jour 0, dimanche.

    On peut faire le calcul (aujourdhui + N) % 7 pour obtenir un nombre de 0 à 6 qui correspond au jour qu'il sera dans N jours.

    Solution

    On associe chaque jour à un nombre de 0 à 6: dimanche=0, lundi=1, ..., samedi=6. Le calcul suivant nous amène au jour 5, un vendredi.

    >>> (1 + 63_410) % 7
        5
    

    On peut écrire un programme plus complet qui permet de reproduire ce calcul pour n'importe quel jour de départ et nombre de jours écoulés.

  • exercice-9-solution.py
  • dimanche = 0
    lundi = 1
    mardi = 2
    mercredi = 3
    jeudi = 4
    vendredi = 5
    samedi = 6
    
    aujourdhui = lundi
    nombre_de_jours = 63410
    
    print((aujourdhui + 63410) % 7)
    

    Les fonctions de hasard

    Certains programmes ont besoin de générer des nombres aléatoires, par exemple un jeu vidéo, un simulation de mutations génétiques, ou un programme de cryptographie.

    Pour générer un nombre flottant aléatoire entre 0.0 (inclus) et 1.0 (exclus), on utilise random().

  • trois_nombres_aléatoires.py
  • print("Trois nombres aléatoires de 0.0 à 1.0")
    for nombre in 1, 2, 3:
        print(random())
    

    On peut aussi générer un nombre entier aléatoire avec randint(a, b) qui génère un nombre de a à b (inclus).

  • trois_entiers_aléatoires.py
  • print("Trois entiers aléatoires de 1 à 100")
    for nombre in 1, 2, 3:
        print(randint(0, 100))
    

    Exercice 10

    Écrivez un programme qui affiche un nombre flottant entre 0.0 (inclus) et 100.0 (exclus) au hasard.

  • exercice-10.py
  • Solution

    Puisque random() génère un nombre entre 0.0 et 1.0, on peut multiplier le résulat par 100 pour que le nombre soit entre 0.0 et 100.0.

  • exercice-10-solution.py
  • maximum = 100
    nombre = random() * maximum
    print(nombre)
    

    Exercice 11

    Écrivez un programme qui affiche un nombre entier pair entre 0 (inclus) et 100 (inclus) au hasard.

  • exercice-11.py
  • Solution

    Puisque randint(a, b) génère un nombre entre a et b, on peut multiplier le résulat par 2 pour que le nombre soit entre 2 * a et 2 * b. Si on choisit a = 0 et b = 50 on obtient le bon intervalle.

  • exercice-11-solution.py
  • nombre = randint(0, 50) * 2
    print(nombre)
    

    Résumé

    Les opérations arithmétiques.

    Opérateur Description Exemple Résultat
    + addition 10 + 3 13
    - soustraction 10 - 3 7
    * multiplication 10 * 3 30
    / division 25 / 10 2.5
    ** exposant 10 ** 3 1000
    // division entière 25 // 10 2
    % modulo (reste) 25 % 10 5
    abs(x) valeur absolue abs(-7) 7
    min(a,b) minimum min(-7, -6) -6
    max(a,b) maximum max(0, -5) 0
    round(x) arrondir à l'entier round(3.1416) 3
    round(x, n) arrondir à la précision n round(3.1416, 2) 3.14

    Les fonctions de la bibliothèque math. Les fonctions trigonométriques sont en radians.

    Fonction ou valeur Description Exemple
    math.sqrt(x) racine carrée math.sqrt(100)
    math.sin(angle) sinus math.sin(0)
    math.cos(angle) cosinus math.cos(3.1416)
    math.tan(angle) tangente math.tan(3.1416 / 4)
    math.asin(x) arc-sinus math.asin(1)
    math.acos(x) arc-cosinus math.acos(0)
    math.atan(x) arc-tangente math.atan(1)
    math.ceil(x) arrondir vers le haut math.ceil(10.1)
    math.floor(x) arrondir vers le bas math.ceil(10.9)
    math.log(x) logarithme en base e math.log(2.71 ** 3)
    math.log2(x) logarithme en base 2 math.log2(16)
    math.log10(x) logarithme en base 10 math.log10(0.001)
    math.pi 3.141592653589793
    math.e 2.718281828459045

    En Python, il faut normallement écrire "import math" en haut du programme pour utiliser ces fonctions. Dans ce manuel, ce n'est pas nécessaire.

    Les fonctions de hasard.

    Fonction Description Exemple Exemple de résultat
    random() nombre aléatoire entre 0.0 et 1.0 random() 0.7354
    randint(a,b) entier aléatoire entre a et b (inclus) randint(1,6) 4

    En Python, il faut normallement ajouter "import random" en haut du programme, puis utiliser random.random() et random.randint(a, b).

    Exercice 12

    Un contenant de 150 litres se fait remplir à un débit de 2 litres par seconde. Puisque le contenant peut contenir au maximum 150 litres, la quantité d'eau dans le contenant sera toujours de 0 à 150.

    Écrivez un programme calculant la quantité d'eau dans ce contenant après un certain nombre de secondes.

    Le programme doit commencer par une variable temps qui est le temps en secondes depuis qu'on a commencé le remplissage. Ce temps peut prendre une valeur négative, représentant la période avant que le remplissage commence.

    Votre programme doit afficher le niveau d'eau dans la console et dessiner le contenant et son niveau d'eau avec la tortue.

    Utilisez votre créativité pour le dessin! Pour vous inspirer, voici un exemple d'à quoi il pourrait ressembler pour un temps écoulé de 30 secondes.

    contenant rempli d'eau

  • exercice-12.py
  • Indice

    Si quantite_eau est la quantité d'eau totale s'étant écoulée et taille_contenant est la taille du contenant, le niveau d'eau dans le contenant peut être calculée avec:

    max(0, min(taille_contenant, quantite_eau))
    

    Solution

  • exercice-12-solution.py
  • # Modifiez le temps et relancez le programme
    temps = 30 # secondes
    
    # Paramètres de la simulation
    hauteur_contenant = 150 # 1 pixel = 1L
    debit_eau = 2 # L / seconde
    
    # Calcul d'un niveau d'eau
    quantite_eau = debit_eau * temps
    niveau_eau = max(0, min(hauteur_contenant, quantite_eau))
    
    print("Après", temps, "secondes, le niveau d'eau est de", niveau_eau, "L")
    
    # Dessin du contenant
    hop()
    lt(90)
    bk(hauteur_contenant / 2)
    pensize(104)
    fd(hauteur_contenant + 2); bk(hauteur_contenant)
    pensize(100)
    pencolor(1, 1, 1)
    fd(hauteur_contenant); bk(hauteur_contenant)
    
    # Dessin du niveau d'eau
    pencolor(0.72, 0.83, 1)
    fd(niveau_eau)
    
    ht()
    

    Exercice 13

    La loi de Snell permet de calculer l'angle de réfraction d'un rayon de lumière changeant de milieu.

    n1sinθ1=n2sinθ2

    n1 et n2 sont les indices de réfraction des milieux dans lesquels se propage les rayons initial et réfracté, et θ1 et θ2 sont les angles de réfraction de ces rayons.

    Vous devez utilise la loi de Snell pour simuler et dessiner un rayon réfracté par un panneau de verre en utilisant la tortue.

    Pour pouvoir paramétrer la simulation, le programme doit commencer par la déclaration de trois variables qui représentent:

    1. l'indice de réfraction du milieu initial
    2. l'indice de réfraction du panneau
    3. l'angle d'incidence du rayon entrant dans le panneau

    Dessinez un panneau de verre allant de x=0 à x=100 dans le plan de la tortue. Dessinez ensuite la trajectoire du rayon traversant le panneau.

    Par exemple avec n1=1 , n2=3 et θ1=30 , votre programme doit générer le dessin suivant:

    réfraction

  • exercice-13.py
  • Indice

    Pour calculer l'angle θ2 , on peut utiliser la formule

    θ2=arcsinn1sinθ1n2

    Attention! Les fonction trigonométriques math.sin et math.asin utilisent des radians, mais la tortue utilise des degrés. Il faudra convertir les angles avec la formule suivante.

    θrad=π180θdeg

    Solution

    On commence par déclarer trois variables: indice_refract1, indice_refract2 et angle1_degre. En modifiant leurs valeurs, on pourra facilement paramétrer la simulation.

    On utilise ensuite la loi de Snell pour calculer l'angle réfracté.

    Une fois que toutes les angles et distances ont été calculés, on utilise la tortue pour faire le dessin. Séparer le code en deux partie (une pour les calculs et une pour le dessin) aide à rendre le programme plus lisible.

  • exercice-13-solution.py
  • # Changez ces variables pour paramétrer le dessin
    # Les indices de réfraction doivent être plus grands ou égaux à 1.0
    indice_refract1 = 1.0 
    indice_refract2 = 3.0
    angle1_degre = 30
    profondeur_milieu2 = 100
    
    # === CALCULS ===
    
    # Calcul des angles
    angle1_radian = angle1_degre / 180 * math.pi
    angle2_radian = math.asin(indice_refract1 * math.sin(angle1_radian) / indice_refract2)
    angle2_degre = angle2_radian / math.pi * 180
    
    # Calcul de la distance parcourue par le rayon dans le milieu
    distance_milieu2 = profondeur_milieu2 / math.cos(angle2_radian)
    
    # === DESSIN ===
    
    # Dessin du panneau de verre
    pencolor(0.72, 0.83, 0.91)
    pensize(500)
    fd(profondeur_milieu2); bk(profondeur_milieu2)
    
    # Dessin du rayon avant le panneau de verre
    pencolor(1, 0, 0)
    pensize(1)
    rt(angle1_degre)
    bk(100); fd(100)
    
    # Dessin du rayon dans le panneau de verre
    lt(angle1_degre); rt(angle2_degre)
    fd(distance_milieu2)
    
    # Dessin du rayon sortant du panneau de verre
    lt(angle2_degre); rt(angle1_degre)
    fd(100)
    

    Exercice 14

    Une année commune (qui n'est pas bissextile) contient 31_536_000 secondes.

    Écrivez un programme qui commence par définir une variable "seconde" qui contiendra un entier de 0 à 31_536_000 (exclus).

    Le programme doit calculer le jour, et l'heure (incluant les minutes) correspondant à cette seconde précise de l'année.

    Par exemple, si seconde = 31_535_999 (dernière seconde de l'année), alors le programme affichera:

    Jour: 365
    Heure: 23 : 59
    
  • exercice-14.py
  • seconde = 31_535_999
    
    # Complétez le programme
    

    Indice

    Commencez par utiliser la division entière pour trouver combien de jours se sont écoulés. Utilisez le modulo pour calculer nombre de secondes écoulées dans cette journée.

    Les calculs pour trouver le jour, l'heure et la minute sont très similaires.

    Solution

    On peut utiliser la division entière pour savoir combien de jour complets se sont écoulés depuis le début de l'année. On utilise le modulo pour calculer le reste, qui est le nombre de secondes dans la journée actuelle.

    On peut répéter ce processus pour trouver l'heure de la journée actuelle, puis la minute de l'heure actuelle.

  • exercice-14-solution.py
  • seconde = 31_535_999
    
    # Calcul du nombre de secondes par intervalles
    sec_par_minute = 60
    sec_par_heure = 60 * sec_par_minute
    sec_par_jour = 24 * sec_par_heure
    
    # Nombre de jours complets écoulés
    jour = seconde // sec_par_jour + 1 # On compte les jours à partir de 1
    
    # Nombre de secondes écoulées dans ce jour
    seconde_du_jour = seconde % sec_par_jour
    
    # Nombre d'heures complètes écoulées
    heure = seconde_du_jour // sec_par_heure
    
    # Nombre de secondes écoulées dans cette heure
    seconde_de_lheure = seconde_du_jour % sec_par_heure
    
    # Nombre de minutes écoulées dans cette heure
    minute = seconde_de_lheure // sec_par_minute
    
    print("Jour:", jour)
    print("Heure:", heure, ":", minute)
    

    Exercice 15

    Écrivez un programme qui commence par déclarer une variable "nombre" qui contient un nombre entier plus grand que zéro.

    Le programme doit afficher au hasard un multiple du nombre entre 0 et 100 (inclus).

    Par exemple, si nombre = 24, le programme génèrera un nombre au hasard parmi 0, 24, 48, 72, et 98.

  • exercice-15.py
  • nombre = 24
    
    # Complétez le programme
    

    Solution

    L'expression randint(0, N) * nombre génèrera aléatoirement un multiple entre 0 et N * nombre. Pour trouver le plus grand entier N tel que N * nombre est plus petit ou égal à 100, on utilise la division entière N = 100 // nombre.

  • exercice-15-solution.py
  • nombre = 24
    multiple = 100 // nombre
    resultat = randint(0, multiple) * nombre
    print(resultat)
    

    Exercice 16

    Utilisez la tortue pour dessiner le drapeau de la République d'Artsakh.

    drapeau de la République d'Artsakh

    Les dimensions de ce drapeau sont de 240 pixels de large par 120 pixels de haut. Chacun des neufs rectangles blancs mesure un sixième de la largeur du drapeau.

    Les couleurs exactes de ce drapeau peuvent être dessinées avec pencolor(0.83, 0, 0.06) (rouge), pencolor(0.15, 0.19, 0.63) (bleu), et pencolor(0.99, 0.66, 0) (orange).

  • exercice-16.py
  • Indice

    Pour dessiner le motif de rectangles blancs en zig-zag, on peut utiliser un boucle for.

    Voici la position du point milieu du côté gauche de chaque rectangle. La position en x peut être calculée avec une fonction valeur absolue. La position en y peut être calculée avec une fonction linéaire.

    Rectangle (de haut en bas) x y
    1 80.0 53.3
    2 60.0 40.0
    3 40.0 26.7
    4 20.0 13.3
    5 0.0 -0.0
    6 20.0 -13.3
    7 40.0 -26.7
    8 60.0 -40.0
    9 80.0 -53.3

    Solution

    La position du point milieu du côté gauche d'un petit rectangle blanc peut être calculée avec les formules suivantes:

    x=12×|5n|×largeury=(5n)×hauteur

    n est le numéro du rectangle à partir du haut, et largeur et hauteur sont les dimensions des rectangles blancs.

    On peut donc utiliser une boucle for pour calculer la position de chaque rectangle et le dessiner.

  • exercice-16-solution.py
  • # Paramètres du drapeau
    largeur = 240
    hauteur = 120
    largeur_blanc = largeur / 6
    hauteur_blanc = hauteur / 9
    
    # Positionner la tortue
    hop()
    rt(90)
    bk(hauteur / 2)
    
    # Bande rouge
    pensize(largeur)
    pencolor(0.83, 0, 0.06)
    fd(hauteur / 3)
    
    # Bande bleue
    pencolor(0.15, 0.19, 0.63)
    fd(hauteur / 3)
    
    # Bande jaune
    pencolor(0.99, 0.66, 0)
    fd(hauteur / 3)
    
    # Repositionner la tortue au centre
    hop()
    bk(hauteur / 2)
    lt(90)
    
    # Rectangles blancs
    pencolor(1, 1, 1)
    pensize(math.ceil(hauteur_blanc)) # On arrondit le nb de pixels vers le haut
    
    for rectangle in 1, 2, 3, 4, 5, 6, 7, 8, 9:
        y = (5 - rectangle) * hauteur_blanc
        x = abs(5 - rectangle) * largeur_blanc / 2
    
        # Déplacement à la position du rectangle
        hop(); fd(x, y)
        fd(largeur_blanc)
    
        # Retour au centre
        hop(); bk(x + largeur_blanc, y)
    
    ht()
    

    Les entrées avec input

    On peut utiliser input pour demander à l'utilisateur de fournir des informations au programme.

  • input_nom_age.py
  • nom = input("Quel est votre nom? ")
    age = input("Quel est votre âge? ")
    
    print("Nom:", nom)
    print("Âge:", age)
    

    Dans ce manuel, input affiche une boîte de dialogue pour demander une entrée à l'utilisateur. Dans d'autres environnements Python, input attendra que l'utilisateur tape une réponse dans la console.

    Conversion de type avec int() et float()

    La fonction input retourne toujours une texte, même si l'utilisateur entre un nombre.

    Si le programme a besoin d'un nombre, on doit convertir le texte en nombre avec int(x) pour un entier ou float(x) pour un nombre flottant.

    Lorsqu'on débogue un programme, il est souvent utile d'afficher le type d'une variable avec la fonction type.

  • input_conversion.py
  • valeur_texte = input("Entrez un nombre: ")
    print("Valeur et type avant conversion:", valeur_texte, type(valeur_texte))
    
    valeur_int = int(valeur_texte)
    print("Valeur et type après int():", valeur_int, type(valeur_int))
    
    valeur_float = float(valeur_texte)
    print("Valeur et type après float():", valeur_float, type(valeur_float))
    

    Exercice 1

    Écrivez un programme qui demande à l'utilisateur d'entrer son nom et son âge. Le programme doit afficher un message du type "Bonjour <nom>, vous avez <âge> ans."

  • exercice-1.py
  • Solution

    Puisqu'on ne fait qu'afficher le nom et l'âge, on n'a pas besoin de convertir l'entrée en nombre.

  • exercice-1-solution.py
  • nom = input("Quel est votre nom? ")
    age = input("Quel est votre âge? ")
    print("Bonjour", nom, "! Vous avez", age, "ans.")
    

    Exercice 2

    Écrivez un programme qui demande à l'utilisateur d'entrer deux nombres entiers.

    Le programme doit afficher la somme, et le produit des deux nombres.

  • exercice-2.py
  • Solution

    On utilise int(input(...)) pour demander un entrée et la convertir en entier. On répète cette opération pour les deux nombres.

  • exercice-2-solution.py
  • nombre1 = int(input("Entrez le premier nombre entier: "))
    nombre2 = int(input("Entrez le deuxième nombre entier: "))
    
    somme = nombre1 + nombre2
    produit = nombre1 * nombre2 
    print("Somme:", somme)
    print("Produit:", produit)
    

    Exercice 3

    Le programme dans votre environnement de développement demande à l'utilisateur d'entrer deux nombres flottants et affiche leur moyenne.

    Il contient toutefois des erreurs. Corrigez le programme pour qu'il fonctionne correctement.

  • exercice-3.py
  • nombre1 = input("Entrez le premier nombre: ")
    nombre2 = input("Entrez le deuxième nombre: ")
    moyenne = (nombre1 + nombre2) / 2
    print("Moyenne:", moyenne)
    

    Solution

    Le texte entré par l'utilisateur doit être converti en nombre flottant avec float(input(...)).

  • exercice-3-solution.py
  • nombre1 = float(input("Entrez le premier nombre: "))
    nombre2 = float(input("Entrez le deuxième nombre: "))
    moyenne = (nombre1 + nombre2) / 2
    print("Moyenne:", moyenne)
    

    Instructions conditionnelles

    Un programme peut prendre des décisions et exécuter des instructions seulement si une condition est remplie.

    On utilise le mot-clé if pour indiquer une condition à tester. Si la condition est vraie, les instructions sous le if sont exécutées.

    Par exemple, on peut demander à l'utilisateur d'entrer "oui" ou "non" pour confirmer une action.

  • condition_confirmation_if.py
  • solde = 1000
    retrait = 200
    
    confirmer = input("Confirmer?: ")
    
    if confirmer == "oui":
        solde = solde - retrait
        print("Retrait effectué, il reste", solde, "$ dans le compte.")
    
    if confirmer == "non":
        print("Retrait annulé, il reste", solde, "$ dans le compte.")
    

    Il y a un problème avec cet exemple! Si l'utilisateur entre autre chose que "oui" ou "non", le programme ne fait rien!

    Exercice 4

    Écrivez un programme qui demande à l'utilisateur d'entrer son nom.

    Si l'utilisateur entre son nom, le programme doit afficher "Bonjour <nom> !"<nom> est le nom entré.

    Si l'utilisateur n'entre rien (ou appuie sur Annuler), le programme doit afficher "Bonjour personne inconnue!".

  • exercice-4.py
  • Solution

  • exercice-4-solution.py
  • nom = input("Entrez votre nom: ")
    
    if nom != "":
        print("Bonjour", nom, "!")
    
    if nom == "":
        print("Bonjour personne inconnue!")
    

    Ce programme fonctionne, mais il teste deux fois une condition très similaire. La section suivante explique comment améliorer ce programme en utilisant else.

    Instructions conditionnelles avec else

    On peut aussi utiliser le mot-clé else pour indiquer des instructions à exécuter si la condition d'un if est fausse.

    Par exemple, on peut demander à l'utilisateur de confirmer une action, et exécuter l'action seulement s'il répond "oui". Sinon, on annule l'action.

  • condition_confirmation_if_else.py
  • solde = 1000
    retrait = 200
    
    confirmer = input("Confirmer?: ")
    
    if confirmer == "oui":
        solde = solde - retrait
        print("Retrait effectué, il reste", solde, "$ dans le compte.")
    else:
        print("Retrait annulé, il reste", solde, "$ dans le compte.")
    

    Exercice 5

    Écrivez un programme qui demande à l'utilisateur d'entrer un mot de passe. Si le mot de passe est correct, le programme doit afficher "Accès accordé!". Sinon, le programme doit afficher "Accès refusé...".

    Le mot de passe est "python123", gardez le secret!

  • exercice-5.py
  • Solution

  • exercice-5-solution.py
  • mot_de_passe = input("Entrez le mot de passe: ")
    
    if mot_de_passe == "python123":
        print("Accès accordé!")
    else:
        print("Accès refusé...")
    

    Bien entendu, ce programme n'est pas sécurisé. Un vrai système de mot de passe ne devrait jamais stocker le mot de passe en texte clair dans le code!

    Instructions conditionnelles avec elif

    Si la condition d'un if est fausse, on peut utiliser le mot-clé elif (contraction de else if) pour tester une autre condition.

    Seul les instructions sous le premier if ou elif dont la condition est vraie seront exécutées.

    Par exemple, on peut demander à l'utilisateur de confirmer une action et exécuter des instructions différentes si la réponse est "oui", "non", ou une réponse invalide.

  • condition_confirmation_if_else_elif.py
  • solde = 1000
    retrait = 200
    
    confirmer = input("Confirmer?: ")
    
    if confirmer == "oui":
        solde = solde - retrait
        print("Retrait effectué, il reste", solde, "$ dans le compte.")
    elif confirmer == "non":
        print("Retrait annulé, il reste", solde, "$ dans le compte.")
    else:
        print("Entrée invalide, le retrait est annulé.")
    

    Exercice 6

    Écrivez un programme qui demande trois entrées à l'utilisateur: une opération ("+", "-", "*", ou "/"), et deux nombres flottants.

    Le programme doit effectuer l'opération demandée sur les deux nombres et afficher le résultat. Si l'opération n'est pas reconnue, le programme doit afficher "Opération invalide".

  • exercice-6.py
  • Solution

    On utilise if, elif, et else pour tester chaque opération possible. Il ne faut pas oublier de convertir les entrées en nombres flottants avec float(input(...)).

  • exercice-6-solution.py
  • operation = input("Entrez une opération (+, -, *, /): ")
    nombre1 = float(input("Entrez le premier nombre: "))
    nombre2 = float(input("Entrez le deuxième nombre: "))
    
    if operation == "+":
        resultat = nombre1 + nombre2
        print("Résultat:", resultat)
    elif operation == "-":
        resultat = nombre1 - nombre2
        print("Résultat:", resultat)
    elif operation == "*":
        resultat = nombre1 * nombre2
        print("Résultat:", resultat)
    elif operation == "/":
        resultat = nombre1 / nombre2
        print("Résultat:", resultat)
    else:
        print("Opération invalide")
    

    Les opérations de comparaison

    Les opérations de comparaison permettent de comparer deux valeurs.

  • comparaison_egalite.py
  • a = 10
    b = 20
    
    if a == b:
        print(a, "est égal à", b)
    elif a < b:
        print(a, "est plus petit que", b)
    else:
        print(a, "est plus grand que", b)
    

    Voici les opérateurs de comparaison:

    Opération Description
    x < y Plus petit que
    x > y Plus grand que
    x <= y Plus petit ou égal à
    x >= y Plus grand ou égal à
    x == y Égal à
    x != y Différent de

    Les opérateurs de comparaison peuvent comparer des nombres ou des textes. Si les valeurs sont des types, l'ordre alphabétique est utilisé pour les comparer.

    Les valeurs booléennes: True et False

    Les opérations de comparaison retournent des valeurs booléennes: True (vrai) ou False (faux).

    Ces valeurs peuvent être stockées dans des variables et manipulées comme n'importe quelle autre valeur.

  • valeurs_booleennes_comparaison.py
  • a = 10
    b = 20
    
    resultat = a < b
    print("a < b:", resultat)
    

    On peut aussi créer des valeurs booléennes directement en utilisant les mots-clés True et False. On peut même vérifier leur type avec type.

  • valeurs_booleennes_variable.py
  • booleen = True
    print("Un booléen:", booleen)
    print("Type d'un booléen:", type(booleen))
    

    Exercice 7

    Écrivez un programme qui demande à l'utilisateur d'entrer un notes en pourcentage (entre 0 et 100).

    Le programme doit afficher la lettre correspondante selon l'échelle suivante:

    Pourcentage Lettre
    100 A+
    90 - 99 A
    80 - 89 B
    70 - 79 C
    60 - 69 D
    0 - 59 E
  • exercice-7.py
  • Solution

    En utilisant if, elif, et else, on peut tester chaque intervalle de pourcentage en ordre décroissant.

  • exercice-7-solution.py
  • note = int(input("Entrez votre note (0-100): "))
    
    if note == 100:
        print("A+")
    elif note >= 90:
        print("A")
    elif note >= 80:
        print("B")
    elif note >= 70:
        print("C")
    elif note >= 60:
        print("D")
    else:
        print("E")
    

    Exercice 8

    Écrivez un programme qui demande à l'utilisateur d'entrer un nombre entier.

    Le programme doit afficher "pair" si le nombre est pair, et "impair" sinon.

  • exercice-8.py
  • Indice

    Un nombre est pair si le reste de sa division par 2 est égal à 0. On peut utiliser l'opérateur modulo % pour obtenir le reste d'une division.

    Solution

  • exercice-8-solution.py
  • nombre = int(input("Entrez un nombre entier: "))
    
    if nombre % 2 == 0:
        print("pair")
    else:
        print("impair")
    

    Exercice 9

    Écrivez un programme qui dessine le drapeau du Libéria en utilisant la tortue.

    Les dimensions de ce drapeau sont de 285 de largeur et 150 de hauteur.

    Pour dessiner une étoile, utilisez l'instruction regpoly(-5) de la tortue. La taille de l'étoile dépend de la valeur donnée à pensize avant d'appeler regpoly. Pour ce drapeau, utilisez un cinquième de la hauteur comme taille.

    Les couleurs utilisées sont pencolor(0.68, 0.18, 0.21) (rouge), et pencolor(0.06, 0.15, 0.4) (bleu).

  • exercice-9.py
  • Indice

    Pour dessiner les onze lignes horizontales, utilisez une boucle for. Les lignes impaires sont rouges et les lignes paires sont blanches.

    Solution

    Pour dessiner les lignes, on utilise une boucle for qui répète pour les lignes 1, 2, ..., 11. Si le numéro de la ligne est impair (ligne % 2 == 1), on utilise la couleur rouge, sinon on utilise la couleur blanche.

  • exercice-9-solution.py
  • # dimensions du drapeau
    largeur = 285
    hauteur = 150
    
    hauteur_ligne = hauteur / 11
    
    # dessiner les 11 lignes
    rt(90)
    hop()
    bk(hauteur / 2)
    pensize(largeur)
    
    for ligne in 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11:
        if ligne % 2 == 1:
            pencolor(0.68, 0.18, 0.21)
        else:
            pencolor(1, 1, 1)
            
        fd(hauteur_ligne)
    
    # dessiner le carré bleu
    hop()
    bk(hauteur_ligne * 8.5, largeur / 2)
    
    lt(90)
    carre = 5 * hauteur_ligne
    pencolor(0.06, 0.15, 0.4)
    pensize(5 * hauteur_ligne)
    fd(carre)
    bk(carre / 2)
    
    # dessiner l'étoile blanche
    pencolor(1, 1, 1)
    rt(18)
    pensize(carre / 5)
    regpoly(-5)
    
    ht()
    

    Les opérations logiques: `and` et `or`

    Les opérateurs logiques or (ou) et and (et) permettent de combiner des expressions booléennes.

    L'opération test1 or test2 retourne True si au moins une des expressions est vraie.

  • table_or.py
  • print("True  or True  =", True or True)   # True
    print("True  or False =", True or False)  # True
    print("False or True  =", False or True)  # True
    print("False or False =", False or False) # False
    

    L'opération test1 and test2 retourne True si les deux expressions sont vraies.

  • table_and.py
  • print("True  and True  =", True and True)   # True
    print("True  and False =", True and False)  # False
    print("False and True  =", False and True)  # False
    print("False and False =", False and False) # False
    

    Les opérations logiques: `not`

    L'opérateur logique not (non) retourne True si l'expression est fausse, et False si l'expression est vraie.

  • table_not.py
  • print("not True  =", not True)   # False
    print("not False =", not False)  # True
    

    Exercice 10

    Dans une ville, le transport en commun est gratuit pour les enfants de moins de 12 ans et pour les aînés de 65 ans et plus. Les autres personnes doivent payer le tarif régulier de 2.50$.

    Écrivez un programme qui demande à l'utilisateur d'entrer son âge. Le programme doit afficher "Gratuit!" si l'utilisateur peut utiliser le transport en commun gratuitement, et "Tarif régulier: 2.50$" sinon.

  • exercice-10.py
  • Solution

  • exercice-10-solution.py
  • age = int(input("Entrez votre âge: "))
    
    if age < 12 or age >= 65:
        print("Gratuit!")
    else:
        print("Tarif régulier: 2.50$")
    

    Exercice 11

    Écrivez un intelligence artificielle très simple qui conseille à un humain s'il doit prendre un parapluie.

    Le programme doit poser deux questions à l'utilisateur:

    • Est-ce qu'il pleut?
    • Est-ce que tu veux rester au sec?

    Si l'utilisateur répond "non" à l'une des deux questions, le programme doit afficher "Pas besoin de parapluie.".

    Si l'utilisateur répond "oui" aux deux questions, le programme doit afficher "Prends un parapluie.".

    Par exemple, si l'utilisateur répond "non" à la première question, le programme doit afficher "Pas besoin de parapluie." sans poser la deuxième question.

  • exercice-11.py
  • Solution

    Il y a deux façons de résoudre cet exercice. Voici une solution utilisant if, elif, et else. Dès que l'utilisateur répond "non" à une question, le programme affiche le message et s'arrête.

  • exercice-11-solution-if-elif-else.py
  • if input("Est-ce qu'il pleut?") == "non":
        print("Pas besoin de parapluie.")
    elif input("Est-ce que tu veux rester au sec?") == "non":
        print("Pas besoin de parapluie.")
    else:
        print("Prends un parapluie.")
    

    On peut utiliser and pour être plus concis. L'opérateur and est spécial, car il évalue la deuxième condition seulement si la première est vraie.

  • exercice-11-solution-court-circuit.py
  • if (input("Est-ce qu'il pleut?") == "oui" and
        input("Est-ce que tu veux rester au sec?") == "oui"):
        print("Prends un parapluie.")
    else:
        print("Pas besoin de parapluie.")
    

    Ce comportement de and qui arrête l'évaluation à la première expression fausse est appelé court-circuitage. L'opérateur or est similaire, mais arrête l'évaluation à la première expression vraie.

    Résumé

    Entrées avec input.

    Instruction Description Exemple
    input(message) Demander une entrée à l'utilisateur en affichant un message age = input("Entrez votre âge: ")
    input() Demander une entrée à l'utilisateur sans afficher de message entree = input()

    Conversion de type.

    Instruction Description Exemple
    int(x) Conversion en entier x = int("5")
    float(x) Conversion en flottant y = float("3.14")
    type(valeur) Retourne le type de la valeur type(42)<class 'int'>

    Opérateurs de comparaison.

    Opérateur Description Exemple
    x < y Plus petit que 3 < 5True
    x > y Plus grand que 5 > 3True
    x <= y Plus petit ou égal à 3 <= 3True
    x >= y Plus grand ou égal à 4 >= 5False
    x == y Égal à 2 == 2True
    x != y Différent de 2 != 3True

    Opérateurs logiques.

    Opérateur Description Exemple
    and Vrai si les deux conditions sont vraies a > 0 and b > 0
    or Vrai si au moins une condition est vraie age < 12 or age >= 65
    not Inverse la valeur booléenne not x == y

    Instructions conditionnelles.

    Mot-clé Description Exemple
    if Exécuter si la condition est vraie
    if note >= 90:
        print('A')
    elif Tester une autre condition si le if précédent est faux
    elif note >= 80:
        print('B')
    else Exécuter si aucune condition n'est vraie
    else:
        print('C')

    Instructions de la tortue

    Instruction Description Exemple
    regpoly(n) Dessiner un polygone régulier à n côtés. pensize(100); regpoly(5) dessine un pentagone plein d'apothème 50
    regpoly(-n) Si le nombre de côtés est négatif, dessiner une étoile pensize(100); regpoly(-5) dessine une étoile à cinq branches
    regpoly(n,a) Si un deuxième argument est donné, utiliser a comme apothème regpoly(5, 50) dessine un pentagone vide d'apothème 50
    regpoly() Si aucun argument n'est donné, dessiner un cercle pensize(100); regpoly() dessine un cercle de diamètre 100

    Exercice 12

    Si un nombre se trouve entre 8 et 120 inclusivement, alors il est toujours premier s'il n'est pas divisible par 2, 3, 5, ou 7.

    Écrivez un programme qui demande à l'utilisateur d'entrer un nombre entier entre 8 et 120.

    Le programme doit afficher "Premier" si le nombre est premier. Sinon, le programme doit afficher "Divisible par n", où n est le plus petit des nombres 2, 3, 5, ou 7 par lequel le nombre est divisible.

    Si le nombre entré n'est pas entre 8 et 120, le programme doit afficher "Je ne sais pas...".

  • exercice-12.py
  • Solution

    On teste chacun des diviseurs possibles avec des instructions if et elif. Si un diviseur est trouvé, on affiche le message correspondant.

  • exercice-12-solution.py
  • nombre = int(input("Entrez un nombre entier entre 8 et 120: "))
    
    if nombre < 8 or nombre > 120:
        print("Je ne sais pas...")
    elif nombre % 2 == 0:
        print("Divisible par 2")
    elif nombre % 3 == 0:
        print("Divisible par 3")
    elif nombre % 5 == 0:
        print("Divisible par 5")
    elif nombre % 7 == 0:
        print("Divisible par 7")
    else:
        print("Premier")
    

    Exercice 13

    Un programme de virement bancaire vérifie si le solde du compte est suffisant pour effectuer un virement et s'assure que le montant entré est valide, c'est-à-dire un nombre positif.

    Écrivez un programme qui commence par la définition d'une variable solde contenant le solde du compte (par exemple 1000$).

    Le programme doit demander à l'utilisateur d'entrer le montant du virement.

    Si le montant est négatif, le programme doit afficher "Montant invalide.".

    Si le montant est supérieur au solde, le programme doit afficher "Fonds insuffisants.".

    Autrement le programme affiche "Virement effectué." et met à jour le solde du compte.

    Dans tous les cas, le programme doit afficher le solde restant après la tentative de virement.

  • exercice-13.py
  • Solution

    On utilise float(input(...)) pour demander le montant du virement et if, elif, et else pour vérifier les conditions.

    Puisque le solde doit être affiché dans tous les cas, on place l'instruction d'affichage du solde à la fin du programme, en dehors du if.

  • exercice-13-solution.py
  • solde = 1000
    montant = float(input("Entrez le montant du virement: "))
    
    if montant < 0:
        print("Montant invalide.")
    elif montant > solde:
        print("Fonds insuffisants.")
    else:
        solde = solde - montant
        print("Virement effectué.")
    
    print("Solde restant:", solde, "$")
    

    Utilise des flottants pour un montant monétaire n'est pas idéal, notamment parce qu'on ne peut pas retirer 0.001$ d'un compte bancaire. Cependant, c'est acceptable pour le moment.

    Exercice 14

    On peut trouver les zéro de ax2+bx+c avec l'équation des zéros d'une fonction quadratique.

    x=b±b24ac2a

    Il y a trois possibilités selon le signe du terme (b24ac) , appelé le discriminant:

    1. Positif: il y a deux zéros réels distincts.
    2. Égal à zéro: il y a un seul zéro réel.
    3. Négatif: il n'y a pas de zéro réel.

    Écrivez un programme qui commence par la définition des variables a, b, et c. Le programme doit afficher le ou les zéros réels de l'équation quadratique, ou "aucun" s'il n'y en a pas.

  • exercice-14.py
  • a = 1
    b = -3
    c = 2
    
    # Complétez le programme
    

    Solution

    On calcule d'abord le discriminant avec b**2 - 4 * a * c. On utilise ensuite if, elif, et else pour gérer les trois cas possibles.

  • exercice-14-solution.py
  • a = 1
    b = -3
    c = 2
    
    discriminant = b**2 - 4 * a * c
    
    if discriminant > 0:
        racine1 = (-b + math.sqrt(discriminant)) / (2 * a)
        racine2 = (-b - math.sqrt(discriminant)) / (2 * a)
        print(racine1, racine2)
    elif discriminant == 0:
        racine = -b / (2 * a)
        print(racine)
    else:
        print("aucun")
    

    Exercice 15

    Une année bissextile contient un jour supplémentaire (29 février) pour compenser le fait que la Terre ne met pas exactement 365 jours pour faire le tour du Soleil.

    Une année est bissextile si:

    • elle est divisible par 4 (bissextile)
    • sauf si elle est divisible par 100 (non bissextile)
    • à moins qu'elle soit divisible par 400 (bissextile)

    Voici quelques exemples:

    • 2026 n'est pas bissextile (non divisible par 4)
    • 2028 est bissextile (divisible par 4)
    • 2100 n'est pas bissextile (divisible par 100)
    • 2000 était bissextile (divisible par 100, mais aussi par 400)

    Écrivez un programme qui demande à l'utilisateur d'entrer une année (un entier), puis affiche "Année bissextile" si l'année est bissextile, et "Année non bissextile" sinon.

  • exercice-15.py
  • Indice

    Une année est bissextile si elle est divisible par 4 ET pas divisible par 100, OU si elle est divisible par 400.

    Pouvez-vous transformer cette phrase en expression booléenne en utilisant les opérateurs and, or?

    Solution

  • exercice-15-solution.py
  • annee = int(input("Entrez une année: "))
    
    if (annee % 4 == 0 and annee % 100 != 0) or (annee % 400 == 0):
        print("Année bissextile")
    else:
        print("Année non bissextile")
    

    Exercice 16

    La vitesse de libération d'un corps céleste, par exemple une planète comme la Terre, est la vitesse minimale qu'un objet doit atteindre pour s'échapper de son attraction gravitationnelle. On utilise l'équation suivante pour calculer la vitesse de libération en mètres par seconde:

    v=2GMR+h

    G est la constante gravitationnelle, M est la masse du corps céleste, R est son rayon (en mètres), et h est l'altitude de l'objet (en mètres). Le résultat v est la vitesse de libération en mètres par seconde.

    La constante gravitationnelle est 6.674e-11. La masse de la Terre est 5.972e24 kg et son rayon est d'environ 6.378e6 m.

    Écrivez un programme qui servira de système de bord à une fusée. Le programme doit demander deux entrées à l'astronaute aux commandes:

    • l'altitude de la fusée en kilomètres
    • la vitesse de la fusée en km/s

    Le système de bord doit déterminer si la fusée peut s'échapper de l'attraction gravitationnelle de la Terre. Il doit afficher "C'est parti!" si la fusée peut s'échapper, et "Encore un peu de puissance..." sinon.

  • exercice-16.py
  • G = 6.674e-11
    masse_terre = 5.972e24 # kg
    rayon_terre = 6.378e6 # m
    
    # Complétez le programme
    

    Indice

    Afin de tester votre système de bord, la vitesse de libération à 100km d'altitude est d'environ 11.9 km/s.

    N'oubliez pas de convertir l'altitude de kilomètres en mètres (1 km = 1000 m) et la vitesse de km/s en m/s (1 km/s = 1000 m/s)!

    Solution

    Après avoir calculé la vitesse de libération, on utilise >= pour vérifier si la fusée peut s'échapper de l'attraction gravitationnelle de la Terre.

  • exercice-16-solution.py
  • G = 6.674e-11
    masse_terre = 5.972e24 # kg
    rayon_terre = 6.378e6 # m
    
    altitude = float(input("Altitude de la fusée (km): ")) * 1000  # m
    vitesse_fusee = float(input("Vitesse de la fusée (km/s): ")) * 1000  # m/s
    
    liberation = math.sqrt((2 * G * masse_terre) / (rayon_terre + altitude)) # m/s
    
    if vitesse_fusee >= liberation:
        print("C'est parti!")
    else:
        print("Encore un peu de puissance...")
    

    Exercice 17

    Un robot botanique arrose automatiquement les plantes dans un champs. Le robot possède trois senseurs:

    • un capteur d'humidité du sol (0 à 100%)
    • un capteur de température (en °C)
    • un capteur de lumière (en lux, une unité de luminosité)

    Pour s'assurer que les plantes poussent bien, le robot doit arroser si:

    • l'humidité du sol est inférieure à 30%
    • la température est supérieure à 20°C
    • la lumière ambiante est supérieure à 50 000 lux

    Toutefois, si l'humidité du sol tombe sous 10%, le robot doit arroser peu importe la température et la lumière.

    Écrivez un programme qui commence par la définition de trois variables: humidite, temperature, et lumiere. Le programme doit afficher "Arroser les plantes" si le robot doit arroser, et "Ne pas arroser" sinon.

  • exercice-17.py
  • humidite = 25
    temperature = 22
    lumiere = 25000
    
    # Complétez le programme
    

    Solution

    Le robot doit arroser si l'humidité est inférieure à 30% et la température est supérieure à 20°C et la lumière est supérieure à 50 000 lux, ou si l'humidité est inférieure à 10%.

    On peut traduire cette logique avec les opérateurs and et or en "humidite < 10 or (humidite < 30 and temperature > 20 and lumiere > 50000)".

  • exercice-17-solution.py
  • humidite = 25
    temperature = 22
    lumiere = 25000
    
    if (humidite < 30 and temperature > 20 and lumiere > 50_000) or humidite < 10:
        print("Arroser les plantes")
    else:
        print("Ne pas arroser")
    

    Les parenthèses autour des conditions combinées avec and ne sont pas strictement nécessaires car l'opérateur and a une priorité plus élevée que l'opérateur or (de la même manière que la multiplication a une priorité plus élevée que l'addition). Cependant, les inclure améliore la lisibilité du code.

    Exercice 18

    Écrivez un programme qui choisit un nombre entier aléatoire de 1 à 6 représentant le lancer d'un dé.

    Utilisez la tortue pour dessiner le face du dé correspondant au nombre choisi.

    Par exemple, si le nombre est 3, le programme doit dessiner ce dé:

  • exercice-18.py
  • Indice

    On pourrait utiliser une série d'instructions if pour dessiner chaque face possible du dé.

    if nombre == 1:
        # dessiner la face 1
    elif nombre == 2:
        # dessiner la face 2
    elif nombre == 3:
        # dessiner la face 3
    ...
    

    Cette solution serait très longue! Un meilleur moyen est d'utiliser des conditions pour dessiner chaque point du dé. Par exemple, le point au centre doit être dessiné seulement si le nombre est 1, 3, ou 5

    Les points en haut à gauche et en bas à droite doivent être dessinés seulement si le nombre est 2, 3, 4, 5, ou 6.

    Et ainsi de suite, on peut déterminer les conditions pour chaque point du dé pour écrire un programme plus court.

    Solution

    On peut écrire un programme concis en ne testant que quatre conditions.

    Si le nombre est 1, 3, ou 5, on dessine le point au centre.

    Si le nombre est 2, 3, 4, 5, ou 6, on dessine les points en haut à gauche et en bas à droite.

    Si le nombre est 4, 5, ou 6, on dessine les points en haut à droite et en bas à gauche.

    Si le nombre est 6, on dessine les points au milieu à gauche et au milieu à droite.

  • exercice-18-solution.py
  • nombre = randint(1, 6)
    
    cote = 80
    coord_point = cote / 2
    point = cote / 4
    
    regpoly(4, cote)  # dessiner le carré du dé
    
    pensize(point)
    
    # point au centre
    if nombre == 1 or nombre == 3 or nombre == 5:
        regpoly()
    
    if nombre >= 2:
        # points en haut à gauche
        hop(); bk(coord_point, -coord_point)
        regpoly()
    
        # points en bas à droite
        hop(); fd(2*coord_point, -2*coord_point)
        regpoly()
        hop(); bk(coord_point, -coord_point)
    
    if nombre >= 4:
        # points en haut à droite
        hop(); fd(coord_point, coord_point)
        regpoly()
        hop(); bk(2*coord_point, 2*coord_point)
    
        # points en bas à gauche
        regpoly()
        hop(); fd(coord_point, coord_point)
    
    if nombre == 6:
        # points au milieu à gauche
        hop(); bk(coord_point)
        regpoly()
    
        # points au milieu à droite
        hop(); fd(2*coord_point, 0)
        regpoly()
        hop(); bk(2*coord_point, 0)
    
    ht()
    

    Chaque bloc if ramène la tortue au centre du dé après avoir dessiné ses points. C'est important, autrement les prochains points ne seraient pas correctement centrés.

    Exercice 19

    Utilisez la tortue pour dessiner le drapeau de la Grèce.

    Les dimensions de ce drapeau sont de 240 pixels de large par 160 pixels de haut. La teinte de bleue utilisée est obtenue avec pencolor(0.18, 0.36, 0.66).

  • exercice-19.py
  • Indice

    Pour dessiner les neuf lignes horizontales, utilisez une boucle for. Les lignes impaires sont bleues et les lignes paires sont blanches. On peut utiliser un if avec l'opérateur modulo % pour déterminer si une ligne est paire ou impaire.

    Solution

  • exercice-19-solution.py
  • largeur = 240
    hauteur = 160
    
    hauteur_ligne = hauteur / 9
    
    rt(90)
    hop(); bk(hauteur / 2)
    pensize(largeur)
    
    # Dessin des neuf lignes
    for ligne in 1, 2, 3, 4, 5, 6, 7, 8, 9:
        if ligne % 2 == 0:
            pencolor(1, 1, 1)
        else:
            pencolor(0.18, 0.36, 0.66)
        
        fd(hauteur_ligne)
    
    # Placement pour le carré
    hop()
    bk(hauteur_ligne * 6.5,  largeur / 2)
    lt(90)
    
    cote_carre = 5 * hauteur_ligne
    
    # Dessin du carré
    pencolor(0.18, 0.36, 0.66)
    pensize(cote_carre)
    fd(cote_carre)
    
    # Dessin de la croix blanche
    pencolor(1, 1, 1)
    pensize(hauteur_ligne)
    bk(cote_carre)
    fd(cote_carre / 2)
    rt(90)
    fd(cote_carre / 2)
    bk(cote_carre)
    
    ht()
    

    Retiré

    Ce chapitre a été retiré de cet échantillon.

    Retiré

    Ce chapitre a été retiré de cet échantillon.

    Retiré

    Ce chapitre a été retiré de cet échantillon.

    Retiré

    Ce chapitre a été retiré de cet échantillon.

    Retiré

    Ce chapitre a été retiré de cet échantillon.

    Retiré

    Ce chapitre a été retiré de cet échantillon.