Les structures conditionnelles

Condition et forme minimale : if

In []:
if condition : 
    BLOC INSTRUCTIONS 1 # si la condition est vérifiée

En python c'est la mise en forme du programme qui détermine son exécution. Pour déclarer des blocs d'instructions, on les décale. On dit que les blocs sont indentés.

Le terme condition désigne une condition booléenne, c’est à dire:

  • une valeur
  • un opérateur de comparaison
  • une autre valeur

Les différents opérateurs de comparaison

  • ==
  • !=
  • <
  • >
  • >=
  • =<
  • in, not in : appartient, n'appartient pas
  • is, not is : comparaison entre deux objets (TD1)

Prédicats et booléens

On appelle prédicat ou assertion la condition qui se trouve entre le if et les deux points

Définition : Une assertion est une phrase à laquelle on peut attribuer une valeur de vérité, c'est à dire qui est soit vraie soit fausse.

Exemple 1: Écrire une suite d'instructions permettant de déterminer si un nombre est pair

In []:
x = 17
if x % 2 == 0: # Le symbole % est appelé modulo et x % 2 renvoie le reste de la division euclidienne
    print("Le nombre est pair")

Détaillons l'exemple 1 pour bien comprendre ce qu'il se passe

  • la première ligne de code est équivalente à la phrase : Soit \(x\) un entier égal à 17
  • L'assertion \(x\%2==0\) est fausse. En effet \(x\%2\) renvoie le reste de la division entière de 17/2 qui est égal à 1 et donc différent de 0

Exemple 2: Contrôler un mot de passe

In []:
# -*- coding: utf-8 -*-
mdp = u"motdepasse"
user_mdp = raw_input(u"Entrez votre mot de passe: ")
if mdp == user_mdp:
    print(u"ok")
  • Soit mdp une chaine de caractères égale à motdepasse
  • L'assertion (mdp = user_mdp) est vraie quand l'utilisateur rentre le bon de mot de passe

Condition et forme complète : if - else

In []:
if condition : 
    BLOC INSTRUCTIONS 1 # si la condition est vérifiée
else:
    BLOC INSTRUCTIONS 2 # si la condition n'est pas vérifiée

Il n'y a pas d'assertion à la suite de else

Exemple 3: Comment indiquer à l'utilisateur qu'il a fait une erreur ?

In []:
# -*- coding: utf-8 -*-
mdp = u"motdepasse"
user_mdp = raw_input(u"Entrez votre mot de passe: ")
if mdp == user_mdp:
    print(u"ok")
else:
    print(u"mot de passe oublié")

exemple 4: Écrire une suite d'instructions permettant d'obtenir la valeur absolue d'un nombre \(x \in \mathbb{R}\)

Soit \(x \in \mathbb{R}\), on appelle valeur absolue de \(x\) et on note \(|x|\) le réel \(max(x, -x)\)

Ainsi \(|x|=x\) si \(x \geq 0\), \(|x| = -x\) si \(x \leq 0\)

In []:
x=-3.14
abs_x = max(x, -x)
print abs_x
In []:
if x >= 0:
    abs_x = x
else:
    abs_x = -x
print abs_x

Les opérateurs booléens les plus courants

Avec les opérateurs booléens :

  • and pour la conjonction
  • or pour la disjonction
  • not qui inverse le prédicat

Exemple 5: Comment contrôler à la fois le mot de passe et l'identifiant ?

In []:
id = u"cpge"
mdp = u"cAmIlLe-JuLlIaN_2016" #un bon mot de passe comporte des majuscules des minuscules des chiffres et des caratères spéciaux
user_id = raw_input(u"Identifiant ? ")
user_mdp = raw_input(u"Mot de passe ? ")
if id == user_id and mdp == user_mdp:
    print(u"ok")
else:
    print(u"problème id ou mdp")
  • soit id et mdp des chaines de caractères respectivement égales à "cpge" et "cAmIlLe-JuLlIaN_2016"
  • (id == user_id and mdp == user_mdp) est une assertion vraie quand id == user_id et mdp == user_mdp sont vraies simultanément, fausse sinon

Enigme

Rédiger un algorithme permettant de déterminer le maximum de trois nombres

Condition et forme imbriquée : if elif else

Un choix possible seulement parmi un ensemble de possibilités

In []:
if condition 1: 
    BLOC INSTRUCTIONS 1 # si la condition 1 est vérifiée
    
elif condition 2:
    BLOC INSTRUCTIONS 2 # si la condition 2 est vérifiée

else:
    BLOC INSTRUCTIONS 3 # si aucune des conditions n'est vérifiées

Exemple 6: Écrire une suite d'instructions permettant d'afficher acide, basique ou neutre en fonction de la valeur de la concentration en ions \(H_3O^+\) (appelé ion oxonium) d'une solution:

In []:
import math
c = float(raw_input(u"Concentration en ion H3O+ = ")) #transtypage
pH = -math.log10(c) #Attention log=ln
print pH
if pH < 7:
    print(u"Acide")
