Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin 2010. Algorithmique 1



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

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

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

Programmation Objet - Cours II

Introduction à MATLAB R

LES TYPES DE DONNÉES DU LANGAGE PASCAL

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

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

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

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

Définition des Webservices Ordre de paiement par . Version 1.0

Le langage C. Séance n 4

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

Plateforme PAYZEN. Définition de Web-services

Programmation avec des objets : Cours 7. Menu du jour

Conventions d écriture et outils de mise au point

Algorithmique & programmation

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)

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

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Plan du cours Cours théoriques. 29 septembre 2014

Système de Gestion de Fichiers

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Utilisation d objets : String et ArrayList

Introduction aux SGBDR

Ordonnancement temps réel

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

Arbres binaires de recherche

Cours 1: Java et les objets

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Exercices sur les interfaces

Sommaire. Structure. Liste simplement chaînée ALGORITHME ET STRUCTURES DE DONNÉES II

Structure fonctionnelle d un SGBD

Programmer en JAVA. par Tama

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

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

Cours 1 : La compilation

Java Licence Professionnelle CISII,

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Présentation du PL/SQL

Cours Informatique Master STEP

Définitions. Numéro à préciser. (Durée : )

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

Problèmes liés à la concurrence

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Chapitre 5 : Les procédures stockées PL/SQL

Chapitre 10. Les interfaces Comparable et Comparator 1

UE Programmation Impérative Licence 2ème Année

Licence Sciences et Technologies Examen janvier 2010

Cours de Programmation en Langage Synchrone SIGNAL. Bernard HOUSSAIS IRISA. Équipe ESPRESSO

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

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

Université Paris-Dauphine DUMI2E 1ère année, Applications

Premiers Pas en Programmation Objet : les Classes et les Objets

Auto-évaluation Programmation en Java

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

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

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

4. Groupement d objets

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Recherche dans un tableau

TD/TP PAC - Programmation n 3

REALISATION d'un. ORDONNANCEUR à ECHEANCES

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Compression de Données - Algorithme de Huffman Document de Conception

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

OCL - Object Constraint Language

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

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

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

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

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Systemes d'exploitation des ordinateurs

Algorithmique, Structures de données et langage C

1 Recherche en table par balayage

Le prototype de la fonction main()

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

Travaux Dirigés n 1 : chaînes de caractères

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

LES DECIMALES DE π BERNARD EGGER

COMMANDER A DISTANCE LE ROBOT-PONG ETUDE DE LA TELECOMMANDE (2 nde PARTIE)

Les structures. Chapitre 3

Canevas théoriques du projet sur le poker Partie A

Partie 7 : Gestion de la mémoire

Introduction à la programmation concurrente

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

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

Les arbres binaires de recherche

Projet Active Object

Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Gestion distribuée (par sockets) de banque en Java

STAGE IREM 0- Premiers pas en Python

Feuille TD n 1 Exercices d algorithmique éléments de correction

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

ARBRES BINAIRES DE RECHERCHE

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

Introduction aux algorithmes répartis

TP1 : Initiation à Java et Eclipse

Transcription:

Algorithmique 1 Durée : 2h Machines électroniques interdites Tous documents papiers autorisés Il est conseillé de traiter les deux parties dans l ordre du sujet. Veuillez respecter les notations introduites dans l énoncé. Il est inutile de paraphraser l énoncé dans vos réponses, mais des explications avec dessins sur votre code sont les bienvenues. I - Listes doublement chaînées circulaires (12 points) type Position is private ; -- type des positions d éléments dans les listes doublement cha^ınées funct ion Creer return Position ; -- retourne une nouvelle position valide dont l élément -- doit ^etre initialisé en utilisant "ChangerElem" ci-dessous. function Elem(P: Position) return Element ; -- requiert: P position valide -- retourne l élément associé à la position P. procedure ChangerElem(P: Position; E: Element) ; -- requiert: P position valide -- garantit: Elem(P)=E. procedure Detruire( P: in out Position) ; -- requiert: P position valide. -- garantit: P détruite et invalide. -- si P figurait dans une liste, alors -- elle a été proprement retirée de cette liste. Fig. 1 Opérations sur les positions Dans cet exercice, on s intéresse à des listes doublement chaînées. L intérêt de cette structure de données est qu on peut retirer une cellule du chaînage à coût constant dès qu on a un pointeur sur cette cellule (alors que pour un chaînage simple il faut connaître un pointeur sur la cellule précédente dans le chaînage). 2009-2010 page : 1/6

