<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Introduction à la programmation en Python, ICN au lycée du Parc 2017-2018
Préambule
Ce fichier  est un notebook Python.
Il comporte deux types de cellules 
Step1:  Exercice 0
Python est un langage de haut niveau et c'est un langage interprété et non pas compilé comme le langage C.
Définissez en quelques mots les expressions 
Step2:  Les opérateurs arithmétiques suivent des règles de précédence (priorité de l'exponentiation sur la multiplication et de la multiplication sur l'addition). Ces priorités peuvent être changées dans un calcul à l'aide de  parenthèses.
Step3:  Exercice 1
Effectuer mentalement les opérations arithmétiques  ci-dessous puis vérifier avec  python dans la cellule suivante (vous pouvez insérer une cellule par calcul)
Step4:  Les  instructions élémentaires
Un petit nombre d'insctructions élémentaires permettent de traduire dans un langage de programmation tout type d'algorithme exécutable par un ordinateur.
L'affectation et le type d'une variable
Définition 2
Une variable est l'association d'un espace de la mémoire de l'ordinateur, accessible par son nom, et  d'une valeur que l'on y stocke. En Python on définit une variable par une instruction d'affectation, par exemple pour affecter la valeur 12 à la variable de nom a on écrit 
Step5:  Les principaux types de Python
Le type int pour les entiers
Step6:  Le type float pour les flottants (approximations de réels)
Step7:  Le type bool pour les booléens (deux valeurs logiques possibles True ou False)
Step8:  Le type str pour les chaînes de caractères
Step9:  Le type list pour les listes (conteneurs de plusieurs valeurs)
Step10:  Le type tuple pour les tuple (conteneurs de plusieurs valeurs comme les listes mais non modifiable une fois défini)
Step11:  Les instructions d'entrée / sortie
La fonction print
On utilise la fonction print pour un affichage sur la sortie standard qui par défaut est l'écran.
Step12:  Pour afficher du texte, celui-ci doit être contenu dans une chaîne de caratère délimitée par des apostrophes comme 'La mer' ou des guillemets comme "L'océan".
Step13:  On peut aussi afficher la valeur d'une expression obtenue par évaluation d'une combinaison de littéraux  (valeurs correspondant aux types de base du langage), d'opérateurs et de variables
Step14:  On peut passer plusieurs arguments à la fonction print en les séparant par une virgule, print les affichera par concaténation en utilisant un espace vide par défaut comme séparateur.
Step15:  Par défaut, print effectue un saut de ligne après chaque affichage mais on peut changer ce comportement par défaut en réglant le paramètre optionnel end=''.
Step16:  On peut aussi changer le paramètre de séparation par défaut sep=''.
Step17:  Pour afficher l'aide sur une fonction en python, on peut utiliser la documentation en ligne sur https
Step18:  Exercice 3
Stocker chaque mot de la phrase 'Le langage Python a 24 ans' dans une variable puis afficher la phrase sur une ligne avec la fonction print.
Step19:  La fonction input
La fonction input récupère un texte un saisi par l'utilisateur après un prompt et retourne la saisie sous forme de chaîne de caractères. La fonction prend comme argument optionnel le prompt qui doit être une chaîne de caractères.
Exercice 4
Testez le programme ci-dessous.
Comment expliquez-vous la réponse de l'interpréteur ?
Demandez au professeur comment on peut corriger ce  programme.
Step20:  Réponse à l'exercice 4
Saisissez ici votre réponse
Exercice 5
Écrire un programme qui demande un nombre de secondes (on attend un entier) et qui affiche en sortie la conversion de cette durée en heures, minutes et secondes sous
le format hh
Step21:  Le test
Définition 3
Un test est composé d’une instruction de contrôle puis d'un bloc d'instructions.
En Python, l'instruction de contrôle commence par le mot clef if suivi d’une
condition à valeur booléenne (True ou False) et se termine par le symbole 
Step22:  Exercice 7
L'Indice de Masse Corporelle se calcule par la formule $\text{IMC}=\frac{masse}{taille^2}$ où la masse est en kilogrammes et la taille en mètres. Un IMC est considéré comme normal s'il est compris entre 18 et 25. En dessous de 18, la personne est en sous-poids et au-dessus de 25 elle est en surpoids.
Ecrire un programme qui demande la taille et retourne l'intervalle de masse correspondant à un IMC normal.
Ecrire un programme qui demande la masse et retourne l'intervalle de taille correspondant à un IMC normal.
Step23:  Exercice 8
Écrire un programme qui affiche le plus petit de deux nombres saisis par l'utilisateur (sans
utiliser la fonction max)
Step24:  La boucle for ou boucle  inconditionnelle
Définition 4
Une boucle inconditionnelle permet de répéter un bloc d'instructions lorsqu'on connaît à l'avance le nombre de répétitions. 
La situation la plus courante est 
Step25:  Exercice 10
Recopier et compléter le programme suivant pour qu'il affiche en sortie de boucle la chaîne de caratères inversée de celle saisie en entrée par l'utilisateur 
Step26:  Les fonctions
Définition 5
Lorsqu'on a besoin d'utiliser plusieurs fois un même bloc d'instructions, on peut l'encapsuler dans une fonction. On peut ainsi étendre le  langage avec une nouvelle instruction. 
Dans la définition d'une fonction, on précise son nom et en général des paramètres formels d'entrée et une valeur de retour. En Python on définit une fonction ainsi 
Step27:  Exercice 12
Expliquer ce qui ne va pas dans la fonction ci-dessous. 
~~~python
def addition(x, y, z)
Step28:  L'opérateur + de concaténation
Step29:  La fonction len permet d'obtenir la longueur du conteneur avec len(conteneur).
Step30:  L'opérateur []  permet d'accéder à l'élément en position k dans le conteneur (chaîne ou liste) avec la syntaxe conteneur[k].
Attention les positions sont indexées de gauche à droite de 0 à len(conteneur)-1 et de droite à gauche de $-1$ à -len(conteneur).
Step31:  D'abord les index positifs
Step32:  Voici ce qui se produit lorsqu'on essaie d'accéder à un index hors de la plage
Step33:  Et maintenant les index négatifs
Step34:  Fonctions  spécifiques aux chaînes de caractères
La fonction  lower permet de  convertir tous les caractères en minuscules.
De même la fonction upper permet de convertir tous les caractères en majuscules
Il s'agit de méthodes internes qu'on applique avec la syntaxe chaine.lower() ou chaine.upper().
Step35:  Il existe beaucoup de fonctions spécifiques aux chaînes de caractères, avant de construire un outil qui existe déjà, il est conseillé de consulter la documentation en ligne dans la rubrique Built-in Types.
Fonctions  spécifiques aux listes
L'ajout d'un élément à la fin d'une liste se fait avec la fonction interne (ou méthode) append avec la syntaxe liste.append(element).
Step36:  La sortie d'un élément se fait avec la fonction interne (ou méthode) pop avec la syntaxe liste.pop(k) où k est la position de l'élément à sortir, entre 0 et len(liste) - 1 qui est la valeur par défaut.
Step37:  Des chaînes de caractères aux listes et réciproquement
La fonction split découpe une chaîne de caractères selon le caractère de séparation sep avec la syntaxe chaine.split(sep).
Step38:  Réciproquement la fonction join permet de recoller les chaînes de caractères séparées dans une liste champs selon un caractère de jointure sep passé en paramètre avec la syntaxe 'sep'.join(champs).
Step39:  Exercice 13
En informatique la couleur associée à un pixel de l'écran  est souvent représentée sous la forme d'un triplet d'entiers comme (R, G, B). La première composante R représente la quantité de Rouge, la deuxième G celle de vert et la troisième B celle de jaune. Par addition des couleurs primaires Rouge, Vert et Bleu on peut représenter n'importe quelle couleur du spectre visible. Les couleurs de pixels sont en général codées sur 3 octets ce qui donne 8 bits par composante c'est-à-dire $2^8=256$ valeurs 
Step40:  Exercice 14
Les fichiers au format postcript sont des fichier textes contenant des instructions permettant de représenter une image dans un format vectoriel à l'aide des fonctions mathématiques du langage de programmation postscript. Ces fichiers peuvent être convertis en fichiers de format binaire comme le format png à l'aide de programme comme convert de la bibliothèque ImageMagick.
En informatique, quelle est la différence entre un fichier  texte et un fichier  binaire ?
Quelle est la différence entre une image de format vectoriel et une image de format binaire ? Citez des formats vectoriels ou bitmap connus.
Compléter la fonction conversion_nom(source, ext) où le paramètre   source est un nom de fichier de la forme nombase.extension,  pour qu'elle retourne le nom associé après remplacement de l'extension source par  l'extension ext passée en paramètre.
~~~python
def conversion_nom(source, ext)
Step41:  Fonctions de bibliothèques et le module turtle
Définition 6
Dans un langage de programmation une  bibliothèque est un ensemble de fonctions qui constitue une trousse à outils autour d'un même thème.
Si cette bibliothèque est installée sur sa machine on peut l'importer dans un programme pour utiliser ses fonctions.
Une bibliothèque écrite en Python s'appelle un module. Il existe des milliers de modules et l'un des plus populaires dans l'informatique éducative est turtle  qui implémente en Python les fonctions du  légendaire langage graphique Logo
Pour importer toutes les fonctions du module turtle dans son programme on écrit 
Step42:  Exercice 16
Écrire un programme en Python avec le module turtle qui dessine une spirale comme celle ci
Step43:  Exercice 17
~~~python
from turtle import * 
couleur = ["red", "yellow", "green", "blue", "purple", "navy"]
rayon = 400
largeur = 2 * rayon
hauteur = 2 * rayon
screensize(largeur, hauteur)
pensize(5)
penup()
goto(0, -rayon)
pendown()
for k in range(4)
Step44:  La boucle while ou boucle conditionnelle
Définition 4
Généralement, on souhaite répéter un bloc d'instructions tant qu'une condition est réalisée mais on ne sait pas à l'avance combien de répétitions seront nécéssaires.
La situation la plus courante est 
Step45:  Exercice 20
On lance successivement un dé cubique équilibré à 6 faces numérotées de 1 à 6 jusqu'à obtenir un 6.
  Recopier et compléter la fonction premier6() ci-dessous pour qu'elle retourne le rang du premier 6.
