From a459026f9f501910d9fa6e371bc9d5fe345266aa Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Wed, 7 Nov 2018 11:45:30 +0100 Subject: [PATCH] =?UTF-8?q?Feat(PreStSauveur):=20R=C3=A9actualisation=20de?= =?UTF-8?q?s=20projets=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Programmation/Projets Python.html | 14488 ++++++++++++++++ .../Programmation/Projets Python.ipynb | 1047 ++ .../Programmation/fig/replit_files.png | Bin 0 -> 12323 bytes .../Programmation/fig/replit_global.png | Bin 0 -> 58189 bytes PreStSauveur/Programmation/fig/replit_run.png | Bin 0 -> 897 bytes 5 files changed, 15535 insertions(+) create mode 100644 PreStSauveur/Programmation/Projets Python.html create mode 100644 PreStSauveur/Programmation/Projets Python.ipynb create mode 100644 PreStSauveur/Programmation/fig/replit_files.png create mode 100644 PreStSauveur/Programmation/fig/replit_global.png create mode 100644 PreStSauveur/Programmation/fig/replit_run.png diff --git a/PreStSauveur/Programmation/Projets Python.html b/PreStSauveur/Programmation/Projets Python.html new file mode 100644 index 0000000..c6eacc4 --- /dev/null +++ b/PreStSauveur/Programmation/Projets Python.html @@ -0,0 +1,14488 @@ + + + + +Projets Python + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+

Projets Python

Dans ce cours autour de la programmation Python et de l'algorithmie, nous verons beaucoup de petits morceaux de programmes.

+

Il est vivement recommander de ne pas faire que les questions poser mais aussi d'expérimenter par soi même.

+ +
+

Notions de programmation

+ +
+

Ressouces Python

+ + +
+
+
+
+
+
+

Avec Repl.it

Se rendre sur le site de repli.it.

+

L'interface se sépare en 2 parties:

+

interface replit

+
    +
  • Zone Script: Éditeur de texte où l'on pourra écrire notre programme python. Pour executer son contenu, il faudra cliquer sur replit run
  • +
  • Zone Shell: Line de commande pour interagir avec python. Ici vous pouvez tester vos commandes python et presser la touche entrer pour l'executer. Par contre on ne peut pas écrire sur plusieurs lignes.
  • +
+

Il est conseillé d'utiliser en priorité la zone script car elle permet d'écrire sur plusieurs lignes et de corriger après l'execution. La zone shell servira à tester des commandes pour voir directement leurs effets.

+

Pour sauvergarder votre travail, vous cliquerez sur les 3 points à côté de Files puis sur download as zip.

+

replit save

+ +
+
+
+
+
+
+

Introduction Python

Dans les encadrés, il y a du code python. Il faudra le recopier leur contenu dans la zone script et ne pas hésiter à le modifier.

+ +
+
+
+
+
+
In [1]:
+
+
+
print("Bonjour")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Bonjour
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Modifier la commande précédente pour qu'elle n'affiche plus bonjour mais votre nom puis executer cette commande.
  • +
+

Il est possible d'afficher plusieurs messages:

+ +
+
+
+
+
+
In [2]:
+
+
+
print("bonjour")
+print("monde")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
bonjour
+monde
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Modifier le programme précédent pour qu'il affiche:

    + +
      Bonjour
    +
    +  tous
    +
    +  le 
    +
    +  monde
    +
  • +
+

Quand une ligne commence par un #, Python ne la lit pas. On appelle cela des commentaires. Nous les utiliserons pour expliquer ce que l'on fait.

+ +
+
+
+
+
+
In [3]:
+
+
+
# la commande suivante affiche Bonjour
+print("bonjour")
+# Quand on veut afficher quelque chose, on utilisera la commande print()
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
bonjour
+
+
+
+ +
+
+ +
+
+
+
+

Les variables

Les variables sont des enveloppes où l'on stockera des nombres, des mots, des phrases ou des choses plus compliqués.

+ +
+
+
+
+
+
In [4]:
+
+
+
un_nombre = 10
+
+ +
+
+
+ +
+
+
+
+

Ainsi dans l'enveloppe appelée un_nombre on y met le nombre 10.

+

C'est ce que l'on appelle assigner une valeur à une variable ou stocker une valeur dans une variable.

+ +
+
+
+
+
+
In [5]:
+
+
+
un_nombre = 10
+print(un_nombre) 
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
10
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Modifier le programme précédent pour stocker le nombre 2 dans un_nombre puis l'afficher.
  • +
+

Pour stocker des mots ou des phrases, il faut les mettre entre guillemets

+ +
+
+
+
+
+
In [6]:
+
+
+
un_mot = "Coucou"
+une_phrase = "ceci est une phrase"
+
+ +
+
+
+ +
+
+
+
+
    +
  • Modifier le programme précédent pour changer le contenu des variables puis ajouter deux lignes pour afficher ce que contiennent ces variables (avec la commande print).
  • +
+ +
+
+
+
+
+
+

Générateur d'excuses

Quand Loïc fait des bétises, il se fait souvent prendre et doit trouver une excuse le plus rapidement possible. Aidons le en créant un programme qui créé des excuses sur commande.

+

Ces excuses auront le modèle suivant

+ +
C'est pas moi! C'est (Bob). 
+Il a (mangé) une (grenouille) (volante). Alors que moi j'étais tranquillement en train de (faire) un (super) (exercice de math). 
+Je suis innocent (monsieur)!
+
+
+

Les nombres entre parenthèses seront remplacé par des mots choisis par l'utilisateur de ce générateur.

+

Pour écrire du texte avec une variable, il faut séparer les parties par une virgule:

+ +
+
+
+
+
+
In [7]:
+
+
+
age = 14
+print("J'ai ", age, "ans")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
J'ai  14 ans
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Modifier les lignes précédentes pour se présenter Bonjour, je m'appelle (Bob).
  • +
+

Pour demander quelque chose à l'utilisateur, on utilise la fonction input

+ +
+
+
+
+
+
In [8]:
+
+
+
coupable = input("Nom du coupable (masculin)? ")
+print("C'est pas moi! C'est ", coupable)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Nom du coupable (masculin)? bob
+C'est pas moi! C'est  bob
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Finir d'écrire le programme qui permettra de générer une excuse
  • +
+ +
+
+
+
+
+
+

Magic 8 ball

Pour ceux qui ne connaissent pas un Magic 8 ball est un boule magique qui répond à toutes les questions (vidéo).

+

Même si je ne voudrai pas gacher votre âme d'enfant, cette boule magique répond au hasard... Pour gérer le hasard en Python, on utilise random. Il faut donc placer la ligne suivante au début du fichier à chaque fois que l'on veut faire quelque chose au hasard.

+ +
+
+
+
+
+
In [9]:
+
+
+
import random
+
+ +
+
+
+ +
+
+
+
+

Nous allons mettre toutes les réponses possibles dans une liste

+ +
+
+
+
+
+
In [10]:
+
+
+
reponses = ["reponse 1", "reponse 2", "reponse 3"]
+
+ +
+
+
+ +
+
+
+
+

Et Python choisira une réponse au hasard

+ +
+
+
+
+
+
In [11]:
+
+
+
random.choice(reponses)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[11]:
+ + + + +
+
'reponse 1'
+
+ +
+ +
+
+ +
+
+
+
+
    +
  • En réutilisant la fonction input vue précédement, écrire un programme qui propose de poser une question et qui lui apporte une réponse!
  • +
+ +
+
+
+
+
+
+

Deviner un nombre

Nous allons maintenant écrire un programme qui va chercher à faire deviner à l'utilisateur un nombre choisi aléatoirement par Python.

+

Pour faire choisir un nombre entier à Python, on utilise la fonction randint(min,max) (randint signifie random integer = entier aléatoire)

+ +
+
+
+
+
+
In [12]:
+
+
+
nbr_aleatoire = random.randint(1,20)
+print(nbr_aleatoire)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
2
+
+
+
+ +
+
+ +
+
+
+
+

Faites executer plusieurs fois cette commande pour remarquer qu'elle ne retourne pas toujours le même résultat.

