Corrigé de l examen de programmation avancée ENSIIE, semestre 2

Documents pareils
Structures dynamiques Listes chaînées

Algorithmique, Structures de données et langage C

Les arbres binaires de recherche

Cours de Programmation 2

Manuel d'utilisation de Wapam

Recherche dans un tableau

Programme Compte bancaire (code)

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)

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

Utilitaires méconnus de StrataFrame

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

Arbres binaires de recherche

Licence Sciences et Technologies Examen janvier 2010

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

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

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Les structures de données. Rajae El Ouazzani

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

CHAPITRE V SYSTEMES DIFFERENTIELS LINEAIRES A COEFFICIENTS CONSTANTS DU PREMIER ORDRE. EQUATIONS DIFFERENTIELLES.

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Algorithmique et Programmation, IMA

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

UE C avancé cours 1: introduction et révisions

Programmation système I Les entrées/sorties

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

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

Algorithmique & programmation

Classes et Objets en Ocaml.

Lexmark Print Management

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

Corrigé des TD 1 à 5

Machines Virtuelles. et bazard autour. Rémi Forax

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

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

TRIGONOMETRIE Algorithme : mesure principale

ARBRES BINAIRES DE RECHERCHE

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

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

Cours d algorithmique pour la classe de 2nde

H Le système de bridage. multifonctionnel

STAGE IREM 0- Premiers pas en Python

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

INF601 : Algorithme et Structure de données

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

dysfonctionnement dans la continuité du réseau piétonnier DIAGNOSTIC

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

DOCM Solutions officielles = n 2 10.

Structures algébriques

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

CERES logiciel de gestion commerciale pour négociants en vin

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

Introduction à la programmation concurrente

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

L ALGORITHMIQUE. Algorithme

Chapitre 1 : La gestion dynamique de la mémoire

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

(51) Int Cl.: H04L 29/06 ( ) G06F 21/55 ( )

Un ordonnanceur stupide

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

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

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Exercice 6 Associer chaque expression de gauche à sa forme réduite (à droite) :

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


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

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

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

Le système de gestion des fichiers, les entrées/sorties.

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Compression Compression par dictionnaires

Propagation sur réseau statique et dynamique

Algorithmique et programmation : les bases (VBA) Corrigé

Automobile et aéronautique

Continuité en un point

= constante et cette constante est a.

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

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

ANNEXES...16 Notation...16 Rente financière certaine Mémo d Actuariat - Sophie /16

Tutoriel Infuse Learning. Créer des quizzes multimédias sur ordinateur ou tablette

Examen Médian - 1 heure 30

Java Licence Professionnelle CISII,

Multisplit premium Duo / DC Inverter

Face au deuil, Vous n êtes pas seul(e) Ce guide vous est proposé par la Caf de Meurthe-et-Moselle et les Associations Deuil Espoir et Favec.

Comparaison de fonctions Développements limités. Chapitre 10

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

Problèmes liés à la concurrence

Ordonnancement temps réel

UNICEF/ /Toutounji

INF 321 : mémento de la syntaxe de Java

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

Problème 1 : applications du plan affine

Document Object Model (DOM)

Continuité et dérivabilité d une fonction

Dérivation : cours. Dérivation dans R

Guide d'installation rapide TFM-560X YO.13

Transcription:

