1 Recherche d une chaîne de caractères dans un fichier



Documents pareils
SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Corrigé des TD 1 à 5

Algorithmes et programmation en Pascal. Cours

Examen Médian - 1 heure 30

Projet de programmation (IK3) : TP n 1 Correction

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

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

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Recherche dans un tableau

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmer en JAVA. par Tama

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

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

Cours Informatique Master STEP

TP1 - Prise en main de l environnement Unix.

Algorithmique et Programmation, IMA

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

Le langage C. Séance n 4

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

Enseignement secondaire technique

1. Structure d'un programme FORTRAN 95

TP, première séquence d exercices.

Chapitre 10. Les interfaces Comparable et Comparator 1

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Algorithmique & programmation

.NET - Classe de Log

Java Licence Professionnelle CISII,

STAGE IREM 0- Premiers pas en Python

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

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Java Licence Professionnelle CISII,

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

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

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Algorithmique et programmation : les bases (VBA) Corrigé

Utilisation d objets : String et ArrayList

Solutions du chapitre 4

Application 1- VBA : Test de comportements d'investissements

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

3 ème Partie : Vérification par tests

Programme Compte bancaire (code)

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Corrigé des exercices sur les références

Initiation à LabView : Les exemples d applications :

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

as Architecture des Systèmes d Information

Document d accompagnement pour l utilisation du Cartable en ligne Lycée des Métiers Fernand LÉGER 2013/2014

1 - Se connecter au Cartable en ligne

SYSTÈME DE GESTION DE FICHIERS

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

1 Recherche en table par balayage

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Introduction au langage C

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

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Les structures. Chapitre 3

Cours 14 Les fichiers

TP1 : Initiation à Java et Eclipse

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

TP : Gestion d une image au format PGM

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

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var - E mail : bij@agasc.fr / Tel : CONSIGNE N 1 :

Programmation en Java IUT GEII (MC-II1) 1

Programmation structurée et algorithmes de base en Pascal

Paginer les données côté serveur, mettre en cache côté client

AWS avancé. Surveiller votre utilisation d EC2

Cours de Systèmes d Exploitation

Algorithmique I. Algorithmique I p.1/??

Génie Logiciel avec Ada. 4 février 2013


Comment se connecter au VPN ECE sous vista

Programmation avec des objets : Cours 7. Menu du jour

Langage Java. Classe de première SI

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Outils pour la pratique

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

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

1 Lecture de fichiers

Introduction à la programmation concurrente

Threads. Threads. USTL routier 1

TP3 : Manipulation et implantation de systèmes de fichiers 1

Initiation à l algorithmique

Notions fondamentales du langage C# Version 1.0

OCL - Object Constraint Language

Les commandes de base de LINUX

TP 1. Prise en main du langage Python

Premiers Pas en Programmation Objet : les Classes et les Objets

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Introduction à MATLAB R

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

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éroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Transcription:

TP NÆ3 1 Université de Nice-Sophia Antipolis Deug MIAS-MI 1 Algorithmique & Programmation 2003 2004 TP NÆ3 Structures de données composées Le but de cette séance est d utiliser les structures de données vues en cours et en TD. 1 Recherche d une chaîne de caractères dans un fichier La commande grep est une des commandes de base des systèmes d exploitation de la famille Unix. Elle cherche à l intérieur de fichiers de texte des lignes correspondant à un motif de texte et les affiche. Dans son utilisation la plus basique, ce motif est une simple chaîne de caractères. Le but de cet exercice va être d implémenter un programmegrep simple. a. Sous Emacs, la première entrée du menutools estsearch File (Grep)... En cliquant dessus, vous obtenez une invite dans la zone de saisie de commandes en bas de la fenêtre : Run grep (like this): grep -n -e Complétez cette commande avec la chaîne de caractères factorielle suivie du nom de fichier*.pas, qui est en fait une liste des fichiers pascal de votre répertoire de travail. Run grep (like this): grep -n -e factorielle *.pas Si vos fichiers du TP numéro 1 sont présents, Emacs vous ouvre un nouveau buffer recensant toutes les lignes des fichiers pascal contenant le mot factorielle. En reproduisant ces opérations mais en saisissant : Run grep (like this): grep -n -e "function factorielle" *.pas Emacs n affiche que les lignes de la déclaration de la fonctionfactorielle. b. Les fichiers textes en Pascal ont pour type text, qui n est autre que file of char. Comme vu en cours, l ouverture d un fichier en lecture se fait d abord en associant le fichier à son nom par assign(f, name), puis en déclarant qu on va l inspecter par reset(f). Le caractère dans le tampon estf^, et on l avance d un caractère parget(f).eof(f) indique si on a atteint la fin du fichier. Les fichiers textes ont de plus la possibilité d avancer le tampon jusqu au début de la prochaine nouvelle ligne avecreadln(f). De plus,eoln(f) devient vrai quand on atteint une fin de ligne. Pour écrire un programme grep, vous allez devoir être capables de revenir en arrière dans le texte du fichier, ce qui n est pas directement possible. Une solution est de stocker le contenu de la ligne dans un tampon ; on définit pour cela : const tailletampon = 8192; { La taille du tampon d entrée. C est aussi la longueur maximale d une ligne. } Écrivez une procédure trouvechaine prenant pour paramètres deux objets de type string : le premier est la chaîne de caractères que l on va chercher, le second est le nom du fichier que l on va explorer à cette fin : { Affiche les lignes du fichier contenant la chaîne s. La chaîne s ne contient pas de retours à la ligne. } procedure trouvechaine(s, nomfichier : string); f : text; { la iable fichier } tampon : array[1..tailletampon] of char; { le contenu de la ligne lue }