~~~python
from random import randint
def premier6()
<ASSISTANT_TASK:>
Python Code:
# ceci est un commentaire, l'interpréteur ne le lit même pas
# les commentaires sont destinés au lecteur humain du code source
code = 'sesame'                     #affectation de variable
rep = input('Entrez le code : ')       #affectation et instruction d'entrée
if rep == code:                     # test  et début d'un bloc d'instructions                
    print('Vous pouvez entrer.')    # instruction si test vrai
else:
    print('Code incorrect, désolé ce ne sera pas possible.')  # instruction si test faux
Explanation: Introduction à la programmation en Python, ICN au lycée du Parc 2017-2018
Préambule
Ce fichier  est un notebook Python.
Il comporte deux types de cellules :
les cellules d'édition dans lesquelles vous pouvez saisir du texte éventuellement enrichi de mises en formes ou de liens hypertextes avec la syntaxe du langage HTML simplifié qui s'appelle Markdown. Voir http://daringfireball.net/projects/markdown/ pour la syntaxe de Markdown.
les cellules de code où l'on peut saisir du code Python3 puis le faire exécuter avec la combinaison de touches CTRL + RETURN
Une cellule peut être éditée  de deux façons différentes :
en mode commande lorsqu'on clique sur sa marge gauche qui est surlignée alors en bleu, on peut alors  :
changer le type de la cellule en appuyant sur m pour passer en cellule Markdown ou sur y pour passer en cellule de code
insérer une cellule juste au-dessus en appuyant sur a
insérer une cellule juste en-dessous en appuyant sur b
couper la cellule en appuyant sur x etc ...
en mode édition lorsqu'on clique sur l'intérieur de la cellule.
L'aide complète sur les raccourcis claviers est accessible depuis le bouton Help dans la barre d'outils ci-dessus.
Notion de langage de programmation
Définition 1
Un algorithme décrit  une suite d'instructions que l’on souhaite faire exécuter par un ordinateur.
Un programme informatique est la traduction d'un algorithme dans  un langage de programmation. Ce langage possède une grammaire et une syntaxe à respecter avec un nombre limité de mots clefs. Le programme est souvent dénommé code source.
Nous utiliserons le langage Python dans sa version 3. Le site officiel est Python.org et la documentation de la version 3 se trouve sur https://docs.python.org/3/.
Exemple 1 de programme en Python
End of explanation
# L'opérateur + réalise l'addition de deux entiers 
1 + 2
# L'opérateur + réalise aussi l'addition de deux flottants
2.0 + 3.5
# L'opérateur * réalise la  multiplication  de deux entiers
3 * 2
# L'opérateur * réalise aussi la  multiplication  de deux flottants
2.0 * 3.14
# L'opérateur - réalise la soustraction de deux entiers ou de deux flottants
(10 - 4, 3.14 - 0.14)  #on utilise des parenthèses pour créer un couple de valeurs
# L'opérateur ** réalise l'exponentiation d'un entier par un entier, idem pour les flottants
(2 ** 3, 2.0 ** 0.5)
# L'opérateur // retourne le quotient de la division euclidienne de deux entiers
15 // 4
# L'opérateur / retourne l'approximation du quotient par le flottant le plus proche
(15 / 4, 2/3)
# L'opérateur % retourne le reste de la division euclidienne de deux entiers
15 % 4
Explanation: Exercice 0
Python est un langage de haut niveau et c'est un langage interprété et non pas compilé comme le langage C.
Définissez en quelques mots les expressions : langage de haut niveau, langage interprété et langage compilé.
Réponse à l'exercice 0
Saisissez votre réponse dans cette cellule
Installer Python sur sa machine et apprendre la programmation en ligne
Installation de l'Ide Pyzo et de la distribution Python Anaconda
Le plus simple est d'installer l'environnement de développement (ou Integrated Development Environment)  Pyzo puis  la distribution Python Anaconda en suivant le guide rapide d'installation sur le site de Pyzo. Installez bien Anaconda et non pas Miniconda (sauf sur votre clef USB éventuellement) car Anaconda inclut tous les modules nécessaires et le Jupyter Notebook si pratique que vous êtes en train d'utiliser. Par la suite nous travaillerons plutôt avec l'IDE Pyzo.
On peut installer des modules supplémentaires depuis Pyzo avec       l'un des outils conda ou pip, voir  http://www.pyzo.org/install_packages.html#install-packages. 
pygame pose problème avec conda et pip. Dans ce cas on se rend sur le site http://www.lfd.uci.edu/~gohlke/pythonlibs/   et on télécharge  le paquet wheel  de pygame qu'on installe avec pip install paquet.whl
En cas de problème contactez le professeur par la messagerie de  l'ENT.
Accès à ce document et au cahier de textes
Ce document est disponible sur un dépôt Github https://github.com/parcicn/Introduction-python 
Le cahier de textes d'ICN est disponible sur Pronote (via l'ENT)  mais aussi sur cette page  http://www.frederic-junier.org/ICN/Progression/ICN_2018.html
S'exercer à la programmation en Python
Le site de référence est http://www.france-ioi.org, si vous souhaitez progresser, il faut s'entraîner et ce site est la plateforme idéale : créez un compte puis suivez le parcours lycée pour commencer.
Pour visualiser ce que fait la machine lors de l'exécution d'un code Python, et mieux comprendre le fonctionnement du langage, un bon outil est http://pythontutor.com/
Python et les opérations arithmétiques
Python dispose d'opérateurs arithmétiques pour réaliser des opérations sur des entiers ou sur des approximations décimales (en notation pointée) de nombres réels qu'on appelle des  flottants.
End of explanation
( 1 + 2 * 3 ** 2) / 2
1 + 2 * 3 ** 2 / 2
Explanation: Les opérateurs arithmétiques suivent des règles de précédence (priorité de l'exponentiation sur la multiplication et de la multiplication sur l'addition). Ces priorités peuvent être changées dans un calcul à l'aide de  parenthèses.
End of explanation
# Répondez à l'exercice 1 à partir de cette cellule de code 
# Vous saisissez un calcul puis vous appuyez sur CTRL + Return pour obtenir le résultat
#pour insérer ensuite une nouvelle cellule de code en-dessous, appuyez sur b.
Explanation: Exercice 1
Effectuer mentalement les opérations arithmétiques  ci-dessous puis vérifier avec  python dans la cellule suivante (vous pouvez insérer une cellule par calcul):
~~~python
5 ** 2
9 * 5
15 / 12
12 / 15
15 // 12
12 // 15
5 % 2
9 % 5
15 % 12
12 % 15
6 % 6
0 % 7
~~~
Ajouter des parenthèses à l'expression 6 * 1 - 2 pour changer sa valeur de  4 à -6.
End of explanation
# Cellule de code pour répondre à l'exercice 2
Explanation: Les  instructions élémentaires
Un petit nombre d'insctructions élémentaires permettent de traduire dans un langage de programmation tout type d'algorithme exécutable par un ordinateur.
L'affectation et le type d'une variable
Définition 2
Une variable est l'association d'un espace de la mémoire de l'ordinateur, accessible par son nom, et  d'une valeur que l'on y stocke. En Python on définit une variable par une instruction d'affectation, par exemple pour affecter la valeur 12 à la variable de nom a on écrit :
~~~python
a = 12
~~~
Un langage de programmation fixe des contraintes pour les nomes de variables. En Python les seuls caractères autorisés sont les caractères non accentués, les chiffres (sauf en première position) et le tiret bas (mais pas le tiret haut).
~~~python
1var = 13     #nom incorrect
var1 = 13     #nom correct
var-1 = 14     #nom incorrect
var_1 = 14     #nom correct
~~~
Un langage de programmation n'accepte par défaut qu'un nombre fini de types de valeurs, ainsi une variable est caractérisée par son type accessible par la fonction type et qu'on peut afficher avec la fonction print:
~~~python
type(a)
~~~
Exercice 2
Recopier et compléter le programme suivant pour qu'il échange les entiers  des variables x et y.
 Le programme doit fonctionner quels que soient les entiers contenus dans x et y.
