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
Table des matières
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
texteet au lieu d'écrire quelque chose commeupper(texte), on écrittexte.upper(). Ce serait trop long de l'expliquer ici. Le typestrest 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.
- On prévoit l'affichage voulu et l'espace prévu pour le contenu de
aIci ce serait :"La valeur de a est {}."Les{}indique une position à compléter. - La fonction
formatpermet de compléter."La valeur de a est {}.".format(a)va compléter l'espace prévu par le contenu dea.
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
keyunités vers la droite. Ainsi, sikey = 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é.
Écrire la fonction
cryptageCesarUnCaractere(c,key)qui, pour un seul caractèrecet une clékey, donne le caractère crypté correspondant.Écrire la fonction
cryptageCesar(texte,key)qui, pour la chaîne de caractèrestexteet une clékey, donne le texte crypté crypté correspondant.Enregistrer votre programme sous le nom
cesar.py. Placer le fichiercesar.test.pydans le même dossier et exécutez-le pour vérification.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
- É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 renvoyerTrueverifierParentheses('(3+x)*5)/(4x+1)')doit renvoyerFalse
- Enregistrer votre programme sous le nom
parentheses.py. Placer le fichierparentheses.test.pydans le même dossier et exécutez-le pour vérification.
Exercice 08.6
Écrire une fonction
conway(line)donnant l'élément suivant delinedans la suite de Conway.Par exemple
line = '112341112'doit produire le résultat'211213143112'Enregistrer votre programme sous le nom
conway.py. Placer le fichierconway.test.pydans 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'etproposition = 'AFBBC'⇒reponse = '12100'code = 'EFAAA'etproposition = 'AAFAD'⇒reponse = '10120'
- Écrire une une fonction
codeAleatoire()qui génère un code au hasard Utilisez la bibliothèquerandom - Écrire une fonction
testCode(bonCode,essaiCode)qui reçoitbonCodeetessaiCodeet qui retourne la réponse indiquant ce qui est bon dansbonCode. - Enregistrer votre programme sous le nom
mastermind.py. Placer le fichiermastermind.test.pydans le même dossier et exécutez-le pour vérification. - É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$.
Écrire une fonction
estAlcane(formule)qui pour une formule donnée sous forme de texte, par exemple"C4H10"renvoieTrueouFalse, 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.Enregistrer votre programme sous le nom
alcane.py. Placer le fichieralcane.test.pydans 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.
