Outils pour utilisateurs

Outils du site


nsi:premiere:caracteres

Ceci est une ancienne révision du document !



Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "cell_counter" in /home/goupillf/wiki.goupill.fr/inc/parser/xhtml.php on line 1550

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Warning: Undefined array key "pos" in /home/goupillf/wiki.goupill.fr/lib/plugins/mdpage/src/DokuWiki/Plugin/Mdpage/MarkdownRendererTrait.php on line 100

Caractères

Encodage

Les transistors, les circuits mémoires... stockent des entités binaires, des 0 et des 1. On a vu que l'on pouvait regrouper ses bits pour former des mots (octet)

Comment va-t-on stocker des caractères ?

 Table ASCII - merican tandard ode for nformation nterchange

128 caractères, pas d'accents, beaucoup de caractères de contrôle liés à la technologie de l'époque (années 60).

x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
0x NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
1x DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2x SP ! " # $ % & ' ( ) * + , - . /
3x 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4x @ A B C D E F G H I J K L M N O
5x P Q R S T U V W X Y Z [ | \ | ] ^ _
6x ` a b c d e f g h i j k l m n o
7x p q r s t u v w x y z { | } ~ DEL

Unicode

Codage international contenant environ 140 000 caractères pour tous les alphabets.

  • Les 128 premiers correspondent à ASCII
  • Les 256 premiers correspondent à ISO 8859-1 = Latin-1 (lui-même compatible avec ASCII)

Un caractère est Unicode codé sur 4 octets.

Remarque : Le plus souvent, pour améliorer les performances, Unicode n'est pas utilisé directement. Pour les textes on utilise des adaptation, notamment UTF-8, permettant d'occuper moins de 4 octets par caractère (on verra plus tard)

Unicode et Python

En Python, on utilise directement unicode ce qui permet d'écrire à peu près n'importe quel caractère.

ord(c)    # renvoie le code unicode du caractère c
chr(code) # renvoie le caractère correspondant au code 

Manipulations

On crée une chaîne de caractères en utilisant "" ou '' indifféremment.

texte = "bonjour"
autretexte = 'au revoir'

Le type d'une chaîne est str.

Nous avons déjà rencontré la syntaxe de la manipulation d'une chaîne, elle est identique à celle des p-uplets. Juste un exemple pour mémoire :

texte = "bonjour"
texte[2]  # correspond au caractère de rang 2 : 'n'

Rappel important : En Python les chaînes de caractères sont immutables. On ne peut donc pas écrire :

texte = "bonjour"
texte[2] = 'a'

Toutes les fonctions qui modifient une chaîne créent une copie de la chaîne d'origine avec la modification faite.

Quelques fonctions spécifiques

Les fonctions pouvant être utilisées sur les chaînes de caractères sont très nombreuses et on ne va pas toutes les apprendre. Dites vous que pour toutes les manipulations ordinaires auxquelles vous pourriez penser, il existe probablement une fonction déjà faite.

texte = "Bonjour"
texte.upper() # renvoie "BONJOUR"
texte.lower() # renvoie "bonjour"
"   texte".lstrip() # enlève les espaces en début
"ananas".replace('a', 'x') # produit "xnxnxs"
"452".isnumeric() # renvoie True

Vous noterez la syntaxe particulière : on veut agir sur la chaîne texte et au lieu d'écrire quelque chose comme upper(texte), on écrit texte.upper(). Ce serait trop long de l'expliquer ici. Le type str est une classe (au sens donné à ce mot en programmation) et vous l'étudierez si vous poursuivre en Terminale.

La commande help(str) affiche les nombreuses fonctions disponibles. Bien sûr, internet est aussi une source précieuse d'information.

Le formatage

Il est fréquent que l'on ait besoin d'écrire un résultat et que l'on souhaite respecter un certain affichage.

Exemple : On dispose du nombre a et on voudrait afficher un message disant que a la valeur de a est et écire la valeur au bout.

Il existe diverses méthodes mais la meilleur consiste à utiliser un formatage.

  1. On prévoit l'affichage voulu et l'espace prévu pour le contenu de a Ici ce serait : "La valeur de a est {}." Les {} indique une position à compléter.
  2. La fonction format permet de compléter. "La valeur de a est {}.".format(a) va compléter l'espace prévu par le contenu de a.

La méthode format donne accès à tout une liste de formatage spéciaux qu'on ne donne pas ici mais que l'on cherche sur internet au besoin. Par exemple, veut-on afficher sur un nombre sur 5 colones ? avec 2 chiffres après la virgule ? en binaire ? etc.

 Exercices

Exercice 08.1

  • Combien faut-il de bits pour coder un caractère ASCII ?
  • Une table étant fournie, coder en ASCII le nom : Ada Lovelace
  • À l'envers, décoder : ̀ 70 114 105 116 101 115 32 97 32 108 97 32 99 97 110 116 105 110 101`

Exercice 08.2

Un roman compte en moyenne 300 000 caractères.

  • Si on prévoit un octet par caractère, quel est le poids du roman en ko ?
  • Combien pourra-t-on stocker de romans sur un disque dur de 1 To ?
  • En quoi est-il peu performant d'utiliser Unicode directement ?

Exercice 08.3 - Cryptage de César

