Informatique TP4 : Manipulations de fichiers Manipulations de chaînes et de tableaux CPP 1A



Documents pareils
1 Lecture de fichiers

TP 1. Prise en main du langage Python

STAGE IREM 0- Premiers pas en Python

1 Recherche en table par balayage

Chaque ordinateur est constitué de différentes unités de stockage de données (Disque dur, Graveur ) que l on peut imaginer comme de grandes armoires.

Présentation du langage et premières fonctions

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Introduction à l informatique en BCPST

Le langage C. Séance n 4

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

TP 1 Prise en main de l environnement Unix

Utilisation d objets : String et ArrayList

Initiation à la programmation en Python

AWS avancé. Surveiller votre utilisation d EC2

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Quels sont les espaces disponibles sur l ordinateur pour stocker ses documents et comment accéder facilement au dossier «My Documents»?

Guide d installation de MySQL

Utilisez Toucan portable pour vos sauvegardes

DM 1 : Montre Autoquartz ETA

Introduction à MATLAB R

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

INITIATION A L INFORMATIQUE. MODULE : Initiation à l'environnement Windows XP. Table des matières :

Recherche dans un tableau

FICHIERS ET DOSSIERS

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

TP1 : Initiation à l algorithmique (1 séance)

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

COURS WINDEV NUMERO 3

Dragon Naturally Speaking 13

Licence Sciences et Technologies Examen janvier 2010

1. Structure d'un programme FORTRAN 95

Eclipse atelier Java

Algorithmique et Programmation, IMA

Initiation à LabView : Les exemples d applications :

L informatique en BCPST

TD3: tableaux avancées, première classe et chaînes

GESTION DE L'ORDINATEUR

LECON 2 : PROPRIETES DE L'AFFICHAGE Version aout 2011

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Comment utiliser FileMaker Pro avec Microsoft Office

Organiser le disque dur Dossiers Fichiers

Foucart Digeon SISR1-CH7 Mise en place d'un serveur FTP BTS SIO 08/04/2013. SISR1 CH7 Mise en place d'un serveur FTP. - Page 1 -

Comment obtenir des ebooks sur le Reader

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Programmation Web. Madalina Croitoru IUT Montpellier

Manuel de System Monitor

Administration de Parc Informatique TP07 : Installation de Linux Debian

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Vos outils CNED COPIES EN LIGNE GUIDE DE PRISE EN MAIN DU CORRECTEUR. 8 CODA GA WB 01 13

Tp 1 correction. Structures de données (IF2)

Direction des Systèmes d'information

Affectation standard Affectation modifiée (exemple)

CREER ET ANIMER SON ESPACE DE TRAVAIL COLLABORATIF

Plan du cours. Historique du langage Nouveautés de Java 7

1.1 L EXPLORATEUR WINDOWS

TP1 - Prise en main de l environnement Unix.

AVEC LIVE TRADER, VISEZ PLUS HAUT POUR VOS INVESTISSEMENTS

Tutoriel Création d une source Cydia et compilation des packages sous Linux

GESTION DU LOGO. 1. Comment gérer votre logo? Format de l image Dimensions de l image Taille de l image 9

Cours d initiation à la programmation en C++ Johann Cuenin

Installation et utilisation du client FirstClass 11

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

Les structures de données. Rajae El Ouazzani

V- Manipulations de nombres en binaire

Utilisation de la Plateforme Office365 et d Oultlook Web App

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Débuter avec Easyweb B

La mémoire. Un ordinateur. L'octet. Le bit

Rapports d activités et financiers par Internet. Manuel Utilisateur

RECUPEREZ DES FICHIERS SUPPRIMES AVEC RECUVA

Programmation avec Xcas ou Python

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Guide d installation CLX.PayMaker Office (3PC)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

TP 1 : prise en main de Windows. TP 1 : prise en main de Windows

INSTALLATION DE L AGENT CT EASY BACKUP LAN REV 1.0/

Programmation C. Apprendre à développer des programmes simples dans le langage C

LES TOUT PREMIERS PAS