~~~python
x = 501
y = 504
à compléter
~~~
End of explanation
a = 12
print(type(a))
Explanation: Les principaux types de Python
Le type int pour les entiers
End of explanation
b = 1/3
print(type(b))
Explanation: Le type float pour les flottants (approximations de réels)
End of explanation
c = (1 < 3)
c 
print(type(c))
d =  ( 1 == 2)
d
print(type(d))
Explanation: Le type bool pour les booléens (deux valeurs logiques possibles True ou False)
End of explanation
e = 'Hello World'
print(e)
print(type(e))
Explanation: Le type str pour les chaînes de caractères
End of explanation
L = [1, 2, 4]
print(L)
print(type(L))
Explanation: Le type list pour les listes (conteneurs de plusieurs valeurs)
End of explanation
coord = (1, 2)
print(coord)
print(type(coord))
Explanation: Le type tuple pour les tuple (conteneurs de plusieurs valeurs comme les listes mais non modifiable une fois défini)
End of explanation
print(Bonjour)
Explanation: Les instructions d'entrée / sortie
La fonction print
On utilise la fonction print pour un affichage sur la sortie standard qui par défaut est l'écran.
End of explanation
print('Bonjour')
Explanation: Pour afficher du texte, celui-ci doit être contenu dans une chaîne de caratère délimitée par des apostrophes comme 'La mer' ou des guillemets comme "L'océan".
End of explanation
n = 2000
print(2017 - n)
Explanation: On peut aussi afficher la valeur d'une expression obtenue par évaluation d'une combinaison de littéraux  (valeurs correspondant aux types de base du langage), d'opérateurs et de variables
End of explanation
print('Vous avez ', 2017 - n, ' ans')
Explanation: On peut passer plusieurs arguments à la fonction print en les séparant par une virgule, print les affichera par concaténation en utilisant un espace vide par défaut comme séparateur.
End of explanation
print('Ligne 1')
print('Ligne 2')
print('Colonne 1', end='|')
print('Colonne 2')
Explanation: Par défaut, print effectue un saut de ligne après chaque affichage mais on peut changer ce comportement par défaut en réglant le paramètre optionnel end=''.
End of explanation
print('Colonne 1', 'Colonne 2', sep='|')
Explanation: On peut aussi changer le paramètre de séparation par défaut sep=''.
End of explanation
help(print)
Explanation: Pour afficher l'aide sur une fonction en python, on peut utiliser la documentation en ligne sur https://docs.python.org/3/ ou la documentation intégrée avec la fonction help.
End of explanation
# Répondre à l'exercice 3 dans cette cellule de code
Explanation: Exercice 3
Stocker chaque mot de la phrase 'Le langage Python a 24 ans' dans une variable puis afficher la phrase sur une ligne avec la fonction print.
End of explanation
date = input('Entrez votre date de naissance : ')
print('Vous avez  ', 2017 - date, 'ans')
Explanation: La fonction input
La fonction input récupère un texte un saisi par l'utilisateur après un prompt et retourne la saisie sous forme de chaîne de caractères. La fonction prend comme argument optionnel le prompt qui doit être une chaîne de caractères.
Exercice 4
Testez le programme ci-dessous.
Comment expliquez-vous la réponse de l'interpréteur ?
Demandez au professeur comment on peut corriger ce  programme.
End of explanation
# Répondez à l'exercice 5 dans cette cellule de code
Explanation: Réponse à l'exercice 4
Saisissez ici votre réponse
Exercice 5
Écrire un programme qui demande un nombre de secondes (on attend un entier) et qui affiche en sortie la conversion de cette durée en heures, minutes et secondes sous
le format hh:mm:ss
End of explanation
# Cellule pour exécuter le code de l'exercice 6
Explanation: Le test
Définition 3
Un test est composé d’une instruction de contrôle puis d'un bloc d'instructions.
En Python, l'instruction de contrôle commence par le mot clef if suivi d’une
condition à valeur booléenne (True ou False) et se termine par le symbole :.
Le bloc d’instructions qui suit s'exécute si et seulement si la condition de l'instruction de contrôle a pour valeur True . Il correspond à un embranchement dans le flux d'instructions. 
En Python, un bloc d'instructions commence à la première ligne suivant le symbole : et son imbrication dans le reste du programme est caractérisée  par son niveau d'indentation. Toutes les instructions d'un même bloc doivent avoir le même niveau d'indentation. Le flux principal d'instructions est collé contre la marge puis chaque niveau d'indentation est décalé de quatre espaces ou une tabulation vers la droite.
~~~python
flux parent
if conditionA:
    #bloc d'instructions exécuté si la valeur de conditionA est True
    if conditionB:
        #bloc d'instructions imbriqué, exécuté si conditionA  est à True
        # et si conditionB est à True