Principe :

  • Le texte est tout en majuscules, sans accents.
  • On se donne une clé, par exemple key = 2.
  • Les lettres de l'alphabet sont décalées de key unités vers la droite. Ainsi, si key = 2, A devient C, G devient I et Y devient A.
  • Si le caractère n'est pas entre A et Z, il n'est pas modifié.
  1. Écrire la fonction cryptageCesarUnCaractere(c,key) qui, pour un seul caractère c et une clé key, donne le caractère crypté correspondant.

  2. Écrire la fonction cryptageCesar(texte,key) qui, pour la chaîne de caractères texte et une clé key, donne le texte crypté crypté correspondant.

  3. Enregistrer votre programme sous le nom cesar.py. Placer le fichier cesar.test.py dans le même dossier et exécutez-le pour vérification.

  4. Comment faire le décryptage ?

Exercice 08.4

Que donnent les différentes instructions suivant l'affectation :

x = 475.45932
print("x =",x)
print("x","=",x)
print("x = x")
print("x = "+x)
print("x = "+str(x))
print("x = {}".format(x))
print(x = "x")
print("x = %8.3f"%x)
print("x = %08.2f"%x)
print("x = {:8.3f}".format(x))
"x" == x
x = "x"
"x" = x

Exercice 08.5

  1. Écrire une fonction verifierParentheses(expression) vérifiant si les parenthèses d'une expression sont bien équilibrées.

Exemples :

  • verifierParentheses('((3+x)*5)/(4x+1)') doit renvoyer True
  • verifierParentheses('(3+x)*5)/(4x+1)') doit renvoyer False
  1. Enregistrer votre programme sous le nom parentheses.py. Placer le fichier parentheses.test.py dans le même dossier et exécutez-le pour vérification.

Exercice 08.6

  1. Écrire une fonction conway(line) donnant l'élément suivant de line dans la suite de Conway.

    Par exemple line = '112341112' doit produire le résultat '211213143112'

  2. Enregistrer votre programme sous le nom conway.py. Placer le fichier conway.test.py dans le même dossier et exécutez-le pour vérification.

Exercice 08.7 - Mastermind - Long

Le jeu de Mastermind se joue a deux.

  • Le joueur 1 choisit un code de 5 items, caché.
  • Ce code est composé de lettres, de A à H.

Par exemple EFAAB est un code possible. Le joueur 2 doit faire des essais pour deviner le code. À chaque proposition du joueur 2, le joueur 1 répond en indiquant pour chaque item :

  • 2 s'il est bien placé,
  • 1 s'il mal placé
  • 0 s'il n'est pas dans le code.

Par exemple :

  • code = 'EFAAB' et proposition = 'AFBBC'reponse = '12100'
  • code = 'EFAAA' et proposition = 'AAFAD'reponse = '10120'
  1. Écrire une une fonction codeAleatoire() qui génère un code au hasard Utilisez la bibliothèque random
  2. Écrire une fonction testCode(bonCode,essaiCode) qui reçoit bonCode et essaiCode et qui retourne la réponse indiquant ce qui est bon dans bonCode.
  3. Enregistrer votre programme sous le nom mastermind.py. Placer le fichier mastermind.test.py dans le même dossier et exécutez-le pour vérification.
  4. Écrire le programme qui exécute une partie :
    • choix du code aléatoirement par la machine,
    • demande à l'utilisateur de saisir un essai de code,
    • test du code proposé,
    • affichage du résultat du test, et cela en boucle jusqu'à ce que le bon code soit trouvé.

Peut aider :

"maison".find("e") # retourne -1 car "e" pas dans "maison"
"maison".find("s") # retourne 3 position de "s" dans "maison"
chaine.find(souschaine) # retourne la position de souchaine dans chaine

Exercice 08.8 (Difficile)

Un alcane est une molécule composée de carbone et d'hydrogène. Le méthane, le propane, le butane sont des alcanes.

Par exemple, le butane a pour composition C4H10, soit 4 atomes carbone et 10 atomes hydrogène. En général, si $n$ est le nombre d'atomes carbone, le nombre d'atomes hydrogène est $2n+2$.

  1. Écrire une fonction estAlcane(formule) qui pour une formule donnée sous forme de texte, par exemple "C4H10" renvoie True ou False, selon si c'est un alcane ou non.

    Pensez que l'usage est de ne pas écrire le 1 quand il n'y a qu'un seul atome. Par exemple "CH4" pour le méthane ou "CO2" pour le dioxyde de carbone.

  2. Enregistrer votre programme sous le nom alcane.py. Placer le fichier alcane.test.py dans le même dossier et exécutez-le pour vérification.

Remarque pour aller plus loin (élèves plus avancés)

Découper une chaîne caractère après caractères est fastidieux et peu performant. L'informatique propose une théorie des langages qui étudie la capacité à reconnaître certains motifs.

Noam Chomsky a grandement contribué à cette théorie.

Une application : les expressions régulières.

Voici un exemple pour le cas précédent :

import re # expressions régulières
 
def decomposeFormule(formule):
    regex = "([A-Z][a-z]*)([0-9]*)"
    return re.findall(regex, formule)

On obtient un découpage parfait même pour des formules comme "Cu12N3HB". La suite du travail en est grandement facilitée.

nsi/premiere/caracteres.1618401122.txt.gz · Dernière modification : de goupillwiki