Cours numéro 8 : Piles et files

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

Recherche dans un tableau

Cours de Programmation 2

modules & compilation

Classes et Objets en Ocaml.

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

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

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

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

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Programme Compte bancaire (code)

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

Programmation Orientée Objet Java

Chapitre VI- La validation de la composition.

Cours 1 : La compilation

Algorithmique et programmation : les bases (VBA) Corrigé

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Arbres binaires de recherche

TP 1. Prise en main du langage Python

Conventions d écriture et outils de mise au point

Java Licence Professionnelle CISII,

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Java 1.5 : principales nouveautés

Bases de programmation. Cours 5. Structurer les données

Examen Médian - 1 heure 30

1. Structure d'un programme FORTRAN 95

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Algorithmique & programmation

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

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écouverte de Python

Analyse de sécurité de logiciels système par typage statique

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

KL5121. Pour activer des sorties en fonction de la position d'un codeur

Présentation du PL/SQL

Approche Contract First

Algorithmique I. Algorithmique I p.1/??

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

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

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

Gestion mémoire et Représentation intermédiaire

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

Cours Informatique Master STEP

Programmer en JAVA. par Tama

Cours d algorithmique pour la classe de 2nde

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

Logiciel Libre Cours 2 Fondements: Programmation

Application 1- VBA : Test de comportements d'investissements

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

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...

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Algorithmique et Programmation, IMA

Notions fondamentales du langage C# Version 1.0

Programmation avec des objets : Cours 7. Menu du jour

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

as Architecture des Systèmes d Information

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

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

ACTIVITÉ DE PROGRAMMATION

Compilation (INF 564)

Principes des langages de programmation INF 321. Eric Goubault

Introduction à la programmation concurrente

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

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

SERVEUR DE SAUVEGARDE POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

Les arbres binaires de recherche

Utilitaires méconnus de StrataFrame

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Architecture des ordinateurs

Théorie de la Programmation

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

CHAPITRE 4 LA VALORISATION DES STOCKS COURS DE COMPTABILITE ANALYTIQUE SEMESTRE 2 DUT TC

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Structure fonctionnelle d un SGBD

Architecture des ordinateurs

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

IRL : Simulation distribuée pour les systèmes embarqués

Programmation C++ (débutant)/instructions for, while et do...while

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

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

Une introduction rapide à Coq

STAGE IREM 0- Premiers pas en Python

Programmation en Caml pour Débutants

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

Cours de Systèmes d Exploitation

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Programmation. fonctionnelle, impérative, logique et orientée objet

Transcription:

LI213 Types et Structures de données Licence d Informatique Université Paris 6

Définition Pile Une pile est une structure de données représentant un ensemble de données unitaires (homogènes), permettant l insertion aisée de nouvelles données permettant l extraction aisée de la dernière donnée insérée. Insertion Suppression structure en pile d assiettes Appelée LIFO : Last In, First Out Fréquemment utilisée en informatique : Évaluation d expression arithmétique Pile d exécution (pile d appels des fonctions) Undo/Redo dans un logiciel

Opérations usuelles sur les piles Quelles opérations a-t-on envie d implanter sur une pile? Opérations usuelles Créer une pile vide : creepile Empiler un élément dans la pile : empile P e Dépiler un élément dans la pile : depile P Tester si une pile est vide : estpilevide P Récupérer l élément en tête de pile : tetepile P tetepile(empile P e)=e depile(empile P e)=p En tout cas : type polymorphe + effet de bord partout!

1 : liste référencée Une pile peut être représentée par une liste, modifiable par effet de bord : une liste référencée. # type a pile = a list ref;; On redéfinit un type de base : on devra utiliser ce type explicitement! # let creepile () = (ref [] : a pile);; # let empile (p : a pile) e = p := e ::!p;; # let depile (p : a pile) = match!p with [] -> failwith "pile vide" x :: y -> p := y;; # let tetepile (p : a pile) = match!p with [] -> failwith "pile vide" x :: y -> x;; # let estpilevide (p : a pile) = match!p with [] -> true -> false;;

Nota Bene : Type faible # let creepile () = (ref [] : a pile);; val creepile : unit -> a pile = <fun> # let l = creepile();; val l : a pile = {contents = []} Type faible Problème : référence à des types polymorphes (paramétrés) # let l= ref [];; # l := 4 ::!l;; (* comme si l contenait une int list *) # l := "youpi" ::!l;; (* et aussi une string list *) Solution : indiquer qu un type polymorphe référencé n est plus polymorphe, mais un type inconnu, en attente d instanciation : type faible qui s écrit a. let h=[] ;; let l = ref [] ;; l :=4::!l ; l ;; a list a list int list

2 : enregistrement à champs list mutable Un enregistrement permet d éviter de forcer le typage et de rajouter des informations (comme la taille de la pile n) # type a pile = {mutable p : a list ; mutable n :int};; # let creepile () = {p=[] ; n=0};; # let empile pile e = pile.p <- e :: pile.p ; pile.n <- pile.n+1;; # let depile pile = match pile.p with [] -> failwith "pile vide" x :: y -> pile.p <- y ; pile.n <- pile.n-1;; # let tetepile pile = match pile.p with [] -> failwith "pile vide" x :: y -> x ;; # let estpilevide pile = pile.n=0;;