Étant donné un type Element représentant les éléments mis dans les listes, on définit un paquetage ListesDC introduisant deux types abstraits : le type ListeDC des listes chaînées, et le type Position des positions dans les listes chaînées. Les opérations pour manipuler les positions sont spécifiées figure 1 page 1. Les opérations pour manipuler les listes sont spécifiées figure 2 page 4. Sous l hypothèse que le type Element est en fait le type Character, on donne un programme TestListesDC figure 3 page 4 qui illustre le comportement attendu des principales opérations. Concrètement, une position est simplement un pointeur sur une cellule du chaînage, avec les définitions ci-contre à droite. Le pointeur (resp. ) représente la position suivante (resp. précédente) dans la liste chaînée. type Position is access Cellule; type Cellule i s record : Element ;, : Position; end record ; Ainsi une position est valide au sens de la spécification figure 1 ssi c est un pointeur non nul et alloué dans le tas. Les sous-programmes Elem et ChangerElem spécifiés figure 1 sont trivialement implémentés par les définitions ci-dessous. function Elem(P: Position)... return P. ; procedure ChangerElem... P. := E ; Par ailleurs, toute position P correspondant à un pointeur alloué du tas vérifie l invariant suivant : P. est un pointeur alloué tel que P..=P. Pour programmer sur les positions, on s impose la discipline suivante : Ne jamais modifier directement les champs et des positions. Passer plutôt par l intermédiaire de la procédure Met ci-contre. procedure Met(Srce,Dest:Position) is --requiert: Srce et Dest valides Srce. := Dest ; Dest. := Srce ; En effet, l utilisation de cette fonction a l intérêt de rendre le code plus lisible et d établir l invariant pour la position Srce. Question 1 (2 points) : Cependant, l exécution de Met(Srce,Dest) où Srce et Dest sont des pointeurs alloués peut casser l invariant d une autre position valide. Donner un exemple. Question 2 (1,5 points) : Écrire la fonction Creer spécifiée à la figure 1 qui alloue une nouvelle position pointant sur elle-même comme dans le dessin de droite : l invariant de cette nouvelle position est donc trivialement établi. 2009-2010 page : 2/6

Une liste doublement chaînée est simplement codée par une position spéciale du chaînage appelée Senti (pour sentinelle). type ListeDC i s record Senti: Position ; end record ; Ainsi, une liste L: ListeDC est valide au sens de la spécification donnée figure 2 ssi L.Senti est une position valide. En outre, L.Senti. n a aucune signification et peut être quelconque. Enfin, si L.Senti.=L.Senti alors la liste est vide. Sinon, L.Senti. et L.Senti. sont deux positions allouées qui représentent respectivement la tête et la queue de la liste. liste vide liste contenant un seul élément u u liste à 2 éléments un liste à 3 éléments une u n u e n Question 3 (1,5 points) : Écrire les 3 procédures CreerVide, EstVide et Tete spécifiées à la figure 2. Question 4 (2 points) : Sous l hypothèse qu on dispose d une procédure Put(E: Element), écrire la procédure Afficher spécifiée figure 2 et illustrée figure 3. Dans les 2 questions suivantes, il faut exploiter la régularité du chaînage de manière à ce que le code du cas général fonctionne aussi pour les cas particuliers (position isolée, liste vide, etc). Question 5 (2 points) : Sous l hypothèse qu on a défini : procedure Liberer is new Ada.Unchecked_Deallocation(Cellule,Position); écrire la procédure Detruire spécifiée figure 1 et illustrée figure 3. La cellule initialement pointée par P doit être libérée. Question 6 (3 points) : Écrire la procédure InsererEnQueue spécifiée figure 2 et illustrée figure 3. 2009-2010 page : 3/6

type ListeDC is private; -- type des listes doublement cha^ınées function CreerVide return ListeDC ; -- retourne une liste vide et valide. function EstVide(L: ListeDC) return Boolean ; -- requiert: L valide -- retourne True ssi L est vide. procedure Afficher(L: ListeDC) ; -- requiert: L valide function Tete(L: ListeDC) return Position ; -- requiert: L valide et non EstVide(L) -- retourne une position valide correspondant à la t^ete de L procedure InsererEnQueue(L: ListeDC; P: Position) ; -- requiert: L et P valides -- garantit: P placée en queue de la liste L. -- si P figurait dans une autre liste, alors -- elle a été proprement retirée de cette liste. Fig. 2 Opérations sur les listes procedure TestListesDC is Pos: array(element range A.. G ) of Position ; L1, L2: ListeDC ; L1 := CreerVide ; for E in Pos Range loop Pos(E):= Creer ; ChangerElem(Pos(E),E) ; InsererEnQueue(L1,Pos(E)) ; end loop ; Afficher(L1) ; Detruire(Pos( C )) ; Afficher(L1) ; L2 := CreerVide ; InsererEnQueue(L2,Pos( B )) ; InsererEnQueue(L2,Pos( E )) ; InsererEnQueue(L2,Pos( G )) ; Afficher(L1) ; Afficher(L2) ; -- affichage attendu: ABCDEFG -- affichage attendu: ABDEFG -- affichage attendu: ADF -- affichage attendu: BEG Fig. 3 Exemple de programme utilisateur 2009-2010 page : 4/6