+
    +
  • Completer votre programme pour demander une réponse à l'utilisateur (utilisez int(input("question")) plutôt que input("question") pour que la réponse soit transformée en entier)

    +
  • +
  • Regarder la section sur Condition if pour adapter l'exemple et savoir lequel du nombre choisi par l'ordinateur ou de l'utilisateur est le plus grand.

    +
  • +
  • Écrire le programme final qui fait choisir un nombre à l'ordinateur, qui demande un nombre à l'utilisateur puis qui dit si le nombre donné par l'utilisateur est plus grand ou plus petit.

    +
  • +
  • Pour améliorer notre programme, il faudrait que l'utilisateur puisse rententer de deviner le nombre. Regardez la section Boucle while pour améliorer votre programme.

    +
  • +
+ +
+
+
+
+
+
+

Pierre Feuille Ciseau

Vous devez connaître le jeu Pierre-Feuille-Ciseau. Deux adversaires s'affrontent choissicent en même temps Pierre, Feuille ou Ciseau.

+

Pierre gagne contre ciseau qui gagne contre feuille qui gagne contre pierre...

+

Nous allons écrire un jeu qui fera s'affronter l'utilisateur contre l'ordinateur.

+

Choix du joueur et choix de l'ordinateur

    +
  • Écrire un programme qui demande le choix de l'utilisateur
  • +
  • Completer ce programme pour que l'ordinateur choisisse parmi les 3 choix
  • +
+

Comparaison des résultats

    +
  • En utilisant les conditions if comparer les deux choix pour determiner qui est le vaincueur.
  • +
+ +
+
+
+
+
+
+

Deviner un nombre (amélioration)

Reprenez votre programme qui fait deviner à l'utilisateur un nombre choisi par l'ordinateur. Le soucis de ce programme est que nous n'avons qu'un essai ce qui n'est pas très pratique pour trouver le nombre...

+

Nous allons améliorer ce programme laisser plus de chance à l'utilisateur. Pour cela nous allons faire une boucle while (tant que en français).

+ +
+
+
+
+
+
In [13]:
+
+
+
a = 11
+while a < 20: #tant que a est plus petit que 20
+    print("un tour")
+    a = a + 1
+print("Fini! Et a vaut ", a)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
un tour
+un tour
+un tour
+un tour
+un tour
+un tour
+un tour
+un tour
+un tour
+Fini! Et a vaut  20
+
+
+
+ +
+
+ +
+
+
+
+

On peut aussi créer une variable aPasTrouve = True (True en anglais signifie vrai) et dès que l'utilisateur a trouvé la bonne valeur, on change aPasTrouve = False (False en anglais signifie faux).

+
    +
  • Écrire cette amélioration du programme.
  • +
  • Améliorer votre programme, en comptant le nombre de tentatives.
  • +
+ +
+
+
+
+
+
+

Generateur de simleys

Pour ce projet, nous allons programmer un générateur de smileys. Nous allons définir quelquels éléments de ce smiley et l'ordinateur choisira aléatoirement parmi ces éléments pour créer le smiley.

+

Voici les éléments du smiley.

+ +
+
+
+
+
+
In [14]:
+
+
+
LISTE_CHAPEAU       = [u"      \n _===_", "  ___ \n .....", "   _  \n  /_\ ", "  ___ \n (_*_)"]
+LISTE_NEZ       = [u",",    ".",    "_",    " "]
+LISTE_OEIL       = [u".",    "o",    "O",    "-"]
+LISTE_GAUCHE_CORPS_HAUT  = [u" ",    "\\",   " ",    " "]
+LISTE_GAUCHE_CORPS_BAS  = [u"<",    " ",    "/",    " "]
+LISTE_DROITE_CORPS_HAUT = [u" ",    "/",    " ",    " "]
+LISTE_DROITE_CORPS_BAS = [u">",    " ",    "\\",   " "]
+LISTE_TORSE      = [u" : ",      "] [",  "> <",  "   "]
+LISTE_BASE       = [u" : ",      '" "',  "___",  "   "]
+
+ +
+
+
+ +
+
+
+
+
    +
  • Le programme qui séléctionnera aléatoirement des éléments pour construire un smiley de ce type:

    + +
         _
    +    /_\ 
    +   (o O)
    +  <( : )  
    +   (" ") 
    +
  • +
+ +
+
+
+
+
+
+

Polynome du 2nd degre

On veut écrire un programme qui manipule les polynomes du 2nd degré qui l'on améliorera petit à petit.

+
    +
  • Écrire un programme qui demande les valeurs de a, b et c (les coefficients du polynome) et renvoie les racines du polynôme $ax^2 + bx + c$

    + +
      Valeur de a?
    +  4
    +  Valeur de b?
    +  4
    +  Valeur de c?
    +  1
    +  Delta = 0, il y a une racine:
    +  x = 0.5
    +
  • +
  • On veut maintenant améliorer notre programme pour qu'il donne le tableau de signe du polynôme.

    + +
      Valeur de a?
    +  4
    +  Valeur de b?
    +  4
    +  Valeur de c?
    +  1
    +  Delta = 0, il y a une racine:
    +  x = 0.5
    +  Comme a = 4 donc le tableau de signe est 
    +
    +  -------------------------
    +  x | -inf     0.5    +inf
    +  -----------------------------
    +  P |    +      0     +
    +  -----------------------------
    +
  • +
+ +
+
+
+
+
+
+

Chiffrement de Cesar

Le chiffrement de César, utilisé par Jules César pour transmettre des messages secrets dans l’Antiquité, consiste décaler les lettres dans l'alphabet pour écrire un message.

+

Voici un exemple avec un décalage de 4

+ +
    message >>> bonjour
+    chiffré >>> fsrnsyv 
+
+
+

Le b devient f, o devient s etc...

+
    +
  • Avec un crayon et du papier chiffrer bonjour avec un décalage de 6.
  • +
+

Python est plus fort pour manipuler les nombres que les lettres. Il faudra donc commencer par transformer les lettres en nombre (on appelle cela encoder). Il existe une fonction faite pour ça: ord

+ +
+
+
+
+
+
In [15]:
+
+
+
codage_a = ord("a")
+print(codage_a)
+codage_b = ord("b")
+print(codage_b)
+codage_A = ord("A")
+print(codage_A)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
97
+98
+65
+
+
+
+ +
+
+ +
+
+
+
+

Pour faire la transformation inverse, on utilisera la fonction chr

+ +
+
+
+
+
+
In [16]:
+
+
+
lettre_100 = chr(100)
+print(lettre_100)
+lettre_43 = chr(43)
+print(lettre_43)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
d
++
+
+
+
+ +
+
+ +
+
+
+
+

Vous retrouverez tous les caractères et leurs nombres ici. On peut remarquer qu'il y en a 256 (souvenez en vous on s'en servira plus tard)

+

Il faut donc transformer le message en liste de nombre. Pour cela on utilisera des Boucles for:

+ +
+
+
+
+
+
In [17]:
+
+
+
message = "Bonjour"
+message_code = [] #le message codé est pour le moment une liste vide
+for lettre in message:
+    print("la lettre ", lettre, "est transformée en le nombre", ord(lettre))
+    message_code.append(ord(lettre)) #append signifie ajouter en anglais
+
+print(message_code)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
la lettre  B est transformée en le nombre 66
+la lettre  o est transformée en le nombre 111
+la lettre  n est transformée en le nombre 110
+la lettre  j est transformée en le nombre 106
+la lettre  o est transformée en le nombre 111
+la lettre  u est transformée en le nombre 117
+la lettre  r est transformée en le nombre 114
+[66, 111, 110, 106, 111, 117, 114]
+
+
+
+ +
+
+ +
+
+
+
+

Il faut maintenant décaler tous ces nombres

+ +
+
+
+
+
+
In [18]:
+
+
+
message_decale = []
+decalage = 6
+for n in message_code:
+    message_decale.append((n + decalage)%256)
+print(message_decale)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
[72, 117, 116, 112, 117, 123, 120]
+
+
+
+ +
+
+ +
+
+
+
+

Le %256 est là pour être sûr qu'aucun nombre ne dépasse 255. Si un nombre dépasse 255, on recommence par 0 (par exemple 259 devient 3 c'est le reste de la division euclidienne de 259 par 256)

+

Il faut maintenant décodé le message_decale pour avoir à nouveau des lettres

+ +
+
+
+
+
+
In [19]:
+
+
+
message_chiffre = []
+for n in message_decale:
+    message_chiffre.append(chr(n))
+print(message_chiffre)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
['H', 'u', 't', 'p', 'u', '{', 'x']
+
+
+
+ +
+
+ +
+
+
+
+

Ensuite on lie toutes les lettres pour en faire un seul mot