Corrigé de examen de programmation avancée ENSIIE, semestre 2 mercredi avri 20 Exercice : Compiation séparée ( points). En C : gcc -Wa -ansi -c A.c En OCam : ocamc -c A.m 2. En C : gcc -Wa -ansi -o prog A.o B.o C.o D.o E.o En OCam : ocamc -o prog D.cmo E.cmo C.cmo A.cmo B.cmo. I faut recompier E et C.. En C : prog: A.o B.o C.o D.o E.o gcc -Wa -ansi -o $@ $^ A.o: C.h D.h B.o: C.h C.o: C.h D.h E.h D.o: D.h E.o: E.h En OCam : prog: D.cmo E.cmo C.cmo A.cmo B.cmo ocamc -o $@ $^ A.cmo: C.cmi D.cmi B.cmo: C.cmi C.cmo: C.cmi D.cmi E.cmi D.cmo: D.cmi E.cmo: E.cmi %.cmo: %.m ocamc -c $< %.cmi: %.mi ocamc -c $< Exercice 2 : Représentation d arbres à k-fis (8 points). En C, représentation standard : struct arbre { int rang; struct arbre* fis[k]; ;

En C, représentation FGFD : struct arbre { struct arbre* fis_gauche; struct arbre* frere_droit; ; En OCam, représentation standard : type arbre = Noeud of int * (arbre array) En OCam, représentation FGFD : type arbre = Noeud of (arbre option) * (arbre option) 2. Représentation standard : 2 0 0 0 0 0 0 0 0 0 0 Représentation FGFD :. a) En C, représentation standard : struct arbre nieme_fis (struct arbre a, int i) { return *(a.fis[i]); En C, représentation FGFD : struct arbre nieme_fis (struct arbre a, int i) { struct arbre* res = a.fis_gauche; whie (i > 0) { res = res->frere_droit; i--; ; return *res; 2

En OCam, représentation standard : et nieme_fis a i = Noeud (r, t) -> t.(i) En OCam, représentation FGFD : et rec nieme_frere a i = if i = 0 then a ese Noeud(_, Some b) -> nieme_frere b (i-) Noeud(_, None) -> faiwith "pas assez de frere" et nieme_fis a i = Noeud(Some f, _) -> nieme_frere f i Noeud(None, _) -> faiwith "pas de fis" b) En C, représentation standard : struct arbre ajoute_fis_a_gauche(struct arbre a, struct arbre b) { if (a.rang >= k) a.rang++; int i; for (i = a.rang - ; i > 0; i--) { a.fis[i] = a.fis[i-]; ; a.fis[0] = &b; En C, représentation FGFD : struct arbre ajoute_fis_a_gauche(struct arbre a, struct arbre b) { b.frere_droit = a.fis_gauche; a.fis_gauche = &b; En OCam, représentation standard : et rec decae_tabeau t n = if n > 0 then begin t.(n) <- t.(n-); decae_tabeau t (n-) end et ajoute_fis_a_gauche a b = Noeud(r, t) -> if r >= k then a ese begin decae_tabeau t r; t.(0) <- b; Noeud(r +, t)

end En OCam, représentation FGFD : et ajoute_fis_a_gauche a b = match a, b with Noeud(fga, fda), Noeud(fgb, None) -> Noeud(Some (Noeud(fgb, fga)), fda) _ -> faiwith "b a déjà un frere" c) En C, représentation standard : struct arbre ajoute_fis_a_droite(struct arbre a, struct arbre b) { if (a.rang >= k) a.fis[a.rang] = &b; a.rang++; En C, représentation FGFD : struct arbre ajoute_fis_a_droite(struct arbre a, struct arbre b) { struct arbre* res = a.fis_gauche; whie (res) res = res->frere_droit; res->frere_droit = &b; En OCam, représentation standard : et ajoute_fis_a_droite a b = Noeud(r, t) -> if r >= k then a ese begin t.(r) <- b; Noeud(r+, t) end En OCam, représentation FGFD : et rec ajoute_frere_a_droite a b = None -> Some(b) Some(Noeud(fg, fd)) -> Some(Noeud(fg, ajoute_frere_a_droite fd b)) et ajoute_fis_a_droite a b = Noeud(fg, fd) -> Noeud(ajoute_frere_a_droite fg b, fd) d) En C, représentation standard : struct arbre supprimer_fis(struct arbre a, int i) { a.rang--; for(; i < a.rang; i++) a.fis[i] = a.fis[i+];

En C, représentation FGFD : struct arbre supprimer_fis(struct arbre a, int i) { if (i == 0) { a.fis_gauche = a.fis_gauche->frere_droit; ; struct arbre* b = a.fis_gauche; whie (i > ) { b = b->frere_droit; i--; ; b->frere_droit = b->frere_droit->frere_droit; En OCam, représentation standard : et rec decaer_droite t i n = if i < n then begin t.(i) <- t.(i+); decaer_droite t (i+) n end et supprimer_fis a i = Noeud(r, t) -> decaer_droite t i (r - ); Noeud(r -, t) En OCam, représentation FGFD : et rec supprimer_frere a i = match a, i with Noeud(fg, Some(Noeud(fdg,fdd))), -> Noeud(fg, fdd) Noeud(fg, Some fd), _ -> Noeud(fg, Some (supprimer_frere fd (i-))) Noeud(_, None), _ -> faiwith "pas assez de frere" et supprimer_fis a i = match a, i with Noeud(Some(Noeud(fgg,fgd)), fd), 0 -> Noeud(fgd, fd) Noeud(Some fg, fd), _ -> Noeud(Some(supprimer_frere fg i), fd) Noeud(None, _), _ -> faiwith "pas assez de fis". Soit n e nombre de sous-arbres de a racine de a Fonction représentation standard représentation FGFD nieme_fis O() O(i) ajoute_fis_a_gauche O(n) O() ajoute_fis_a_droite O() O(n) supprimer_fis O(n i) O(i). L accès à un fis est pus rapide dans a représentation standard.

La représentation standard est pus avantageuse si on ajoute es sous-arbres à droite, aors ue a représentation FGFD est pus avantageuse si on es ajoute à gauche. La pace occupée en mémoire est meieure pour a représentation FGFD dans e cas où beaucoup de noeuds ne sont pas compets (c est-à-dire ont un nombre de noeuds strictement inférieur à k), ce ui est e cas des feuies par exempe. Exercice : Garbage coector et partage maxima ( points) 2. Les parties accessibes sont cees à partir de et. 2. On marue à partir des variabes du programme : 2 Puis on nettoie :. On recopie d abord (par exempe) 2 6

Puis 2 Et on change de moitié de mémoire :.. et tabe = creer 2 et hashcons = try rechercher tabe with Not_found -> inserer tabe ; et ni = hashcons et cons x = hashcons (x :: ) 6. et = cons ni in 7

et = cons ni in et = et h = cons 2 (cons (cons )) in List.t h in et = cons (cons ) in, 7. Après a première igne : Après a deuxième : Après a uatrième igne : 8

2 h Après e cons de a igne 7 : 2 À a fin : Exercice : Fonctions de hachage ( points). La vaeur de hachage vaut 00000000 xor c xor h xor i xor e xor n, soit 0000 xor 00000 xor 0000 xor 0000 xor 000, soit 00000 xor 0000 xor 0000 xor 000, soit 00000 xor 0000 xor 000, 9

soit 00000 xor 000, soit 0000. 2. La vaeur de hachage vaut 00000000 xor n xor i xor c xor h xor e, soit 000 xor 0000 xor 0000 xor 00000 xor 0000, soit 00000 xor 0000 xor 00000 xor 0000, soit 00000 xor 00000 xor 0000, soit 000000 xor 0000, soit 0000.. Si on a un anagramme c... c n et c π()... c π(n) avec une permutation π, a vaeur de hachage vaudra 0 xor c xor xor c n = 0 xor c π() xor xor x π(n) dans es deux cas. I y aura donc coision entre anagrammes.. La fonction combine ne doit pas être commutative, sinon a vaeur de hachage est a même pour es anagrammes, ce ui entraîne des coisions.. La fonction combine(x, y) = x * 9 + y n est jamais commutative (on peut vérifier ue si combine(x,y) = combine(y,x) aors x = y), ee ne pose a priori pas de probème, au moins pour es anagrammes. 6. On peut définir une fonction de hachage de façon récursive : si arbre est vide, on retourne une certaine constante (par exempe 0) ; si on a un noeud contenant entier i avec comme fis fg et fd, on cacue récursivement a vaeur de hachage h fg du fis gauche et h fd du fis droit, et on retourne combine(h fg, combine(h fd, i)). 0