II - File de priorités de Dial (8 points) Cet exercice consiste à implémenter une file de priorités de Dial pouvant être utilisée notamment dans l algorithme de Dijkstra calculant des plus courts chemins dans un graphe orienté à coûts positifs. Connaître cet algorithme n est pas nécessaire pour réaliser cet exercice. Par contre, on utilise ici le paquetage ListesDC des listes doublement chaînées de l exercice précédent. Concrètement la file de priorités sert à conserver des éléments de type Element de manière triée en fonction du champ Prio, appelé priorité de l élément. type Element i s record Prio: Natural ; Nom: Character ; end record ; La file est définie ici comme l état interne d un paquetage appelé FilePrio. A l initialisation du paquetage, cet état interne correspond à la file vide. Ensuite, il est modifié via les opérations fournies ci-dessous : package FilePrio i s funct ion Taille return Natural ; -- retourne le nombre d éléments présents dans la file. procedure ExtraireMin(Min: out Element) ; -- requiert Taille > 0 -- garantit: "Min" était un élément de priorité minimum de la file -- qui a été détruit. En particulier, la position de cet élément -- n est plus valide! La taille de la file est décrémentée. type PositionFile is private ; -- type des positions d éléments procedure Inserer(E: Element; P: out PositionFile) ; -- garantit: E ajouté dans la file avec la position valide P. -- La taille de la file est incrémentée. procedure ModifierPriorite(P: PositionFile; Prio: Natural) ; -- requiert: P une position valide de la file. -- garantit: l élément de position P prend la priorité Prio. -- La taille de la file est inchangée. private type PositionFile is new ListesDC.Position ; end FilePrio ; Dans la suite, on suppose que DeltaP: constant Natural est une constante entière fixée. Par ailleurs, on définit un entier noté PrioDerMin dépendant de l historique des appels de procédures du paquetage : PrioDerMin vaut soit 0 s il n y a pas eu d appel à ExtraireMin, soit Min.Prio si Min est l élément ayant été extrait lors du dernier appel à ExtraireMin. Pour optimiser sa représentation interne, le paquetage FilePrio requiert que les programmes qui l utilisent vérifient une condition particulière appelée ici hypothèse de Dial (qui est en particulier vérifiée par l algorithme de Dijkstra) : Lors de tout appel à Inserer(E,P), on a E.Prio in PrioDerMin..PrioDerMin+DeltaP. Lors de tout appel à ModifierPriorite(P,Prio), Prio in PrioDerMin..PrioDerMin+DeltaP 2009-2010 page : 5/6

Par exemple, sous l hypothèse que DeltaP=5, alors l extrait de programme suivant vérifie l hypothèse de Dial : P1, P2, P3: PositionFile ; X: Element ; Inserer((5, A ),P1) ; Inserer((2, B ),P2) ; Inserer((4, C ),P3) ; ExtraireMin(X) ; -- X=(2, B ). P2 détruit. ModifierPriorite(P1,3) ; ExtraireMin(X) ; -- X=(3, A ). P1 détruit. ExtraireMin(X) ; -- X=(4, C ). P3 détruit. Inserer((9, D ),P1) ; Par contre, si dans cette dernière ligne, on change la priorité 9 soit en 10 soit en 3, alors l hypothèse de Dial est violée puisque le dernier minimum extrait était de priorité 4. Le principe de l implémentation est le suivant : la file est codée comme un tableau de listes doublement chaînées telles que tous les éléments d une même liste ont même priorité. Grâce à l hypothèse de Dial, à tout instant, il ne peut y avoir que DeltaP+1 priorités distinctes dans la file. Ainsi, les listes de la file sont mises dans le tableau File ci-dessous : subtype Indice i s Integer range 0.. DeltaP ; File: array(indice) of ListeDC ; Les éléments de priorité Prio se trouvent dans la liste d indice Prio mod File Length. Bien sûr, le type Element de la file est le même que celui utilisé dans le paquetage ListesDC. Pour coder les opérations efficacement, on introduit aussi les variables globales suivantes dans l implémentation du paquetage FilePrio : NbElems: Natural ; IndiceMin: Indice ; -- nombre d éléments présents dans la file. -- indice de la liste de priorité minimum. On a l invariant suivant : si NbElems est non nul, alors File(IndiceMin) est une liste non vide qui contient les éléments de priorité minimum de la file. Question 7 (1 point) : Écrire le bloc d instructions principal du paquetage FilePrio qui permet d initialiser son état à la file vide. Écrire aussi le code de la fonction Taille. Question 8 (4 points) : Écrire le code ExtraireMin en pensant bien à mettre-à-jour les variables globales du paquetage. Question 9 (3 points) : Le type PositionFile étant simplement défini comme un renommage 1 du type Position de la page 1, écrire les procédures Inserer et ModifierPriorite. 1 Ceci a simplement pour but d empêcher un utilisateur de la file de priorités de modifier directement la priorité d un élément en passant par ChangerElem au lieu de ModifierPriorite. 2009-2010 page : 6/6