retour au flux parent
~~~
Si la condition du test n'est pas vérifiée, on peut prévoir l'exécution d'un bloc d'instructions alternatif après un else :.
~~~python
flux parent
if condition:
    #bloc d'instructions exécuté si la valeur de condition est True
else:
    #bloc d'instructions exécuté si la valeur de condition est False
retour au  flux parent
~~~
On peut aussi tester d'autres conditions mutuellement exclusives pour modéliser un choix entre plus de deux alternatives. Chaque condition  testée dans un elif condition : commande un bloc d'instructions et un bloc d'instructions  par défaut peut se trouver après un else :.
~~~python
flux parent
if condition1:
    #bloc d'instructions exécuté si la valeur de condition1 est à True
elif condition2:
    #bloc d'instructions  si  condition2 est True (et condition1 est à False) 
elif condition3:
    #bloc d'instructions si  condition3 est True (et condition1 et condition2 sont à False)
else : 
    #bloc d'instruction si toutes les conditions précédentes sont à False
retour au flux parent
~~~
Opérateurs
Une condition de test doit avoir une  valeur booléenne, ce  peut être le résultat :
d'une comparaison arithmétique entre deux valeurs numériques a et b :
l'égalité dont la syntaxe en Python est   a == b
la différence dont la syntaxe en Python est a != b
l'inégalité dont la syntaxe en Python est a &lt; b ou a &gt; b ou a &lt;= b ou a &gt;= b
d'une opération logique entre  deux valeurs booléennes x ou y :
la négation logique dont dont la syntaxe en Python est   not x
le ou inclusif  dont la syntaxe en Python est   x or y
le et  dont la syntaxe en Python est   x and y
Il existe des règles de priorité : opérateurs arithmétiques prioritaires sur les opérateurs logiques, not prioritaire sur and qui  est prioritaire sur or. Des parenthèses permettent de changer les priorités.
Exercice 6
Deviner les valeurs booléennes affichées par le programme ci-dessous puis vérifier en l'exécutant.
~~~python
a = 504
b = 505
print(not (a > b))
print( a == b or a < b)
print( not ( a > 0 and a < b))
print((b - a) ** 2 == 1 and a != b - 1)
print((False or not False) and not(False and True))
~~~
End of explanation
# Répondre à la première question de l'exercice 7 dans cette cellule de code
Explanation: Exercice 7
L'Indice de Masse Corporelle se calcule par la formule $\text{IMC}=\frac{masse}{taille^2}$ où la masse est en kilogrammes et la taille en mètres. Un IMC est considéré comme normal s'il est compris entre 18 et 25. En dessous de 18, la personne est en sous-poids et au-dessus de 25 elle est en surpoids.
Ecrire un programme qui demande la taille et retourne l'intervalle de masse correspondant à un IMC normal.
Ecrire un programme qui demande la masse et retourne l'intervalle de taille correspondant à un IMC normal.
End of explanation
# Répondre à l'exercice 8 dans cette cellule de code
Explanation: Exercice 8
Écrire un programme qui affiche le plus petit de deux nombres saisis par l'utilisateur (sans
utiliser la fonction max)
End of explanation
# Répondre à l'exercice 9 dans cette cellule de code
Explanation: La boucle for ou boucle  inconditionnelle
Définition 4
Une boucle inconditionnelle permet de répéter un bloc d'instructions lorsqu'on connaît à l'avance le nombre de répétitions. 
La situation la plus courante est :
Pour k allant de 1 à 10 répéter 
    Bloc d'instructions
