Algorithmique et Programmation 2 LMI 1 – Semestre 2 Cours 2 – La

publicité
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
Téléchargement