MISE A JOUR : 04 FEVRIER 2011 PROCÉDURE D INSTALLATION. Cegid Business COMMENT INSTALLER CEGID BUSINESS V9 SOUS WINDOWS XP, VISTA ET 7

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Développement d une application Android pour l Association des Paralysés de France

Découverte de Python

Algorithmes récursifs


ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Python - introduction à la programmation et calcul scientifique

Leçon N 5 PICASA Généralités

Module : Informatique Générale 1. Les commandes MS-DOS

bbc Launch Pad Juillet 2011 Version 10.0

Restaurer des données

Menu Fédérateur. Procédure de réinstallation du logiciel EIC Menu Fédérateur d un ancien poste vers un nouveau poste

Documentation Technique du programme HYDRONDE_LN

Transcription:

Informatique TP4 : Manipulations de fichiers Manipulations de chaînes et de tableaux CPP 1A Djamel Aouane, Frederic Devernay, Matthieu Moy Mars - avril 2015 1 Manipulations de fichiers Pour organiser des données sur un disque dur, on utilise généralement des fichiers et des répertoires (parfois appelés «dossiers»). Les fichiers («file» en anglais) contiennent l information à proprement parler. Un fichier est une suite d octets (1 octet = 8 bits = 1 nombre de 0 à 255). Par exemple, pour un fichier contenant un programme python, et plus généralement pour tous les fichiers textes, chaque octet correspond à un caractère du programme. Pour d autres formats de fichier plus évolués (texte mis en forme par LibreOffice ou Word, image JPEG ou PNG...), la suite de caractères n a pas forcément de sens pour un être humain, mais les logiciels appropriés savent les lire. Les répertoires («directory» en anglais) contiennent des fichiers ou d autres répertoires. Lancez le gestionnaire de fichiers en cliquant sur l icône «Dossier personnel de...» sur le bureau. Nous utilisons ici Linux, mais l équivalent existe bien sûr sous Windows (répertoire «Mes documents» par exemple) et OS X. Créez un répertoire TP4 dans votre répertoire personnel. Vous ferez l ensemble de ce TP dans ce répertoire. Vous trouverez sur la page du cours un petit programme Python make_dirs.py. Téléchargez ce programme et placez-le dans le répertoire TP4 que vous venez de créer (votre navigateur le téléchargera probablement dans un répertoire Téléchargement, il faudra donc le déplacer). Vous n avez pas besoin d en comprendre le contenu. Chargez ce programme dans Spyder avec le menu «File», «Open...», puis exécutez-le. Il va créer pour vous quelques répertoires et fichiers. Si vous revenez à la fenêtre du gestionnaire de fichiers graphique, vous devriez trouver, dans le répertoire TP4, des nouveaux répertoires dir1, dir2 et dir3 et des nouveaux fichiers file1 et file2. Ouvrez le répertoire dir1 et regardez son contenu. Il contient entre autres un sous-répertoire subdir1, ouvrez-le. Nous allons maintenant parcourir ces répertoires avec un programme Python. Au final, le programme devra afficher la structure des répertoires de la manière suivante : file1 dir1 (repertoire, contient : tutu-3.txt, subdir2, toto-1.py, subdir1, toto-2.txt) make_dirs.py 1

dir3 (repertoire, contient : toto-16.txt, subdir2, subdir1, toto-15.py, tutu-17.txt) file2 dir2 (repertoire, contient : toto-8.py, toto-9.txt, subdir2, subdir1, tutu-10.txt) 1.1 Contenu d un répertoire Créez un nouveau programme Python (par exemple, ls.py 1 ), et écrivez-y le contenu suivant : import os ls (): for e in os. listdir ('.' ): print (e) Exécutez-le et appelez la fonction ls (on peut soit appeler ls() directement depuis l interprète interactif, ou bien ajouter un appel ls() en dessous de sa déclaration dans le fichier). Vous devriez obtenir quelque chose comme (l ordre peut changer) : ls.py make_dirs.py dir1 dir2 dir3 file1 file2 Explications : os.listdir est une fonction Python qui permet de lister les éléments du répertoire passé en paramètre. Il renvoie une liste de chaînes qui sont les noms des fichiers ou répertoires. Notre boucle for permet donc de parcourir les fichiers et répertoires, et de les afficher avec print. Le répertoire courant s appelle «.». os.listdir(. ) veut dire «liste le contenu du répertoire courant». Comme d habitude, import os est nécessaire pour utiliser une fonction du module os (OS = «Operating System»). Exercice 1 (Distinction des fichiers et des répertoires) À l intérieur de la boucle for, distinguez (avec un if) le cas des répertoires. La fonction Python os.path.isdir(nom) permet de savoir si nom est un répertoire. Si e est un répertoire, affichez (repertoire) à côté de son nom. Sinon, gardez l affichage tel qu il était. Vous devriez maintenant obtenir un affichage ressemblant à : ls.py make_dirs.py dir1 (repertoire) dir2 (repertoire) dir3 (repertoire) file1 file2 1. ls est la commande Unix qui permet de lister le contenu d un répertoire, plus ou moins ce qu on est en train de faire en Python 2