+ +
+
+
+
+
+
In [20]:
+
+
+
message_chiffre = ''.join(message_chiffre) # join en anglais signifie joindre
+print(message_chiffre)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Hutpu{x
+
+
+
+ +
+
+ +
+
+
+
+

Voila votre programme sais chiffrer des messages.

+
    +
  • Écrire un programme qui sais déchiffrer les messages.
  • +
  • Pour améliorer votre programme, on peut utiliser des fonctions.
  • +
+ +
+
+
+
+
+
+
+

input

Contrairement à ce que l'on a fait hier on ne met plus rien dans les parenthèses d'un input.

+

input() est une commande qui va demander à l'utilisateur une information

+ +
+
+
+
+
+
In [21]:
+
+
+
print("Comment t'appelles tu?")
+nom = input()
+print("Ah! Tu t'appelles", nom)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Comment t'appelles tu?
+bob
+Ah! Tu t'appelles bob
+
+
+
+ +
+
+ +
+
+
+
+

Après avoir afficher la question, l'ordinateur se met en pose et attend que l'utilisateur réponde quelque chose. Une fois que l'utilisateur a répondu (a appuyé sur entrer) la réponse est stocké, ici, dans la variable nom.

+ +
+
+
+
+
+
+

Condition if

Pour différencier plusieurs cas, on utilisera la commande if (si), elif (sinon si) et else (sinon).

+ +
+
+
+
+
+
In [22]:
+
+
+
a = 2
+b = 3
+
+if a > b: 
+    print("a plus grand que b")
+elif a == b:
+    print("a est égal à b")
+else:
+    print("a est plus petit que b")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
a est plus petit que b
+
+
+
+ +
+
+ +
+
+
+
+

Boucles for

Les boucles for permettent de répéter un certain nombre de fois la même action.

+
    +
  • Ajouter 5 fois 100 d'affilé
  • +
+ +
+
+
+
+
+
In [23]:
+
+
+
a = 2
+print("Au debut a vaut", a)
+for i in range(5):
+    a = a + 100
+    print("a vaut maintenant", a)
+print("Finalement a vaut", a)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Au debut a vaut 2
+a vaut maintenant 102
+a vaut maintenant 202
+a vaut maintenant 302
+a vaut maintenant 402
+a vaut maintenant 502
+Finalement a vaut 502
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • On peut aussi parcourir les lettres d'un mot ou d'une phrase
  • +
+ +
+
+
+
+
+
In [24]:
+
+
+
phrase = "boujour toi"
+print("On enumere >>> ", phrase)
+for l in phrase:
+    print(l)
+print("Toutes les lettres ont été énumérées")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
On enumere >>>  boujour toi
+b
+o
+u
+j
+o
+u
+r
+ 
+t
+o
+i
+Toutes les lettres ont été énumérées
+
+
+
+ +
+
+ +
+
+
+
+
    +
  • Ou encore tous les éléments d'une liste
  • +
+ +
+
+
+
+
+
In [25]:
+
+
+
liste = ["premier element", 2, "coucou", 1, "aie", 0]
+print("On enumère >>>", liste)
+for i in liste:
+    print(i)
+print("Tout a été énuméré")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
On enumère >>> ['premier element', 2, 'coucou', 1, 'aie', 0]
+premier element
+2
+coucou
+1
+aie
+0
+Tout a été énuméré
+
+
+
+ +
+
+ +
+
+
+
+

Boucles while

En anglais, while signifie tant que. On l'utilisera quand on veut refaire quelque plusieurs fois tant que quelque chose n'est pas vrais.

+

Ajouter 3 tant que que u n'a pas dépassé 19:

+ +
+
+
+
+
+
In [26]:
+
+
+
u = 2
+while u < 19:
+    u = u + 3
+    print(u)
+print("u a depassé 50 et vaut", u)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
5
+8
+11
+14
+17
+20
+u a depassé 50 et vaut 20
+
+
+
+ +
+
+ +
+
+
+
+

Poser toujours la même question quand que l'utilisateur n'a pas bien répondu:

+ +
+
+
+
+
+
In [27]:
+
+
+
aPasTrouve = True # True signifie vrai en anglais.
+while aPasTrouve:
+    print("Quelle est la couleur du cheval blanc d'Henri 4?")
+    rep = input()
+    if rep == "blanc":
+        print("Bravo!")
+        aPasTrouve = False # False signifie faux en anglais
+    else:
+        print("Non! Recommence!")
+print("Voila tu as réussi!")
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Quelle est la couleur du cheval blanc d'Henri 4?
+blanc
+Bravo!
+Voila tu as réussi!
+
+
+
+ +
+
+ +
+
+
+ + + + + + diff --git a/PreStSauveur/Programmation/Projets Python.ipynb b/PreStSauveur/Programmation/Projets Python.ipynb new file mode 100644 index 0000000..30a9930 --- /dev/null +++ b/PreStSauveur/Programmation/Projets Python.ipynb @@ -0,0 +1,1047 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Projets Python\n", + "\n", + "Dans ce cours autour de la programmation Python et de l'algorithmie, nous verons beaucoup de petits morceaux de programmes. \n", + "\n", + "Il est vivement recommander de ne pas faire **que** les questions poser mais aussi d'**expérimenter** par soi même.\n", + "\n", + "* [Introduction à Python](#Introduction-Python)\n", + "* [Générateur d'excuses](#Générateur-d'excuses)\n", + "* [Magic 8 ball](#Magic-8-ball)\n", + "* [Deviner un nombre](#Deviner-un-nombre)\n", + "* [Pierre feuille ciseau](#Pierre-Feuille-Ciseau)\n", + "* [Deviner un nombre (améliorations)](#Deviner-un-nombre)\n", + "* [Generateur de Smiley](#Generateur-de-simleys)\n", + "* [Chiffrement de Cesar](#Chiffrement-de-Cesar)\n", + "* [Polynome du 2nd degré](#Polynome-du-2nd-degre)\n", + "-----------\n", + "Notions de programmation\n", + "* [input](#input)\n", + "* [Les conditions if](#Condition-if)\n", + "* [Les boucles for](#Boucles-for)\n", + "* [Les boucles while](#Boucles-while)\n", + "* [Les fonctions](#Fonction)\n", + "------------\n", + "Ressouces Python\n", + "* [site du zero](http://openclassrooms.com/courses/apprenez-a-programmer-en-python) (cours en ligne)\n", + "* [codeacademy](http://www.codecademy.com/) (cours en ligne)\n", + "* [code conbat](http://codecombat.com) (jeu en ligne qui se joue en codant)\n", + "* [checkio](http://www.checkio.org/) (jeu en ligne - anglais - avec beaucoup de langage différents)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Avec Repl.it\n", + "\n", + "Se rendre sur le site de [repli.it](https://repl.it/repls/SpiffyOpulentBackend). \n", + "\n", + "L'interface se sépare en 2 parties:\n", + "\n", + "![interface replit](./fig/replit_global.png)\n", + "\n", + "- **Zone Script**: Éditeur de texte où l'on pourra écrire notre programme python. Pour executer son contenu, il faudra cliquer sur ![replit run](./fig/replit_run.png)\n", + "- **Zone Shell**: Line de commande pour interagir avec python. Ici vous pouvez tester vos commandes python et presser la touche *entrer* pour l'executer. Par contre on ne peut pas écrire sur plusieurs lignes.\n", + "\n", + "Il est conseillé d'utiliser en priorité la **zone script** car elle permet d'écrire sur plusieurs lignes et de corriger après l'execution. La **zone shell** servira à tester des commandes pour voir directement leurs effets. \n", + "\n", + "Pour sauvergarder votre travail, vous cliquerez sur les 3 points à côté de *Files* puis sur *download as zip*.\n", + "\n", + "![replit save](./fig/replit_files.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction Python\n", + "\n", + "Dans les encadrés, il y a du code python. Il faudra le recopier leur contenu dans la zone script et ne pas hésiter à le modifier." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bonjour\n" + ] + } + ], + "source": [ + "print(\"Bonjour\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Modifier la commande précédente pour qu'elle n'affiche plus bonjour mais votre nom puis executer cette commande.\n", + "\n", + "Il est possible d'afficher plusieurs messages:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bonjour\n", + "monde\n" + ] + } + ], + "source": [ + "print(\"bonjour\")\n", + "print(\"monde\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Modifier le programme précédent pour qu'il affiche:\n", + "\n", + " Bonjour\n", + " \n", + " tous\n", + " \n", + " le \n", + " \n", + " monde\n", + " \n", + "Quand une ligne commence par un #, Python ne la lit pas. On appelle cela des commentaires. Nous les utiliserons pour expliquer ce que l'on fait." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bonjour\n" + ] + } + ], + "source": [ + "# la commande suivante affiche Bonjour\n", + "print(\"bonjour\")\n", + "# Quand on veut afficher quelque chose, on utilisera la commande print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Les variables\n", + "\n", + "Les variables sont des *enveloppes* où l'on stockera des nombres, des mots, des phrases ou des choses plus compliqués." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "un_nombre = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ainsi dans *l'enveloppe* appelée **un_nombre** on y met le nombre 10.\n", + "\n", + "C'est ce que l'on appelle **assigner** une **valeur** à une variable ou **stocker** une valeur dans une variable." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + } + ], + "source": [ + "un_nombre = 10\n", + "print(un_nombre) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Modifier le programme précédent pour stocker le nombre 2 dans **un_nombre** puis l'afficher.\n", + "\n", + "Pour stocker des mots ou des phrases, il faut les mettre entre guillemets" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "un_mot = \"Coucou\"\n", + "une_phrase = \"ceci est une phrase\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Modifier le programme précédent pour changer le contenu des variables puis ajouter deux lignes pour afficher ce que contiennent ces variables (avec la commande `print`)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Générateur d'excuses\n", + "\n", + "Quand Loïc fait des bétises, il se fait souvent prendre et doit trouver une excuse le plus rapidement possible. Aidons le en créant un programme qui créé des excuses sur commande.\n", + "\n", + "Ces excuses auront le modèle suivant\n", + "\n", + " C'est pas moi! C'est (Bob). \n", + " Il a (mangé) une (grenouille) (volante). Alors que moi j'étais tranquillement en train de (faire) un (super) (exercice de math). \n", + " Je suis innocent (monsieur)!\n", + " \n", + "Les nombres entre parenthèses seront remplacé par des mots choisis par l'utilisateur de ce générateur.\n", + "\n", + "Pour écrire du texte avec une variable, il faut séparer les parties par une virgule:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J'ai 14 ans\n" + ] + } + ], + "source": [ + "age = 14\n", + "print(\"J'ai \", age, \"ans\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Modifier les lignes précédentes pour se présenter **Bonjour, je m'appelle (Bob)**.\n", + "\n", + "Pour demander quelque chose à l'utilisateur, on utilise la fonction `input`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nom du coupable (masculin)? bob\n", + "C'est pas moi! C'est bob\n" + ] + } + ], + "source": [ + "coupable = input(\"Nom du coupable (masculin)? \")\n", + "print(\"C'est pas moi! C'est \", coupable)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Finir d'écrire le programme qui permettra de générer une excuse" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Magic 8 ball\n", + "\n", + "Pour ceux qui ne connaissent pas un Magic 8 ball est un boule magique qui répond à toutes les questions ([vidéo](https://www.youtube.com/watch?v=9gaQwIrBNPw)).\n", + "\n", + "Même si je ne voudrai pas gacher votre âme d'enfant, cette boule magique répond au hasard... Pour gérer le hasard en Python, on utilise **random**. Il faut donc placer la ligne suivante au début du fichier à chaque fois que l'on veut faire quelque chose au hasard." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nous allons mettre toutes les réponses possibles dans une liste" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "reponses = [\"reponse 1\", \"reponse 2\", \"reponse 3\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Et Python choisira une réponse au hasard" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'reponse 1'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "random.choice(reponses)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* En réutilisant la fonction **input** vue précédement, écrire un programme qui propose de poser une question et qui lui apporte une réponse!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deviner un nombre\n", + "\n", + "Nous allons maintenant écrire un programme qui va chercher à faire deviner à l'utilisateur un nombre choisi aléatoirement par Python.\n", + "\n", + "Pour faire choisir un nombre entier à Python, on utilise la fonction `randint(min,max)` (`randint` signifie random integer = entier aléatoire)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "nbr_aleatoire = random.randint(1,20)\n", + "print(nbr_aleatoire)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Faites executer plusieurs fois cette commande pour remarquer qu'elle ne retourne pas toujours le même résultat.\n", + "\n", + "* Completer votre programme pour demander une réponse à l'utilisateur *(utilisez `int(input(\"question\"))` plutôt que `input(\"question\")` pour que la réponse soit transformée en entier)*\n", + "\n", + "* Regarder la section sur [Condition if](#Condition-if) pour adapter l'exemple et savoir lequel du nombre choisi par l'ordinateur ou de l'utilisateur est le plus grand.\n", + "\n", + "* Écrire le programme final qui fait choisir un nombre à l'ordinateur, qui demande un nombre à l'utilisateur puis qui dit si le nombre donné par l'utilisateur est plus grand ou plus petit.\n", + "\n", + "* Pour améliorer notre programme, il faudrait que l'utilisateur puisse rententer de deviner le nombre. Regardez la section [Boucle while](#Boucle-while) pour améliorer votre programme." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pierre Feuille Ciseau\n", + "\n", + "Vous devez connaître le jeu Pierre-Feuille-Ciseau. Deux adversaires s'affrontent choissicent en même temps Pierre, Feuille ou Ciseau.\n", + "\n", + "Pierre gagne contre ciseau qui gagne contre feuille qui gagne contre pierre...\n", + "\n", + "Nous allons écrire un jeu qui fera s'affronter l'utilisateur contre l'ordinateur.\n", + "\n", + "### Choix du joueur et choix de l'ordinateur\n", + "\n", + "* Écrire un programme qui demande le choix de l'utilisateur\n", + "* Completer ce programme pour que l'ordinateur choisisse parmi les 3 choix\n", + "\n", + "### Comparaison des résultats\n", + "\n", + "* En utilisant les [conditions if](#Condition-if) comparer les deux choix pour determiner qui est le vaincueur." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deviner un nombre (amélioration)\n", + "\n", + "Reprenez votre programme qui fait deviner à l'utilisateur un nombre choisi par l'ordinateur. Le soucis de ce programme est que nous n'avons qu'un essai ce qui n'est pas très pratique pour trouver le nombre...\n", + "\n", + "Nous allons améliorer ce programme laisser plus de chance à l'utilisateur. Pour cela nous allons faire une boucle `while` (tant que en français)." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "un tour\n", + "Fini! Et a vaut 20\n" + ] + } + ], + "source": [ + "a = 11\n", + "while a < 20: #tant que a est plus petit que 20\n", + " print(\"un tour\")\n", + " a = a + 1\n", + "print(\"Fini! Et a vaut \", a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On peut aussi créer une variable `aPasTrouve = True` (True en anglais signifie vrai) et dès que l'utilisateur a trouvé la bonne valeur, on change `aPasTrouve = False` (False en anglais signifie faux).\n", + "\n", + "* Écrire cette amélioration du programme.\n", + "* Améliorer votre programme, en comptant le nombre de tentatives." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generateur de simleys\n", + "\n", + "Pour ce projet, nous allons programmer un générateur de smileys. Nous allons définir quelquels éléments de ce smiley et l'ordinateur choisira aléatoirement parmi ces éléments pour créer le smiley.\n", + "\n", + "Voici les éléments du smiley." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "LISTE_CHAPEAU = [u\" \\n _===_\", \" ___ \\n .....\", \" _ \\n /_\\ \", \" ___ \\n (_*_)\"]\n", + "LISTE_NEZ = [u\",\", \".\", \"_\", \" \"]\n", + "LISTE_OEIL = [u\".\", \"o\", \"O\", \"-\"]\n", + "LISTE_GAUCHE_CORPS_HAUT = [u\" \", \"\\\\\", \" \", \" \"]\n", + "LISTE_GAUCHE_CORPS_BAS = [u\"<\", \" \", \"/\", \" \"]\n", + "LISTE_DROITE_CORPS_HAUT = [u\" \", \"/\", \" \", \" \"]\n", + "LISTE_DROITE_CORPS_BAS = [u\">\", \" \", \"\\\\\", \" \"]\n", + "LISTE_TORSE = [u\" : \", \"] [\", \"> <\", \" \"]\n", + "LISTE_BASE = [u\" : \", '\" \"', \"___\", \" \"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Le programme qui séléctionnera aléatoirement des éléments pour construire un smiley de ce type:\n", + "\n", + " _\n", + " /_\\ \n", + " (o O)\n", + " <( : ) \n", + " (\" \") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Polynome du 2nd degre\n", + "\n", + "On veut écrire un programme qui manipule les polynomes du 2nd degré qui l'on améliorera petit à petit.\n", + "\n", + "* Écrire un programme qui demande les valeurs de `a`, `b` et `c` (les coefficients du polynome) et renvoie les racines du polynôme $ax^2 + bx + c$\n", + "\n", + " Valeur de a?\n", + " 4\n", + " Valeur de b?\n", + " 4\n", + " Valeur de c?\n", + " 1\n", + " Delta = 0, il y a une racine:\n", + " x = 0.5\n", + " \n", + "* On veut maintenant améliorer notre programme pour qu'il donne le tableau de signe du polynôme.\n", + "\n", + " Valeur de a?\n", + " 4\n", + " Valeur de b?\n", + " 4\n", + " Valeur de c?\n", + " 1\n", + " Delta = 0, il y a une racine:\n", + " x = 0.5\n", + " Comme a = 4 donc le tableau de signe est \n", + " \n", + " -------------------------\n", + " x | -inf 0.5 +inf\n", + " -----------------------------\n", + " P | + 0 +\n", + " -----------------------------" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Chiffrement de Cesar\n", + "\n", + "Le chiffrement de César, utilisé par Jules César pour transmettre des messages secrets dans l’Antiquité, consiste décaler les lettres dans l'alphabet pour écrire un message.\n", + "\n", + "Voici un exemple avec un décalage de 4\n", + "\n", + " message >>> bonjour\n", + " chiffré >>> fsrnsyv \n", + "\n", + "Le `b` devient `f`, `o` devient `s` etc...\n", + "\n", + "* Avec un crayon et du papier chiffrer `bonjour` avec un décalage de 6.\n", + "\n", + "Python est plus fort pour manipuler les nombres que les lettres. Il faudra donc commencer par transformer les lettres en nombre (on appelle cela **encoder**). Il existe une fonction faite pour ça: `ord`" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "97\n", + "98\n", + "65\n" + ] + } + ], + "source": [ + "codage_a = ord(\"a\")\n", + "print(codage_a)\n", + "codage_b = ord(\"b\")\n", + "print(codage_b)\n", + "codage_A = ord(\"A\")\n", + "print(codage_A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pour faire la transformation inverse, on utilisera la fonction `chr`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d\n", + "+\n" + ] + } + ], + "source": [ + "lettre_100 = chr(100)\n", + "print(lettre_100)\n", + "lettre_43 = chr(43)\n", + "print(lettre_43)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Vous retrouverez tous les caractères et leurs nombres [ici](http://www.asciitable.com/). On peut remarquer qu'il y en a 256 (souvenez en vous on s'en servira plus tard)\n", + "\n", + "Il faut donc transformer le message en liste de nombre. Pour cela on utilisera des [Boucles for](#Boucle-for):" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "la lettre B est transformée en le nombre 66\n", + "la lettre o est transformée en le nombre 111\n", + "la lettre n est transformée en le nombre 110\n", + "la lettre j est transformée en le nombre 106\n", + "la lettre o est transformée en le nombre 111\n", + "la lettre u est transformée en le nombre 117\n", + "la lettre r est transformée en le nombre 114\n", + "[66, 111, 110, 106, 111, 117, 114]\n" + ] + } + ], + "source": [ + "message = \"Bonjour\"\n", + "message_code = [] #le message codé est pour le moment une liste vide\n", + "for lettre in message:\n", + " print(\"la lettre \", lettre, \"est transformée en le nombre\", ord(lettre))\n", + " message_code.append(ord(lettre)) #append signifie ajouter en anglais\n", + "\n", + "print(message_code)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Il faut maintenant décaler tous ces nombres" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[72, 117, 116, 112, 117, 123, 120]\n" + ] + } + ], + "source": [ + "message_decale = []\n", + "decalage = 6\n", + "for n in message_code:\n", + " message_decale.append((n + decalage)%256)\n", + "print(message_decale)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Le `%256` est là pour être sûr qu'aucun nombre ne dépasse 255. Si un nombre dépasse 255, on recommence par 0 (par exemple 259 devient 3 c'est le reste de la division euclidienne de 259 par 256)\n", + "\n", + "Il faut maintenant décodé le `message_decale` pour avoir à nouveau des lettres" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['H', 'u', 't', 'p', 'u', '{', 'x']\n" + ] + } + ], + "source": [ + "message_chiffre = []\n", + "for n in message_decale:\n", + " message_chiffre.append(chr(n))\n", + "print(message_chiffre)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ensuite on lie toutes les lettres pour en faire un seul mot" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hutpu{x\n" + ] + } + ], + "source": [ + "message_chiffre = ''.join(message_chiffre) # join en anglais signifie joindre\n", + "print(message_chiffre)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila votre programme sais chiffrer des messages.\n", + "\n", + "* Écrire un programme qui sais déchiffrer les messages.\n", + "* Pour améliorer votre programme, on peut utiliser des [fonctions](#fonction)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "--------------------------------------\n", + "## input\n", + "\n", + "Contrairement à ce que l'on a fait hier on ne met plus rien dans les parenthèses d'un `input`.\n", + "\n", + "`input()` est une commande qui va demander à l'utilisateur une information " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Comment t'appelles tu?\n", + "bob\n", + "Ah! Tu t'appelles bob\n" + ] + } + ], + "source": [ + "print(\"Comment t'appelles tu?\")\n", + "nom = input()\n", + "print(\"Ah! Tu t'appelles\", nom)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Après avoir afficher la question, l'ordinateur se met en pose et attend que l'utilisateur réponde quelque chose. Une fois que l'utilisateur a répondu (a appuyé sur `entrer`) la réponse est stocké, ici, dans la variable `nom`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Condition if\n", + "\n", + "Pour différencier plusieurs cas, on utilisera la commande `if` (si), `elif` (sinon si) et `else` (sinon)." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a est plus petit que b\n" + ] + } + ], + "source": [ + "a = 2\n", + "b = 3\n", + "\n", + "if a > b: \n", + " print(\"a plus grand que b\")\n", + "elif a == b:\n", + " print(\"a est égal à b\")\n", + "else:\n", + " print(\"a est plus petit que b\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boucles for\n", + "\n", + "Les boucles **for** permettent de répéter un certain nombre de fois la même action.\n", + "\n", + "* Ajouter 5 fois 100 d'affilé" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Au debut a vaut 2\n", + "a vaut maintenant 102\n", + "a vaut maintenant 202\n", + "a vaut maintenant 302\n", + "a vaut maintenant 402\n", + "a vaut maintenant 502\n", + "Finalement a vaut 502\n" + ] + } + ], + "source": [ + "a = 2\n", + "print(\"Au debut a vaut\", a)\n", + "for i in range(5):\n", + " a = a + 100\n", + " print(\"a vaut maintenant\", a)\n", + "print(\"Finalement a vaut\", a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* On peut aussi parcourir les lettres d'un mot ou d'une phrase" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "On enumere >>> boujour toi\n", + "b\n", + "o\n", + "u\n", + "j\n", + "o\n", + "u\n", + "r\n", + " \n", + "t\n", + "o\n", + "i\n", + "Toutes les lettres ont été énumérées\n" + ] + } + ], + "source": [ + "phrase = \"boujour toi\"\n", + "print(\"On enumere >>> \", phrase)\n", + "for l in phrase:\n", + " print(l)\n", + "print(\"Toutes les lettres ont été énumérées\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Ou encore tous les éléments d'une liste" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "On enumère >>> ['premier element', 2, 'coucou', 1, 'aie', 0]\n", + "premier element\n", + "2\n", + "coucou\n", + "1\n", + "aie\n", + "0\n", + "Tout a été énuméré\n" + ] + } + ], + "source": [ + "liste = [\"premier element\", 2, \"coucou\", 1, \"aie\", 0]\n", + "print(\"On enumère >>>\", liste)\n", + "for i in liste:\n", + " print(i)\n", + "print(\"Tout a été énuméré\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boucles while\n", + "\n", + "En anglais, `while` signifie **tant que**. On l'utilisera quand on veut refaire quelque plusieurs fois **tant que** quelque chose n'est pas vrais.\n", + "\n", + "Ajouter 3 **tant que** que `u` n'a pas dépassé 19: " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "8\n", + "11\n", + "14\n", + "17\n", + "20\n", + "u a depassé 50 et vaut 20\n" + ] + } + ], + "source": [ + "u = 2\n", + "while u < 19:\n", + " u = u + 3\n", + " print(u)\n", + "print(\"u a depassé 50 et vaut\", u)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Poser toujours la même question quand que l'utilisateur n'a pas bien répondu:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quelle est la couleur du cheval blanc d'Henri 4?\n", + "blanc\n", + "Bravo!\n", + "Voila tu as réussi!\n" + ] + } + ], + "source": [ + "aPasTrouve = True # True signifie vrai en anglais.\n", + "while aPasTrouve:\n", + " print(\"Quelle est la couleur du cheval blanc d'Henri 4?\")\n", + " rep = input()\n", + " if rep == \"blanc\":\n", + " print(\"Bravo!\")\n", + " aPasTrouve = False # False signifie faux en anglais\n", + " else:\n", + " print(\"Non! Recommence!\")\n", + "print(\"Voila tu as réussi!\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/PreStSauveur/Programmation/fig/replit_files.png b/PreStSauveur/Programmation/fig/replit_files.png new file mode 100644 index 0000000000000000000000000000000000000000..24bb805a1d86f6e0f912544fcf6a10c08e929f8e GIT binary patch literal 12323 zcmch7by$>PyXRm4B4yDMDy0(Ajnbf`G)Q-MhZ54FBGMotEezeA(jYN3NJw}0-t4#E zIeX6e&b7P$te3(#GcfP_JkNdq>JE~V5y!zI!9pMqIFb?~3J3(65InBHM2D|qq#~N| z4PEc0xCnfQKS#oq-tg^)jf9##0>Sw3@*kQ@s-P1*iQynAEs8O7^Xg3wE^Q}?ad?W@ zK~&X2*xJ(4(8>WJY-gzJU}!+;Z0cY_DK053r}7S$5P_gXNQ%5rbQxWnaMe^aPTbg% zmA}iYc<=5Ptb%gHgYULM(?0TFGE5%CX2_SbE)Tak7%#=WT9>9px~E4Ju}&;G@bo+L zOvJ29R#G{!1*4Cf+>yU^Pek*30iC?a{^M`o-uh&n1mx>ozgH|Ra#XF&q|LM(zYxC@ zZ=Y2o(8KMRs8Cc?G>qspVqITf$E2!JQc`kkH9Xl{p~YCGn)~zTT?83Am54U&3p&4# zlwX7?;p<%?%o{>f|Nfv%US9r|`OwcL){~W|>8IzT)$W{wgM+2A@f+^icp8Y`7IHl`&Ana9X(Y%6%_;Z=tJcCJi5l<4kL z>xPr(*@NE)&8RV(t8d=8K}AKCJhr>NZ5JFIO!xTlmBmQi!x7`8zVUGnaYJ5S-lf&m zRgO2wa>JEMXUBUdS{ikFx$w?b+Ddr{w2{sn zb#PG1RA|~ygN{ok;o(trO;=Vq*DY*#ShwnMcK)YEZA{g})}x-O9Ip&yJ)$%ES&9n( zsH(ht{pO#>8+dpd`4(^9+=qK8D=+sPleRP$PU%C)sj9k+bzD2}9o-qzPe)~)?0VN} zd+yzP`Sof2)Kt>=xaLrfhPaLni(UCl^&zZ0=Ki@_;lEk9# zcIDl>@S(zZQBhGvC8bZXv7^}ya_RlINJvKY%M;tbL`F{7u54>bQ``{_)WWFieRp=^ zfZx*6avL8X@!Z3MkDHtORV-WEIfas@CRurT`Q?o?2H-`+$A@YmYxk1^wPf}59*mV( zRxVYXot>>Qa4<13(MZQOeR?QvMdAl&#oPVE)l*2-2 zw8)f;n_FH{QN+ODQDS1^Z9hZ^fk5+&zpQiI`kX_~(%CAjJ$W0awWA}uIVyL}QTH&< z#$LY7v3{j>=Ka@lq2#*e=4Rd4?Cd9&mX^a79HC+<{A||Pl^R=HTedE1OG~c(q=uXt z;R=}|>HWHFBtfB}A}M`x3JO9ZBG+hT;-{C=lf0%|b5YllOQUG7qAyyHnS~OQw*}9K zR66%9lOFa=UHA)^w=%Pr;*;HOYB2uGvav*qmZzTMu^UjlI=Vx>w}*b}!QL6q9jWvr zYG(E4Y5l%D5)}dKYmmcvDn1&jlH^bLYG-EZ8Ttw4Q44Twr8pS5}@J5IA`{5)~t} zm${tIuORdvHr!ZBkN8n})z;S5z|ioS_qoTFD_1gdb7^>aPZEce)YK$}g|EW4VN7?% zu=>4!fBXJ@%UUrae0&{>G>hRp-PMW8C|?Xb7N^x=En7Y}Y5a3kQvcx&?b1Zr#a4=qqwO9+SKkGKo|K9T0t##EU9|HI#m5be!iN*y zr!yF5u>pr(WV|Y3w#}US=%W_5{hUp97yBF>9P(^u#h|zHBz(AWhbGVcV7*ccRc^n) z<-Y%uACtoS)K*GLYPi^(5Fz{?n~IvcSxYNb;hD#wjZ6YhGn5)NrZtou zew@#*(|c@>JGp5DKmE2$Of8H+*5>MXwOee5Cm9%RE6lWn8_oSPp=k=Irpv4Kc+m7v zcYk#~DM3ZsbMTL&jSaKlabGx@x<4!)uA!cu-dl4{zFds4FmG+byLX#*dIa(61~OmA z@Hl39CdS2)?kr5zq|dLec0wV`XS%gUO}k6uADazglY3ZCwA|RzcRgy3t#b^D zsZz?$lZua53B!MFTk%gLXa)hl&Ju{VEqTwoWbN(#t1Uj0zwp;sfANLM?WA7Ty19rcPnO% z**I;d8{`8_`ybGLer@OXq{W<*Dl2Z~SGmoXAAxPvx#s}iQZ?mjERQmhu&XG^Cn-W$S8D{>b$X`!*dS3X<>zNp`?Czw0_R;I$Dc;U&+ z$aE87*>TGz8>=?aUzrcLwA@c8G!<|A2>Il3 z`nByQN7y(zU7rrl5AK*6f9B-qWN5YPAmr)mW_gxG%pHe7T5G&N>8AMJJ+Ntc79hK^ zr~Q*)W+U0e)HMIal&8ss7fWm$T^8R3s4yM@bL)o@bG{FKEgaHfo3X&QpJSF{`j~3>@fZC z@vf%aYG|C`_Ee_=(zqB`Ri(2vBXi}dCtOHVIcs+HT##8?SvT_0^a1hbWyNT#^vxZuW^& z?6vchmXv&sjBL(Q$|hnn!H=MorD0=Jl=*uglE_Z*ozTq0q^_q2FJXN&+)NU4{~e{r z(+BbL!i`ou$ehN8uS~f8L%N>|scSe*O--+%qucGTsy%-41PJg0ditQ@;o-QFN2S(N zGC(xQ$;lr*dW26%i1D_~Ko3~TmoHzwDP%_Txw2fpe*H&U+RVa&xTxrLVq#)oN6E_B zlCNH^mYf$F_Y?qWgvR4?vR0~AVnG~$M?u5E@pW<0B%r|G-`~L4xPN>+R3=@&JD%Im z-@omKCy}q*%34rm_RW~`>$v?VC#Es?1xeP%Mb3-(H5%kRkho-Ab)TtUV&dS;12O%n zT}v(~DCpx;b4IURIMNx*ZXV6+%-Gl0H-JJFT21f_n6Wp$$9c%lf4^F*C(gPi2nhMZ zhrXkuqvjWxrN#M1T_i?bv7#0hPsLI`fdH}E3k(j{JKCN%Ff!V1xXFaDIo$kXHQ(OR zF;ZxZmzkNlyMhY;{ab;9$$Y;(=Xn?w>WHPL>d|zVhpnI9V^ij5Hs&4|4_)Za*G2h>rB{^qC5{AC@y_TeCXlMsj z+OS9r8YOv#9RvYODdOQ@BhE9>|M=oIb__ahTe(W$5HY_6@$k%Ylr3N>H8mAZ)u=XV zU;zK#Jwxv|Z{AqqJv%WZ%lQg0%KIuiGxJ4C-?u@t%$%HNqr#EKUcG!BW}?*&tqOp;$bP&0?ICMQCTC79Pb)_E z5AizNzf2UnrR-!AXg6Lxv!@L+>_za0G32arMfaeTP`OhX@sXXu?xBDF)YB!zm&vJh zr7rXMoSsRHxxY=P2}`NTjPVsUK3Zxp*uNKV)DS3fI-sS<$+mrz?BT9*Ub%O;8p3zG zwRvWCNk-rPiF^1x+rKl0i7pmgXf{WW~{wW zNRzzJxo_OK!NtpKzda|py|d%G)l9fHk4w%cAt8YYom^2-@nb?lSAk&%*$}&46XyAT zX|3(wPU81Cq+*_){4p^xkEp4W`?MkP$nfAyhhlhvE?)w%XNEh=Mot>Q(UcYYp^@|b;T~=21 z_U+q592P{Nf*ABxhH|QQx_QegDp;Tb-BpfT3^}bQL)CMPKsK$8m+vI*n@`uh1L+Y_ zRKyk=7uRRP_T$G72~2_IH?x(xg(JTNl>G+HQu+p@&dXVZPB7#YY}Zg#-JYKQVy~aP zJFgiajSIrQF*k+s5^LqG-E%If@=4K-oLQLl?BCmX!X+vkapUdm0uw$bpU-n|!FD7M zdMT7?2caulNzoNKr_^93EE!gMj$j;jTsgO+#}5Pi><%5CbxYCeVFYaU4NYu!SM^j? zRjC%4^jUTs9vy9+?(|GKOlnwH8(#3z(FIam9JZE@cROo*g7by@XD=e@v`P0oLq4S< zhn94>b@udU#S*FH9Mn4?5|Z}iE` zu*}2wi4PnGL*IlYd2hd=c_jZG**B$&i4`YD`Q-gwo9Lk)72iK`c~3ISg5yGh&%M-J zL~tH#IONCU17Lf*Naq+`E~qicy7~3@Ldlem*#d1F-;ehnx8RV5Zg4UP#C3_af7#05 z=a)nHUfJV&=Ej8)+&$Vs!K=}-YnyLU%}-zBAS(0g>gKq8kE6Sp@b3NXpIe+IYl00w z4_jRfby=|deL^A!=i(28pC@cgob`N{+Z^~|Ytb&yOBnHFzagi$iaZ?kH z{Ij}ej1!xV@jmv3uSo9*@8?Gh&naSV`M$n1sisGxUV0ZE)ocDp;-GmCh|2ACE);G^ z5rS#l5fxy4vKKQsbBr?fI$x-rEQtp!L-KP*9dNFHE6%CzsinU#lrK1~t6X$v5E8b( zDfas2pLhII`<$`rCg$EniQMF*?9ukx+Mn?6erLk?v$aFGp22=7!O?aPi#(iM=om*k zi$G|%p3*}xrqhz&Da4Y4bi?x3M_=lutB;(+{>gp*CEfUU0@7#9ja@Olus|y=!e`Uc zLPPBELLx-&ALL2M=N}Iil_ot8-gFx6cxqd}e0dW%NzGCfz=|?bOIl5B#1i!>DysFv zeO@c>3tv2eZ#6YqGT*NyFLto7vbJ?~t#MR;|LzkmaGaqsR9;*h`Sa&fJ78mDg9`|dNssW|y87{*nm^+A@86i%*mJ8Rg^J3`GxPJJ3JSOL^Yb|^C9S4v z60))$^YL9aOG-vYTtq}$Q;Fpm9XZ?VYqZDa}6lLjRgb z(5tHYBq=slN?DlzAk7erGFa1Hb_`rHowm=^py=(6whf1n+Tlq_6fa)9*k>^+jA1t) zVs>8F{GO7Mi9{MtR5)e~nqBs9aHHI+6FH|m?qm;2iHV^X7Z)RnivKUz$7Z_VSs{a?>>RbeG?*sviksYGkL%k1i0ECp z?=1>O&udlHMdmIY=IM=%4Q7V_z(5Ag);heLFZl=m(3AxxDK<)EQ43f70s;=&4g#+wyUhKcsK^@rZItjVP)OW4#bu)AG{1JA;q(*~ z7T*7RHI(R?&&-S-Fks&*{R&QNl6N@NJKy&IceE{R^#mLG8AyoP3FoQeDfUEed!tgj(ye`SwWF9A&4CN$D3a(C**A4`+O5 zw_kR4e!iJ^qpFeAy6PPi1iWy1x*%xW_x+LtA~stE&p-M3T?-X^sDji=h2sOEK{8wl zr!{$fef`8TxbG6c8KtGA4^K|Og?{DY!iBhZ@1B8yft-?(zj_YMvuB^6mw4?LCZXA! z9@@fLeHQZy2>m3>7x2nq15#`R5Dqj93}I2)UNMkZfaJ_qeHzd2P5>IHC5%)Yx;{iN zpm-;(AW6795Z&D}&~?h}=CP1f+gMgsR%AR5fgp~zXF`~66A*~0sS$(X15G+TGt&U3 zW?)cIa!QIXAQp>BFC{<&m)9v5FI~y)&1g&+V zBqAxPXT02AEl&rHCL$<|l+$jy4vj`O@wB&!aLy=bu`oV9esg#C2OufPy+WP(D?kZt zoSbN=sL&v%Nqrd=7#jMctc>XG&O*In>9@$q$^EO2U(i?}DJh9f#)S_^0w?7T&8x){ND~|Z#6LoW z5fX9}b_H1T@XFH6j1b6``T2Rs5kOkc+S<^*m6b))CV7DQEMvR3 ztOSlVSw-69rhfsej6(R!ES18y+Odi`IVgrn=?WC_3PPx0!%Nz zQl=ubdv_gYC#M4IDS=$A>UOxMn9EkAkH~Y~F+#^9zcibz-NrG9{Y;3}}#bFimyF7a>OvQ-%y zG%KF)SvfATV&7;n%+AiX=DujLgZ2Uob;1_X>{G9U_y(Z*@gqLyowm!u)uJUc#igUu(8#s5Ni*HZy#0VqEpFah9DT*arL==sW^!5s4n*78$C zgs_SVA&5%^Y(GGWq4k+4JV;6kkBEqp2RUKwd)UJEF#Fc~}kG?~aa*9Zmb<<*7aeuLv?Yvki4IF|h*g3$O3r zzmrw?9&EFJ&dXyq>Wr?ha9lC5vJy-0&v)6<^YHLM06V-ie!Ai~QjwuTgYMAIY;54w4d?4WBf`GK z1L(=%Ez#4{PpEf7#U4z$_XsdtX1q8NP)9afGol3r1#*ugL+|r`m5iX_SKPo8efcs3 zrw$kd@a`m{tvX`TxZVuUx#xV>wzs!4a&ioT0^sd=0iI#@El7fyc+6KWM(0;%Jlh%` zMR199@Z3Kj?_WM>5|*x!V{oI^*N-5(243Sa$0e=*rziSPS`RwyKN0=^@Jux^56lAK zd0)-~{6i1eEDzBC?(e6_;wddE%5&RW=6xLZ=~I1Qia3Sp8^hk~TM}yS2CNI&9eJY` zE)_1lJ*`Q8$+N^W6z@~BBQ6fNYfafWb&J)v>~{1%GDe$zy0f*{i|936)6=$P^pBG5 zH?b01Tkpzv*BHaYMxGk+S&&S%6@{Z>Rk4OjudREZqEY@^wONBzyG1l}1~uaSBQuAX z*8d8V3R8o_Rmsrk!0rwenXg5d{)b*{G197*9PiQnW*0L52u+|)=Qq<8Ih6Ga)iPPx z5m-WJ=rcd$Y)-dL&pqf87$NH-{a|T0btKGI9MkJ+YHG%szi~>%K{kf|{9}oruLBjf z+zQ&J)1JXcM!y#o_=-}kPX1j+sqp!Pslmy|FUoi-dACcq{vM>K%_jUrknHk^ zpVtjHk#T*MJFbzix%@6l^En|02_h#THu4UE{#CD9Z=8EA*@~Q~zTcDWBUuVXK!xpCkUaLQQ72uUrJx%IZ+SaSC6p@6TX4d@K!>Aci$Cy zBy!s9HI8GN8;i`kVSR>L6Lz43>fghyS#VYLSz~rfOL4J9 zVXc0?Jed7dy$CaVupPqi%Unw;^)sZUzy@`7bwf!xyLBu78!m9E`M{=zvR;7J22B(w zu(*xQCPP#;G5osqiORN~o^)V1x{dGu%Wd*|^&@CzX3hs+oDA5am$+fjL?E5^>9qvLG1wX%Ra`1XZaotZ2Qk)#IS8EI? z0ZbVwhz1b&6awhQl?TQ6_6Jmq7HpL@$De0nZ~7hKR4r5t=S|2_+>8txbZ~Hz8&q7u z_XA8?9W4$q?D%>MQpV;G!jU}Ps~~RjqmF<`xXc965^>uZgwG#rOvzeWG9YV?A3u%^ z2CA0lb>;@vE!i?^XsG4VVrDld0AWfLCI*tV;`%Q5(W+%OR0};x#sG6w`=jQnIYZ=8 z)mG5PG%Fl}fawr}D+RL|?Vy)e-(h`>j1;xAV}XXVI#wDE0}h+*Pmt4p|F$Fx2dGv$ zF)-B}K0v_a%D~{@77&$WIlAF;ds^?a744${??a3mLVcwR>c=@jF zn8mKR*q<=1A;qtW-I~s69GJvloFY+an8;!zsPe! zyof#bJH~w^M6oV+4uTB~#%DIu#l1Lqc*YHWHwFdfH&}5uM(NFyK($4pRCLU&b@ROGE{IA$Qc8QD@Ht14KD?5G*tFZzsm~bMuSE;Z z3Bz46GkJDp`p=A)tYf}|8XdAWv6-7-`5N#;Mw`Fq{4?L} zhqNq@C_{Y>Te%d!%67h$sG6u^j*a8;*y2L?o(XScGC~^d#p7sLy0n&XKOV{WFl$OD zfO){I7)FA|G(_GCo8#9F4(@$ue-bG*K0aPi{2?nldkKY1YUC+aX8;jv7rj5RHrbxQ z=w2;=?psfVZEj{pwruZt0R^9%n+xYSfca-;rta!+{yt)3b+sq}q(UmZqA@HLA{Q7J z&3$^~3l^=N)DClTDKi^oJfHqgPt)n%c?$it0qs7X?5SI78e)CxOM9m-^psBvm@hO1_lNWMBzwiQc{u!Pt#Rn z3yaU%`IX`78XC4vP7oM13s|m=7GKhijEsx`x2arj&%g6g+UJ!+58vohk=xSBCeDF8 zO)f6J2cD{_DLovJ0%r#QO9DO@Mj=QJG1`XL0k30KVuFv$Pa`Y8Dgt-M?No!Q&O=?A%NoJ zjs29>@-i~GmChSpbCVBY4(#;&ptjbMxLoZ4xfw8MY!Wt1=L2)uPuLU!RVstX0eiii4a+H=)Z1GgtU6xKo@gf^Ao!e+AZ>4dIU&Ps z|Mzkm;9vp;Of4$93kwAy4Ja#T7eAa_oM*+JCr&^UVF-|tit1fi85hjcwCJX!$t0Lr z=U9yv1%3E{JLz>|2}~S*@E1eCmkN1VVWnd5j#t*;4nbOgS4aR8aTD*CVnLH9c^%X5 z?d^e56bmPxunhbucyZJNC81w9!euvyXnX_`(X~n~J9H1m2^*a4&7f2N*oG_UqrKn%f zk-ve?+%z#Uah_Zm3G<3zEeV^MJqBP)DJuGcL&|Z9RdUM8VlZZitUa&r#7u`ZO>~*L zakBm2TcGG%xTKD66cz76^he9e8bPS#g7&SIDm8b-G$RY-?rlKi@1h|lzhenuFHNYn(Zu=n_arxSI8?9!QOP?-L?!706bq2AIaS3vUyAW z@+&^LFQ6FIYQ6Zqyu5H*myfyCA$W#i$#f7jz%ec{3ZZvi$pDOlmx)cx;s>M`lzKSmUD&Ptq28Zrg=9kb zxt>(qpr50oi9n^V=0w7JxW|wNge_+>-XwTh*U@p)*w`2{DUbsb=udxjbBb1o+Js7jg%gZJvCY0RV#Ds)| zfDsaslKG|ER%8O5psNM04TrsOnO$T92hHOIAbt@7*wk5#``jsXf2Ld&ejQcZqRbx(s8wN=m1I_^pzgPC|5)e3zO*#k6 zV8Lu>Rn@pw6lqeJa;D<`Y=1w#4kIHYe+ec`)IOBW9=uIKv0?KDpzbD^5-@BBGWRn7 z1dj7MV+XK$61@ZhSB4GhfXoyEqI1Q^5A zWOk*0m2!4!T3XteoF4c9Im$1AKXSx%k-vv%v*K8w^a1nMWO|SPEvH>SPD9(}`!NtUZ^fxN2$P0Ti_?U)hu1-p{QC9FYOlr$ zWHH#1o0IMvBf`#qJ7Y?7782GAAwvaxf^+H*01L=paYi`+UE*?vQ6*QizP0tz4;k}T zp04k899mwzAp>w)zDYBw)t8|)JIJpt)I zM+w90ea?Gntt+|VXfCu3jg512l9y_oT;_t}8?Vu~PX^1XFuRYC6qOOl71HtfAE-KJ AG5`Po literal 0 HcmV?d00001 diff --git a/PreStSauveur/Programmation/fig/replit_global.png b/PreStSauveur/Programmation/fig/replit_global.png new file mode 100644 index 0000000000000000000000000000000000000000..49d61161607e7fcd8a0c41581bedec46d6c95a9c GIT binary patch literal 58189 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

Q!32Y|8c{ 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 literal 0 HcmV?d00001 diff --git a/PreStSauveur/Programmation/fig/replit_run.png b/PreStSauveur/Programmation/fig/replit_run.png new file mode 100644 index 0000000000000000000000000000000000000000..2efa017bfec73ad1b507c70e25aa118b681d6592 GIT binary patch literal 897 zcmeAS@N?(olHy`uVBq!ia0vp^RY2^=!3HGXZ(@oEQfx`y?k+$Y2!1;6t_M<_1s;*b z3=De8Ak0{?)V>TT$X?><>&pI!o0(ghZ^N_pRX`!h64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aRvsam!2+;Ar-gY-uCntPGo5R_#a?pjIKAE8X`hiT6ZKI z*&*{+sgB9Mi+%kui98_-2}7>VsHO!@6MR?RXmW`3^49Dz=e^*vVv0yb-SK5-&+PHP zS3a$zr*&y+u*DZ09>#@^88Rke*d1zIrmJbn7WUVg?8r8+mQ zPLXAz8%mllw1AWdNFgXrUZ>^@3ML#-$~Pm&SoDMTj$K77`c8UXdu!*%msyn=*1NQH zm1Ur!Gn?_R0;8>BvBBRv+;ivgon>V{^TMV2)3=@PuEkByPjox{uP}CX&V=%F%M(teyD=}%Xz{L>WEw?{U=UT?<& zGynE1zpzyskE{*J)-tv#^nSU3X`$-f;_WLm(x2yRp3ym*eZzd=wawvQ7yRps>66*Y zU!p0(`M#*mJHD>wsV`=+@tpdXq3*KFm7gW~fESCKIxp#Nsiml5c^{Us+G21=s z)a%sksaYoHBD7a4?v;6SvHM?m6py}e)%sA;up_0GQ>IVdo4fMt=~EYzUi??`W&KlS ze$D;G-f43a@9()R*6mZA{99=EQ)A_0Z_HCNl#k_?Ki+Y9srS-6y<^{QT}$Ab9V@(F zE%nr&;@6w^ZCrOV!Qtn(J1uY9bxmW#Pn}=AX+h8GcYg!Q)R&vwQ3l6HCF)J3lY zYiImevNgjb@%9?MH37+$b1$vUyc73!dP(-Ice|sn7~fiM=D+;Xny{$>20xovu!oM z>(9Gj^SW=L#r6*uWQEV~>gRA0MoIv{KYn}-1|}PuU4JJ?@;b@C zU1}}EXUN6wV{?}0vWah7-%@Er8gk6|^HngTe~DWM4fe>04K literal 0 HcmV?d00001