FinPour
Sa traduction en Python est :
~~~python
flux parent
for k in range(1, 11):
    # bloc d'instructions
retour au flux parent
~~~
On remarque l'utilisation range(1, 11) alors qu'on attendrait range(1, 10).
En fait range(1, 11) retourne un itérateur, qui va parcourir avec un incrément de 1 tous les entiers $n$ tels que $1 \leqslant n < 11$. 
Il faut bien se souvenir que la borne supérieure de range(n, m) est exclue mais il est facile de retenir que le nombre de tours de boucles est  $m - n$.
Par exemple, pour calculer la somme des tous les entiers consécutifs de 100 à 200, on peut écrire :
~~~python
somme = 0
for k in range(100, 201):
    somme = somme + k
print("La somme est ", somme)
~~~
S'il s'agit juste de répéter n fois un bloc d'instructions on utilise le raccourci range(n) au lieu de range(0, n) ou de range(1, n + 1).
Par exemple pour dire 100 fois "Merci", on peut écrire :
~~~python
for k in range(100):
    print("Merci !")
print("Ouf!")
~~~
La fonction range offre un troisième paramètre optionnel qui permet de changer l'incrément par défaut qui est 1.
Par exemple, pour  calculer la somme des tous les entiers pairs consécutifs entre  100 et 200, on peut écrire :
~~~python
sommePair = 0
for k in range(100, 201, 2):
    sommePair = sommePair + k
print("La somme est ", sommePair)
~~~
Enfin, la boucle for permet aussi de parcourir des objets itérables comme les chaînes de caractères, les listes, les fichiers etc ...
Par exemple pour afficher les caractères consécutifs de la chaîne "Bonjour" avec un caractère par ligne, on peut écrire :
~~~python
chaine = "Bonjour"
for c in chaine:
    print(c)
~~~
Autre exemple, pour afficher des messages d'invitation personnalisés :
~~~python
for nom in ["Jean-Luc", "Emmanuel", "François", "Marine"]:
    print("Salut", nom, "je t'invite à mon anniversaire samedi !")
~~~
Exercice 9
Le programme ci-dessous calcule la somme des n premiers entiers de 1 à n, la valeur  entière strictement positive de  n étant saisie par l'utilisateur. On notera l'utilisation de k += 1 comme raccourci pour l'incrémentation k = k + 1. Recopier et compléter ce programme pour qu'il calcule également le produit des n premiers entiers consécutifs $1 \times 2 \times 3 \times \ldots \times n$. Tester pour $n = 100$, que peut-on dire de l'ordre de grandeur du produit ? 
~~~python
n = int(input('Entrez un entier n strictement positif : '))
somme = 0
for k in range(1, n + 1):
    somme += k
