Algorithmique et programmation Master 1 Humanités numériques Jérôme Darmont Année 2016-2017 http://eric.univ-lyon2.fr/~jdarmont/ Définitions Algorithme Un algorithme est une suite finie et non ambiguë d’opérations ou d'instructions permettant de résoudre un problème ou d'obtenir un résultat.1 Un algorithme peut prendre des données en entrée et fournit au moins un résultat en sortie.2 Un algorithme est souvent exprimé avec une notation indépendante de tout langage de programmation.3 Programme Un programme est la traduction d’un algorithme en un langage interprétable par un ordinateur.4 1 Wikipedia. https://fr.wikipedia.org/wiki/Algorithme 2 Donald E. Knuth. The Art of Computer Programming, Vol. 1. 3e edition, 1997. Addison-Wesley. 3 Robert Strandh, Irène Durand. Initiation à l’informatique. 2003. http://dept-info.labri.fr/ENSEIGNEMENT/INITINFO/initinfo/supports/book/ 4 Robert Cordeau. Introduction à Python 3. http://www.maths-et-tiques.fr/telech/Python3v1-1.pdf M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 1 sur 20 Méthodologie M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 2 sur 20 Outils Langage algorithmique textuel Le langage algorithmique en français proposé dans ce support et relativement standard, si tant est qu’il existe un standard en la matière. Il est volontairement indépendant et différent des autres langages abordés dans cet enseignement (plus rigoureux). Blockly Blockly5 est un langage graphique open-source de Google qui vise à démocratiser le développement informatique en limitant les possibilités d’erreurs de syntaxe grâce à l’agencement de blocs de code par glisser-déposer. Il est inspiré de Scratch6, un langage similaire développé par le MIT. Il permet de générer automatiquement du code, notamment dans les langages JavaScript, PHP et Python. Il est considéré ici comme un langage algorithmique en anglais. Python Python7 est un langage de programmation sous licence libre promu par la Python Software Foundation. Il fonctionne sur la plupart des systèmes d’exploitation et fait partie des langages les plus utilisés pour apprendre la programmation. Il inclut l’environnement de développement IDLE8, qui vise à faciliter la programmation en Python. Les programmes Python sont placés dans des fichiers d’extension « .py ». 5 https://developers.google.com/blockly/ https://scratch.mit.edu 7 https://www.python.org 8 http://tarball69.developpez.com/articles/python/idle-presentation-rapide/ 6 M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 3 sur 20 Tableau d’équivalence entre les langages Concept Algorithmique textuelle Commentaire {Il faut commenter son code !} Var âge : Entier Var salaire : Réel Var nom : Chaîne Var v_f : Booléen Const N 10 Const PI 3,1416 Const MONNAIE "Euro" Déclaration de variables Déclaration de constantes Affectation de variables Algorithmique graphique (Blockly) # Il faut commenter son code ! Pas d’équivalent ! age = 44 salaire = 1466.62 nom = "Jérôme" ou nom = 'Jérôme' âge 44 salaire 1466,62 nom "Jérôme" v_f Vrai {Contraire : Faux} Type d’une variable Calculs âge 44 + 1 âge âge + 1 salaire salaire x 1,05 quotient a b nom nom | " Darmont" Opérateurs arithmétiques + - x ^ div mod M1 HN – Algorithmique et programmation Langage Python v_f = True # Contraire : False a = b = 20 x, y = 30, 40 type(age) type(salaire) type(nom) type(v_f) # int # float # str # bool age = 44 + 1 age = age + 1 ou age += 1 salaire = salaire * 1.05 quotient = a / b nom = nom + " Darmont" + - x ^ http://eric.univ-lyon2.fr/~jdarmont/ + - * / // % Page 4 sur 20 Concept Entrées / sorties Algorithmique textuelle Algorithmique graphique (Blockly) Langage Python Lire(nom) Lire(âge) Lire("Salaire :", salaire) Écrire("Hello world!") Écrire(âge) nom = input() age = int(input()) salaire = float(input("Salaire : ")) print("Hello world!") print(age) Écrire("Âge ", âge, "Salaire ", salaire) print("Âge", age, "Salaire", salaire) M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 5 sur 20 Concept Algorithmique textuelle Algorithmique graphique (Blockly) Langage Python Si nom = "Jérôme" alors Écrire("Bravo") Fin si if nom == "Jérôme": print("Bravo") Si âge < 18 alors Écrire("Mineur") Sinon Écrire("Majeur") Fin si Tests if age < 18: print("Majeur") else: print("Mineur") Si salaire < 1466,62 alors Écrire("Pauvre") Sinon si salaire ≤ 3000 alors Écrire("Moyen") Sinon Écrire("Riche") Fin si if salaire < 1466.62: print("Pauvre") elif salaire <= 3000: print("Moyen") else: print("Riche") Si âge < 18 alors Si salaire > 0 alors salarie_mineur True Else Salarie_mineur False Fin si Fin si if age < 18: if salaire > 0: salarie_mineur = True else: salarie_mineur = False if age >=25 and salaire == 0: print("Droit au RSA") Si age ≥ 25 et salaire = 0 alors Écrire("Droit au RSA") Fin si Opérateurs de comparaison Opérateurs logiques = ≠ < ≤ > ≥ = ≠ < ≤ > ≥ == != < <= > >= et ou non and or and or not M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 6 sur 20 Concept Algorithmique textuelle Algorithmique graphique (Blockly) Boucles pour Pour i de 1 à 10 faire Écrire(7 x i) Fin pour for i in range(1, 11): print(7 * i) Boucles tant que i 1 Tant que i ≤ 10 faire Écrire(7 x i) i i + 1 Fin tant que i=1 while i <= 10: print(7 * i) i += 1 Boucles répéter jusqu’à i 1 Répéter Écrire(7 x i) i i + 1 Jusqu’à i > 10 i=1 while True: # Boucle infinie print(7 * i) i += 1 if i > 10: break # Très inélégant (Fonctionne comme un while) M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Langage Python Page 7 sur 20 Concept Algorithmique textuelle Algorithmique graphique (Blockly) Procédure table7() Var i : Entier Début Pour i de 1 à 10 faire Écrire(7 x i) Fin pour Fin Procédures Langage Python def table7(): for i in range(1, 11): print(7 * i) Procédure table(n : Entier) Var i : Entier Début Pour i de 1 à 10 faire Écrire(n x i) Fin pour Fin def table(n): for i in range(1, 11): print(n * i) def tablegen(n, m): for i in range(1, m + 1): print(n * i) Procédure tablegen( n : Entier, m : Entier) Var i : Entier Début Pour i de 1 à m faire Écrire(n x i) Fin pour Fin # Appel des procédures table7() table(3) max = 15 tablegen(3, max) {Appel des procédures} table7() table(3) max 15 tablegen(3, max) M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 8 sur 20 Concept Fonctions Algorithmique textuelle Algorithmique graphique (Blockly) def tva(prixHT): TAUX = 0.2 return prixHT * (1 + TAUX) Fonction tva(prixHT : Réel) : Réel Const TAUX = 0,2 Début Retourner prixHT x (1 + TAUX) Fin def tva2(prixHT): TAUXPLEIN = 0.2 TAUXRED = 0.055 return prixHT * (1 + TAUXPLEIN), prixHT * (1 + TAUXRED) {Appel de la fonction} prixTTC tva(10,5) Traitement des chaînes de caractères Langage Python lettre3 nom[3] # Appel des fonctions prixTTC = tva(10.5) prixTTCplein, prixTTCred = tva2(10.5) lettre3 = nom[2] # 1re position = 0 extrait SousChaîne(nom, 3, 5) extrait SousChaîne(nom, 1, 5) extrait = nom[2 : 5] # Arrêt avant 5 extrait = nom[: 5] # Depuis le début longueur Longueur(nom) nom_maj Majuscules(nom) txt " A bra ca da bra " txt SupprimerEspaces(txt) longueur = len(nom) # Fonction nom_maj = nom.upper() # Méthode txt = " A bra ca da bra " txt = txt.strip() pos ChercherPosition(txt, "bra") pos = txt.find("bra") txt Remplacer(txt, "bra", "BRA") txt = txt.replace("bra", "BRA") M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 9 sur 20 Concept Algorithmique textuelle Algorithmique graphique (Blockly) {Déclaration} Var lst : Liste d’entiers lst = [ ] # Liste vide lst = [1, 3, 5, 7, 9] print(lst[1]) lst2 = [1, 3.14, "ok", [ ]] # Multitype ! lst ( ) {Liste vide} lst (1, 5, 7) Écrire(lst(2)) Listes Langage Python lst( ) 9 {Ajout en fin} Ajouter(lst, 2, 4) {Ajout 2e position} lst(2) 3 {Modification} Suppr(lst, 3) {Suppression 3e pos.} lst.append(9) lst.insert(1, 4) lst[1] = 3 lst.pop(2) taille Longueur(lst) Trier(lst) pos ChercherPosition(lst, 3) mots Découper(txt, " ") taille = len(lst) lst.sort() pos = lst.index(3) mots = txt.split(" ") # Parcours de liste for nombre in lst: print(nombre) {Parcours de liste} Pour nombre dans lst faire Écrire(nombre) Fin pour M1 HN – Algorithmique et programmation # Ajout en fin # Ajout en 2e position # Modification # Suppression 3e pos. http://eric.univ-lyon2.fr/~jdarmont/ Page 10 sur 20 Concept Algorithmique textuelle Algorithmique graphique (Blockly) {Déclarations} Var f : Fichier Var lignes : Liste de Chaînes Var l : Chaîne # Choix du répertoire de travail import os os.chdir("D:/Jérôme") {Création de fichier) lignes ("Angèle", "Bernard", "Cherifa", "Bob") f Ouvrir("fichier.txt", "écriture") Pour l dans lignes faire Écrire(f, l) Fin pour Fermer(f) Fichiers # Création de fichier f = open("fichier.txt", "w") # (w)rite f.write("Angèle\n") # Ecriture unique # (\n = passage à la ligne) lignes = ["Bernard\n", "Cherifa\n", "Bob\n"] f.writelines(lignes) # Ecriture multiple f.close() {Ajout dans un fichier} lignes ("Ekaterina", "Fali") f Ouvrir("fichier.txt", "ajout") Pour l dans lignes faire Écrire(f, l) Fin pour Fermer(f) # Ajout dans un fichier f = open("fichier.txt", "a") # (a)ppend lignes = ["Ekaterina\n", "Fali\n"] f.writelines(lignes) f.close() # Lecture d'un fichier f = open("fichier.txt", "r") # (r)ead lignes = f.readlines() # lignes est une liste de chaînes f.close() {Lecture d’un fichier} f Ouvrir("fichier.txt", "lecture") Lire(f, l) Tant que non FinDeFichier(f) faire lignes( ) l Lire(f, l) Fin tant que Fermer(f) M1 HN – Algorithmique et programmation Langage Python http://eric.univ-lyon2.fr/~jdarmont/ Page 11 sur 20 Structure d’un algorithme Algorithme Nom_algorithme {Déclaration constantes} {Déclaration variables} Début {Instructions} Fin M1 HN – Algorithmique et programmation {Exemple} Algorithme Lire_Écrire Var message : Chaîne Début Lire(message) Écrire(message) Fin http://eric.univ-lyon2.fr/~jdarmont/ Page 12 sur 20 Tables de vérité Opérateurs élémentaires Soient deux variables booléennes (prenant les valeurs Vrai ou Faux) C1 et C2. Quel est le résultat des tests « Si non C1 », « Si C1 et C2 », « Si C1 ou C2 » ? C1 C2 non C1 C1 et C2 C1 ou C2 Vrai Vrai Faux Vrai Vrai Vrai Faux Faux Faux Vrai Faux Vrai Vrai Faux Vrai Faux Faux Vrai Faux Faux Exemple de condition complexe Soit la variable booléenne C3 (C1 et (non C2)) ou ((non C1) et C2), quelles sont les valeurs possibles de C3 en fonction de celles de C1 et C2 ? C1 C2 non C2 C1 et (non C2) non C1 (non C1) et C2 C3 Vrai Vrai Faux Faux Faux Faux Faux Vrai Faux Vrai Vrai Faux Faux Vrai Faux Vrai Faux Faux Vrai Vrai Vrai Faux Faux Vrai Faux Vrai Faux Faux M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 13 sur 20 Modules Python Définition Un module (ou bibliothèque) est un fichier Python (extension .py) qui contient des fonctions pouvant être employées depuis plusieurs programmes. Python inclut de plusieurs bibliothèques standards. De nombreuses bibliothèques externes sont également disponibles9. Utilisation de modules dans un programme (exemples) 1. Importer le(s) module(s) : 2. Utiliser les fonctions d’un module : 1. Importer une/des fonction(s) d’un module : 2. Utiliser les fonctions : import os import os, math os.chdir("D:/Jérôme") racine_carree = math.sqrt(4) # Module « os » # Modules « os » et « math » # Fonction « chdir » du module « os » # Fonction « sqrt » du module « math » from os import chdir from math import * chdir("D:/Jérôme") racine_carree = sqrt(4) # Fonction « chdir » du module « os » # Toutes les fonctions du module « math » # Plus besoin de préfixer la fonction par le nom du module Mode d’emploi des modules et fonctions help("os") # Fournit la liste et la description de toutes les fonctions d’un module (ici, le module « os ») help("os.chdir") # Fournit la description d’une fonction d’un module (ici, la fonction « chdir » du module « os ») 9 https://fr.wikibooks.org/wiki/Programmation_Python/Biblioth%C3%A8ques_pour_Python M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 14 sur 20 Interface graphique tkinter (Tool kit interface) Une interface tkinter est constituée d’une fenêtre dans laquelle on place des widgets : étiquettes textuelles, zones de saisie, boutons de commandes, canevas pour dessins, photos ou images. Code Python Résultat from tkinter import * # Importation du module tkinter # Fenêtre fenetre = Tk() fenetre.title("Formulaire test") fenetre.mainloop() # Création de la fenêtre # Titre de la fenêtre # Affichage de la fenêtre # Etiquette textuelle (code à insérer avant fenetre.mainloop()) etiq_nom = Label(fenetre, text = "Saisir votre nom :") # Création de l’étiquette etiq_nom["fg"] = "black" # Couleur du texte etiq_nom["bg"] = "white" # Couleur de l’arrière-plan de l’étiquette etiq_nom.pack() # Affichage de l’étiquette # Zone de saisie (code à insérer avant fenetre.mainloop()) nom = Entry(fenetre) # Création de la zone de saisie nom.pack() # Affichage de la zone de saisie # Bouton de commande (code à insérer avant fenetre.mainloop()) bouton = Button(fenetre, text = "Valider", command = afficher_nom) # Création du bouton de commande bouton.pack() # Affichage du bouton de commande M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 15 sur 20 Code Python Résultat # Fonction permettant de traiter la commande du bouton "Valider" (à insérer avant fenetre = Tk()) def afficher_nom(): fenetre_resultat = Tk() # Définition d’une nouvelle fenêtre fenetre_resultat.title("Votre nom") affichage = Label(fenetre_resultat) # Définition d’une étiquette pour l’affichage du nom saisi affichage["text"] = nom.get() # Lecture du contenu du widget "nom" affichage.pack() # Affichage du nom # Bouton qui ferme fenetre_resultat bouton_quitter = Button(fenetre_resultat, text = "Quitter", command = fenetre_resultat.destroy) bouton_quitter.pack() # Canevas (code à insérer avant fenetre.mainloop()) # Création du canevas avec ses dimensions et sa couleur de fond dessin = Canvas(fenetre, width = 200, height = 200, bg = "cyan") dessin.pack() # Affichage du cannevas dessin.create_rectangle(0, 0, 200, 200) # Dessin d'un rectangle (coordonnées (0, 0) en haut à gauche) dessin.create_line(0, 0, 200, 200) # Dessin des diagonales dessin.create_line(0, 200, 200, 0) dessin.create_oval(75, 75, 125, 125, fill = "yellow") # Disque de couleur jaune inscrit dans un carré M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 16 sur 20 Code Python Résultat # Image (code à insérer avant fenetre.mainloop()) logoPython = PhotoImage(file = "pythonmini.png") # Création de l'image etiq_image = Label(fenetre, image = logoPython) # Association de l'image à une étiquette etiq_image.pack() # Affichage de l'étiquette M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 17 sur 20 # Code complet from tkinter import * # Importation du module tkinter # Fonction permettant de traiter la commande du bouton "Valider" def afficher_nom(): fenetre_resultat = Tk() # Définition d’une nouvelle fenêtre fenetre_resultat.title("Votre nom") affichage = Label(fenetre_resultat) # Définition d’une étiquette pour l’affichage du nom saisi affichage["text"] = nom.get() # Lecture du contenu du widget "nom" affichage.pack() # Affichage du nom # Bouton qui ferme fenetre_resultat bouton_quitter = Button(fenetre_resultat, text = "Quitter", command = fenetre_resultat.destroy) bouton_quitter.pack() # Fenêtre fenetre = Tk() fenetre.title("Formulaire test") # Création de la fenêtre # Titre de la fenêtre # Etiquette textuelle etiq_nom = Label(fenetre, text = "Saisir votre nom :") # Création de l’étiquette etiq_nom["fg"] = "black" # Couleur du texte etiq_nom["bg"] = "white" # Couleur de l’arrière-plan de l’étiquette etiq_nom.pack() # Affichage de l’étiquette # Zone de saisie nom = Entry(fenetre) nom.pack() # Création de la zone de saisie # Affichage de la zone de saisie # Bouton de commande bouton = Button(fenetre, text = "Valider", command = afficher_nom) # Création du bouton de commande bouton.pack() # Affichage du bouton de commande M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 18 sur 20 Code Python Résultat # Canevas avec ses dimensions et sa couleur de fond dessin = Canvas(fenetre, width = 200, height = 200, bg = "cyan") dessin.pack() # Affichage du cannevas dessin.create_rectangle(0, 0, 200, 200) # Dessin d'un rectangle (coordonnées (0, 0) en haut à gauche) dessin.create_line(0, 0, 200, 200) # Dessin des diagonales dessin.create_line(0, 200, 200, 0) dessin.create_oval(75, 75, 125, 125, fill = "yellow") # Disque de couleur jaune inscrit dans un carré # Image logoPython = PhotoImage(file = "pythonmini.png") # Création de l'image etiq_image = Label(fenetre, image = logoPython) # Association de l'image à une étiquette etiq_image.pack() # Affichage de l'étiquette fenetre.mainloop() M1 HN – Algorithmique et programmation # Affichage de la fenêtre http://eric.univ-lyon2.fr/~jdarmont/ Page 19 sur 20 Webographie Algorithmique Christophe Darmangeat. Algorithmique et programmation pour non-matheux. Université Paris 7, 2013. http://pise.info/algo/ Bouazza El Benani, Awatef Sayah. Cours d’informatique – Partie 1. Université Mohammed V Rabat, 2008. http://www.fsr.ac.ma/cours/informatique/elbenani/Partie1.pdf Python Vincent Le Goff. Apprenez à programmer en Python. OpenClassrooms, 2016. https://openclassrooms.com/courses/apprenez-a-programmer-en-python Robert Cordeau. Introduction à Python 3. Université Paris Sud. http://www.maths-et-tiques.fr/telech/Python3v1-1.pdf Wikilivres. Programmation Python. 2016. https://fr.wikibooks.org/wiki/Programmation_Python Pierre-Antoine Champin. Bonnes pratiques de programmation. Université Claude Bernard Lyon 1, 2015. http://liris.cnrs.fr/pierre-antoine.champin/enseignement/algo/cours/algo/bonnes_pratiques.html Raphaël Seban. IDLE – présentation rapide. L’environnement de développement standard Python. Developpez.com, 2014. http://tarball69.developpez.com/articles/python/idle-presentation-rapide/ Étienne Florent. ISN : Documentation de tkinter. 2013. http://tkinter.fdex.eu M1 HN – Algorithmique et programmation http://eric.univ-lyon2.fr/~jdarmont/ Page 20 sur 20