Il faut maintenant lister le contenu des répertoires (dir1, dir2 et dir3). Pour cet exercice, nous n irons pas plus loin : nous ne chercherons pas à lister le contenu des sous-répertoires de dir1, dir2 et dir3. 1.2 Affichage du contenu des répertoires Nous allons maintenant compléter notre affichage dans le cas des répertoires. Pour éviter de tout mettre dans la même fonction, créez une fonction show_dir(d) qui contient pour l instant : show_dir (d): print (d + " ( repertoire )") Modifiez votre fonction ls pour appeler cette fonction correctement. La fonction doit maintenant ressembler à : ls (): for e in os. listdir ('.' ): if os. path. isdir (e): show_dir (e) else : print (e) Exercice 2 (Affichage du contenu des répertoires) Modifiez maintenant la fonction show_dir pour produire l affichage «(repertoire, contient : tutu-3.txt subdir2 toto-1.py subdir1 toto-2.txt)». Conseil : créer une variable content de type chaîne, qui vaut initialement "" (chaîne vide). Parcourez le répertoire avec une boucle for, et à chaque tour de boucle ajoutez l élément à la chaîne avec : content = content + " " content = content + element Terminez l affichage avec une instruction : print ( d + " ( repertoire, contient : " + content + ")") Exercice 3 (Affichage d une liste dont les éléments sont séparés par des virgules) Reprenez le programme de l exercice précédent et remplacez l espace (" ") qui sépare chaque élément dans la variable content par une virgule (", "). Exécutez votre programme : vous devriez avoir un affichage presque correct, mais il y a sans doute une virgule en trop au début de la liste. On peut s en débarrasser en n exécutant pas content = content + ", " au premier tour de boucle. Pour cela, ajoutez une variable first initialisée à True avant la boucle et positionnée à False pendant le premier tour. Utiliser un if autour de content = content + ", ". 2 Calcul à partir de données contenues dans un fichier Nous allons maintenant faire un calcul simple sur des données lues depuis un fichier. On suppose qu un instrument de mesure a fourni des données dans un fichier texte, avec une valeur par ligne, comme ceci : 1 12.3 43 3 10 3