TP NÆ3 2 c. Les paramètres de la ligne de commande passés à un programme Pascal sont au nombre de ParamCount. Leurs valeurs de type chaîne de caractères sont aisément récupérées par l appel à ParamStr(i) oùiest l index entre 1 etparamcount du paramètre. Pour un programmegrep permettant d appeler la procéduretrouvechaine avec pour paramètres les deux paramètres de la ligne de commande dans l ordre, cela donne : if (ParamCount <> 2) then writeln( Le programme grep pr deux arguments : ); writeln( une chaîne de caractères (au besoin entre g u i l l e mets ) ); writeln( un nom de f i c h i e r à e xplorer ) else trouvechaine(paramstr(1), ParamStr(2)). { grep } Créez un nouveau fichier test.txt sous Emacs, écrivez plusieurs lignes de texte dont une contenant la chaînetototoro. Testez ensuite votre programme (compilé avec l option-o tp03-1) : Run grep (like this):./tp03-3 totoro test.txt La ligne contenant la chaînetototoro doit apparaître. d. Étez votre programme pour permettre de chercher la chaîne de caractères dans une liste de fichiers. { Le programme grep cherche des occurences d une chaîne de caractères au sein d un fichier texte, et affiche s il y en a les lignes où la chaîne apparaît. } program grep; const tailletampon = 8192; { La taille du tampon d entrée. C est aussi la longueur maximale d une ligne. } { Affiche les lignes du fichier contenant la chaîne s. La chaîne s ne contient pas de retours à la ligne. } procedure trouvechaine(s, nomfichier : string); f : text; { la iable fichier } tampon : array[1..tailletampon] of char; { le contenu de la ligne lue } i : integer; { indice dans s } d : integer; { point de départ dans tampon } j : integer; { indice dans tampon } l : integer; { longueur utile dans tampon } trouve : boolean; { si on a déjà trouvé s } n : integer; { numéro de la ligne } { Ouverture du fichier de texte dans f. } assign(f, nomfichier); reset(f); { Initialisation du tampon. } d := 1; l := 1; { Initialisation de trouve et de n. }

TP NÆ3 3 trouve := false; n := 1; { Parcours du fichier texte. } while (not eof(f)) do { Recopie de la ligne de f dans tampon. } while (not eoln(f)) and (l < tailletampon) do tampon[l] := f^; l := l + 1; get(f) if (l = tailletampon) then writeln( Erreur : débordement de tampon. ); { l contient la taille utile du tampon. d est le point de départ de son exploration. } while (d < l) do { On se place au point de départ dans le tampon. } j := d; { Avance dans tampon jusqu à atteindre le premier caractère de s. } while (j < l) and (tampon[j] <> s[1]) do j := j + 1; { Sauvegarde du point de départ pour le prochain tour de boucle. } d := j + 1; { Avance dans s et tampon de manière synchrone. } i := 1; while (j < l) and (i <= length(s)) and (tampon[j] = s[i]) do i := i + 1; j := j + 1 { Affiche le contenu de la ligne si nécessaire. } if (i = length(s) + 1) then { Affiche le nom du fichier. } if (trouve = false) then writeln(nomfichier, : ); trouve := true; write(, n, : ); { Recopie la ligne. } for j := 1 to l-1 do write(tampon[j]); writeln { ajout du retour à la ligne sur la sortie }

