Tests et conditions

Une condition peut prendre deux valeurs: vrai (TRUE) ou faux (FALSE). Une telle variable s'appelle un booléen (en hommage à George Boole)

exemple 1

Dans l'exemple 1

A la ligne 2 le script affiche le contenu de la condition 'a>15' : False

A la ligne 3, celui de la condition 'a**2 inférieur ou égal à 16' : Vrai.

Enfin, le type d'un tel objet: 'bool' (booléen)

Avant de passer aux instructions de test à proprement parler, indiquons quels sont les opérateurs de comparaison les plus usuels:

a == b évalue si a et b sont égaux a != b évalue si a et b sont différents

a > b évalue si a est strictement supérieur à b a >= b évalue si a est supérieur ou égal à b

a < b évalue si a est strictement inférieur à b a <= b évalue si a est inférieur ou égal à b

a in L évalue si a est un élément de L a not in L évalue si a n'est pas un élément de L

1.L'instruction "if...elif...else"

On peut décider d'exécuter une instruction ou un bloc de plusieurs instructions de manière conditionnelle: si le test est vrai alors le bloc d'instruction est exécuté. On peut éventuellement rajouter ce que le script doit exécuter sinon (c'est à dire si le test est faux)

exemple 2

Dans l'exemple 2, le test (si...sinon...) évalue si la variable n est supérieure ou égale à 2000.

Si le test donne un résultat vrai, l'instruction de la ligne 4 s'exécute mais celle de la ligne 6 non

Sinon (si le test donne un résultat faux), l'instruction de la ligne 4 ne s'exécute pas mais celle de la ligne 6 oui.

Du point de vue de la syntaxe, on retiendra que:

  • les instructions if et else se terminent toutes les deux par deux points " : "

  • l'instruction ou le bloc d'instructions qui doivent être exécutés doivent se situer avec une indentation vers la droite par rapport au niveau de l'instruction du test.

  • les instructions if et else se situent au même niveau d'indentation dans le script

  • l'instruction else n'est suivie d'aucun test: elle se réalise dès que le ou les tests précédents sont faux

Observez maintenant l'exemple 3 ci-dessous qui met en jeu les trois instructions if..elif...else.... Ce script permet de simuler le tirage aléatoire d'une boule dans une urne selon la loi suivante: la probabilité d'obtenir une boule verte est de 20%, celle d'obtenir une boule noire de 30% et enfin celle d'obtenir une boule rouge de 50%

exemple 3

x est une valeur aléatoire comprise entre 0 et 1 (float)

Le script teste d'abord si x est strictement supérieur à 0.8. Si c'est le cas, il affiche le texte 'verte' puis passe à à la ligne 9. Sinon, il passe à la ligne 5

A la ligne 5, on sait déjà que x > 0.8 est faux. Le script fait un nouveau test à travers l'instruction elif (contraction de else if). Si x >0.5 est vrai alors il affiche le texte 'noire' puis passe à la ligne 9. Sinon, il passe à la ligne 7

A la ligne 7, on sait déjà que tous les tests précédents sont faux. L'instruction else ne teste rien: elle exécute l'instruction à la ligne 8 et le script affiche 'rouge'

En conclusion, si x appartient à ]0.8; 1[ alors le script affiche 'verte', si x appartient à ]0.5 ; 0.8] alors le script affiche 'noire et si x appartient à [0; 0.5] alors le script affiche 'rouge'

EXERCICES

Exercice 1: Au cinéma, le prix normal d'une place est de 8,50 euros. Néanmoins, un enfant de moins de 7 ans ne paye pas. Un jeune de moins de 25 ans a une réduction de 50% et un sénior de plus de 65 ans a une réduction de 30%. Ecrire un script qui demande l’âge du client et qui affiche le prix à payer

Exercice 2: On reprend l'énoncé de l'exercice précédent. Modifier le script précédent afin que celui-ci demande le nombre de places que l'on souhaite acheter et demande ensuite l’âge de chacun des spectateurs. Le script affichera alors le prix total à payer.

Exercice 3: Une urne contient 5 jetons. Sur 2 jetons on a inscrit la lettre 'M', sur 1 jeton la lettre 'N' et sur les jetons restants on a inscrit a lettre 'A'. Simuler le tirage aléatoire d'un jeton dans cette urne

Correction exercice 1

# un script possible

age=int(input('Quel est votre age? '))

if age <7:

prix = 0

elif age<25:

prix=4.25

elif age>=65:

prix=5.95

else:

prix=8.5

print('le prix de votre place est de',prix,'euros')


Correction exercice 2

# un script possible

nb=int(input('combien de places souhaitez-vous acheter? '))

prix=0 # on initialise le prix total à zéro

for i in range(nb): # la boucle doit répéter le bloc autant de fois qu'il y a de spectateurs