print(somme)
~~~
Écrire un programme qui affiche les 10 premiers multiples de 2  sous la forme :
2 x 1 = 2  
2 x 2 = 4  
....  
2 x 10 = 20
Modifier le programme précédent pour qu'il affiche les tables de mulplications pour les  10 premiers multiples de tous les entiers compris entre 1 et 9
End of explanation
# Répondre à l'exercice 10 dans cette cellule de code
Explanation: Exercice 10
Recopier et compléter le programme suivant pour qu'il affiche en sortie de boucle la chaîne de caratères inversée de celle saisie en entrée par l'utilisateur :
~~~python
ab = input('Entrez une chaîne de caractères : ')
ba = ''
for c in ab:
    ba = .....
print('Voici la chaîne inversée  : ', ba)
~~~
Compléter le programme pour qu'il demande à l'utilisateur de saisir deux chaînes de caractères et qu'il affiche en sortie s'il s'agit de palindromes.
End of explanation
# Répondre à l'exercice 11 dans cette cellule de code.
Explanation: Les fonctions
Définition 5
Lorsqu'on a besoin d'utiliser plusieurs fois un même bloc d'instructions, on peut l'encapsuler dans une fonction. On peut ainsi étendre le  langage avec une nouvelle instruction. 
Dans la définition d'une fonction, on précise son nom et en général des paramètres formels d'entrée et une valeur de retour. En Python on définit une fonction ainsi :
~~~python
def mafonction(parametre1, parametre2):
    #bloc d'instructions (optionnel)
    return valeur
~~~
Par exemple une fonction maximum qui prend en paramètres deux nombres x et y et qui retourne leur maximum,  s'écrira  :
~~~python
def maximum(x, y):
    if x < y:
        return y
    else:
        return x
~~~
En fait, l'exécution d'une instruction  return correspond à une sortie de la  fonction, toutes les instructions suivantes ne seront pas exécutées. Ainsi la fonction précédente peut s'écrire plus simplement :
~~~python
def maximum2(x, y):
    if x < y:
        return y
    return x
~~~ 
Nous venons de voir la définition d'une fonction. On exécute la fonction en substituant aux  paramètres formels  des valeurs particulières appelées arguments. Cette instruction se nomme un appel de fonction :
~~~python
note1 = int(input('Entrez une note'))   #récupération d'un argument
note2 = int(input('Entrez une note'))   #récupération d'un autre argument
maxi = maximum2(note1, note2)           #affectation de la valeur retournée par un appel de fonction
~~~
Il existe aussi des fonctions sans paramètres d'entrée ou sans valeur de retour.
Par exemple, une fonction qui affiche le nom complet d'un acronyme peut s'écrire :
~~~python
def icn():
    print("Informatique et Création Numérique")
~~~
Attention, return valeur  retourne valeur qu'on peut capturer dans une variable alors que  print(valeur) affiche valeur sur la sortie standard (l'écran par défaut) mais valeur ne peut alors être capturée dans une variable.
Exercice 11
On donne ci-dessous un programme qui permet de remplir un tableau de valeurs de la  fonction  mathématique $f : x \mapsto x^2$ pour $x$ variant de $0$ à 2 avec un pas de $0,1$. Modifier ce programme, pour qu'il remplisse un tableau de valeurs de $g : x \mapsto (3x - 2)(x-1)$ pour $x$ variant de $0$ à 2 avec un pas de $0,01$. Critiquez les valeurs obtenues.
~~~python
def f(x):
    return x ** 2
binf = 0                         #borne inférieure
bsup = 2                             # borne supérieur
pas = 0.1                            # pas 
n = int( (bsup - binf)/pas) + 1      # calcul du nombre de valeurs
tabx = [0] * n                       #initilisation de la liste des x
taby = [0] * n                       #initialisation de la liste des y
x = binf
for k in range(n):
    tabx[k]  = x
    taby[k] = f(x)
    x = x + pas
~~~
Rechercher sur le web, la formule de conversion d'une température de l'échelle des degrés Celsius
dans celle des degrés Fahrenheit
Écrire en Python une fonction celsius2fahrenheit(t) puis la fonction réciproque fahrenheit2celsius(t).
End of explanation
chaine = 'Bonjour'
'b' in chaine
'B' in chaine
liste = [0, 7]
8 in liste
0 in liste
Explanation: Exercice 12
Expliquer ce qui ne va pas dans la fonction ci-dessous. 
~~~python
def addition(x, y, z):
    return x + y + z
    print('la réponse est', x + y + z)