3 : pile de taille finie Si on peut connaître la taille max. de la pile : utilisation de tableau. 0 n lg-1 # type a pile = {p : a array ; mutable n :int ;lg :int};; # let creepile nbr x = { p = Array.make nbr x ; lg = nbr ; n = 0 } ;; # let empile pile e = if (pile.n=pile.lg) then failwith "pile pleine" else ( pile.p.(pile.n)<-e ; pile.n<-pile.n+1 ) ;; # let depile pile = if (pile.n=0) then failwith "vide" else pile.n<-pile.n-1 ;; # let tetepile pile = if (pile.n=0) then failwith "vide" else pile.p.(pile.n-1) ;; # let estpilevide pile = pile.n=0;;

4 : module Stack Module Stack # Stack.create;; (* = creepile *) - : unit -> a Stack.t = <fun> # Stack.push;; (* = empile *) - : a -> a Stack.t -> unit = <fun> # Stack.pop;; (* = tetepile+depile *) - : a Stack.t -> a = <fun> Comment écrire pop? # let pop pile = let e = tetepile pile in depile pile ;e;;

Récursivité = séquentiel + Pile Fibo toujours... simulation de récursivité # let fibo n = let p = CreePile () and res=ref 0 in empile p n ; while not (estpilevide p) do let e=tetepile p in ( depile P ; match e with 0 1 -> res :=1+!res -> begin empile p (e-1) ; empile p (e-2) end ) done ;!res;;

Récursivité et pile On suppose une pile qu on veut garder ordonnée. Tri par insertion avec pile # let rec ranger pile x = if estvidepile pile then empiler pile x else if (x > tetepile pile) then empiler pile x else let y=tetepile pile in ( depiler pile ; ranger pile x ; empiler pile y ) ;;

Définition File Une file est une structure de données représentant un ensemble de données unitaires (homogènes), permettant l insertion aisée de nouvelles données permettant l extraction aisée de la plus ancienne donnée insérée. Insertion Suppression Appelée FIFO : First In, First Out Fréquemment utilisée en informatique : file d attente pipe linux

Opérations usuelles sur les files Quelles opérations a-t-on envie d implanter sur une file? Opérations usuelles Créer une file vide : creefile Insérer un élément dans la file : enfile F e Supprimer un élément dans la file : defile F Tester si une file est vide : estfilevide F Récupérer l élément en queue de file : queuefile F queuefile(enfile F e)= si F= alors e sinon queuefile F defile(enfile F e)= si F= alors sinon enfile (defile F) e En tout cas : type polymorphe + effet de bord partout!

1 : liste mutable On évite l implantation en liste référencée et on utilise tout de suite un enregistrement. # type a file = {mutable f : a list};; # let creefile () = {f=[]};; # let enfile file e = file.f <- file.f @ [e];; # let defile file = match file.f with [] -> failwith "file vide" x :: y -> file.f <- y ;; # let queuefile file = match file.f with [] -> failwith "file vide" x :: y -> x ;; # let estfilevide pile = file.f=[];;

2 : file de taille finie Si on connaît la taille max. de la file : utilisation circulaire d un tableau 0 debut fin lg-1 0 fin debut lg-1 # type a file = {f : a array ; lg :int ; mutable debut :int ; mutable fin :int};; # let creefile nbr x = { f = Array.make nbr x ; lg = nbr ; debut = 0 ; fin = 0 } ;; # let enfile file e = let pos = (file.fin+1) mod file.lg in if (pos=file.debut) then failwith "File pleine" else ( file.p.(file.fin)<-e ; file.fin<-pos ) ;;

2bis : file de taille finie Si on connaît la taille max. de la file : utilisation circulaire d un tableau. 0 debut fin lg-1 0 fin debut lg-1 # let defile file = if (file.debut=file.fin) then failwith "File vide" else file.debut<-(file.debut+1) mod file.lg ;; # let queuefile file = if (file.debut=file.fin) then failwith "File vide" else file.f.(file.debut) ;; # let estfilevide pile = file.debut=file.fin;;

3 : module Queue Module Queue # Queue.create;; (* = creefile *) - : unit -> a Queue.t = <fun> # Queue.add;; (* = enfile *) - : a -> a Queue.t -> unit = <fun> # Queue.take;; (* = queuefile+defile *) - : a Queue.t -> a = <fun> Comment écrire take? # let take file = let e = queuefile file in defile file ;e;;

Encapsulation Pile et file en OCAML utilise des objets mutables (référence, enregistrement, tableau, etc.). Ce qui rend la programmation peu sûre : # let l = creepile () ;;; val t : a pile = {p = [] ; n=0} # t.p <- 1 :: t.p;;!!! Encapsulation # type a superpile = { empile : a -> unit ; depile : unit -> unit ; estpilevide : unit -> bool tetepile : unit -> a } ;;

Encapsulation - 2 Construction de superpile # let newsuperpile () = let pile = ref[] and n=ref 0 in { empile = (function x -> pile :=x ::!pile ; n <- 1+!n) ; depile = (function () -> if!n = 0 then...) ; estpilevide = (function () ->!n=0) ; tetepile = (function () -> if!n=0 then...) } ;; # let pile = newsuperpile();; pile : a t =... # pile.empile 4;; # pile.empile 25;; # pile.tetepile;; - : int = 25