Vidéo 14 : Booléens : deux exercices

\(\newcommand{\ds}{\displaystyle}\) \(\newcommand{\Frac}{\ds\frac}\) \(\renewcommand{\r}{\mathbb{ R}}\) \(\newcommand{\C}{\mathbb{ C}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\z}{\mathbb{ Z}}\) \(\newcommand{\Q}{\mathbb{ Q}}\) \(\newcommand{\N}{\mathbb{ N}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\ol}{\overline}\) \(\newcommand{\abs}[1]{\left| \,{#1} \right|}\) \(\newcommand{\pv}{\;;\;}\) \(\newcommand{\ens}[1]{\left\{ {#1} \right\}}\) \(\newcommand{\mens}[1]{\setminus\left\{ {#1} \right\}}\) \(\newcommand{\Par}[1]{\left({#1}\right)}\)

Vidéo 14 : Booléens : deux exercices

Mois de 31 jours

On donne un numéro de mois m entre 1 et 12. Créer une variable booléenne est_mois_31 (prenant comme valeur True ou False) qui teste si m est le numéro d’un mois ayant 31 jours comme janvier (numéro 1) ou juillet (numéro 7) mais pas février (numéro 2).

Solution

On dispose de la liste des numéros de mois ayant 31 jours, donc il suffit de tester les uns après les autres le mois donné m avec les mois possibles :

m = 4
est_mois_31 = (m == 1 or m == 3 or m == 5 or
               m == 7 or m == 8 or m== 10 or m== 12)

print(est_mois_31)
False
  • Lignes 2-3 : une expression placée entre des parenthèse peut être exceptionnellement écrite sur plusieurs lignes, cela évite d’écrire de longues lignes.

On peut aussi essayer de donner une condition plus synthétique. Un mois de 31 jours placé avant août est de numéro 1, 3, 5 ou 7 et donc impair ; à l’inverse, un mois de 31 jours placé à partir d’août est de numéro 8, 10 ou 12 et donc pair. D’où le code suivant :

m = 9
est_mois_31 = ((m <= 7 and m % 2 == 1) or (m >= 8 and m % 2 == 0))
print(est_mois_31)
False

On pouvait aussi remarquer qu’il y a plus de mois à 31 jours et donc il est (légèrement) plus court d’écrire de passer par la négation :

m = 4
est_mois_31 = not (m==2 or m==4 or m==6 or m==9 or m==11)
print(est_mois_31)
False

Expressions booléennes

De la même façon qu’il existe des expressions arithmétiques comme

x*(x+1) - 4*x*y + 1,

il existe des expressions booléennes, comme

p and (q or r) or (not p and q),

qui s’obtiennent en combinant des opérateurs logiques avec des expressions.

Évaluer une expression booléenne, c’est déterminer si elle vaut True ou False.

Par exemple

(1 == 2 and 2 == 3) or 1 == 1

est un expression booléenne dont la valeur est True.

Bien se rendre compte que dans de nombreuses situations, les parenthèses figurant dans l’expression sont indispensables. Ainsi, comparer :

1
2
3
4
a=1
b=2
print((not a) == b)
print(not a == b)
5
6
False
True

Pour conclure, donnons deux exemples typiques d’expressions booléennes.

Exemple 1 : être positif

Il est fréquent que les expressions booléennes utilisent des variables. Par exemple, si x est une variable, on peut définir une expression booléenne qui exprime si oui ou non x représente un nombre positif : x >= 0. On peut référencer ces expressions booléennes elles-mêmes par une variable. Ainsi :

1
2
3
4
5
6
7
8
x = 2**19 - 10**6
estPos = (x >= 0)

print(estPos)
print(x)

vrai = True
print(estPos == vrai)
 9
10
11
False
-475712
False
  • Ligne 2 : on a défini une « variable booléenne » estPos et qui ici permet de tester le caractère positif de n’importe quel nombre x défini au préalable. L’usage des parenthèses n’est pas obligatoire, autrement dit, l’écriture estPos = x >= 0, bien que moins lisible, est licite.
  • Ligne 4 : l’affichage (ligne 10) montre que x est négatif donc la valeur de la variable estPos est bien False (ligne 9).
  • Ligne 6 : on peut placer la constante True dans une variable. Idem pour la constante False.
  • Ligne 7 : si b est une variable booléenne, l’expression b == True a toujours même valeur que b, autrement dit, en pratique, il n’est que rarement justifié d’écrire une expression de la forme b == True.

Exemple 2 : comparer des heures

On donne deux moments de la journée, désignés par M et MM, en heures et minutes, par exemple

\(\texttt{M = 14 h 52 min}\) et \(\texttt{MM = 14 h 51 min}\).

et on demande de dire si, oui ou non, M est un moment de la journée strictement antérieur à MM. Dans l’exemple ci-dessus, la réponse est non.

Chaque moment sera donné sous la forme de deux entiers h, m représentant les heures et les minutes pour M et de même hh, mm pour MM.

Pour exprimer que M est antérieur à MM, on compare les heures : \(\mathtt{h < hh}\). Si elles sont distinctes, on peut conclure, sinon c’est que l’expression booléenne \(\mathtt{h == hh}\) est True, et il faut comparer les minutes (\(\mathtt{m < mm}\)) pour conclure. D’où l’expression booléenne suivante :

(h < hh) or (h == hh and m < mm)

Cette expression est vraie si et seulement si M est strictement antérieur à MM. Voici un exemple d’utilisation :

1
2
3
4
5
6
7
h=14
m=52

hh=14
mm=51

print((h < hh) or (h == hh and m < mm))
8
False