age=int(input("Quel est l'age du spectateur "+str(i+1)+' ? ')) # la question doit se trouver à l'intérieur de la boucle

if age <7:

prix = prix + 0

elif age<25:

prix = prix + 4.25 # à chaque passage de la boucle, le prix total est incrémenté de la bonne valeur

elif age>=65:

prix = prix + 5.95

else:

prix = prix + 8.5

print('le prix total est de',prix,'euros')


Correction exercice 3

# un premier script possible, qui reprend la structure de l'exemple 3

from random import randint

i = randint(1,5)

if i<=2:

print ('M')

elif i<=4:

print ('A')

else:

print ('N')



# un deuxième script possible, plus élégant mais qui n'utilise pas de test

from random import randint

i = randint(0,4)

univers = 'MAMAN'

print(univers[i])



2. Les opérateurs logiques

On a souvent besoin d'effectuer des tests composés, c'est à dire des tests qui combinent plusieurs conditions.

Soient A et B sont deux booléens.

"A and B" est vrai si et seulement si les booléens A et B sont vrais tous les deux

"A or B" est vrai si et seulement si au moins un des booléens A ou B est vrai

"not A" est vrai si et seulement si A est faux

exemple 4

Dans l'exemple 4,

Ligne 2: True and True = True

Ligne 3: False or True = True

Ligne 4: False or False = False

Ligne 5: not(True) = False

On pourra retenir les tables de vérité suivantes:

EXERCICES

Exercice 4: A l'aide d'une boucle while, écrire un script qui contraint l'utilisateur à saisir un nombre entier entre 4 et 17

Exercice 5: L'ordinateur choisit aléatoirement un entier entre 1 et 20. L'utilisateur propose des valeurs jusqu'à trouver la bonne. A chaque essai, l'ordinateur indique s'il le nombre proposé est trop petit ou trop grand. On peut éventuellement ajouter un compteur qui totalise le nombre d'essais qui ont été nécessaires pour trouver la bonne valeur

Exercice 6: L'ordinateur demande de saisir un mot puis renvoie vrai ou faux selon que ce mot est écrit uniquement en lettres majuscules ou non. On pourra utiliser la table de correspondance ASCII.

Correction exercice 4

# un script possible

a=1

while a<4 or a>17:

a = int(input('donner un entier entre 4 et 17: '))

print('merci')


# un deuxième script possible

a = 1

while a not in range(4,18): # lci on teste directement l'appartenance de a à {4; 5; ...; 17} (liste d'entiers)

a = int(input('donner un entier entre 4 et 17: '))

print('merci')


# les deux scripts précédents génèrent une erreur dès lors que l'utilisateur saisit une valeur qui n'est pas numérique ou pas entière.

# pour se prémunir de ce type d'inconvénient, on peut utiliser les fonctions try...except...

a = 1

while a not in range(4,18):

try:

a = int(input('donner un entier entre 4 et 17: '))

except:

print("ce n'est pas un entier, recommencez!")

if a not in range(4,18):

print("l'entier n'est pas entre 4 et 17, recommencez !")

print('merci')


# la fonction 'try': teste si le script peut réaliser l'instruction 'int(input(...))' correctement.

# si ce n'est pas le cas, au lieu d'afficher un message d'erreur, elle n'exécute pas l'instruction et passe au bloc qui commence par 'except:'


Correction exercice 5

# un script possible

from random import randint

N = randint(1,20)

essai,c = 21,0

while essai !=N:

c=c+1

essai=int(input('quelle est ta proposition ? '))

if essai > N:

print("c'est trop grand")

elif essai < N:

print("c'est trop petit")

print("bravo ! il ne t'a fallu que",c,'essais')


Correction exercice 6

#Cet exercice est important car il n'est pas rare de devoir évaluer la véracité sommative de plusieurs conditions


# un script possible

mot = input('Entre un mot: ')

MAJ = True

# On commencence par supposer que MAJ est vrai, c'est à dire que le mot est écrit en majuscules. Si aucune information ne vient réfuter cette supposition, c'est la réponse que renverra le script

L = len(mot)

for i in range(L):

n = ord(mot[i])

if n<65 or n>90: # Ici on évalue si n correspond à un caractère qui n'est pas une des 26 lettres majuscules de la table ASCII

MAJ = False # Cette instruction s'exécutera dès lors que la condition du test précédent est vraie au moins une fois

print(MAJ)


# un autre script possible. On a modifié la ligne 6 du script précédent et remplacé le test par une opération sur des booléens

# Ce script est peut-etre un peu moins facile à lire, notamment pour qui n'est pas très familier avec les tables de vérité

mot = input('Entre un mot: ')

MAJ = True

L = len(mot)

for i in range(L):

n = ord(mot[i])

MAJ = MAJ and (n>=65) and (n<=90) # MAJ reste vrai si et seulement si toutes les conditions de part et d'autre sont vraies

print(MAJ)