Les conditions

Voila le moment de prendre des décisions!

En effet, suivant la valeur que prend telle ou telle variable, il est souvent nécessaire de faire exécuter au programme une suite différente d'instructions ...

D'où la nécessité de disposer d'instructions de test pour "aiguiller" le programme...

Aiguillage

En Python, comme dans de très nombreux langages, un test se fait avec l'instruction if ( ='si' ).

Structure de l'instruction if

Test simple

				
	if (condition):
		Instruction 1
		Instruction 2
		....
				
			

...qui peut se traduire par:

				
	"SI la condition est VRAIE,
		alors exécuter les instructions 1, 2,..."
				
			

Test avec exécution par défaut

				
	if (condition):
		Instruction 1
		Instruction 2
		....
	else :
		Instruction 3
		Instruction 4
		....
				
			

...qui peut se traduire par:

				
	"SI la condition est VRAIE,
		alors exécuter le bloc d'instructions 1, 2,...
	SINON, dans les autres cas ( donc, si la condition est fausse ),
		exécuter le bloc d'instructions 3, 4,..."
				
			

Test multiple

				
	if (condition A) :
		Instruction 1
		Instruction 2
		....
	elif (condition B):
		Instruction 3
		Instruction 4
		....
	else :
		Instruction 5
		Instruction 6
		....
				
			

