Algorithmique et Programmation 2 LMI 1 – Semestre 2 Cours 2 – La séquence et l’alternative 2 janvier 2009 1 Les structures de contrôle En Scheme, le programmation se fait par composition de fonctions, et même les structures de choix comme le if sont exprimées sous la forme de fonctions, dont l’un ou l’autre des arguments est évalué. En programmation impérative, on utilise essentiellement la séquence : les instructions sont exécutées les unes à la suite des autres. S’y ajoutent d’autres éléments qui vont permettre – le branchement conditionnel, le choix entre des instructions à effectuer – la répétition d’instructions 2 L’alternative L’instruction conditionnelle en Python est le if. Il s’utilise ainsi : >>> mois = 1 >>> annee = 2008 >>> if (mois < 2): print ’Bonne annee’, annee Bonne annee 2008 >>> La première partie du if, qui est entre parenthèses, est la condition : si elle est vérifiée, alors la séquence d’instructions qui se trouve après le : sera exécutée. En Python, le : annonce le début d’un bloc d’instructions : il s’agit d’une suite d’instructions qui seront executées ensemble, ou pas du tout. Un bloc d’instructions se distingue syntaxiquement également par le fait qu’il est indenté, i.e. décalé vers la droite par rapport au reste du code. Lorsqu’on termine un bloc d’instructions, on supprime une indentation (on revient d’une tabulation vers la gauche). Ces limites de blocs d’instructions sont analogues aux parenthèses ouvrantes et fermantes en Scheme qui délimitent les appels de fonctions. En Scheme, pour la lisibilité, il était demandé d’indenter le code (mise à la verticale des ( et des ) de même niveau). En Python, il est obligatoire d’avoir du code bien indenté et lisible pour programmer : l’indentation est un élément syntaxique du langage. Mais, pas de panique ! Il suffit d’utiliser un éditeur intelligent pour que l’indentation du code soit gérée facilement. 2.1 L’alternative : syntaxe générale if (condition1): bloc-d’instructions-alors-1 elif (condition2): bloc-d’instructions-alors-2 ... 1 LMI1 – Semestre 2 Cours 2 – La séquence et l’alternative PRG2 – 08/09 else: bloc-d’instructions-sinon Les parties elif et else sont facultatives. On ne peut écrire qu’une seule partie else pour un if, et toujours en dernière position. On peut écrire autant de parties elif que l’on veut. Les parties elif, contraction de else if, signifient sinon si. L’instruction if est exécutée ainsi : – si condition1 est vraie, alors bloc-d’instructions-alors-1 est exécuté, puis on sort du if – si condition1 est fausse, alors, si condition2 est vraie, bloc-d’instructions-alors-2 est exécuté, puis on sort du if – même chose pour toutes les parties elif suivantes (elles ne seront exécutées que si aucune des conditions précédentes n’a été vérifiée, et si leur propre condition est vraie) ; – enfin, si aucune condition n’a été vérifiée, c’est bloc-d’instructions-sinon qui sera exécuté. 2.2 2.2.1 Exemples Conversion Fahrenheit - Celsius On écrit le même programme que la semaine dernière, mais l’utilisateur nous indique en plus en quelle unité il donne la température : ’F’ pour Fahrenheit, et ’C’ pour Celsius. On fait la conversion en conséquence. # -*- coding: utf-8 -*# programme de conversion Celsius <-> Fahrenheit # obtenir l’unité utilisée print "Programme de conversion Celsius <-> Fahrenheit" print "Les unités possibles sont : ’F’ pour Fahrenheit ou ’C’ pour Celsius" unite = input(’Quelle unité allez-vous utiliser ? ’) # obtenir une température temperature = input(’Donnez une température exprimée en degrés ’+unite+’: ’) if (unite == ’F’ or unite == ’f’): # convertir en degrés Celsius celsius = (5*(temperature - 32))/9 print ’Cela fait’, celsius,’C’ elif (unite == ’C’ or unite == ’c’): # convertir en degrés Fahrenheit fahrenheit = ((9*temperature)/5)+32 # afficher le résultat print ’Cela fait’, fahrenheit, ’F’ else: print unite, "est une unité inconnue" Ici, il faut faire attention car la saisie d’une chaı̂ne de caractères avec input requiert les quotes (il faut saisir ’c’ au clavier pour l’unité et pas seulement c). 2.2.2 Année bissextile Écrire un programme qui demande une année, et affiche un message indiquant si elle est bissextile ou non. Rappel : une année est bissextile si c’est un multiple de 4 mais pas de 100, ou alors un multiple de 400 2 LMI1 – Semestre 2 Cours 2 – La séquence et l’alternative PRG2 – 08/09 # -*- coding: utf-8 -*# programme bissextile # récupérer une année annee = input(’Donnez-moi une année : ’) # maintenant on teste si elle est bissextile ou pas if ((annee % 4 ==0) and ((annee % 100 !=0) or (annee % 400 == 0))): print annee, ’est une année bissextile’ else: print annee, "n’est pas une année bissextile" qu’on aurait pu également écrire : # -*- coding: utf-8 -*# programme bissextile # récupérer une année annee = input(’Donnez-moi une année : ’) # on commence print annee, # maintenant on teste si elle est bissextile ou pas if ((annee % 4 ==0) and ((annee % 100 !=0) or (annee % 400 == 0))): print ’ est’, else: print " n’est pas", # et dans tous les cas print ’ une année bissextile’ Dans le deuxième exemple, on remarque les différents cas d’exécution, les morceaux de code qui sont toujours exécutés, etc . . . On remarque aussi la virgule en fin d’instruction du print qui évite le retour à la ligne dans l’affichage (démo). 2.2.3 Devis déménagement Une petite entreprise de déménagement propose d’effectuer des devis rapides. Les règles sont les suivantes : – il y a un forfait de base pour les déplacements : – déménagement dans un rayon de moins de 10km : 300 euros – déménagement dans un rayon de moins de 400km : 600 euros – au-delà, un forfait de 1000 euros est appliqué ; – plus un forfait kilométrique : – gratuit pour les déménagements de moins de 10km – 3 euros par kilomètre sinon – il y a un barême sur le volume : – c’est 15 euros par mètre cube pour les déménagement de moins de 15m3 – 28 euros par mètre cube pour les déménagements de moins de 30m3 – 40 euros par mètre cube pour les déménagements de moins de 50m3 – 50 euros par mètre cube pour les déménagements au-delà de 50m3 Écrire le programme qui calcule un devis. 3 LMI1 – Semestre 2 Cours 2 – La séquence et l’alternative PRG2 – 08/09 # -*- coding: utf-8 -*# devis déménagement print ’Devis rapide avec les déménageurs express!’ # on demande la distance distance = input("Quelle est la distance (en km) entre le départ et l’arrivée ? # on demande le volume volume = input("Quel est le volume prévu ? ") # calcul du forfait distance if distance <= 10 : forfaitDistance = 300 elif distance <= 400 : forfaitDistance = 600 else : forfaitDistance = 1000 # calcul du forfait kilométrique if distance > 10 : km = 3*distance else : km = 0 # calcul du forfait if volume <= 15 : forfaitVolume = elif volume <= 30 : forfaitVolume = elif volume <= 50 : forfaitVolume = else : forfaitVolume = volumétrique 15*volume 28*volume 40*volume 50*volume # calcul devis, et affichage résultat print ’le devis prévisionnel est de’, print forfaitDistance+km+forfaitVolume,’euros’ 2.3 Quelques règles de syntaxe supplémentaires – les parenthèses autour des conditions ne sont pas obligatoires lorsqu’il s’agit d’expressions simples (pas de and, de or, ...) – le : n’est pas forcément collé à l’expression qui le précède – il faut faire attention à l’indentation : si vous n’utilisez pas un éditeur qui indente automatiquement vos programmes Python, vous pouvez choisir d’indenter un morceau de code, soit avec des espaces, soit avec des tabulations. Le principe est que deux instructions font partie d’un même bloc d’instruction s’ils ont la même indentation. Attention toutefois à ne pas mélanger espaces et tabulations : on peut obtenir visuellement le même résultat, sans pour autant que les indentations soient les mêmes. 2.4 Les if imbriqués Aucun des exemples ne comportaient de structures conditionnelles imbriquées. . .Mais cela ne pose pas plus de souci qu’en Scheme ! 4 LMI1 – Semestre 2 2.4.1 Cours 2 – La séquence et l’alternative PRG2 – 08/09 Le retour des déménageurs express Seconde version # -*- coding: utf-8 -*# devis déménagement print ’Devis rapide avec les déménageurs express!’ # on demande la distance distance = input("Quelle est la distance (en km) entre le départ et l’arrivée ? # on demande le volume volume = input("Quel est le volume prévu ? ") # calcul du forfait distance # et du forfait kilométrique if distance <= 10 : forfait_distance = 300 km = 0 else : km = 3*distance if distance <= 400 : forfait_distance = 600 else : forfait_distance = 1000 # calcul du forfait volumétrique if volume <= 15 : forfait_volume = 15*volume elif volume <= 30 : forfait_volume = 28*volume elif volume <= 50 : forfait_volume = 40*volume else : forfait_volume = 50*volume # calcul devis, et affichage résultat print ’le devis prévisionnel est de’, print forfait_distance+km+forfait_volume,’euros’ 3 Un premier pas vers la définition de fonctions Python fait partie de la famille des langages procéduraux : comme Pascal, comme C, comme ADA :), en Python, on écrit des sous-programmes qui s’appellent procédures, ou ... fonctions (eh oui, comme en Scheme !). Utiliser des fonctions permet : – de décomposer un problème en sous-problèmes – de tester et de valider, fonction par fonction, un pogramme – de réutiliser du code La syntaxe générale d’une fonction en Python est : def maFonction(param1,param2,...): instruction1 instruction2 ... 5 LMI1 – Semestre 2 Cours 2 – La séquence et l’alternative PRG2 – 08/09 Si une fonction doit retourner une valeur, l’exécution de la fonction doit se terminer par une instruction return. # -*- coding: utf-8 -*def calculForfaitDistance(dist) : ’’’calculForfaitDistance : int -> int fonction de calcul du forfait distance’’’ if dist <= 10 : prix = 300 elif dist <= 400 : prix = 600 else : prix = 1000 return prix def calculForfaitVolume(vol) : ’’’calculForfaitVolume : int -> int fonction de calcul du forfait volumétrique’’’ if vol <= 15 : prix = 15*vol elif vol <= 30 : prix = 28*vol elif vol <= 50 : prix = 40*vol else : prix = 50*vol return prix def calculKm(dist) : ’’’calculKm : int -> int fonction de calcul des frais de déplacement’’’ if distance > 10 : prix = 3*distance else : prix = 0 return prix # devis déménagement print ’Devis rapide avec les déménageurs express!’ # on demande la distance distance = input("Quelle est la distance (en km) entre le départ et l’arrivée ? # on demande le volume volume = input("Quel est le volume prévu ? ") # calcul du forfait distance forfaitDistance = calculForfaitDistance(distance) # calcul du forfait kilométrique km = calculKm(distance) # calcul du forfait volumétrique 6 LMI1 – Semestre 2 Cours 2 – La séquence et l’alternative PRG2 – 08/09 forfaitVolume = calculForfaitVolume(volume) # calcul devis, et affichage résultat print ’le devis prévisionnel est de’, print forfaitDistance+km+forfaitVolume,’euros’ Les commentaires entre trois quotes qui sont écrits juste après la ligne d’entête permettent de créer une documentation sur la fontion. On prendra l’habitude d’y écrire nos spécifications de fonctions, comme en Scheme : >>> help(calculKm) Help on function calculKm in module __main__: calculKm(dist) calculKm : int -> int fonction de calcul des frais de déplacement >>> help(calculForfaitDistance) Help on function calculForfaitDistance in module __main__: calculForfaitDistance(dist) calculForfaitDistance : int -> int fonction de calcul du forfait distance 7