~~~
Réponse à l'exercice 12 :
Compléter cette cellule de texte
Premiers compléments sur les listes et les chaînes de caractères
Opérateurs et fonctions communs aux chaînes de caractère et aux listes
L'opérateur in d'appartenance
End of explanation
chaine = 'Bonjour'
liste = [0,7]
chaine2 = chaine + ' à tous.'
chaine2
liste2 = [0] + liste
liste2
Explanation: L'opérateur + de concaténation
End of explanation
len(liste2), len(chaine2)
Explanation: La fonction len permet d'obtenir la longueur du conteneur avec len(conteneur).
End of explanation
chaine = 'Bonjour'
liste = [0,7]
Explanation: L'opérateur []  permet d'accéder à l'élément en position k dans le conteneur (chaîne ou liste) avec la syntaxe conteneur[k].
Attention les positions sont indexées de gauche à droite de 0 à len(conteneur)-1 et de droite à gauche de $-1$ à -len(conteneur).
End of explanation
chaine[0], chaine[1], chaine[len(chaine) - 1]
Explanation: D'abord les index positifs
End of explanation
chaine[len(chaine)]
Explanation: Voici ce qui se produit lorsqu'on essaie d'accéder à un index hors de la plage
End of explanation
chaine[-1], chaine[-2], chaine[-len(chaine)]
Explanation: Et maintenant les index négatifs
End of explanation
chaine = 'Bonjour'
chaine.lower()
chaine.upper()
Explanation: Fonctions  spécifiques aux chaînes de caractères
La fonction  lower permet de  convertir tous les caractères en minuscules.
De même la fonction upper permet de convertir tous les caractères en majuscules
Il s'agit de méthodes internes qu'on applique avec la syntaxe chaine.lower() ou chaine.upper().
End of explanation
liste = [0,7]
liste.append(1)
print(liste)
Explanation: Il existe beaucoup de fonctions spécifiques aux chaînes de caractères, avant de construire un outil qui existe déjà, il est conseillé de consulter la documentation en ligne dans la rubrique Built-in Types.
Fonctions  spécifiques aux listes
L'ajout d'un élément à la fin d'une liste se fait avec la fonction interne (ou méthode) append avec la syntaxe liste.append(element).
End of explanation
liste = [9,3]
a = liste.pop()
print(liste, a)
liste.append(4)
print(liste)
b = liste.pop(0)
print(b, liste)
Explanation: La sortie d'un élément se fait avec la fonction interne (ou méthode) pop avec la syntaxe liste.pop(k) où k est la position de l'élément à sortir, entre 0 et len(liste) - 1 qui est la valeur par défaut.
End of explanation
chaine = 'Frédéric,Junier,enseignant,mathématiques'
champs = chaine.split(',')
print(champs)
Explanation: Des chaînes de caractères aux listes et réciproquement
La fonction split découpe une chaîne de caractères selon le caractère de séparation sep avec la syntaxe chaine.split(sep).
End of explanation
chaine2 = '*'.join(champs)
print(chaine2)
Explanation: Réciproquement la fonction join permet de recoller les chaînes de caractères séparées dans une liste champs selon un caractère de jointure sep passé en paramètre avec la syntaxe 'sep'.join(champs).
End of explanation
# Cellule de code pour répondre à l'exercice 13
Explanation: Exercice 13
En informatique la couleur associée à un pixel de l'écran  est souvent représentée sous la forme d'un triplet d'entiers comme (R, G, B). La première composante R représente la quantité de Rouge, la deuxième G celle de vert et la troisième B celle de jaune. Par addition des couleurs primaires Rouge, Vert et Bleu on peut représenter n'importe quelle couleur du spectre visible. Les couleurs de pixels sont en général codées sur 3 octets ce qui donne 8 bits par composante c'est-à-dire $2^8=256$ valeurs : de 0 pour l'absence de couleur à 255 pour l'intensité  maximale.
La variable C de type liste contient une couleur, mais laquelle ?
~~~python
C = [255, 255, 255]
~~~
Comment peut-on modifier la variable C pour qu'elle code la couleur jaune ? la couleur noire ?
  On pourra s'aider de l'outil sur  la page https://www.w3schools.com/colors/colors_picker.asp.
End of explanation
# Cellule de code pour répondre à l'exercice 14
Explanation: Exercice 14
Les fichiers au format postcript sont des fichier textes contenant des instructions permettant de représenter une image dans un format vectoriel à l'aide des fonctions mathématiques du langage de programmation postscript. Ces fichiers peuvent être convertis en fichiers de format binaire comme le format png à l'aide de programme comme convert de la bibliothèque ImageMagick.
En informatique, quelle est la différence entre un fichier  texte et un fichier  binaire ?
Quelle est la différence entre une image de format vectoriel et une image de format binaire ? Citez des formats vectoriels ou bitmap connus.
Compléter la fonction conversion_nom(source, ext) où le paramètre   source est un nom de fichier de la forme nombase.extension,  pour qu'elle retourne le nom associé après remplacement de l'extension source par  l'extension ext passée en paramètre.
~~~python
def conversion_nom(source, ext):
   # à compléter
   # return  
~~~
End of explanation
from turtle import * 
speed(1)        #parametrage de la vitesse de 1 lent à 10 rapide, 0 étant la vitesse la plus rapide
shape("turtle") #choix de la forme de la tortue
pencolor("red")  #choix de la couleur du crayon
pensize(4)      #épaisseur du crayon
penup()         #lever le crayon     
goto(0,0)      # aller à la position (0,0)
setheading(0)  #orientation de la tortue vers l'Est / 90  Nord / 180 Ouest / 270 Sud
pendown()       #poser le crayon
for k in range(4):
    forward(100)  #avancer de 100 pixels
    left(90)           #tourner de 90 degrés
mainloop()       #gestionnaire d’evenement, indispensable pour l’affichage et l’interactivite
Explanation: Fonctions de bibliothèques et le module turtle
Définition 6
Dans un langage de programmation une  bibliothèque est un ensemble de fonctions qui constitue une trousse à outils autour d'un même thème.
Si cette bibliothèque est installée sur sa machine on peut l'importer dans un programme pour utiliser ses fonctions.
Une bibliothèque écrite en Python s'appelle un module. Il existe des milliers de modules et l'un des plus populaires dans l'informatique éducative est turtle  qui implémente en Python les fonctions du  légendaire langage graphique Logo
Pour importer toutes les fonctions du module turtle dans son programme on écrit :
~~~python
from turtle import *
~~~
Pour utiliser la fonction penup() du module on écrira alors penup().
On peut également créer juste un point d'accès au module turtle avec :
~~~python
import turtle
~~~
Pour utiliser la fonction penup() du module on écrira alors turtle.penup().
Exercice 15
Pour découvrir quelques fonctions de turtle, lire  puis exécuter le programme ci-dessous dans la cellule juste après celle-ci. 
Si vous avez un message d'erreur contenant le terme Terminator, exécutez la cellule de nouveau.
Pour aller plus loin, vous pouvez consulter la documentation sur https://docs.python.org/3/library/turtle.html#module-turtle
End of explanation
# Cellule de code pour répondre à l'exercice 16
Explanation: Exercice 16
Écrire un programme en Python avec le module turtle qui dessine une spirale comme celle ci:
End of explanation
# cellule de code pour répondre à l'exercice 18
Explanation: Exercice 17
~~~python
from turtle import * 
couleur = ["red", "yellow", "green", "blue", "purple", "navy"]
rayon = 400
largeur = 2 * rayon
hauteur = 2 * rayon
screensize(largeur, hauteur)
pensize(5)
penup()
goto(0, -rayon)
pendown()
for k in range(4):
    #à compléter
