Lycée Maximilien Sorre BTS SIO 1 Année 2016-2017 Algorithmique 1 Introduction 1.1 Algorithmes Le mot algorithme vient du nom du mathématicien et astronome Al Khuwarizmi (latinisé au Moyen Âge en Algoritmi), qui, au IXe siècle écrivit le premier ouvrage systématique sur la solution des équations linéaires et quadratiques. Dénition. Un algorithme est une suite nie d'opérations ou d'instructions à appliquer dans un ordre déterminé à un nombre ni de données pour résoudre un problème en un nombre ni d'étapes. Exemples. • • On peut trouver des exemples d'algorithmes dans la vie courante : recette de cuisine, notice de montage de meuble. Remarque. Dans le domaine informatique, les algorithmes sont une suite nie d'instructions écrites dans un langage informatique permettant de demander à l'ordinateur de résoudre un problème donné. 1.2 Langages informatiques Le langage est ce qui permet à deux humains de communiquer. Si nous nous comprenons, c'est parce que nous appliquons un ensemble de règles qui dénit notre langage (en français, les règles d'orthographe et de grammaire). L'ordinateur a son propre langage, avec ses propre règles. Le langage de l'ordinateur est le langage binaire, qui est composé uniquement de 0 et de 1. Exemple. On peut par exemple traduire le mot Bonjour (codage UTF-8) par le code binaire 01000010011011110110111001101010011011110111010101110010 . Bien sûr, cela ne serait pas très pratique d'écrire directement nos algorithmes en binaire. C'est pour cela que pour communiquer avec la machine, on a recours à ce que l'on appelle un langage informatique (comme par exemple Python, C, C++, etc). Les algorithmes sont écrits dans un langage informatique, et un programme se charge ensuite de traduire ces algorithmes en langage binaire compréhensible par la machine. Durant l'année, nous allons utiliser deux langages pour nos algorithmes : • un langage naturel, peu formel, exprimé en français ; ce langage est aussi appelé • le langage informatique nommé code. Remarque. pseudo- Python. En général, on comprend quelqu'un même si il fait des fautes d'orthographe ou de grammaire. Attention, l'ordinateur lui n'est qu'une machine. Si on ne respecte pas les règles du langage informatique utilisé, l'ordinateur ne comprendra pas. 1 1.3 Python Python est un langage informatique multi-plateforme placé sous licence libre et utilisé dans de nombreux milieux (en particulier dans le domaine scientique et dans de nombreuses entreprises). Python a été crée en 1989 par le programmateur Guido van Rossum, fan de la série télévisée des Monty Python (d'où le nom Python ). Durant l'année, nous allons utiliser la version 3 de Python (les exemples donnés dans ce document sous formulés avec la version Python 3.4.0). Pour faciliter l'écriture d'algorithmes, nous allons travailler dans un environnement de développement intégré (en anglais IDE, pour Integrated Development Environment). Plusieurs environnements de programmation existent. Par exemple • Idle 3 est l'environnement classique, qui est presque toujours installé avec Python (fonc- tionne sous Windows, Linux et Mac OS). • Le pack Python portable contient une version de Python, l'environnement de programma- tion PyScripter et plusieurs bibliothèques Python. Ce pack peut être copié sur clé USB et exécuté sans installation sur l'ordinateur. Le téléchargement se fait à l'adresse : http://portablepython.com/wiki/PortablePython3.2.5.1/ L'avantage de ce pack est qu'il permet d'avoir un environnement Python familier où que l'on soit pourvu de ne pas oublier sa clé USB. L'un de ses inconvénients est qu'il ne fonctionne que sous Windows. • Spyder est un environnement sous licence libre relativement proche de ce que fournit le pack Python portable. Il fonctionne sous Windows, Linux et Mac OS. Téléchargement du pack Anaconda contenant Spyder et des bibliothèques Python à l'adresse : http://continuum.io/downloads En général, les environnements de programmation sont constitués de plusieurs zones, notamment : • un interpréteur dans lequel on saisit des instructions en Python. L'interpréteur les traduit en langage machine, puis traduit la réponse fournie par la machine en Python, et ache cette réponse. Le symbole >>> signie que l'interpréteur est prêt à recevoir une instruction. Les instructions sont traitées directement, une par une. • un éditeur de texte, dans lequel on écrit les algorithmes (dans un chier ayant l'exten- sion .py). Une commande permet ensuite d'envoyer tout le contenu du chier en cours à l'interpréteur (bouton avec un triangle vert dans PyScripter et Spyder). 2 Exemple. Avec PyScripter : Exemple. Avec Spyder : 3 1.4 Premiers exemples d'instructions Dans la suite de ce document, nous allons donc apprendre à communiquer avec l'ordinateur. Faisons donc une première tentative (à taper dans l'interpréteur) : >>> Bonjour Python ! Remarque. Les trois chevrons (>>>) sont ceux qui apparaissent dans l'interpréteur et ne sont pas à taper. À notre Bonjour Python ! , Python répond : SyntaxError: invalid syntax Cela veut tout simplement dire que Python ne comprend pas ce qu'on lui demande. Mais alors, que comprend Python ? Python comprend plusieurs types de données. En particulier, nous travaillerons avec : • • • • • des entiers (int ou integer), des nombres réels (oat) (attention, la virgule est représentée par un point en Python), des booléens (bool ou boolean), des chaînes de caractères, écrites entre guillemets (str ou string), des listes (list). Par exemple, si on tape : >>>"Bonjour" Python répond : `Bonjour' Et si on tape : >>> 8 Python répond : 8 Python comprend de quoi on parle, mais comme on ne lui a rien demandé de faire, il se contente de répéter ce qu'on lui dit. Demandons par exemple à l'ordinateur de faire des calculs et voyons ce qu'il répond : >>> >>> >>> >>> 1+1 10-3 29*61 12/4 Pour la puissance, on utilise le symbole **. Par exemple pour calculer 210 : >>> 2**10 Exemple. Deux exemples importants d'opérations que Python sait faire sont le calcul du quotient et du reste d'une division euclidienne. Le quotient (ou partie entière de la division) // et le reste est donné par l'opération que l'on appelle modulo , %. Par exemple 13 = 3 × 4 + 1, donc : est donné par le symbole donnée par le symbole >>> 13//3 va retourner : >>> 13%3 va retourner : 4 1 Remarque. Dans le cas de nombres réels, l'instruction x//n renvoie la partie entière de x/n. 4 Remarque. Attention, les calculs avec des nombres réels (ottants) donnent parfois des résultats approximatifs à cause de la façon dont sont stockés ces nombres en Python (essayez par exemple de calculer 3.11 + 2.08). En général ces approximations sont très bonnes n'ont pas d'impact sur les résultats naux des algorithmes. En plus des opérations décrites ci-dessus, Python dispose de fonctions toutes faites, que l'on utilise en inscrivant le nom de la fonction, suivi des paramètres de la fonction mis entre parenthèses. Par exemple : >>>min(2,3) >>>max(5.1,1) Certaines fonctions ne sont pas reconnues de base par Python, comme par exemple la racine carrée. Pour que Python ait accès à ces fonctions, il faut lui dire d'aller les chercher dans une bibliothèque. Par exemple la fonction racine carrée (sqrt en Python) est dans la bibliothèque math . Pour utiliser la fonction racine carrée, on commence par importer les fonctions de la bibliothèque math : >>> from math import * Le symbole * signie qu'on veut importer toutes les fonctions de la bibliothèque math. On peut aussi n'importer qu'une fonction, par exemple la fonction sqrt : >>> from math import sqrt Exemples. >>> >>> >>> >>> >>> Quelques fonctions de la bibliothèque math : from math import * sqrt(4) pow(5,2) abs(-3) floor(3.1) Remarque. # # # # # importation de la bibliothèque math racine carrée équivaut à 5**2, c'est-à-dire 52 valeur absolue partie entière Pour obtenir de l'aide sur les fonctions d'une bibliothèque, et la liste de ces fonctions, utiliser la commande help. Par exemple pour la bibliothèque math : >>> help("math") Exemples. Quelques fonctions de la bibliothèque random permettant de générer des nombres pseudo aléatoires : >>> from random import * >>> random() >>> randint(1,10) Remarque. # importation de la bibliothèque random # génère un nombre réel aléatoire entre 0 et 1 # génère un entier aléatoire entre 1 et 10 Pour apprendre l'algorithmique, il faut être curieux et ne pas hésiter à essayer. Si Python n'arrive pas à terminer l'opération que vous lui demandez d'eectuer (si le symbole >>> n'apparaît pas dans l'interpréteur), cliquer sur le bouton d'interruption (bouton avec un carré) ou appuyer simultanément sur la touche Ctrl et sur la touche c devrait interrompre le calcul en cours. 5 1.5 Éditeur de texte Comme on l'a vu, lorsqu'on tape une instruction dans l'interpréteur, celle-ci est directement exécutée. En revanche, cette instruction n'est pas gardée en mémoire, et on la perd si l'on quitte Python. C'est pour cela que l'on a recours à un éditeur de texte : les instructions successives sont tapées dans un chier texte d'extension .py que l'on sauvegarde régulièrement. Cela permet de modier à tout moment nos programmes, de les diuser ou d'y faire appel ultérieurement. La première étape est de créer un nouveau chier et de le sauvegarder, par exemple sous le nom ``exemple1.py''. Vous pouvez maintenant taper vos diérentes instructions dans le chier, puis envoyer ces instructions à l'interpréteur à l'aide de la commande exécuter. Remarque. Il est vivement conseillé de conserver tous les chier écrits au cours de l'année sur une clé USB. Remarque (très importante). bole # Pour commenter le rôle des instructions, on utilise le sym- suivi de notre commentaire (sur une seule ligne). Le texte suivant le symbole # n'est pas pris en compte par l'interpréteur, et ne sert qu'à fournir des informations utiles à la compréhension des programmes. Dans Pyscripter, on peut mettre en commentaire une portion du texte en sélectionnant celle-ci et en cliquant sur le bouton commenter . En cliquant une deuxième fois sur le bouton, on fait la manipulation inverse. Exemple. Reproduire dans l'éditeur de texte l'algorithme suivant, puis l'exécuter (les nombres sur le côté gauche ne sont pas à reproduire, ils servent uniquement à se repérer plus facilement lors de la lecture de ce document) : 1. 2. 3. 4. 5. 6. # Algorithme : premier exemple # Rôle : ne sert à rien print(Premier exemple d'algorithme) # cette instruction affiche un message 1+2 # cette instruction calcule 1+1, mais n'affiche rien ! print(1+2) # si l'on veut afficher, il faut utiliser la commande print 6 1.6 Formalisme Pour pouvoir utiliser un algorithme qu'un autre a écrit (ou que l'on a écrit il y a longtemps), il faut comprendre parfaitement la façon dont il fonctionne et ce qu'il fait. C'est pourquoi il est indispensable de faire en sorte que les algorithmes que l'on écrit soient compréhensibles par tous. L'objectif de cette partie est de mettre en place des normes d'écritures an de rendre les algorithmes plus lisibles. Remarque. Le respect du formalisme est pris en compte dans la notation de l'épreuve d'al- gorithmique. En général, un algorithme comporte trois parties : Le titre 1) et si possible une brève description du rôle de l'algorithme (en particulier si l'algorithme est long). Le titre doit être choisi intelligemment ! La déclaration des variables, qui consiste à préciser le nom des variables utilisées ainsi 2) que leur type (voir partie 1.7). Les instructions, qui constituent le corps de l'algorithme. 3) Exemple. En pseudo-code, cela donne : 1. Algorithme : Affichage dix pour cent 2. Rôle : affiche 10% d'un nombre fourni par l'utilisateur 3. Variables : numériques : quantite, dix_pour_cent_de_quantite 4. 5. DEBUT 6. Saisir : quantite 7. dix_pour_cent_de_quantite ← 0.1 * quantite 8. Afficher : dix_pour_cent_de_quantite 9. FIN Remarque. En pseudo-code, on indique clairement le début et la n du corps de l'algorithme, et le corps de l'algorithme est écrit en retrait (indentation). Remarque. • La déclaration des variables est indispensable dans certains langages (par exemple en C), et on le fait toujours en pseudo-code. • En revanche en Python, on ne déclare pas les variables. Si l'algorithme est long, on peut néanmoins mettre en commentaire des informations sur les variables. Exemple. 1. 2. 3. 4. 5. 6. L'algorithme précédent donne en Python : # Algorithme : Affichage dix pour cent # Rôle : affiche 10% d'un nombre fourni par l'utilisateur quantite = float(input("Veuillez indiquer une quantité")) dix_pour_cent_de_quantite = 0.1 * quantite print("10% de la quantité indiquée valent",dix_pour_cent_de_quantite) 7 2 Variables 2.1 Ce qu'est une variable Pour concevoir un algorithme il est (quasiment) indispensable d'utiliser ce que l'on appelle des variables. Une variable est un emplacement dans la mémoire de l'ordinateur auquel est donné un nom, et dans lequel est stockée une valeur. On se sert de ce nom pour accéder à son contenu ou le modier. Remarque. Le nom d'une variable est laissé au choix du concepteur de l'algorithme. Attention : il doit néanmoins respecter certaines règles : • • • Il doit commencer par une lettre et ne pas comporter d'espace. On évitera rigoureusement les noms avec accent en Python. Python est sensible à la casse : la variable nom_de_variable et la variable Nom_De_Variable ne sont pas les mêmes. • Il est très important de donner des noms de variable qui permettent de retrouver ce que la variable contient. Par exemple si je veux créer une variable qui contient un âge, je ne l'appelle pas toto, ou x, mais age. Une variable peut être : • numérique s'il s'agit d'un nombre, par exemple un nombre entier (int en Python) ou d'un nombre réel (oat en Python) • alphanumérique s'il s'agit d'une succession de symboles, par exemple des mots, des phrases. C'est le cas par exemple des chaînes de caractère (str en Python) • booléenne si elle vaut VRAI (représenté par un 1) ou FAUX (représenté par un 0). Un booléen se note bool en Python. Remarque. Pour connaître la classe d'une variable en Python, on utilise la commande type. Par exemple : >>> annee=2014 >>> type(annee) Python répond : <class `int'> ce qui signie que la variable annee est du type 8 int. 2.2 Aectation d'une variable 2.2.1 En pseudo-code Dénition. L'aectation est une opération permettant de dénir la valeur initiale d'une variable (on parle alors d'initialisation), puis de modier la valeur de cette variable. En pseudo-code, on note : nom_variable ← valeur où : • < nom_variable > est le nom de la variable dont on souhaite • < valeur > est la valeur que l'on veut placer dans la variable. Exemple. Si on veut aecter à la variable A modier la valeur, la valeur 5, on écrit : A←5 Remarque. On peut aecter à une variable la valeur d'une autre variable. cela, la variable apparaissant à droite B←3 A←B A←B+2 Attention, pour doit avoir été initialisée au préalable. Par exemple : Attention ! L'aectation A ← B est un peu la même chose que de faire un copier-coller. Cela ne veut pas dire que dorénavant A et B auront la même valeur, mais que la valeur contenue dans A est écrasée par la valeur contenue dans B au moment de l'aectation. Remarque. On peut aussi mettre la même variable à droite et à gauche. Par exemple : A ← 10 A ← A × 30 Après la deuxième aectation, Dénition. A vaut 10 × 30 = 300. On appelle incrémentation l'opération (très courante) consistant à ajouter 1 à une variable. Par exemple : A ← A + 1. Exercice 1. Sur feuille, représenter dans un tableau les valeurs des variables A, B, C et D après chacune des opérations suivantes (on notera NI si la variable n'a pas été initialisée) : 1. A←1 2. B←2 3. C←5 4. D←A 5. A←A+1 6. B ←D+C 7. C ←D+1 9 2.2.2 En Python Pour aecter une valeur à une variable en Python, on utilise le symbole ← = à la place du symbole utilisé en pseudo-code. Remarque. Même si en mathématiques A = B veut dire la même chose que B = A, en informatique, et en particulier en Python, on fera toujours très attention à mettre la variable dont on veut changer la valeur à gauche, et la valeur que l'on veut donner à cette variable à droite. Exemple. 1. 2. 3. 4. 5. 6. 7. 8. Reproduire et tester l'algorithme suivant en Python # Algorithme : age de Bob annee = 2015 annee = annee +1 print(annee) annee_de_naissance_de_bob = 1901 age_de_bob = annee - annee_de_naissance_de_bob print(age_de_bob) 2.3 Lecture et écriture de variables L'ordinateur peut interagir avec l'utilisateur de deux façons diérentes : l'ordinateur peut lire un texte ou une valeur saisie par l'utilisateur (entrée), et l'ordinateur peut acher du texte ou le contenu d'une variable (sortie). 2.3.1 Lecture La saisie permet de transmettre une information à l'ordinateur par l'intermédiaire du clavier et de la stocker dans la mémoire pour pouvoir la réutiliser. • En pseudo-code, on écrit Saisir nom_variable • : En Python, on utilise la commande input, et on précise en paramètre de cette commande (entre parenthèses) une chaîne de caractère que l'ordinateur va acher. Exemple. Donnons à Python l'instruction suivante : >>> nom = input("Quel est votre nom ?") Python va alors acher : Quel est votre nom ? Il faut alors saisir une réponse, par exemple Bob : Python va alors enregistrer notre réponse dans la variable nom . On peut vérier cela en demandant à Python ce que vaut cette variable : >>> print(nom) 10 Remarque (très importante). Si on ne précise rien, la valeur fournie par l'utilisateur à l'aide de la commande input est une chaîne de caractère (str en Python) : >>> age = input("Quel est votre âge ?") Si on saisit (par exemple) 2, la valeur saisie est stockée dans la variable age que l'on peut acher : >>> print(age) Python va alors acher : `2' (Remarquez que 2 est écrit entre guillemets). Si on demande le type de la variable age : >>> type(age) Python va acher : <class 'str'> (la variable age est donc une chaîne de caractères) Attention, Python ne gère pas les entiers et les chaînes de caractères de la même façon, et si on ne fait pas attention, on peut avoir de mauvaises surprises. Par exemple si on demande : >>> print(age*2) Python va acher : `22' Pour forcer par exemple la variable age à être un entier, on ajoute une opération de transtypage, qui permet ici de transformer la chaîne de caractères en un entier. Pour trans- former une variable en une variable de type int, on utilise la fonction int avec comme argument la variable à transformer. Exemple. 1. 2. 3. 4. 5. 6. 7. Reproduisez l'algorithme suivant : # Algorithme : saisie d'une variable entière age_str = input("Quel est votre âge ?") age = int(age_str) print(age) print(type(age)) print(age*2) # cette fois-ci, on obtient le resultat voulu Exercice 2. Écrire une commande permettant de demander à l'utilisateur sa taille, et d'en- registrer cette donnée dans une variable de type float. 2.3.2 Écriture Les sorties sont les informations transmises par l'ordinateur à l'utilisateur. • En pseudo-code, on écrit par exemple : Afficher Bonjour ! • En Python, on utilise la commande print, et on précise en argument de cette commande ce que l'ordinateur va acher. Exemple. Instruction Acher la chaîne de caractères Bonjour ! Pseudo-code Afficher Afficher A Acher le contenu de la variable A Remarque. Bonjour ! Python print("Bonjour !") print(A) Attention à bien distinguer une chaîne de caractères, écrite entre guillemets, et une variable, écrite sans guillemets 11 Remarques. • Pour acher des guillemets dans une chaîne de caractères, >>> print("Bob a dit : \"Je m'appelle Bob. \"") on utilise \", par exemple : On peut aussi passer à la ligne dans une chaîne de caractère, avec le symbole • La commande print \n. permet d'acher plusieurs chaînes de caractères ou contenus de variables sur une même ligne. Il sut pour cela de séparer les diérentes choses à acher par des virgules. Par exemple : >>> print("1+1 =",1+1) Exemple. Reproduire et tester l'algorithme suivant : 1. # Algorithme : Affichage de l'age de Bob 2. 3. age_de_bob = int(input("Quel âge a Bob ?")) 4. print("Bob a",age_de_bob,"ans.") 2.4 Exercices Remarque. À partir de maintenant, sauf si on veut tester rapidement l'eet d'une commande simple, nous écrirons nos instructions dans l'éditeur de texte. Une fois que touts les instructions voulues sont écrites, on les envoie à l'interpréteur à l'aide du bouton Exécuter ou Run de l'éditeur de texte (triangle vert dans PyScripter et Spyder). Exercice 3. Une épicerie vend de la farine à 1 euro le kilo, et des tablettes de chocolat à 2,5 euros. Écrire une suite d'instruction demandant à un client combien de kilos de farine (nombre réel, pas nécessairement entier) et combien de tablettes de chocolat (nombre entier) il désire, et qui ache le prix qu'il devra payer. Exercice 4. Bob veut acheter des livres qui coûtent 5 euros chacun. Écrire une suite d'ins- tructions pour 1) demander à Bob combien il a, 2) dire a Bob combien il peut acheter de livres au maximum, 3) dire a Bob combien il lui restera. Exercice 5. Bob part en voyage aux États-Unis. a) Écrire en pseudo-code un algorithme qui demande de saisir une somme en euros, qui convertit cette somme en dollars (1 euro vaut environ 1,13 dollars), et qui ache le résultat. b) Programmer l'algorithme de la question (a) en Python. c) Bob veut ramener des chapeaux de cowboy de son voyage. Il trouve des chapeaux à 3,99 dollars pièce. Compléter l'algorithme précédent en achant combien de chapeaux pourront être achetés au maximum avec la somme saisie. Exercice 6. a) Écrire en pseudo-code un algorithme qui demande de saisir une somme en centimes, puis qui donne le nombre de pièces minimal de 2 centimes et 1 centime nécessaires pour payer cette somme. Par exemple si l'utilisateur saisit 17 centimes, l'ordinateur achera : 8 pièces de 2 centimes et 1 pièce de 1 centime. b) Implémenter en Python l'algorithme précédent, puis le modier pour qu'il donne la décomposition de la somme en pièces de 1, 2, 5, 10, 20 et 50 centimes. 12 3 Fonctions et procédures 3.1 Fonctions prédénies et modules Les fonctions sont un concept très important en programmation. Elle permettent notamment de décomposer un programme complexe en sous-programmes plus simples et d'améliorer ainsi la lisibilité d'un algorithme. En Python, il existe un certain nombre de fonctions prédénies. Pour utiliser ces fonctions, on met le nom de la fonction, suivi des paramètres (ou arguments) de la fonction mis entre parenthèses. Les paramètres, si il y en a plusieurs, sont séparés par des virgules. Exemple. 1. 2. 3. 4. min et type m = min(3.1,5) print(m) t = type(42) print(t) sont des fonctions. Exemples d'utilisation : Il existe un très grand nombre de fonctions prédénies en Python. Très peu de ces fonctions sont directement chargées en mémoire. Les autres sont regroupées dans des chiers que l'on appelle modules l'instruction import ou bibliothèques. Pour charger ces modules en mémoire, on utilise (voir l'exemple ci-dessous). Exemple. Pour utiliser la fonction randint de la bibliothèque random, on peut utiliser l'instruction • import de plusieurs façons diérentes : Méthode 1 : en important la fonction voulue depuis (from en anglais) la bibliothèque dans l'espace de noms principal : 1. from random import randint 2. nb = randint(0,10) 3. print(nb) • Méthode 2 : en important toutes les fonctions de la bibliothèque dans l'espace de noms principal : 1. from random import * 2. nb = randint(0,10) 3. print(nb) Attention, si une fonction de l'espace de noms principal a le même nom que l'une des fonctions importées, cette première fonction sera écrasée par l'opération d'importation. • Méthode 3 : en important toutes les fonctions de la bibliothèque dans un sous-espace de l'espace de noms principal. Pour utiliser les fonctions de la bibliothèque, il faut alors spécier l'espace de noms dans lequel elles ont été chargées. Par défaut, ce nom est le nom de la bibliothèque : 1. import random 2. nb = random.randint(0,10) 3. print(nb) On peut aussi choisir un nom tout autre (ci-dessous bob) : 1. import random as bob 2. nb = bob.randint(0,10) 3. print(nb) Remarque. Pour obtenir la liste des fonctions contenues dans une bibliothèque, on utilise la help. help("random") commande Par exemple : 13 3.2 Création de fonctions et procédures 3.2.1 Premier exemple Si on utilise régulièrement la même portion de code, on peut en faire une fonction que l'on pourra ensuite utiliser à volonté. De même, si un algorithme est très long, on peut faciliter sa lecture en le décomposant en sous-programmes simples, chacun de ces sous-programmes étant matérialisé par une fonction. Exemple. par 1. 2. 3. 4. Imaginons par exemple que l'on ait régulièrement besoin de la fonction f dénie f (x) = x2 + 5x + 3. On peut alors créer en Python une fonction f de la façon suivante : def f(x): """Fonction f : f(x) renvoie x*x + 5*x + 3""" res = x*x + 5*x + 3 return res Une fois dénie, on peut utiliser la fonction 5. 6. 7. 8. f de la façon suivante : y = f(4) print(y) print("f(3) vaut : ", f(3)) print("f(15,1) vaut : ", f(15.1)) Remarque. La première ligne de la fonction est l'aide de la fonction. On peut acher cette ligne dans l'interpréteur avec l'instruction >>> help(f) help : 3.2.2 Cas général Pour dénir une fonction, on utilise la syntaxe suivante : • En pseudo-code : 1. 2. 3. 4. 5. 6. 7. • Fonction nom_fonction(parametre_1, parametre_2, ...) : Variables locales : ... DEBUT Fonction instructions Retourner : valeur_1, valeur_2,... FIN Fonction En Python : 1. def nom_fonction(parametre_1, parametre_2, ...) : 2. """Aide de la fonction""" 3. instructions 4. return valeur_1, valeur_2,... 14 Remarques. • Par convention (en cours d'algorithmique uniquement), nous ferons commencer le nom de nos fonctions par une majuscule et le nom des variables par une minuscule. • Les parenthèses après le nom de la fonction sont obligatoires. Si une fonction ne nécessite pas de paramètres, on ne met rien entre les parenthèses. • En Python, on commence en général la fonction par une ligne de documentation écrite entre triples guillemets (on parle de docstrings). Cette ligne n'est pas obligatoire, mais documenter ses fonctions est une bonne habitude à prendre. • L'instruction Retourner ou return précède la liste des valeurs renvoyées return ne sont pas eectuées. par la fonction. Attention, les instructions après le • En général, on utilise une fonction en aectant la valeur renvoyée par celle-ci à une va- riable : a = fonction(parametres) Par exemple : a = input("Veuillez saisir quelque chose") • Une fonction peut ne rien renvoyer. On parle alors de procédure. Dans une procédure, on ne met donc pas d'instruction Retourner ou return. Évidemment, on ne peut pas aecter le résultat d'une procédure à une variable (puisque celui-ci n'existe pas). Pour utiliser une procédure, on utilise la syntaxe suivante : procedure(parametres) Exemple. La fonction Python print est en fait une procédure. print ache du texte ou la valeur de variables, mais ne renvoie aucun résultat. Par exemple l'instruction : >>> a = print("1") n'aecte aucune valeur à la variable >>> print(a) a : L'utilisation correcte de print est la suivante : >>> print("1") Exemples. • Fonction cube : 1. def cube(x) : 2. """cube(x) renvoie le cube de x""" 3. res = x*x*x 4. return res Utilisation : 5. a = cube(3) 6. print(a) • Procédure achage de la somme de deux nombres : 1. def aff_somme(x,y) : 2. """aff_somme(x,y) affiche la valeur de x+y""" 3. print(x,"+",y," vaut : ",x+y) Utilisation : 4. aff_somme(3,2) 15 • Fonction (inutile) renvoyant 42 : 1. def reponse() : 2. """fonction sans argument renvoyant 42""" 3. return 42 Utilisation : 4. a = reponse() 5. print(a) 3.3 Structure générale d'un algorithme Lorsqu'on construit un algorithme, on met en premier les importations de bibliothèques, puis on met les sous-programmes, avant de mettre l'algorithme principal. Exemple. Lors d'un jeu, on lance trois fois un dé à 6 faces, le score vaut la racine carrée de la somme des trois lancers. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. # Algorithme : score au dé # Importations : from random import * from math import * # Fonctions : def lancer(n) : """Simule un lancer de dé à n faces""" de = randint(1,n) print("Vous obtenez : ",de) return de # Main : score = sqrt(lancer(6) + lancer(6) + lancer(6)) print("Votre score : ", score) 3.4 Variables locales et variables globales Dénitions. • Lorsque des variables sont dénies à l'intérieur d'une procédure ou d'une fonction, elles ne sont accessibles que pour cette dernière. On dit que ce sont des variables locales. Les paramètres d'une fonction sont également des variables locales. • Les variables dénies à l'extérieur d'une procédure ou d'une fonction sont appelées va- riables globales. Elles sont accessibles à l'intérieur des sous-programme. On peut également dénir une variable globale à l'intérieur d'une fonction à l'aide de l'instruction Remarque. global. Les variables locales dénies dans une fonction (ou une procédure) seront sup- primées de la mémoire après exécution de la fonction. 16 Exemples. • Exemple 1 : 1. 2. 3. 4. 5. • x = 5 def affiche(x): print(x) affiche(3) print(x) # la variable globale x n'a pas été modifiée Exemple 2 : 1. 2. 3. 4. 5. 6. • On pourra tester les instructions en Python suivantes : x = 5 def affiche(): x=3 # création d'une variable locale print(x) affiche() print(x) # la variable globale x n'a pas été modifiée Exemple 3 : 1. x = 5 2. def affiche(): 3. print(x) # Affiche la variable globale x 4. affiche() • Exemple 4 : 1. 2. 3. 4. 5. 6. 7. x = 5 def affiche(): global x x = 3 # Affectation de la valeur 3 à la variable globale x print(x) affiche() print(x) # la variable globale x a été modifiée Remarque. Pour éviter toute confusion, on donnera des noms distincts aux variables locales et globales, bien que cela ne soit pas nécessaire à la bonne marche de l'algorithme. 3.5 Récursivité Les fonctions disposent d'une particularité très intéressante : la récursivité quand une fonction fait appel à elle-même. Exemple. La procédure ci-dessous est récursive : 1. def decompte(n): 2. """Fonction décompte ! """ 3. print(n) 4. if n>0: 5. decompte(n-1) 6. 7. # test : 8. decompte(10) 17 récursivité. On parle de Remarque. Attention, l'utilisation de fonction récursives peut donner lieu à une exécution innie. Pour éviter cela, il faut toujours faire attention à ce que la fonction se termine dans tous les cas. Il faut en particulier toujours penser à Exemple. 4. spécier les valeurs de départ. Dans l'exemple précédent, remplacer les lignes 4 et 5 par : decompte(n-1) Tester cette nouvelle fonction. Cela devrait provoquer une erreur. 3.6 Exercices Exercice 7. Écrire en pseudo-code et en Python une fonction prenant en paramètres d'entrée deux nombres réels et retournant leur produit. Exercice 8. Écrire en Python une procédure prenant en paramètres d'entrée une phrase et achant 3 fois la phrase. Exercice 9. La température en degrés Fahrenheit est égale à 32 plus 1,8 fois la température en degrés Celsius. a) Écrire en pseudo-code et en Python une fonction prenant en paramètre une température en degrés Celsius et renvoyant cette température en degrés Fahrenheit. b) Écrire une fonction faisant la conversion inverse. Exercice 10. Écrire en pseudo-code et en Python une procédure conv_duree prenant en paramètre une durée en secondes puis achant cette même durée en heures, minutes et secondes. Par exemple conv_duree(7422) ache "2 heures, 3 minutes et 42 secondes". Exercice 11 (jeu de calcul mental). Écrire en pseudo-code et en Python une fonction prenant en paramètre un entier n et qui : • tire au hasard deux entiers, notés x et y, entre 1 et n, • ache ces deux entiers, • demande de saisir le produit de ces deux entiers et stocke le resultat dans une variable reponse, • calcule puis ache la variable erreur, valant la valeur absolue de (reponse - x * y), • retourne erreur. Exercice 12. On rappelle que le PGCD de deux entiers r est le reste de la division euclidienne de deux entiers a et b et renvoyant le PGCD a et b est égal au PGCD des deux entiers b et r où a par b. Écrire une fonction prenant en argument de a et b. La fonction pourra être récursive. 18 4 Les structures conditionnelles 4.1 Un premier exemple Exemple. L'algorithme suivant, donné en pseudo-code puis en Python, contient une structure conditionnelle. • En pseudo-code : 1. Algorithme : compare à 10 2. Variable numérique : nombre 3. 4. 5. 6. 7. 8. 9. • DEBUT FIN Saisir : nombre SI nombre > 10 ALORS : Afficher : "Le nombre choisi est plus grand que 10" FINSI En Python : 1. # Algorithme : compare à 10 2. 3. nombre = float(input("Choisissez un nombre : ")) 4. if nombre > 10 : 5. print("Le nombre choisi est plus grand que 10") Exercice 13. Que fait l'algorithme ci-dessus ? Tester son exécution en Python. 4.2 Si, Alors La structure conditionnelle de base (on l'appelle la structure Si, Alors ) fonctionne de la façon suivante : si la condition est vraie, alors on exécute les instructions. Sinon, on passe à la suite de l'algorithme. Une structure conditionnelle Si, Alors s'écrit de la façon suivante : En pseudo-code : SI condition ALORS : instructions FINSI ... En Python : if condition : instructions ... Remarques. • En Python, il n'y a pas de ALORS. C'est le symbole : qui marque l'entrée dans le bloc d'instructions. • Dans tous les langages, les instructions d'une structure conditionnelle forment un bloc qui est décalé vers la droite. Ce décalage est appelé indentation. Sur un ordinateur, une indentation se forme à l'aide de la touche tab . • En pseudo-code, le décalage est esthétique, et ne sert qu'à rendre l'algorithme lisible. Mais en Python, ce décalage est indispensable. Essayez de ne pas décaler les instructions, ou de les décaler de deux crans, vous constaterez que l'algorithme ne fonctionne plus, ou plus comme prévu. 19 • En Python, il n'y a pas de FINSI. Pour marquer la n du bloc d'instructions et passer à la suite de l'algorithme, il sut d'arrêter de décaler les instructions. • On peut imbriquer plusieurs structures conditionnelles, à condition de décaler autant de fois que nécessaire. 4.3 Opérateurs de comparaison Les conditions qui apparaissent dans les structures conditionnelles sont exprimées à l'aide d'opérateurs de comparaison. Il y a six opérateurs de comparaison : • • =, 6=, <, ≤, >, ≥. ==, ! =, <, <=, >, >=. En pseudo-codes, ces opérateurs (bien connus) sont notés : En Python, ces opérateurs sont (dans le même ordre) : Exemples (à taper dans l'interpréteur en Python). >>> >>> >>> >>> >>> >>> 1==2 1!=2 1<2 40<=40 15>3 1>=2 # teste si 1 est égal à 2 # teste si 1 est différent de 2 Remarque. Les conditions qui apparaissent dans les structures conditionnelles peuvent prendre deux valeurs : Vrai ou Faux. Ce sont donc des booléens (type bool en Python). Rappel : les booléens sont au nombre de deux : Vrai ( True en Python) et Faux (False en Python). Exemple (à taper dans l'interpréteur en Python). >>> variable_booleenne = (1>1) >>> print(variable_booleenne) >>> type(variable_booleenne) Remarque. À partir de maintenant, le type booléen est à connaître. Il faut également savoir manier les variables booléennes. 4.4 Opérateurs booléens Pour éviter de devoir imbriquer des structures conditionnelles, on peut utiliser des conditions complexes basées sur des opérateurs booléens (ou opérateurs logiques). Exemple. On rappelle que l'eau est liquide entre 0 degrés et 100 degrés. On donne l'algorithme ci-dessous en pseudo-code : 1. 2. 3. 4. 5. 6. 7. 8. 9. Algorithme : Indicateur d'eau liquide Variable numérique : temperature DEBUT FIN Saisir : temperature SI temperature > 0 ET temperature < 100 ALORS : Afficher : "L'eau est liquide." FINSI 20 Exercice 14. Traduire en Python l'algorithme ci-dessus, puis le tester. Que fait l'algorithme ? Comme pour les nombres, il existe des opérations pour les booléens. Les deux opérateurs les plus importants sont donnés ci-dessous. Dénitions. • L'opérateur ET se traduit en python par and : (A ET B) est vrai si et seulement si à la fois A est vrai et B est vrai. • L'opérateur OU (ou inclusif ) se traduit en python par or : (A OU B) est faux si A est faux et B est faux, et (A OU B) est vrai tout le reste du temps. Remarques. • Le ET logique a la même signication que dans le langage courant. En revanche le OU logique est un OU inclusif alors que dans le langage courant, le OU est souvent exclusif (par exemple, dans fromage ou dessert , il faut choisir l'un ou bien l'autre). • Deux autres opérateurs booléens peuvent être utiles : il s'agit de la négation NON (not en Python) et du ou exclusif (le ou du langage courant cette fois-ci) OUX (∧ en Python). Exemples (à taper dans l'interpréteur en Python). >>> >>> >>> >>> (1<2) or (2<3) (1==1) and (1>150) not (24>=37) not (True and (40==12)) 4.5 Sinon, Sinon Si Pour éviter de devoir utiliser plusieurs structures conditionnelles à la suite, nous allons maintenant voir les structures conditionnelles plus riches que la structure Si, Alors . Exemple. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Algorithme : Indicateur de Variable numérique : age majorité DEBUT FIN Saisir : age SI age < 18 ALORS : Afficher : "Vous êtes mineur." SINON : Afficher : "Vous êtes majeur." FINSI Exercice 15. Traduire en Python l'algorithme ci-dessus, puis le tester. Que fait cet algorithme ? 21 La structure Si, Alors, Sinon permet de donner certaines instructions si la condition est satisfaite, et d'autres instructions si la condition n'est pas satisfaite. Cette structure se formalise de la façon suivante : En pseudo-code : SI condition ALORS : instructions SINON : autres instructions FINSI ... En Python : if condition : instructions else : autres instructions ... La structure Si, Alors, Sinon Si, Sinon est une version enrichie de la structure Si, Alors, Sinon permettant de distinguer le comportement de l'algorithme selon plusieurs conditions : si la première condition est satisfaite, on suit les instructions prévues dans ce cas (instructions 1). Sinon, on teste si la seconde condition est satisfaite. Si c'est la cas, on suit les instructions associées (instructions 2), et sinon, on passe à la condition suivante. Remarque. Il peut y avoir autant de conditions que l'on veut. Les conditions sont examinées dans l'ordre. Si l'une des conditions est satisfaite, alors on eectue les instructions correspondantes puis on sort de la boucle et les autres conditions de sont donc pas examinées. Si aucune condition n'est satisfaite, on suit les instructions écrites après le SINON (si il y en a un). Cette structure se formalise de la façon suivante : En pseudo-code : SI condition 1 ALORS : instructions 1 SINON SI condition 2 ALORS : instructions 2 SINON SI condition 3 ALORS : instructions 3 # etc... SINON : autres instructions FINSI ... En Python : if condition 1 : instructions 1 elif condition 2 : instructions 2 elif condition 3 : instructions 3 # etc... else : autres instructions ... 22 4.6 Exercices Exercice 16. Bob ne va à la plage que si l'une des deux conditions suivantes au moins est satisfaite : la température de l'air est supérieure à 25 degrés, la température de l'eau est supérieure à 20 degrés. Écrire en Python un algorithme demandant la température de l'eau et de l'air, et achant un message si Bob peut aller à la plage. Exercice 17. Écrire une fonction prenant en paramètres 2 nombres et retournant le plus grand des deux. Exercice 18. Le mot de passe est James-Bob. Écrire un algorithme qui demande à l'utilisateur le mot de passe, et qui ache un bip d'alarme si le mot de passe est incorrect. Exercice 19. Une place dans un cinéma coûte 5 euros pour les moins de 10 ans, 6 euros pour les moins de 18 ans et 8 euros pour les autres. Écrire une procédure prix qui prend en paramètre un âge et ache le prix correspondant. Exercice 20. Bob possède un sac qui contient 10 boules numérotées de 1 à 10 et telles que : les boules 1 et 2 sont blanches, les boules 3, 4 et 5 sont noires et les 5 autres boules sont rouges. Bob vous propose un jeu : vous devez parier sur une couleur, puis, il tire une boule au hasard, et si cette boule est de la couleur que vous avez choisie, vous avez gagné. a) Faire un algorithme qui tire au hasard le numéro d'une boule et qui ache sa couleur. Indice : on pourra utiliser la fonction randint de la bibliothèque random. b) Écrire un algorithme qui demande de choisir une couleur, qui tire une boule au hasard, et qui ache si vous avez gagné ou non. c) Transformer l'algorithme précédent en une procédure 23 jeu ne prenant aucun paramètre. 5 Les boucles 5.1 Premier exemple On veut acher la table de multiplication de 7, de 7×1 à 7 × 10. Un premier algorithme pour faire cela est l'algorithme suivant : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Algorithme : affichage de la table de 7 Variables : DÉBUT Afficher : "7 fois 1 =",7*1 Afficher : "7 fois 2 =",7*2 Afficher : "7 fois 3 =",7*3 Afficher : "7 fois 4 =",7*4 Afficher : "7 fois 5 =",7*5 Afficher : "7 fois 6 =",7*6 Afficher : "7 fois 7 =",7*7 Afficher : "7 fois 8 =",7*8 Afficher : "7 fois 9 =",7*9 Afficher : "7 fois 10 =",7*10 FIN Dans l'algorithme ci-dessus, on répète grosso modo dix fois la même instruction. Imaginons maintenant qu'on veuille aller jusqu'à 7 × 100. En suivant l'idée précédente, il faudrait alors écrire 100 instructions. Pour éviter cela, on a recours à une structure itérative (ou boucle). • En pseudo code, cela donne : 1. 2. 3. 4. 5. 6. 7. 8. 9. • Algorithme : affichage de la table de 7 Variable numérique : compteur DÉBUT compteur ← 1 TANT QUE compteur ≤ 100 : Afficher : "7 fois ", compteur, " = ", 7*compteur compteur ← compteur +1 FIN TANT QUE FIN En Python, cela donne : 1. # Algorithme : affichage de la table de 7 2. 3. compteur = 1 4. while compteur <= 100 : 5. print("7 fois ", compteur, " = ", 7*compteur) 6. compteur = compteur +1 Dénition. Une structure itérative (ou boucle) est une structure permettant d'exécuter plusieurs fois de suite un même bloc d'instructions. Il existe trois types de boucles : • • • Tant que Répéter . . .jusqu'à Pour 24 5.2 Structure Tant que La structure tant que permet de répéter un bloc d'instructions tant qu'une condition est satisfaite. Une telle structure se formalise de la façon suivante : En pseudo-code : En Python : 1. TANT QUE condition : 2. instructions 3. FIN TANT QUE 4. ... 1. while condition : 2. instructions 3. ... Lorsque l'on rencontre l'instruction Tant que dans un algorithme, on évalue la condition : • • si la condition est vériée, on eectue les instructions, si elle n'est pas vériée, on sort de la boucle, et on passe à l'instruction située après le Fin Tant que . Exemple. 1. 2. 3. 4. 5. 6. 7. 8. 9. L'algorithme ci-dessous ache les nombres de 1 à 5 : Algorithme : affichage de 1 à 5 Variable numérique : i DEBUT i ←1 TANT QUE i ≤ 5 Afficher : i i ← i+1 FIN TANT QUE FIN Quel rôle joue la variable i ? Remarque. Attention, si la structure Tant que est mal utilisée, l'exécution de l'algorithme peut ne jamais prendre n. Pour que l'exécution de la boucle Tant que se termine en temps ni, il faut qu'à un moment la condition devienne fausse. En particulier, lorsque l'on utilise un compteur, il faut penser à l'initialiser correctement, et à modier sa valeur à chaque itération. Exemple. Les deux algorithmes suivants donnent lieu à une boucle innie : 1. compteur ← 1 2. TANT QUE compteur ≤ 100 : 3. Afficher : 7*compteur 4. FIN TANT QUE Que fait l'algorithme ci-dessus ? 1. compteur ← 1 2. TANT QUE compteur > 0 : 3. Afficher : 7*compteur 4. compteur ← compteur +1 5. FIN TANT QUE Que fait l'algorithme ci-dessus ? Remarque. La boucle Tant que est une boucle non déterministe : on ne sait pas forcément à l'avance combien d'itérations seront eectuées. Il arrive qu'elle ne soit pas exécutée du tout lorsque la condition est fausse dès le départ. 5.3 Structure Répéter . . . jusqu'à Il existe un deuxième type de structure itérative non déterministe, très proche du Tant que : c'est la structure Répéter . . . jusqu'à . Elle se formalise de la façon suivante : 25 En pseudo-code : 1. RÉPÉTER : 2. instructions 3. JUSQU'À condition 4. ... En Python, cette structure n'existe pas. On compense cette absence à l'aide de la structure while . Avec la structure Répéter . . . jusqu'à , les instructions sont eectuées une ou plusieurs fois jusqu'à ce que la condition soit vériée. Remarque. Contrairement à ce qui se passe avec la structure Tant que , avec la structure Répéter . . . jusqu'à , les instructions sont eectuées au moins une fois. Exemple. On utilise couramment la structure Répéter . . . jusqu'à pour des contrôles de saisie. On peut par exemple utiliser cette structure pour vérier qu'une valeur saisie est bien entière : 1. 2. 3. 4. 5. 6. 7. 8. Algorithme : contrôle de saisie Variable numérique : n DÉBUT RÉPÉTER Afficher : "Saisir un entier naturel" Saisir : n JUSQU'À : Partie_Entière(n)=n FIN 5.4 Structure Pour La dernière structure itérative que nous allons étudier est la structure Pour . Cette structure est utilisée lorsque le nombre d'itérations est connu dès le départ. On parle alors de boucle déterministe. Exemple. 7 × 10. • 7×1 à On peut faire cela en utilisant une structure Pour . En pseudo code, cela donne : 1. 2. 3. 4. 5. 6. 7. • Reprenons l'exemple de l'achage de la table de multiplication de 7, de Algorithme : affichage de la table de 7 Variable numérique : compteur DÉBUT POUR compteur ALLANT DE 1 À 10 : Afficher : "7 fois ", compteur, " = ", 7*compteur FIN POUR FIN En Python, cela donne : 1. # Algorithme : affichage de la table de 7 2. for compteur in range(1,11) : 3. print("7 fois ", compteur, " = ", 7*compteur) La structure Pour utilise une variable, que l'on appelle compteur, qui sert à repérer le nombre d'itérations déjà eectuées. Le compteur part d'une valeur de départ et augmente à 26 chaque itération d'un nombre xe, appelé pas, jusqu'à atteindre une valeur d'arrivée. Pour chaque valeur du compteur, le bloc d'instructions est eectué une fois. La structure Pour se formalise de la façon suivante : En pseudo-code : 1. POUR compteur ALLANT DE valeur_depart À valeur_arrivee PAR PAS DE pas : 2. instructions 3. FIN POUR 4. ... En Python : 1. for compteur in range(valeur_depart,valeur_arrivee +1,pas) : 2. instructions 3. ... Remarques. • Contrairement à ce qui se passe dans la boucle Tant que , dans la boucle Pour la valeur du compteur est modiée automatiquement. • On peut ne pas préciser de valeur pour le pas. La valeur par défaut du pas est de 1. En pseudo-code, cela donne : POUR compteur ALLANT DE valeur_depart À valeur_arrivee : et en Python : for compteur in range(valeur_depart,valeur_arrivee +1) : • En Python, si on écrit : for compteur in range(a,b) la boucle s'arrête juste avant que le compteur atteigne la valeur b. Pour que le compteur atteigne la valeur d'arrivée, il faut donc écrire : for compteur in range(valeur_depart,valeur_arrivee • +1 ) En Python, on peut ne pas donner de valeur de départ, la valeur de départ par défaut étant 0. Par exemple si on écrit : for compteur in range(7) le compteur ira de 0 à 6 par pas de 1. Exemple. • En pseudo code : 1. 2. 3. 4. 5. 6. 7. • Achons par exemple les nombres pairs de 0 à 100 : Algorithme : affichage des nombres pairs Variable numérique : compteur DÉBUT POUR compteur ALLANT DE 0 À 100 PAR PAS DE 2 : Afficher : compteur FIN POUR FIN En Python : 27 1. # Algorithme : affichage des nombres pairs 2. for compteur in range(0,101,2) : 3. print(compteur) Remarque. On peut imbriquer plusieurs structures itératives, toujours en faisant très attention à indenter correctement. Exemple. Tester l'algorithme suivant : En pseudo code : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Algorithme : étoiles Variables numériques : i,j DÉBUT POUR i ALLANT DE 1 À 4 : POUR j ALLANT DE 1 À i : Afficher : "*" FIN POUR Afficher nouvelle ligne FIN POUR FIN En Python : 1. # Algorithme : étoiles 2. for i in range(1,5) : 3. for j in range(1,i+1) : 4. print("*", end=" ") 5. print("") Remarques. • Dans la commande : print("*", end=" ") le end= est une option de la commande print permettant de dénir ce qu'il se passe quand tous les arguments ont été achés. Par défaut (si rien n'est précisé), on passe à la ligne. L'instruction end=" " permet de remplacer le passage à la ligne par un espace. Pour plus de détails, taper dans l'interpréteur : >>> help(print) • On peut interrompre break prématurément une boucle l'aide de la commande : 5.5 Exercices Exercice 21. val Écrire en Python une procédure table3 qui prend en paramètre une valeur et ache la table de multiplication de 3, de Exercice 22. 3×1 à 3 × val. Bob joue avec un dé. Il décide de lancer le dé tant qu'il n'a pas obtenu un 6. Écrire en pseudo-code puis en Python un algorithme simulant les tirages successifs du dé jusqu'à ce qu'un 6 apparaisse. Indice : on pourra utiliser la fonction randint de la bibliothèque random. Exercice 23. Dans la mare qui est dans son jardin, Bob a mis un nénuphar. Au début, la 2 2 surface du nénuphar est de 9 cm . La surface de la mare est de 6m . Tous les mois, la surface du nénuphar augmente de 20%. a) Écrire une fonction seuil prenant en paramètre une surface, et retournant le nombre de mois mis par le nénuphar pour dépasser cette surface. b) Écrire un algorithme faisant appel à la fonction seuil bout duquel le nénuphar aura recouvert toute la mare. 28 et achant le nombre de mois au Exercice 24. Écrire en Python un algorithme permettant de vérier qu'une valeur saisie est bien entière. L'algorithme devra utiliser une structure Tant que . Exercice 25 (suite de l'exercice 11). Le compte informatique de Bob est protégé par un mot de passe. Écrire en pseudo-code puis en Python un algorithme qui demande de saisir un mot de passe jusqu'à ce que le bon mot de passe soit saisi, sachant que le mot de passe de Bob est : James-Bob. Exercice 26. une valeur Écrire en pseudo-code puis en Python une val Exercice 27. procédure prenant en paramètre et achant les carrés des nombres entre 0 et val. Bob se lance dans la vente de plants de nénuphars. Il en vend 3 le premier jours. Le nombre de plants vendus double ensuite chaque jour. a) Écrire en pseudo-code puis en Python un algorithme achant le nombre de plants vendus chaque jour jusqu'au trentième jour. b) Modier l'algorithme précédent pour calculer le nombre total de plants vendus en 30 jours. Exercice 28 . (Le jeu du nombre à deviner) Le but du jeu est de deviner un nombre entier entre 0 et 50 choisi aléatoirement par l'ordinateur. Écrire en pseudo-code puis en Python un algorithme qui : 1. tire au hasard un entier entre 0 et 50 qui sera le nombre à deviner (utiliser la fonction randint de la bibliothèque random), 2. demande de saisir un entier entre 0 et 50 et ache un message disant si l'entier saisi est plus petit ou plus grand que le nombre à deviner, 3. répète l'instruction ci-dessus (saisi d'un nombre et comparaison avec le nombre à deviner) tant que le bon nombre n'a pas été saisi. 4. Lorsque le nombre à deviner est égal au nombre saisi, l'algorithme ache un message de victoire. Exercice 29. a) Écrire en pseudo-code puis en Python une procédure prenant en paramètre un entier, et achant la liste des diviseurs de cet entier. b) Modier la procédure précédente en une fonction retournant le nombre de diviseurs de l'entier choisi comme paramètre. Exercice 30. • Bob joue à un jeu de dés. Les règles sont les suivantes : À chaque tour, on lance 10 fois de suite un dé. Si la somme des valeurs obtenues est paire, on gagne 1 point, sinon, on perd 2 points. • On part de 10 points, et le jeu continue jusqu'à ce que le nombre de points soit inférieur ou égal à 0. a) Écrire un algorithme simulant un tour de ce jeu et achant le nombre de points obtenus (1 ou -2). b) Modier l'algorithme précédent pour simuler une partie complète, en achant pour chaque tour le nombre de points obtenus pour le tour et le nombre de points restants au total. 29 6 Tableaux et listes 6.1 Un premier exemple L'algorithme ci-dessous demande de saisir dix nombres et fait la somme de ces nombres : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Algorithme : somme Variables numériques : nombre, somme DEBUT somme ← 0 POUR i allant de 0 à 9 : Saisir : nombre somme ← somme + nombre FIN POUR Afficher : somme FIN Dans cet algorithme, les nombres saisis ne sont pas stockés en mémoire. Si l'on commet une erreur en saisissant l'un de nombres, il faut relancer l'algorithme et re-saisir chacun des dix nombres. Pour éviter cela, une première idée serait de créer dix variables, une pour chaque nombre saisi. En cas d'erreur, il surait alors de modier la valeur de la variable concernée. Bien sûr, écrire un tel algorithme est fastidieux, et cela serait pire encore si on voulait saisir cent valeurs au lieu de dix. Dans ce genre de situations, on a recours à une nouvelle structure : les tableaux (ou listes). Exemple. • En pseudo-code, cela donne : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. • Reprenons l'algorithme précédent à l'aide de tableaux. Algorithme : somme avec tableau Variables numériques : liste_nb(10), somme DEBUT somme ← 0 POUR i allant de 0 à 9 : Saisir : liste_nb[i] somme ← somme + liste_nb[i] FIN POUR Afficher : somme FIN Et en Python, l'algorithme précédent s'écrit : 1. 2. 3. 4. 5. 6. 7. # Algorithme : somme avec tableau somme = 0 liste_nb = [0]*10 for i in range(0,10) : liste_nb[i] = float(input("Veuillez saisir un nombre")) somme = somme + liste_nb[i] print("Somme : ",somme) Dans l'algorithme ci-dessus, les nombre saisis sont stockés dans une liste, c'est-à-dire variable list. On peut par >>> print(liste_nb) de type exemple acher cette liste en tapant dans l'interpréteur : 30 6.2 Que sont les tableaux et les listes ? Les tableaux et les listes sont des regroupements de variables. Chacune des variables est numérotée, ce numéro s'appelle un indice. Remarque. Attention, les indices peuvent commencer à 0 ou à 1 selon les langages. En Python, les indices commencent à 0. Par convention, nous ferons également commencer les indices à 0 en pseudo-code. Au programme du BTS SIO, on ne distingue pas les tableaux et les listes. En général, les deux termes tableau et liste désignent deux façons diérentes de stocker un regroupement de variables. Pour mieux comprendre, regardons ce qu'il se passe dans la mémoire de l'ordinateur. En schématisant, on peut voir la mémoire d'un ordinateur comme un ensemble de cases dans lesquelles sont stockées des valeurs. Chacune de ces cases a une adresse. On peut donc accéder au contenu d'une case grâce à son adresse. En général, un tableau est un groupe de cases consécutives. La taille (nombre de cases) d'un tableau est xe. En contrepartie, on connaît directement l'adresse de n'importe quel élément du tableau, et on peut donc accéder à cet élément pour un coût de 1 accès mémoire. Une liste en revanche est un ensemble de cases non consécutives. Dans chaque case de la liste, on stocke deux choses : une valeur de la liste et l'adresse de la case suivante. Pour accéder à un élément de la liste, il faut donc visiter tous les éléments précédents (accéder à l'élément d'indice i coûte (i+1) accès mémoire). En contrepartie, la taille d'une liste peut être modiée à volonté. Dans la suite, on appelle indiéremment liste ou tableau un regroupement de variables sans se préoccuper de la façon dont ces variables sont stockées. Il est néanmoins utile de retenir que pour faire référence à un tableau (ou à une liste), on indique l'adresse du premier élément de ce tableau. Remarques. • • En Python, on utilise le type list. La liste qui ne contient aucun élément s'appelle la liste vide et se note simplement 6.3 Déclaration, accès aux éléments, modications 6.3.1 En pseudo-code En pseudo-code, un tableau T de taille n est déclaré de la manière suivante : Variables numériques : T(n) 31 []. On représente ensuite un tableau en mettant entre crochets ses éléments séparés par des virgules. Enn pour accéder à un élément du tableau on indique le nom du tableau suivi de l'indice de l'élément entre crochet. Exemple. 1. 2. 3. 4. 5. 6. 7. Considérons l'algorithme suivant : Algorithme : affichage de deux éléments Variables numériques : T(10) DÉBUT T ← [2,3,5,7,9,0,1,4,8,6] Afficher : T[3] Afficher : T[9] FIN 6.3.2 En Python En Python, on utilise le type list. La création d'un tableau et l'accès à ses éléments se font comme en pseudo-code. Remarques. • • La taille d'un tableau est donnée par la fonction len. En Python, contrairement à beaucoup d'autres langages, un tableau est non-typé, c'est à dire qu'il peut contenir des variables de plusieurs types diérents. • En Python, on peut aussi accéder aux éléments à partir de la n du tableau en utilisant des indices négatifs. Exemple. 1. 2. 3. 4. 5. 6. 7. 8. Tester en Python l'algorithme ci-dessous : #Algorithme : exemples sur les tableaux tab = [1,"Toto",3.5,[1,2],True] print(tab) print(tab[1]) print(tab[5]) # Une erreur apparaît car on dépasse la taille du tableau print(tab[-1]) print(tab[-2]) print(len(tab)) 6.3.3 Modication des éléments d'un tableau On peut modier les éléments d'un tableau un par un (les listes et les tableaux sont des types dits mutables). Par exemple pour aecter la valeur 8 à l'élément d'indice 3 d'un tableau T, on écrit : en pseudo-code : et en Python : T[3] ← 8 T[3] = 8 6.3.4 Création d'un tableau de taille donnée Il arrive souvent que l'on ne connaisse pas dès le départ tous les éléments d'un tableau. Pour construire un tableau petit à petit, il y a deux façons de procéder : • La méthode 1 : consiste à créer un tableau de la taille voulue dont tous les éléments sont identiques (par exemple 0), puis à modier les éléments un par un. • La méthode 2 : consiste à créer un tableau vide auquel on ajoute des éléments petit à petit (voir ci-dessous pour les détails sur l'opération d'ajout d'un élément). 32 Exemple. • Remplissons par exemple un tableau avec dix nombres aléatoires. Avec la méthode 1 : 1. tab = [0]*10 # On crée un tableau contenant 10 zéros 2. for i in range(0,10) : 3. tab[i] = randint(1,100) # On modifie les éléments un par un 4. print(tab) • Avec la méthode 2 : 1. tab = [] # On part de la liste vide 2. for i in range(0,10) : 3. tab = tab + [randint(1,100)] # On ajoute les éléments un par un 4. print(tab) 6.4 Opérations sur les tableaux en Python 6.4.1 Concaténation Si l'on dispose de deux listes, on peut vouloir les coller l'une à l'autre pour n'avoir plus qu'une liste. Cette opération s'appelle la concaténation. Il existe deux façons de faire en Python. • La première façon crée une nouvelle liste, et utilise l'opération 1. 2. 3. 4. • + : l = [1,2,3] m = [4,5] lm = l + m print(lm) La seconde façon utilise la méthode de liste extend. Cela ne crée pas une nouvelle liste, mais modie la première des deux listes. 1. 2. 3. 4. • l = [1,2,3] m = [4,5] l.extend(m) print(l) On peut également concaténer plusieurs fois une liste à elle même avec le symbole : ∗. 1. l = [1,2,3] 2. m = l*5 3. print(m) Remarques. • • La seconde méthode est beaucoup moins coûteuse que la première. L'opération extend est ce que l'on appelle une méthode de liste. Elle ne renvoie rien, mais modie l'objet auquel on l'applique. 6.4.2 Ajout d'un élément à la n d'un tableau Pour ajouter l'élément t à la n de la liste L : • on peut concaténer L à la liste [t]. Cela nécessite de créer une nouvelle liste. Exemple : 1. l = [1,2,3] 2. m = l + [4] 3. print(m) 33 • ou on peut modier la liste existante en utilisant la méthode de liste append : 1. l = [1,2,3] 2. l.append(4) 3. print(l) Remarque. Comme précédemment, la seconde option est bien plus rapide. 6.4.3 Copie d'un tableau Attention : comme on l'a signalé plus haut, une liste en Python est stockée sous la forme d'une adresse mémoire. Il est donc indispensable de faire attention lorsque l'on veut copier une variable de type Exemple. 1. 2. 3. 4. list dans une autre variable. Tester : a = [1,2,3,4,5] b = a b[1] = 10 print(a) a on stocke en réalité l'adresse de la liste dans la mémoire. Avec recopie cette adresse dans la variable b. Tout changement eectué Explication : dans la variable l'instruction b = a on sur les emplacements mémoires correspondants à cette adresse changera donc simultanément a et b. Pour créer une nouvelle liste (stockée dans un emplacement mémoire diérent) ayant les mêmes valeurs que la liste 1. 2. 3. 4. 5. a, on procède comme suit : a = [1,2,3,4,5] c = a[:] c[1] = 20 print(a) print(c) 6.4.4 Autres opérations Si on dispose d'une liste appelée • • • • ma_liste, on peut utiliser diérentes fonctions : sous_liste = ma_liste[1:3] Faire la somme de la liste : somme = sum(ma_liste) Trouver le maximum de la liste : maximum = max(ma_liste) Trouver le minimum de la liste : minimum = min(ma_liste) Extraire une sous-liste : Il existe aussi diérentes méthodes de listes : • Trier une liste : ma_liste.sort() • Trouver l'indice d'un élément : ma_liste.index(2) • Inverser une liste : ma_liste.reverse() • Enlever un élément : ma_liste.remove(2) • La liste complète des méthodes de liste s'obtient en tapant help(list) 34 dans l'interpréteur : 6.5 Exercices Exercice 31. Écrire en Python une procédure afficheT prenant en paramètre un tableau et achant l'un après l'autre tous les éléments du tableau. On pourra tester la procédure avec le tableau suivant : [2, False, [3, 4, 5], "Bonjour",3.4, "?", 7*8, 0] Exercice 32. Écrire en pseudo-code puis en Python un algorithme demandant de saisir 5 valeurs réelles et stockant ces valeurs dans un tableau. On achera le tableau à la n de l'algorithme. Exercice 33. Écrire en pseudo-code puis en Python une fonction mult3 prenant en paramètre liste_nb une liste de réels notée liste_nb et retournant une liste dont les éléments sont ceux de multipliés par 3. Exercice 34. Écrire en pseudo-code puis en Python une fonction miroir prenant en para- mètre une liste et retournant la liste inversée. Par exemple miroir([1,2,3]) retourne [3,2,1]. Exercice 35. a) Écrire une fonction maximum prenant en paramètre un tableau et retournant la plus grande valeur du tableau. b) Écrire une procédure contient3 prenant en paramètre un tableau et achant si la valeur 3 apparaît dans le tableau. Si la valeur 3 apparaît, la procédure doit acher l'indice du premier élément valant 3. c) Écrire en Python un algorithme créant une liste de taille N composée d'entiers aléatoires entre 1 et 1000, où N est un entier saisi par l'utilisateur, puis achant le maximum du tableau, ainsi qu'un message disant si la valeur 3 apparaît dans le tableau. Exercice 36 (Tri à bulles). Considérons un tableau de taille n constitué de nombres entiers. Nous allons trier ces entiers dans l'ordre croissant selon la méthode appelée tri à bulles. Le tri à bulles consiste à parcourir le tableau en comparant les éléments consécutifs et à les échanger s'ils ne sont pas dans l'ordre croissant. Après le premier parcours du tableau, le plus grand élément du tableau se situe en dernière position, comme une bulle remontée en surface d'où le nom de la méthode. Et après chaque parcours du tableau, un élément supplémentaire est trié. Donc au bout de n−1 parcours, le tableau est entièrement trié. a) Écrire en pseudo-code puis en Python le tri à bulles sous forme d'une fonction b) En réalité, le tableau peut être trié avant que les tribulles. n−1 parcours aient été eectués. On peut en eet s'arrêter dès lors qu'aucun n'échange n'est fait pendant un parcours. En s'aidant de cela, modier la fonction précédente pour limiter le nombre de parcours. Exercice 37 (Bataille navale). On veut programmer un jeu de bataille navale. On joue sur un plateau de 5 cases sur 5. Un bateau (de taille 1 × 1) est placé aléatoirement sur l'une des cases. a) On représente le plateau par une liste contenant 5 listes de taille 5, chaque liste représentant une ligne du plateau. Les éléments des listes valent 0 sauf l'élément correspondant à la case sur laquelle est le bateau, qui vaut 1. Écrire un algorithme plaçant aléatoirement un bateau sur le plateau. b) Écrire un algorithme qui demande à l'utilisateur de saisir des coordonnées jusqu'à ce que bateau soit coulé. 35 7 Chaînes de caractères 7.1 Dénition et premiers exemples Dans ce chapitre, nous abordons une nouvelle classe d'objets : les chaînes de caractères. Les chaînes de caractères sont représentées en Python par le type str (abréviation du mot anglais string). Dénition. Une chaîne de caractère peut être dénie comme une succession quelconque de caractères. En pseudo-code comme en Python, une chaîne de caractères peut être délimitée soit par des guillemets, soit par des apostrophes. Comme nous l'avons déjà vu à plusieurs reprises, on peut acher une (ou plusieurs) chaîne de caractères à l'aide de la fonction print. Exemple. 1. phrase1 = "Bonjour tout le monde !" 2. phrase2 = 'Comment ça va ?' 3. print(phrase1, phrase2) Dénition. Le nombre de caractères d'une chaîne de caractère s'appelle longueur de la chaîne. Pour connaître la longueur d'une chaîne en Python, on utilise la fonction len. Exemple. 1. chaine = "blablabla" 2. print(len(chaine)) Remarque. opérateurs En Python, on peut également comparer deux chaînes de caractères à l'aide des <, >, ! = et ==. L'ordre utilisé est l'ordre lexicographique. 7.2 Caractères, sous-chaînes Remarque. Comme pour les tableaux, les caractères d'une chaîne de caractères sont nu- mérotés. Ces numéros s'appellent indices. On rappelle qu'en Python, et par convention en pseudo-code (pour ce cours), les indices commencent à 0. Pour accéder à un caractère d'une chaîne de caractères, on utilise son indice, mis entre crochets. Les indices permettent également d'extraire une sous-chaîne d'une chaîne de caractères donnée. Exemple. 1. chaine = "Les crocodiles peuvent rester 45 minutes sous l'eau" 2. print(chaine[0]) 3. print(chaine[4:13]) Remarque. Attention, chaine[4:13] contient les caractères d'indices 4 à 12 de la chaîne. Tester par exemple le code ci-dessous : 1. chaine="0123456789" 2. print(chaine[3:4]) Remarque. Attention, contrairement aux tableaux, il n'est pas possible de modier les ca- ractères d'une chaîne un par un. Par exemple les deux instructions suivantes renvoient une erreur : 1. chaine = "blabla" 2. chaine[1] = "h" # cette instruction renvoie une erreur 36 7.3 Opérations sur les chaînes de caractères 7.3.1 Concaténation Comme les tableaux, les chaînes de caractères peuvent être concaténées. Pour concaténer deux chaînes de caractères, on utilise l'opérateur +, en pseudo-code comme en Python. Exemple. 1. 2. 3. 4. chaine1 = "Bonjour, je m'appelle... " chaine2 = "Bob !" chaine = chaine1 + chaine2 print(chaine) 7.3.2 Transtypage Il existe plusieurs opérations de transtypage applicables aux chaînes de caractères : • Entre chaîne et variable numérique : Une chaîne de caractères contenant uniquement un nombre entier peut être transtypée en une variable de type int. Par exemple : 1. chaine = "42" 2. nombre = int(chaine) 3. print(nombre) Une chaîne de caractères contenant uniquement un nombre réel peut être transtypée en float. Par 1. chaine = "3.1415" 2. nombre = float(chaine) 3. print(nombre) une variable de type exemple : Et réciproquement, une variable numérique peut être transtypée en une chaîne de caractères à l'aide de la fonction str. Par exemple : 1. nombre = 42 2. chaine = str(nombre) 3. print(chaine) • Entre chaîne et liste : Une chaîne peut être transtypée en une liste. Les éléments de la liste obtenue sont alors les caractères de la chaîne. Par exemple : 1. chaine = "Bonjour !" 2. liste = list(chaine) 3. print(liste) Et réciproquement, une liste contenant des caractères ou des chaînes de caractères peut être assemblée en une seule chaîne de caractères à l'aide de la méthode join, appliquée à la chaîne que l'on veut utiliser comme séparateur entre les éléments de la liste. Exemple : 1. 2. 3. 4. liste = ["Et", "...", " ","Hop !"] print(liste) chaine = "".join(liste) print(chaine) 37 7.3.3 Conversion en entiers Les caractères sont codés par des entiers. En Python, on peut passer d'un caractère à l'entier qui le code (en ascii) à l'aide de la fonction ord. Et réciproquement, on peut passer d'un entier chr. au caractère qu'il représente à l'aide de la fonction Exemple. 1. print(ord("a")) 2. print(chr(97)) 7.3.4 Méthodes de chaînes Comme pour les tableaux, il existe en Python un certain nombre de méthodes pour les chaînes de caractères, dont certaines peuvent s'avérer utiles. Exemples. Supposons que l'on ait une variable de type string nommée chaine, par exemple : chaine = "Bob dit : Blablabla" Alors : • chaine = chaine.upper() : met la chaîne en majuscules, • chaine = chaine.lower() : met la chaîne en minuscules, • chaine.index("bla") : donne l'indice de la première occurrence de la sous-chaîne bla (erreur si la chaîne de contient pas bla), • chaine.count("bla") : compte le nombre d'occurrences de la sous-chaîne bla. 7.4 Exercices Exercice 38. Écrie en pseudo-code puis en Python une fonction compte_b prenant en paramètre une chaine de caractères et retournant le nombre d'occurrences du caractère b dans celle-ci. Exercice 39. Écrire en pseudo-code puis en Python un algorithme demandant à l'utilisateur de saisir une chaîne de caractères, puis créant une liste dont les éléments sont les caractères de la chaîne, et achant cette liste. (On s'interdira l'utilisation de la fonction list.) Exercice 40. a) Écrire une fonction bin2dec prenant en paramètre une chaine de caractères représentant un nombre en base 2 et retournant ce nombre en base 10. b) Écrire en pseudo-code et en Python une fonction dec2bin prenant en paramètre un entier en décimal et retournant une chaîne de caractères contenant l'équivalent binaire de cet entier. Exercice 41. a) Écrire en pseudo-code et en Python un algorithme demandant de saisir une phrase et achant une version modiée de cette phrase dans laquelle tous les caractères e sont remplacés par des caractères z. b) Écrire un algorithme demandant de saisir une phrase et achant une version modiée de cette phrase dans laquelle toutes les occurrences de la sous-chaînes Bob sont remplacées par la sous-chaîne Roger. Appliquer cet algorithme à la phrase : Bob dit : je m'appelle Bob !. 38 Exercice 42. Écrire en pseudo-code et en Python une fonction compte_mots prenant en paramètre une phrase sans aucune ponctuation et retournant le nombre de mots de cette phrase. On se placera dans le cas où la chaîne commence par un mot et se termine par un mot, ne contient aucun signe de ponctuation, et où les mots sont séparés par un seul espace. Exercice 43. On considère l'algorithme suivant : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Algorithme : A1 Variables : DEBUT alphabet ← "abcdefghijklmnopqrstuvwxyz" Saisir : mot nouveau_mot ← "" POUR i allant de 0 à (longueur(mot)-1) : pos ← position dans l'alphabet de mot[i] nouvelle_pos ← (pos+5)%26 nouveau_mot ← nouveau_mot + alphabet[nouvelle_pos] FIN POUR Afficher : nouveau_mot FIN a) Lister les variables de A1. Que fait A1 ? L'appliquer au mot Bob. b) Écrire A1 en Python. c) Écrire un algorithme A2 permettant de crypter une phrase en minuscules sans accents saisie par l'utilisateur, en laissant les espaces et la ponctuation inchangés. d) Écrire un algorithme A3 permettant de décoder les phrases codées par l'algorithme A2. e) Utiliser A3 pour décoder le message : qj rty xjhwjy jxy : gtg !. f ) Bonus : modier les algorithmes précédents pour prendre en compte les majuscules et les accents. Exercice 44 (numéro INSEE). On rappelle que le numéro INSEE (ou numéro de sécurité sociale est formé de 15 chires : 1 chire pour le sexe (1 pour les hommes et 2 pour les femmes) 2 chires correspondants aux deux derniers chires de l'année de naissance 2 chires correspondants au mois de naissance 2 chires correspondant au département de naissance 3 chires correspondant à la commune de naissance 3 chires correspondants au numéro d'inscription sur le registre des naissances 2 chires correspondant à une clé de contrôle. Soit r le reste de la division euclidienne du nombre formé par les 13 premiers chires par 97. La clé de contrôle vaut 97 − r. a) Écrire un algorithme demandant de saisir un numéro INSEE, et achant si le numéro est valide (c'est-à-dire si la clé de contrôle est correcte) ainsi que le sexe, la date de naissance et le département de naissance associés au numéro. b) Tester l'algorithme précédent sur le numéro de sécurité sociale de Bob, qui est 1 42 11 13 055 376 56. c) Tester la validité du numéro : 2 85 05 33 569 001 89. 39