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 [A04-Caracteres] avec le nom donné à l'exercice : ProgA04.52.py, ProgA04.53.py, etc...
  • Pour exécuter ce programme, il suffit de le sauvegarder puis d'appuyer sur la touche [F5].
  • Le programme principal doit contenir un appel au module doctest :
    ##----- Programme principal et tests -----##
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    

Exercice A04.51 - Problème d'encodage

  1. Ouvrez un éditeur de texte (par exemple Notepad++) et vérifiez que l'encodage est bien UTF-8 (Menu [Encodage]).
  2. Créez un nouveau fichier HTML et copiez/collez le code ci-dessous :

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!DOCTYPE html>
        <html lang="fr">
            <head>
                <meta charset = "utf-8">
                <title>Encodage du texte</title>
            </head>
            <body>
                <p>
                    bébé, élève, où, château
                </p>
            </body>
        </html>
    

  3. Ouvrez ensuite le fichier avec un navigateur internet.
    Y a-t-il un problème de lecture ?

  4. Modifiez la ligne 4 en remplaçant charset = "utf-8" par charset = "iso-8859-1". Sauvegardez puis actualisez le fichier dans le navigateur.

  5. Que pouvez-vous observer ? Expliquez ce phénomène.

    Une solution

    On observe des caractères « bizarres » à la place des lettres accentuées.

    Pourquoi?

    Le fichier a été encodé lors de l'écriture en utf-8. Par contre, avec la ligne <meta charset="iso-8859-1">, on indique au navigateur de lire le fichier en lui annonçant que ce fichier est encodé suivant la norme iso-8859-1.

    Lorsque le navigateur lit le code du caractère « é » (codé en utf-8), il cherche la correspondance de ce code, mais il ne cherche pas cette correspondance dans la table de l'utf-8, il la cherche dans la table de iso-8859-1.
    Or ce code ne correspond pas en iso-8859-1 à la lettre « é ». On obtient le caractère (ou les caractères) correspondant au code lu dans la table de l'iso-8859-1.

ProgA04.52 - Codage ASCII hexadécimal

La fonction ord() de Python renvoie la représentation décimale d'un caractère. Dans cet exercice, vous allez pogrammer des fonctions permettant d'obtenir la représentation hexadécimale de ceux-ci.

Pour faciliter ce travail, on rappelle que la fonction hex() renvoie l'écriture hexadécimale (sous forme d'une chaîne de caractères précédée de '0x') l'entier passé en paramètre. De plus, la fonction int() permet de renvoyer l'écriture décimale d'une valeur hexadécimale (sous forme d'une chaîne de caractères qui n'est pas précédée de '0x').

Exemple

>>> hex(90)
'0x5a'

>>> int('5a', 16)
90                          # écriture décimale de '5a'
  1. Copiez/collez et complétez le corps de la fonction nettoie() en respectant ses spécifications.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def nettoie(hexa):
        """
        hexa – str, chaîne de caractères précédée de '0x'
        Sortie: str – la chaîne entrée sans le '0x'
        >>> nettoie('0x5a')
        '5a'
        >>> nettoie('0x5ab7')
        '5ab7'
        """
    

    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    def nettoie(hexa):
        """
        hexa – str, chaîne de caractères précédée de '0x'
        Sortie: str – la chaîne entrée sans le '0x'
        >>> nettoie('0x5a')
        '5a'
        >>> nettoie('0x5ab7')
        '5ab7'
        """
        result = ""
        for i in range(2, len(hexa)):
            result = result + hexa[i]
        return result
    
  2. Copiez/collez et complétez le corps de la fonction code_hexa() qui prend en paramètre une chaîne de caractères simple (sans accents ni caractères « spéciaux ») et renvoie sa représentation ASCII hexadécimale (nettoyée) sous forme de tableau.

    1
    2
    3
    4
    5
    6
    7
    def code_hexa(chaine):
        """
        chaine – str, chaîne de caractères de la table ASCII
        Sortie: list – tab, chaque caractère sous sa écriture hexadécimale
        >>> code_hexa('Bonjour')
        ['42', '6f', '6e', '6a', '6f', '75', '72']
        """
    

    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    def code_hexa(chaine):
        """
        chaine – str, chaîne de caractères de la table ASCII
        Sortie: list – tab, chaque caractère sous sa écriture hexadécimale
        >>> code_hexa('Bonjour')
        ['42', '6f', '6e', '6a', '6f', '75', '72']
        """
        liste = []
        for carac in chaine:
            valeur = hex(ord(carac))
            liste.append(nettoie(valeur))
        return liste
    
  3. Copiez/collez et complétez le corps de la fonction decode_hexa() en respectant ses spécifications.

    1
    2
    3
    4
    5
    6
    7
    8
    def decode_hexa(tab):
        """
        tab – list, tableau de nombres hexadécimaux sous forme de chaîne
                    Chaque nombre représente un caractère
        Sortie: str - traduction sous forme de chaîne de caractères
        >>> decode_hexa(['42', '6f', '6e', '6a', '6f', '75', '72'])
        'Bonjour'
        """
    

    Une solution
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    def decode_hexa(tab):
        """
        tab – list, tableau de nombres hexadécimaux sous forme de chaîne
                    Chaque nombre représente un caractère
        Sortie: str - traduction sous forme de chaîne de caractères
        >>> decode_hexa(['42', '6f', '6e', '6a', '6f', '75', '72'])
        'Bonjour'
        """
        chaine = ""
        for element in tab:
            valeur_carac = int(element, 16)
            chaine = chaine + chr(valeur_carac)
        return chaine