Le but de cette section est de calculer la moyenne de ces valeurs. 2.1 Lecture d un fichier ligne à ligne On commence avec le programme suivant : f = open (' donnees. txt ', ' r' ) ligne = f. readline () while ligne!= ' ' : print (" ligne =", ligne ) ligne = f. readline () Explications : Pour lire dans un fichier, il faut d abord l ouvrir. C est ce que fait la fonction open, qui ouvre le fichier donnes.txt en lecture ( r, pour «read»). La fonction open renvoie un objet f que l on peut utiliser avec f.readline() qui veut dire «lire la ligne suivante dans le fichier». Une fois la fin du fichier atteint, f.readline() renvoie la chaîne vide. La variable ligne va donc contenir successivement les chaînes "1", "12.3", "43", "3" et "10" 2. On va maintenant extraire les nombres contenus dans cette ligne, et en faire la moyenne. Exercice 4 (Ordre des instructions dans la boucle) Essayez d inverser les lignes print(ligne) et ligne = f.readline() et exécutez le programme. Cette inversion provoque deux problèmes : la première ligne n est plus affichée, et une ligne blanche est affichée en fin de programme. Expliquez ces problèmes. En pratique, il est donc important d exécuter ligne = f.readline() en dernier : c est cette instruction qui marque le passage à l itération suivante, donc c est la dernière chose qu on fait avant de revenir en tête de boucle et de tester ligne!= ' ' à nouveau. Exercice 5 (Calcul de moyenne) En ajoutant quelques lignes au programme ci-dessus, calculez la moyenne des nombres lus. Attention, la fonction f.readline() renvoie une chaîne de caractère. Pour la convertir en nombre, on peut utiliser float(...). On pourrait bien sûr généraliser la méthode à des fichiers d entrée plus compliqués, par exemple avoir plusieurs valeurs par ligne (typiquement séparées par des virgules). 3 Manipulation de chaînes de caractères La bibliothèque standard de Python contient beaucoup de fonctions de manipulations de chaînes évoluées. Le but ici est de retrouver les algorithmes sans utiliser ces fonctions. Le but de cette partie est d écrire une fonction recherche_mot(m, t) qui recherche le mot m dans le texte t. m et t sont deux chaînes de caractères. L algorithme est le suivant : pour chaque position i à l intérieur de la chaîne t, on va vérifier si m correspond à la sous-chaîne de t démarrant à l indice i. 2. plus précisément, la variable ligne contient elle-même une fin de ligne, ce qui fait que print(ligne) affiche deux retours à la ligne 4

Exercice 6 Écrire une fonction coincide(t, i, m) qui renvoie True si la sous-chaîne de t démarrant à l indice i et de la même longueur que m est égale à m, et False sinon. Par exemple, coincide("ceci est un test de texte", 12, "test") et coincide("ceci est un test de texte", 0, "ceci") renvoient True, mais coincide("ceci est un test de texte", 11, "test") renvoie False. Exercice 7 (Recherche de sous-chaîne) En utilisant la fonction coincide(t, i, m), écrire une fonction recherche_mot(m, t) qui renvoie l indice de t où se trouve le mot m s il existe, et la valeur None sinon. Vérifiez sur quelques exemples que la fonction fonctionne comme prévu. Exercice 8 (Complexité) Quelle est la complexité de cet algorithme? En pratique, on sait faire beaucoup mieux que cet algorithme, et arriver à un coût linéaire après un pré-traitement de la chaîne à rechercher (algorithme de Knuth-Morris-Pratt par exemple). Les mêmes algorithmes peuvent être utilisés avec autre chose que des chaînes de caractères (exemple : recherche d un gêne dans une séquence d ADN). 4 Recherche de valeur dans un tableau Nous avons vu en cours la recherche linéaire dans un tableau, qui est rappelée ici : recherche ( v, liste ): for e in liste : if v == e: return True return False Si on veut que notre fonction renvoie l indice de la valeur quand elle est trouvée, on peut utiliser : recherche ( v, liste ): for i in range ( len ( liste )): if liste [i] == v: return i return None Une autre méthode, si le tableau est trié, est la recherche dichotomique : on va utiliser deux variables gauche et droite pour représenter la portion de tableau dans laquelle la valeur v est susceptible de se trouver (l indice de la valeur est dans l intervalle [gauche, droite]). Initialement, gauche vaut donc 0 et droite vaut len(t) - 1. L idée est de restreindre l intervalle au fur et à mesure de la recherche. On s arrête quand on trouve la valeur, ou quand droite < gauche (i.e. la portion de tableau dans laquelle la valeur v est susceptible de se trouver est vide). À chaque étape, on calcule m = (gauche + droite) // 2 et on regarde la valeur du tableau se trouvant à cet indice : Si la valeur est égale à v, on a trouvé la solution. Si elle est plus grande que v, alors il faut chercher dans la moitié gauche du tableau (entre gauche et m - 1) Si elle est plus petit, c est l inverse. L intérêt de la recherche dichotomique est qu elle est beaucoup plus rapide (Si n est la taille du tableau, la recherche dichotomique est en O(log(n)) au lieu de O(n) pour la recherche linéaire). Exercice 9 (Recherche dichotomique dans un tableau trié) Écrire la fonction recherche(v, liste) en utilisant la méthode de recherche dichotomique. 5