mainloop()
~~~
* Consulter la documentation de la fonction circle du module turtle sur https://docs.python.org/3/library/turtle.html#turtle.circle puis compléter et reopier le programme ci-dessus pour qu'il trace une figure similaire à celle-ci :
Exercice 18
Le module random offre plusieurs fonctions permettant de générer des nombres pseudo-aléatoires.
Par exemple pour générer un nombre pris au hasard dans l'intervalle [ 0 ; 1 [ on utilise la fonction random sans argument et pour générer un nombre entier pris au hasard dans l'intervalle [1 ; 6] on utilise la fonction randint :
~~~python
from random import random, randint
a = random()       # nombre aléatoire dans [0 ; 1 [
b = randint(1, 6)  # entier aléatoire dans [1 ; 6 ]
~~~
Rechercher sur le web  la définition d'un nombre pseudo-aléatoire.
On donne ci-dessous la liste des noms des  16 couleurs définies dans la norme HTML, le langage HTML permettant d'écrire des pages Web. 
~~~python
couleur = ["red", "yellow", "green", "blue", "purple", "navy", "lime", "maroon", "olive", 
            "gray", "black", "teal","fuchsia", "white", "silver"]
~~~
Ecrire une fonction couleur_alea(c) de paramètre c une liste de noms de couleurs, qui retourne  le nom
d'une couleur choisie aléatoirement dans la liste.
Utiliser la fonction couleur_alea(c)  pour compléter le programme ci-dessous afin qu'il trace une figure aléatoire comme ci-dessus, constituée d'un nombre aléatoires de cercles de rayons et de couleurs également aléatoires :
~~~python
from turtle import * 
from random import randint
def couleur_alea(c):
    # à compléter
couleur = ["red", "yellow", "green", "blue", "purple", "navy", "lime", "maroon", "olive", "gray", "black","teal","fuchsia", "white", "silver"]
rayonMax = 400
largeur = 2 * rayonMax
hauteur = 2 * rayonMax
screensize(largeur, hauteur)
speed(0)      
shape("turtle") 
pensize(2)    
for i in range(randint(10, 50)):
    delay(100)     #pause  de 100 millisecondes
    # à compléter
    delay(100)
mainloop()
~~~
End of explanation
# Cellule de code pour répondre à l'exercice 19 
Explanation: La boucle while ou boucle conditionnelle
Définition 4
Généralement, on souhaite répéter un bloc d'instructions tant qu'une condition est réalisée mais on ne sait pas à l'avance combien de répétitions seront nécéssaires.
La situation la plus courante est :
Tant Que Condition répéter
    Bloc d'instructions
Fin Tant Que
Elle se traduit en Python par :
~~~python
flux parent
while condition:
    # bloc d'instructions indenté
retour au flux parent
~~~
Par exemple, pour demander la saisie d'un login jusqu'à une saisie correcte, on peut écrire :
~~~python
login = 'moi'
saisie = input('Login ?')     # initialisation de la condition d'entrée de boucle
while saisie != login:        # test d'entrée de boucle
    saisie = input('Login ?') # mise à jour de la condition de boucle
print('Bienvenue ', login)    # sortie de boucle
~~~
Évidemment, on peut aboutir à une boucle infinie si la condition d'entrée de boucle n'est jamais vérifiée. 
On peut prévoir des conditions plus complexes avec des opérateurs booleens.
Par exemple si on veut limiter à 10 demandes de login, on peut écrire :
~~~python
login = 'moi'
compteur = 1
saisie = input('Login ?')     # intialisation de la condition d'entrée de boucle
while compteur < 10 and saisie != login:        # test d'entrée de boucle
    saisie = input('Login ?') # mise à jour de la condition de boucle
    compteur = compteur + 1   # mise à jour du compteur
if compteur == 10 and saisie != login:
    print('10 tentatives de login échouées')
else:
    print('Bienvenue ', login)    # sortie de boucle
~~~
Enfin remarquons que toute boucle for peut s'écrire avec une boucle while :
~~~python
somme = 0
for k in range(100, 201):
    somme = somme + k
print("La somme est ", somme)
~~~
peut ainsi s'écrire :
~~~python
somme = 0
k = 100
while k < 201:
    somme = somme + k
    k = k + 1
print("La somme est ", somme)
~~~
Exercice 19
Dans cet exercice on n'utilisera ni la fonction <code>int</code> de conversion en entier, ni la fonction <code>sqrt</code> du module <code>math</code>
Écrire une fonction intSquareFloor(n) qui retourne le plus petit entier $p$ tel que $p^2 > n$. 
Écrire une fonction intSquareFloor2(n) qui retourne le plus grand entier $p$ tel que $p^2 \leqslant n$.
End of explanation
# Cellule de code pour répondre à l'exercice 20
Explanation: Exercice 20
On lance successivement un dé cubique équilibré à 6 faces numérotées de 1 à 6 jusqu'à obtenir un 6.
  Recopier et compléter la fonction premier6() ci-dessous pour qu'elle retourne le rang du premier 6.
~~~python
from random import randint
def premier6():
    de = randint(1, 6)
    rang = 1
    # while à compléter
        # bloc du while
    return rang
~~~
On répète un grand nombre n de fois l'expérience qui consiste à lancer un dé cubique jusqu'à obtenir un premier 6, compléter le programme précédent avec une fonction rangMoyen(n) qui retourne le rang moyen du premier 6 sur cet échantillon de taille n.
~~~python
def rangMoyen(n):
    sommeRang = 0
    for k in range(n):
        # à compléter
    return sommeRang / n
~~~
End of explanation
<END_TASK>