TP NÆ3 4 { Prépare la lecture de la ligne suivante. } readln(f); n := n + 1; d := 1; l := 1 { trouvechaine } { Récupération des arguments de la ligne de commande et appel de trouvechaine. } i : integer; { indice dans la liste des arguments } if (ParamCount < 2) then writeln( Le programme grep pr au minimum deux arguments : ); writeln( une chaîne de caractères (au besoin entre g u i l l e mets ) ); writeln( une l i s t e de noms de f i c h i e r s ) else for i := 2 to ParamCount do trouvechaine(paramstr(1), ParamStr(i)). { grep }............................................................................................. 2 Articles On veut implémenter une notion modélisant un étudiant en tenant compte de trois caractéristiques : le prénom, le nom, l âge. e. Déclaration et première utilisation de l article etudiant On se propose d implémenter cette notion d etudiant avec un article comportant les champs adéquats. On supposera que les noms et les prénoms ne comportent pas plus de ½caractères et que les âges sont compris entre½et½¾¼ ans. Déclarez le type d un article etudiant. Après avoir déclaré un étudiant, vous affecterez ses champs et vous les ferez afficher dans le programme principal. f. Saisie et affichage d un etudiant Écrire une procédure SaisirEtudiant qui pr en argument un etudiant et qui affecte les trois champs de cet etudiant avec des valeurs saisies au clavier par l utilisateur. Écrire une procédure AfficherEtudiant qui pr en argument un etudiant et qui affiche ses trois champs comme dans l exemple suivant : Nom = Knuth; Prénom = Donald; Âge = 66 ans Testez vos procédures dans votre programme principal. g. Groupes d étudiants On propose de faire des groupes d étudiants (disons des groupes de étudiants) qui s entent bien afin qu ils travaillent ensemble de façon privilégiée. Déclarez le type groupe d un tableau d etudiant et écrivez deux procédures, l une pour affecter les etudiants d un groupe et l autre pour les afficher. Testez vos procédures dans votre programme principal. h. Deux prédicats sur les groupes d étudiants De façon informelle, un prédicat est une fonction qui permet de tester si un article ou une collection d articles vérifie une propriété donnée. Ici par exemple, on vous demande un prédicat booléen (i.e. la fonction répond vrai si la propriété est

TP NÆ3 5 vérifiée et faux sinon) permettant à l utilisateur de tester s il y a unetudiant d un âge de son choix dans ungroupe. De même, faites un prédicat permettant à l utilisateur de tester s il y a au moins une occurence d unetudiant du nom de son choix dans un groupe. Vous devez tester vos deux prédicats. program exo2; const AgeMin = 1; AgeMax = 120; taille = 31; nbamis = 5; {déclaration du type d enregistrement pour un étudiant} type etudiant = record {champ pour le nom de l étudiant} nom : string[taille]; {champ pour le prénom d un étudiant} prenom : string[taille]; {champ pour l âge d un étudiant} age : AgeMin..AgeMax; {déclaration du type d un groupe qui est un tableau de 5 étudiants} type groupe = array[1..nbamis] of etudiant; copains : groupe; temp : etudiant; cible : 1..120; find : boolean; {procédure pour la saisie d un étudiant} procedure SaisieEtudiant( Ami : etudiant); Write( Saisie du nom : ); ReadLn(Ami.nom); Write( Saisie du prénom : ); ReadLn(Ami.prenom); Write( Saisie de l âge : ); ReadLn(Ami.age) { SaisieEtudiant } {procédure pour l affichage d un étudiant} procedure AfficheEtudiant(Ami : etudiant); Write( Prénom = ); Write(Ami.prenom); Write( ; Nom = ); Write(Ami.nom); Write( ; Âge = ); WriteLn(Ami.age) { AfficheEtudiant } {procédure pour la saisie d un groupe} procedure SaisieGroupe( mesamis : groupe);

TP NÆ3 6 i : 1..nbAmis; WriteLn( Saisie d un groupe : ); for i:=1 to nbamis do Write( Saisie de l é tudiant numéro ); Write(i); WriteLn( : ); SaisieEtudiant(mesAmis[i]) { SaisieGroupe } {procédure pour l affichage d un groupe} procedure AfficheGroupe(mesAmis : groupe); i : 1..nbAmis; WriteLn( A f f i c h e d un groupe : ); for i:=1 to nbamis do AfficheEtudiant(mesAmis[i]) { AfficheGroupe } {fonction pour tester si il y a un étudiant d un age donné dans le groupe} function TestParAge(mesAmis : groupe; agecible : integer) : boolean; i : 1..nbAmis; resultat : boolean; resultat := false; for i:= 1 to nbamis do if mesamis[i].age = agecible then resultat := true return(resultat) { TestParAge } {tests pour l exo e} temp.nom := Truc ; temp.prenom := Bidule ; temp.age := 19; {tests pour l exo f} AfficheEtudiant(temp); SaisieEtudiant(temp); AfficheEtudiant(temp); {test pour l exo g} SaisieGroupe(copains); AfficheGroupe(copains); {test pour l exo h} Write( S a i s i r l âge recherché : ); ReadLn(cible); find := TestParAge(copains, cible); if find then WriteLn( I l y a au moins un é tudiant ayant l âge requis. ) else WriteLn( I l n y a pas d é tudiant ayant l âge requis. )..............................................................................................