5 Pour ceux qui n en ont jamais assez... Si vous terminez le TP en avance, vous pouvez vous amuser à améliorer vos programmes, par exemple : Permettre à votre fonction ls de prendre en paramètre le nom du répertoire à lister. (Difficile) Modifier votre fonction ls pour qu elle liste le contenu des sous-répertoire, soussous-répertoires, et ainsi de suite. Il faut pour cela que ls soit récursive (i.e. s appelle elle-même). Modifiez le programme de l exercice 5 pour faire le calcul en deux temps : lecture des valeurs depuis le fichier texte vers une liste Python, puis parcours de la liste Python pour calculer la moyenne. 6

6 Solutions Section 1 : import os show_dir (d): content = "" first = True # variable vraie au premier tour de boucle for e in os. listdir (d): if first : first = False else : content = content + ", " content = content + e print ( d + " ( repertoire, contient : " + content + ")") ls (): for e in os. listdir ('.' ): if os. path. isdir (e): show_dir (e) else : print (e) ls () Note : if first: pourrait aussi s écrire if first == True:, mais le == True n est pas nécessaire : first est une variable booléenne, on peut l utiliser directement dans l argument du if. De la même manière en français, on peut écrire «si je suis au CPP alors je fais du Python» ou bien «si la phrase je suis au CPP est vraie alors je fais du Python», c est équivalent. Exercice 4 : Attention, il y a une ligne ligne = f.readline() dans l initialisation avant de rentrer dans la boucle. Donc, si on fait print("ligne =", ligne) après ligne = f.readline() dans la boucle, on aura bien exécuté deux fois ligne = f.readline() avant le premier print, donc la première ligne est lue mais pas affichée. À la dernière exécution, on affiche nécessairement une ligne vide puisque le dernier print serait exécuté entre le dernier readline et le test de sortie de boucle. Exercice 5 : f = open (' donnees. txt ', ' r' ) # Premi è re valeur ligne = f. readline () nombre = 0 somme = 0 while ligne!= ' ' : v = float ( ligne ) somme = somme + v nombre = nombre + 1 # Lecture de la valeur suivante ligne = f. readline () print (" La moyenne des lignes est :", somme / nombre ) Exercice 6 : En n utilisant que les opérations de base : coincide (t, i, m): for j in range ( len (m )): 7

if t[i + j]!= m[j]: return False # On a trouv é une diff é rence, pas # la peine de continuer la boucle. # Si on arrive ici, c' est que la boucle a termin é et qu' on # a compar é tous les caract è res. Les chaines coincident. return True Une autre solution en utilisant les tranches de tableaux Python : coincide (t, i, m): return t[i:i + len (m)] == m Exercice 7 : recherche_mot (m, t): for i in range (1 + len (t) - len (m )): if coincide (t, i, m): return i return None Exercice 8 : La fonction coincide fait len(m) itérations dans le pire cas. Elle est appelée 1 + len(t) - len(m) fois. La complexité est donc len(m) (1 + len(t) - len(m)) (pire cas). Exercice 9 : L invariant de boucle est que l élément recherché est dans l intervalle [gauche, droite]. À chaque tour de boucle, on met à jour gauche ou droite pour maintenir cet invariant. La ligne return m n est atteinte que si t[m] == v, donc dans ce cas la valeur renvoyée est la bonne. La ligne return None n est atteinte que si gauche > droite donc si [gauche, droite] est vide, auquel cas l élément cherché ne peut pas être dans le tableau. recherche_valeur (v, t): gauche = 0 droite = len (t) - 1 while gauche <= droite : # D é commenter pour voir l' ex é cution : # print ( gauche, droite ) m = ( gauche + droite ) // 2 if t[m] == v: return m elif t[m] < v: gauche = m + 1 else : droite = m - 1 return None t = [0, 1, 2, 3, 5, 12] print ( recherche_valeur (4, t)) print ( recherche_valeur (5, t)) print ( recherche_valeur (3, t)) print ( recherche_valeur (0, t)) print ( recherche_valeur (12, t)) 8