...qui peut se traduire par:

				
	"SI la condition A est VRAIE,
		alors exécuter le bloc d'instructions 1, 2,...
	SINON SI la condition B est VRAIE,
		alors exécuter le bloc d'instructions 3, 4,...
	SINON, dans tous les autres cas ( donc, si aucune des conditions précédentes n'est vraie ),
		exécuter le bloc d'instructions 5, 6,..."
				
			

La (ou les) instruction(s) à exécuter selon la situation sont regroupées dans un même bloc logique. Elles sont donc toutes indentées d'un retrait par rapport à l'instruction "parente" ( ici, les instructions if, elif ou else ) pour indiquer à Python qu'il s'agit du même bloc logique.

Plusieurs blocs elif ( = "else if" ) peuvent être placés les uns à la suite des autres, voire même imbriqués les uns dans les autres.
On peut ainsi écrire de très complexes tests en "imbriquant" plusieurs évaluations de condition, qui s'excluent mutuellement: le programme les évalue les unes après les autres, et dès qu'il en trouve une de vraie, exécute son bloc d'instructions et passe toutes les suivantes...

Condition à évaluer:

La condition est une expression, plus ou moins complexe, à évaluer à l'aide d'opérateurs de comparaison :

Opérateur Signification Commentaire
== égal à ATTENTION: il s'agit bien d'un DOUBLE SIGNE ÉGAL...
C'est une erreur classique de ne mettre qu'un seul égal, qui est l'instruction d'affectation ( qui est donc, elle, toujours vraie!!! )
!= différent de
> supérieur à
< inférieur à
>= supérieur ou égal à
<= inférieur ou égal à
in présent dans C'est l'opérateur qui permet de tester l'appartenance d'un élément à un autre, par exemple un caractère particulier dans une chaîne, un élément dans un fichier ou une liste,...de manière générale, un élément dans une structure itérable.
not in pas présent dans C'est l'opérateur inverse, celui qui permet de tester l'absence d'un élément dans une structure itérable.

Exemples:

				
	if ( moyenne == 10 ):

	if ( nombreEleve > 35 ):

	if ( numero != 12 ):

	if ( 'a' in mot ) :
				
			

Conditions multiples:

Plusieurs conditions peuvent être évaluées en même temps, en utilisant les opérateurs and ( ET ) et or ( OU ).

Exemples:

				
	if ( valeur1> 2 ) or ( valeur2 != 10 ):
		"si valeur1 est supérieure à 2 OU valeur2 est différente de 10,....."

	if ( monAge >=18) and ( monAge <=65 ):
		"si monAge est supérieure ou égale à 18 ET inférieure ou égale à 65"
				
			

Exercices

Traduire les tests suivants en langage naturel:

					
	if stock <= 10:
		reponse = "Stock faible!"
					
				
RÉPONSE
SI la valeur de la variable stock est inférieure ou égal à 10,
alors la valeur de la variable reponse est "Stock faible !".

	if ( moyenne >= 10 ) and ( exclus != 0 ):
		reponse = "Elève admis."
				
RÉPONSE
SI la valeur de la variable moyenne est supérieure ou égale à 10 ET que la valeur de la variable exclus est différente de 0,
alors la valeur de la variable reponse est "Elève admis.".

	if (score <= 100 ) :
		reponse = "Petit joueur !"
	elif ( score > 100 ) and (score < 200 ) :
		reponse = "Pas mal..."
	else :
		reponse = "Champion !"
				
RÉPONSE
SI la valeur de la variable score est inférieure ou égale à 10,
alors la valeur de la variable reponse est "Petit joueur !",
SINON SI la valeur de la variable score est supérieure à 100 ET inférieure à 200,
alors la valeur de la variable reponse est "Pas mal...",
SINON, dans tous les autres cas,
la valeur de la variable reponse est "Champion !".

Le test suivant est-il judicieusement écrit?


	if nombre1 > nombre2:
		difference = nombre1 – nombre2
		test = 1
	elif nombre1 < nombre2:
		difference = nombre2 – nombre1
		test = 0
	elif nombre2 == nombre1:
		difference = 0
				
RÉPONSE

Non : il n'y a que deux possibilités pour la condition ( nombre1 > nombre2 ou nombre1 < nombre2 ), tous les autres cas correspondant à nombre1 = nombre2.
La troisième évaluation n'est donc pas nécessaire, et peut être remplacée par un simple else :


	if nombre1 > nombre2:
		difference = nombre1 – nombre2
		test = 1
	elif nombre1 < nombre2:
		difference = nombre2 – nombre1
		test = 0
	else:
		difference = 0
							

Que fait le programme suivant?


	if nombre != 0:
		if nombre < 256:
			print("Valeur trop petite!")
		elif nombre > 256 :
			print("Valeur trop grande!")
		else:
			print('Parfait!')
	else:
		print('Tricheur!')
				
RÉPONSE

Bien observer l'indentation : il y a deux blocs logiques d'instructions, dont l'un est imbriqué dans l'autre.

Cet ensemble fonctionne ainsi :

  1. une première condition sur la variable "nombre != 0" est évaluée
  2. SI cette condition est vraie,...
    ...alors une deuxième condition sur nombre ( comparée à 256 ) est évaluée
  3. SINON, si la première condition est fausse ( et indépendamment du résultat de la deuxième ! ),...
    ....alors afficher "Tricheur !"

QCM d'entraînement

Que s'affiche-t-il à la fin de l'exécution de chacun des scripts suivants ?

Applications

La plus grande des deux (exercice_A09.py)

Écrire un programme qui demande de saisir 2 valeurs et qui affiche la plus grande des 2 valeurs.



				

La plus longue chaîne (exercice_A10.py)

Écrire un script qui demande de saisir 2 chaînes de caractères et qui affiche la plus grande des 2 chaînes (celle qui a le plus de caractères).



				

IMC (exercice_A11.py)

Écrire un script qui demande à l'utilisateur d'entrer sa taille et son poids, qui calcule son IMC et qui lui indique si il est trop maigre, de corpulence normale, en surpoids ou obèse.

L'indice de masse corporelle (IMC) est une mesure basée sur deux variantes : la taille et le poids corporel.
La formule standard s’applique aux hommes et aux femmes d’âge adulte. La formule est simple : IMC = poids (kg) divisé par la taille (m) au carré.

Voici les différentes catégories d’IMC endossés par les organismes officiels de santé:



				

Combien de caractères... (exercice_A12.py)

Écrire un script qui demande à l'utilisateur d'entrer un caractère, et qui compte le nombre de fois où ce caractère apparaît dans le texte ci-dessous :

				

				
			

Attention, un peu de mise en forme ( "nettoyage" des indentations et des retours à la ligne ) sera nécessaire après le copier-coller dans Pyzo.



				

Année bissextile (exercice_A13.py)

Écrire un programme qui demande à l'utilisateur d'entrer une année, et qui détermine si celle-ci est ( ou était ) bissextile.
Essayer de chercher la manière la plus optimisée pour écrire la condition à évaluer...

Les années bissextiles sont:

Pour tester le programme: 1900 n'était pas une année bissextile, 2000 l'était et 2016 le sera.

AIDE
Un nombre est divisible par un autre si ils sont multiples l'un de l'autre, c'est à dire si le reste de la division du premier par le deuxième est égal à 0.
ALGORITHME
annee ← entrée utilisateur transtypée en entier
SI annee divisible par 4 ET annee pas divisible par 100 OU annee divisible par 400
alors resultat ← 'Année bissextile !'
SINON resultat ← 'Année non bissextile !'
afficher resultat


				

Quel jour était-il le ...? (exercice_A14.py)

Il existe un algorithme qui permet de déterminer le jour de la semaine correspondant à une date donnée sous la forme: jour, mois , année entre le 1er janvier 1800 et le 31 décembre 2099.

Bien qu'apparemment complexe, il s'agit d'une simple suite d'évaluation de conditions sur les chiffres de cette date:

				
		siecle ← les deux premiers chiffres de l'année
		an ← les deux derniers chiffres de l'année
		mois ← le mois
		jour ← le jour

		valeur = an + quotient de la division entière de an par 4

		si siecle vaut 18, rajouter 2 à valeur
		sinon si siecle vaut 20, rajouter 6 à valeur.

		si le mois est janvier et que l'année n'est pas bissextile, ajouter 1 à valeur
		si le mois est février,
			si l'année est bissextile, ajouter 3 à valeur,
			sinon si l'année n'est pas bissextile, ajouter 4 à valeur
		si le mois est mars ou novembre, ajouter 4 à valeur
		sinon si le mois est mai, ajouter 2 à valeur
		sinon si le mois est juin, ajouter 5 à valeur
		sinon si le mois est août, ajouter 3 à valeur
		sinon si le mois est octobre, ajouter 1 à valeur
		sinon si le mois est septembre ou décembre, ajouter 6 à valeur

		( Noter qu'on n'ajoute rien à valeur pour avril et juillet...)

		valeur = reste de la division entière de ( valeur + jour )par 7

		si valeur est égale à 1, le jour de cette date est dimanche
		sinon si valeur est égale à 2, le jour de cette date est lundi
		sinon si valeur est égale à 3, le jour de cette date est mardi
		sinon si valeur est égale à 4, le jour de cette date est mercredi
		sinon si valeur est égale à 5, le jour de cette date est jeudi
		sinon si valeur est égale à 6, le jour de cette date est vendredi
		sinon si valeur est égale à 0, le jour de cette date est samedi
				
			

Écrire le programme qui demande à l'utilisateur d'entrer une date sous la forme requise par le programme, puis qui applique l'algorithme pour trouver le jour de la semaine correspondant à cette date.

Quelques conseils :