elif pH == 7:
    print(u"Neutre")
else:
    print(u"Basique")

Exercices :

Année bissextile

Écrire une suite d'instructions permettant de déterminer si une année saisie par l'utilisateur est bissextile.

Une année est dite bissextile si c'est un multiple de 4, sauf si c'est un multiple de 100. Mais elle est quand même considérée comme bissextile si c'est un multiple de 400.

La monnaie SVP :

Un distributeur de banque dispose de billets de 10, 20, 50, 100, 200 et 500 euros. Écrire un programme qui demande la somme désirée et propose une répartition avec le moins de billets possible. Contrairement à l'exercice du TD1 les billets affectés d'un coefficient zéro ne sont pas affichés

Chaîne de caractères

Écrire une suite d'instructions qui renvoie vrai si une chaîne de caractères représente un nombre et faux sinon.

Compter avec les heures

Ecrire une suite d'instructions qui calcule l’heure une minute après celle stockées sous la forme de deux variables :

In []:
heure, minute = 10, 20

Exemples :

  • heure, minute = 10, 20 affiche heure = 10, minute = 21
  • heure, minute = 10, 59 affiche heure = 11, minute = 00

Ne pas oublier le cas de minuit.

Corrections des exercices

Maximum de trois nombre : version longue
In []:
#maximum de trois nombres
a, b, c = 10, 10, 10
if a > b:
    if a > c:
        max = a
    else:
        max = c
else:
    if b > c:
        max = b
    else:
        max = c

print max
In []:
#maximum de trois nombre avec conjonction
a, b, c = 24, 24, 25
if a > b and a > c:
    max = a
elif a > b and a < c:
    max = c
elif b > c:
    max = b
else:
    max = c
print max

Une meilleur stratégie consiste à diviser pour régner, on décompose en deux problèmes distincts, on cherche d'abord le max de a et b puis on compare avec c

In []:
a, b, c = 23, 2, 25
if a > b:
    max = a
else:
    max = b
if c > max:
    max = c
print max
In []:
#Année bissextile
'''
 2015 n'est pas bissextile. L'an 2008 était bissextile suivant la première règle (divisible par 4).
 L'an 1900 n'était pas bissextile, car divisible par 100 mais non divisible par 400. 
 L'an 2000 était bissextile car divisible par 400.
'''
bissextile = False
an = int(raw_input(u"Entrez une année : "))
if (an % 400) == 0:
    bissextile = True
elif (an % 100) == 0:
    bissextile = False
elif (an % 4) == 0:
    bissextile = True
else:
    bissextile = False
print bissextile
In []:
#Année bissextile optimisé
bissextile = False
an = int(raw_input(u"Entrez une année : "))
if (an % 400) == 0 or ((an % 100 != 0) and (an % 4 == 0 )):
    bissextile = True
else:
    bissextile = False
print bissextile
In []:
bissextile = False
an = int(raw_input(u"Entrez une année : "))
if (an % 4 == 0 ) and (an % 100 != 0) or (an % 400) == 0:
    bissextile = True
else:
    bissextile = False
print bissextile

Un algorithme glouton (greedy algorithm en anglais, parfois appelé aussi algorithme gourmand) est un algorithme qui suit le principe de faire, étape par étape, un choix optimum local. Dans certains cas cette approche permet d'arriver à un optimum global

In []:
#La monnaie SVP

somme = int(raw_input(u"Combien désirez-vous ?"))
n = somme / 500
if n > 0:
    somme = somme - n * 500 
    print n,"billet(s) de 500"
    
n = somme / 200
if n > 0:
    somme = somme - n * 200 
    print n,"billet(s) de 200" 
    
n = somme / 100
if n > 0:
    somme = somme - n * 100 
    print n,"billet(s) de 100"

n = somme / 50
if n > 0:
    somme = somme - n * 50
    print n,"billet(s) de 50"
    
n = somme / 20
if n > 0:
    somme = somme - n * 20 
    print n,"billet(s) de 20"
    
n = somme / 10
if n > 0:
    somme = somme - n * 10 
    print n,"billet(s) de 10" 
In []:
#Parité d'un nombre

nombre = raw_input(u"Donnez un nombre entier = ")
if nombre.isdigit():
    if int(nombre)%2 == 0: #transtypage String to int
        print u"Nombre pair"
    else:
        print u"Nombre impair"
else:
    print "Ce n'est pas un nombre entier"
In []:
#La chaîne est-elle un nombre ?

a = "233.897"
b = a.replace(".", "", 1)
if b.isdigit():
    print "transtypage possible"
    print "entier:", int(float(a)), "flottant:",float(a)
else:
    print "Ce n'est pas un nombre"
In [1]:
import time
print time.strftime("Version du "+'%d/%m/%y %H:%M',time.localtime())
Version du 07/09/16 09:14

Christophe Casseau mail : isncaju@gmail.com