Aller au contenu

Exercices d'entraînement

Ces exercices doivent être utilisés pour vous entraîner à programmer. Ils sont généralement accompagnés d'aide et de leur solution pour vous permettre de progresser.

Avant de vous précipiter sur ces solutions dès la première difficulté, n'oubliez pas les conseils suivants :

  • Avez-vous bien fait un schéma au brouillon pour visualiser le problème posé ?
  • Avez-vous essayé de rédiger un algorithme en français, avec vos propres mots, avant de vous lancer dans la programmation sur machine ?
  • Avez-vous utilisé des affichages intermédiaires, des print(), pour visualiser au fur et à mesure le contenu des variables ?
  • Avez-vous testé le programme avec les propositions de tests donnés dans l'exercice ?
  • Avez-vous testé le programme avec de nouveaux tests, différents de ceux proposés ?

Rappels

  • Chaque programme Python doit être sauvegardé sous forme de fichier texte avec l'extension .py.
    Enregistrez ce fichier dans le dossier [A02-Booléens] avec le nom donné à l'exercice : ProgA02.51.py, ProgA02.52.py, etc...
  • Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche [F5].

ProgA02.51 - Table du « et »

On présente ci-dessous comment établir la table de vérité de l'opérateur et avec Python.

Étudiez ce code puis exécutez l'appel tableEt() dans la console afin de bien comprendre la table affichée.

1
2
3
4
5
6
7
def tableEt():
    """
    Sortie: None - Affichage de la table du « et »
    """
    for a in (False, True):
        for b in (False, True):
            print(f"{a} et {b} = {a and b}")
Affichage après exécution

On obtient l'affichage suivant :

>>> tableEt()
False et False = False
False et True = False
True et False = False
True et True = True

ProgA02.52 - Table du « ou »

En vous inspirant de l'exercice ProgA02.51, définissez la fonction tableOu() qui affiche la table de l'opérateur ou.

Affichage après exécution

On doit obtenir l'affichage suivant :

>>> tableOu()
False ou False = False
False ou True = True
True ou False = True
True ou True = True

Une réponse
1
2
3
4
5
6
7
def tableOu():
    """
    Sortie: None - Affichage de la table du « ou »
    """
    for a in (False, True):
        for b in (False, True):
            print(f"{a} ou {b} = {a or b}")

ProgA02.53 - Table du « non »

En vous inspirant de l'exercice ProgA02.51, définissez la fonction tableNon() qui affiche la table de l'opérateur non.

Affichage après exécution

On doit obtenir l'affichage suivant :

>>> tableNon()
non(False) = True
non(True) = False

Une réponse
1
2
3
4
5
6
def tableNon():
    """
    Sortie: None - Affichage de la table du « non »
    """
    for a in (False, True):
        print(f"non({a}) = {not(a)}")

ProgA02.54

  1. Qu'obtient-on en entrant les instructions suivantes dans un interpréteur python ?

    >>> ch = ''
    
    >>> ch[0] == 'a'
    
    Une réponse

    On obtient l'affichage d'une erreur bien sûr :

    >>> ch = ''
    
    >>> ch[0] == 'a'
    IndexError: string index out of range
    

  2. Qu'obtient-on en entrant les instructions suivantes dans un interpréteur python ?

    >>> ch = ''
    
    >>> if len(ch) != 0 and ch[0] == 'a':
    ...     print(ch)
    ... else:
    ...     print("Bouh!")
    
    Une réponse

    On obtient l'affichage Bouh!. Cette réponse peut paraître étrange : pourquoi n'obtient-on pas une erreur ?

    >>> ch = ''
    
    >>> if len(ch) != 0 and ch[0] == 'a':
    ...     print(ch)
    ... else:
    ...     print("Bouh!")
    ...
    'Bouh!'
    

    Comme le test (len(ch) != 0) a pour valeur False, une expression logique « (len(ch) != 0 ) et ... » vaudra nécessairement False. Python n'évalue donc pas ce qui se trouve après l'opérateur « and » : l'erreur IndexError n'a donc pas lieu.

ProgA02.55 - Problème de communication

Hugo voudrait afficher la valeur de x lorsque x vaut 1 ou lorsque x vaut 0, et afficher "Erreur" lorsque x ne vaut ni 0, ni 1.

Il écrit le code suivant :

1
2
3
4
5
6
7
8
9
def un_ou_zero(x):
    """
    x - int
    Sortie: None - Affiche x lorsque x vaut 1 ou 0, affiche "Erreur" sinon.
    """
    if x == 1 or 0:
        print(x)
    else:
        print("Erreur")
  1. Testez ce code et vérifiez qu'il ne convient pas.

    Réponse du 1.

    Ce code ne convient pas.
    En effet, l'appel un_ou_zero(0) affiche "Erreur" :

    >>> un_ou_zero(1)
    1
    
    >>> un_ou_zero(0)
    'Erreur'
    
  2. Expliquez l'erreur faite par Hugo.

    Réponse du 2.

    Pour mieux comprendre ce qu'a écrit Hugo, ajoutons des parenthèses:

    6
    if (x == 1) or 0:
    

    Le or, au lieu de porter sur deux booléens, porte d'un côté sur le booléen x == 1 et de l'autre sur le nombre 0.
    Cela n'a, d'un point de vue logique, aucun sens !

    Il faut écrire :

    6
    if (x == 1) or (x == 0):
    

    En effet, or est un opérateur entre deux booléens.

  3. Expliquez pourquoi Python ne renvoie pas une erreur.

    Réponse du 3.

    Pour comprendre pourquoi Python n'affiche pas d'erreur, on peut tester les instructions suivantes dans la console :

    >>> 1 == 1 or 0
    True
    
    >>> 1 == 0 or 0
    0
    
    >>> bool(0)
    False
    
    >>> 'a' == 'b' or 'c'
    'c'
    

    Python donne à or une signification qui n'est pas uniquement celle de la logique.

    Attention

    Il vous est interdit en NSI d'utiliser or autrement qu'entre deux booléens. Toute autre utilisation sera considérée par le correcteur comme une erreur de codage de votre part.

    Vous pouvez vérifier sur quelques exemples que l'instruction t = a or b a la même valeur que t = (a if a else b).

    De même, t = a and b aura la valeur de t = (a if not(a) else b).