tp d’informatique n˚5 (Python) Chaînes de caractères Partie I — Opérations de base sur les chaînes Rappelons pour commencer qu’on fabrique les chaînes de caractères avec s1 = "Bonjour le monde !" et qu’on les affiche (dans la console) avec print(s1) Exercice 1 — Tester et expliquer ce que font les méthodes s1.upper(), s1.lower(), s1.lstrip(), s1.rstrip() et s1.strip(). Exercice 2 — Que fait l’opérateur + appliqué à une chaîne ? Peut-on soustraire deux chaînes ? Peut-on multiplier une chaîne par un entier ? Exercice 3 — Parcours des chaînes Comparer (en les testant !) les deux programmes suivants. def parcourir_1(s) : for i in range(len(s)) : print(s[i]) def parcourir_2(s) : for c in s : print(c) Ensuite, écrire deux programmes prenant comme entrée une chaîne s : le premier qui écrit un caractère sur deux de s, le second qui écrit tous les caractères de s sauf les espaces. Modifier ensuite ces deux programmes pour qu’au lieu d’écrire leur résultat, ils renvoient une nouvelle chaîne contenant ce résultat. Exercice 4 — Conversions chaînes ←→ nombres a) Les fonctions str(x) et int(s) permettent respectivement de créer une chaîne de caractères à partir d’un nombre (entier ou pas) x et de créer un entier à partir d’une chaîne valide s. Écrire une fonction accoler_deux(x,y) qui étant donnés deux entiers x et y renvoie l’entier obtenu en les mettant bout à bout : par exemple, accoler_deux(15,18) doit renvoyer 1518. b) Écrire une fonction accoler_plusieurs(t) qui étant donné un tableau d’entiers renvoie l’entier obtenu en les mettant tous bout à bout : par exemple accoler_plusieurs([14,25,6,0,11]) doit renvoyer 14256011. c) La fonction float(s) renvoie le nombre à virgule flottante représenté par la chaîne s. Écrire une fonction EF(x,y) qui à partir de deux entiers x et y fabrique un nombre décimal dont la partie entière est x et la partie fractionnaire est y. d) Tester les fonctions ci-dessous. Expliquer le rôle des mots-clés try et except (on pourra essayer d’écrire ces fonction en les omettant pour voir la différence). Lycée Saint Louis — MPSI 3 1 TP d’informatique n˚5 (Python) def essai_1(s) : try : x = int(s) print(x) except ValueError : print("Ce n’est pas un nombre à virgule.") def essai_2(s) : try : x = float(s) print(x) except ValueError : print("Ce n’est pas un nombre à virgule.") e) Tester chr(97) et ord("a"). La différence ord("a") - ord("A") dépend-t-elle de la lettre choisie ? Essayer avec des caractères exotiques comme "ç" et "é". Exercice 5 — Fonctions de recherche a) Comparer les résultats de s.find("Le"), s.find("le") et s.find("le", 9, 12) pour la chaîne s = "Bonjour le monde et le soleil". b) Écrire un algorithme trouver_tous(s, m) qui renvoie le tableau de tous les indices auxquels apparaît la chaîne m dans s. Le tableau renvoyé sera vide si le motif n’apparaît pas. Partie II — Recherche Exercice 6 — Écrire une fonction ComparerÀPartirDe(s, m, j) qui teste si le motif m apparaît à partir de l’indice j dans la chaîne s, et renvoie True ou False en conséquence. Exercice 7 — Écrire une fonction RechercheNaïve(s, m) qui étant donnée une chaîne s renvoie le tableau de tous les indices où y apparaît le motif m. L’usage de la fonction find est interdit. Évaluer la complexité de l’algorithme proposé, en fonction des longueurs des deux chaînes. Exercice 8 — Algorithme de Rabin-Karp (1987) Appelons clé d’une chaîne de caractères m la somme des ord(c) pour c in s comme dirait Python. L’algorithme de recherche de motifs de Rabin et Karp consiste à dresser la liste de tous les indices où démarre une sous-chaîne de s de même longueur que m, et ayant la même clé. Ce tableau étant construit, on vérifie ensuite naïvement à chacune de ces positions la présence de m. a) Comment calculer la clé de la sous-chaîne s[i+1:j+1] à partir de la clé de s[i:j] ? b) En déduire un programme RabinKarp(s, m) qui met en œuvre cet algorithme. La construction du tableau avec tous les indices potentiels doit s’effectuer en O(`s ) opérations, où `s est la longueur de s. c) Évaluer la complexité totale de l’algorithme de Rabin-Karp, et la comparer avec celle de l’algorithme naïf. Partie III — Manipulation des fichiers Dans cette partie très brève, nous allons voir comment ranger dans un fichier du disque dur le contenu d’une chaîne, ainsi que l’opération inverse, c’est-à-dire comment récupérer dans une chaîne de caractères le contenu d’un fichier. On stockera l’adresse des différents fichiers à utiliser dans des variables, par exemple : src = "M:/Mon dossier/source.txt" Lycée Saint Louis — MPSI 3 2 TP d’informatique n˚5 (Python) dst = "M:/Mon dossier/destination.txt" Exercice 9 — Après avoir créé (avec le bloc-notes par exemple) un fichier source.txt contenant une phrase arbitraire, tester le code ci-dessous. def MettreEnMajuscules(src, dst) : # Ouverture en mode lecture with open(source, ’r’) as f: s1 = f.read() # La chaîne s1 contient alors la totalité du fichier # Ouverture en mode écriture s2 = s1.upper() with open(cible, ’w’) as f: f.write(s2) Exercice 10 — Écrire un programme qui prend en argument un fichier du disque dur et une chaîne de caractères, et renvoie les indices de toutes les positions où cette chaîne apparaît dans le fichier. Exercice 11 — Cadavres exquis On sera prié de ne pas jouer trop longtemps avec le programme de cet exercice, une fois qu’on a réussi à l’écrire. a) Écrire un programme qui étant donnés quatre tableaux de chaînes de caractères sujets, verbes, adverbes et compléments choisit un élément de chacun d’eux au hasard, et renvoie la phrase obtenue en les concaténant (on ajoutera des espaces là où il faut et un point à la fin). On pourra utiliser par exemple les listes suivantes. sujets = ["Un poisson rouge", "Le hamster vert", "La grande Prêtresse du Nord", "Un moine bénédictin", "Napoléon Ier", "Un MPSI 3 mal réveillé", "Une MPSI 3 mal réveillée", "Lancelot du lac", "Médor"] verbes = ["mange", "boit", "voit", "croit", "désigne", "fait disparaître", "met en pièces", "émerveille", "entend", "adoube", "dissimule", "colorie en rose", "absorbe", "éponge", "écume", "mélange", "extrait"] adverbes = ["élégamment", "avec insistance", "goulûment", "sans hâte", "indécemment", "très vite", "sans le savoir", "souvent", "avec malice"] compléments = ["une pomme empoisonnée", "son labrador préféré", "un liquide visqueux", "un chapelet de saucisses", "une fibre textile", "du papier journal", "le prochain contrôle d’informatique", "son voisin de palier", "un nuage frémissant"] b) Écrire un programme qui écrit dans un fichier du disque dur une centaine de phrases aléatoires ainsi construites. Entre chacune d’elles, on ajoutera un retour de charriot (c’est-à-dire le caractère "\n"). Partie IV — Un peu de cryptographie On termine ce TP par deux algorithmes de cryptographie classiques. Exercice 12 — Cryptage par décalage constant Celui-ci consiste à appliquer aux caractères de la chaîne s la transformation si 7→ si + c mod 128, avec c une valeur donnée appelée clé. Écrire les fonctions de cryptage et de décryptage correspondant. Ces fonctions Lycée Saint Louis — MPSI 3 3 TP d’informatique n˚5 (Python) s’appliqueront à un fichier du disque dur et produiront un nouveau fichier contenant le texte transformé. On vérifiera que le texte obtenu après avoir successivement crypté et décrypté le texte initial est correct. Exercice 13 — L’algorithme de Vigénère Cette fois-ci on applique la transformation si 7→ si + c(i mod N) mod 128, où c est une chaîne de caractères qu’on appelle à nouveau la clé, et N est sa longueur. Mêmes questions qu’à l’exercice précédent. Lycée Saint Louis — MPSI 3 4 TP d’informatique n˚5 (Python)
© Copyright 2024 ExpyDoc