Devoir surveillé - éléments de correction Usage profs uniquement.

Documents pareils
Les arbres binaires de recherche

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

Les structures de données. Rajae El Ouazzani

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

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

Programme Compte bancaire (code)

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Recherche dans un tableau

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

Algorithmique et Programmation, IMA

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

Conventions d écriture et outils de mise au point

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

STAGE IREM 0- Premiers pas en Python

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

Algorithmique, Structures de données et langage C

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

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

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

Le langage C. Séance n 4

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

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

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

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

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

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

Chapitre 10. Les interfaces Comparable et Comparator 1

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

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

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

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

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Cours d Algorithmique et de Langage C v 3.0


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

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

TP 1. Prise en main du langage Python

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

Plateforme PAYZEN. Définition de Web-services

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)

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

Arbres binaires de recherche

Le prototype de la fonction main()

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

Introduction à MATLAB R

I. Introduction aux fonctions : les fonctions standards

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

1 Recherche en table par balayage

Utilisation d objets : String et ArrayList

Licence Sciences et Technologies Examen janvier 2010

Algorithmes d'apprentissage

Compte-rendu de projet de Système de gestion de base de données

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

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

Objets et Programmation. origine des langages orientés-objet

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

Programmation par les Objets en Java

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

Corrigé des exercices sur les références

Classes et Objets en Ocaml.

Cours de Systèmes d Exploitation

SUPPORT DE COURS. Langage C

Cours Informatique Master STEP

Cours Programmation Système

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Machines Virtuelles. et bazard autour. Rémi Forax

OS Réseaux et Programmation Système - C5

Solutions du chapitre 4

Traduction des Langages : Le Compilateur Micro Java

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Algorithmique I. Algorithmique I p.1/??

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

Représentation d un entier en base b

Découverte de Python

2. Comprendre les définitions de classes

CHAPITRE V. Recherche et tri

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Introduction à la programmation concurrente

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

1.6- Génération de nombres aléatoires

Principes des langages de programmation INF 321. Eric Goubault

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

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

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Application 1- VBA : Test de comportements d'investissements

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

Cours de Programmation 2

Plan du cours Cours théoriques. 29 septembre 2014

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

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

Transcription:

Département IMA / 3A (S6) Structures de données 2010/2011 Devoir surveillé - éléments de correction Usage profs uniquement. A Exercice : Arbres Binaires pour un tournoi (5pt/20min) 1. Faire les déclarations nécessaires pour représenter de tels arbres. Écrire un algorithme qui, étant donné l'arbre binaire d'un tournoi, ache les matchs disputés et leur vainqueur. Correction : Déclaration : type arbre = Pointeur de Noeud structure Noeud val:entier left:arbre right:arbre fin structure On réalise un algorithme récursif : Si l'arbre est vide on ne fait rien Si l'arbre est <R,G,D> : si R est diérent de -1 et G et R non vides, alors on ache le match et on appelle ache sur G et R Action achematchs(ab) D: ab : ArbreBinaire L: abg,abd : ArbreBinaire Si non estvide(ab) alors abg getgauche(ab) agd getdroite(ab) Si getracine(ab) 1 et abg Vide et abg Vide alors Acher(match entre,getracine(abg),et,getracine(abg)) Acher( : vainqueur,getracine(ab)) achematchs(abg) achematchs(abd) FAction 2. Écrire un algorithme permettant de stocker le résultat d'un match dans l'arbre du tournoi. Correction : Je fais une fonction pour rendre un booléen des que l'insertion est faite, comme cela si l'insertion est faite dans le sous-arbre gauche, il n'y a pas besoin de faire l'appel rec dans le sous-arbre droit! 1

Fonction insereresultatmatch(j1,j2,j,ab) D: ab : ArbreBinaire D: j1,j2,j :Entiers L: resug : Booleen abg getgauche(ab) agd getdroite(ab) Si getracine(abg)=j1 et getracine(abd)=j2 alors putracine(ab,j) Retourner vrai Sinon resug insereresultatmatch(j1,j2,j,abg) Si resug (=vrai) alors resug insereresultatmatch(j1,j2,j,abd) Retourner resug FFonction B Problème de BTP (le reste) Codage du problème et fonctions faciles Question 1 Dessiner la rangée de briques correspondant au tableau suivant : 0 1 0 0 1 0 0 De quelle taille est cette rangée? Correction : La rangée de briques est : 1 brique de taille 2, puis 2 de taille 3, soit une rangée de taille 8. Question 2 Déclarer le type rangée de briques (nommé Rangee) Correction : typedef int Rangee[TAILLEMAX]; Question 3 Écrire une fonction void imprimerangee(rangee rangee) qui imprime une rangée de briques (sous la forme 011100). Correction : void imprimerangee(rangee rangee){ for (i=0;i<taillemax;i++) printf("%d",rangee[i]); Question 4 Écrire une fonction bool sontcompatibles(rangee si les deux rangées données sont compatibles, false sinon. r1,rangee r2) qui retourne true Correction : Très dicile également : 2

bool sontcompatibles(rangee r1,rangee r2){ bool resu = true; for (i=0;i<taillemax;i++){ if (r1[i]==1 && r2[i] ==1) return false; return resu; Résolution L'algorithme récursif initial Question 5 Pourquoi la quantité count(r,1) vaut-elle 1 pour tout r? Correction : Parce qu'il n'y a qu'une seule façon de faire un mur de hauteur 1 avec une rangée donnée. Question 6 Écrire la déclaration du type ListeRangees : liste chaînée de Rangee. Correction : Liste chaînée classique. typedef struct Cell{ Rangee el; struct Cell* suivant; Cell; typedef Cell* ListeRangees; Question 7 On suppose l = 5. Développer sur votre copie les diérentes étapes de calcul (avec les appels récursifs) de l'appel count_all(allrows,2), allrows étant la liste comportant les deux tableaux codant les rangées 0100 et 0010. Correction : On va donc dérouler les appels récursifs (arbre) : initialement, sum vaut 0 appel à count(allrows,0100,2). La variable auxiliaire est mise à 0 et on parcourt la liste allrows : 0100 n'est pas compatible ; 0010 est compatible, donc appel récursif avec h = 1 donc la valeur de retour est 1. La valeur retournée par la fonction est donc 1. retour : la fonction précédente retournant 1, sum vaut maintenant 1. appel à count(allrows,0010,2) qui se comporte pareil que l'autre, et retourne 1 à la n sum vaut 2, et on retourne 2. Optimisation avec stockage des valeurs intermédiaires Question 8 Écrire la déclaration d'un type Triplet pour stocker des valeurs (r, h, nbmurs) (nbmurs sera le résultat de count(r, h)). Écrire une fonction qui permet de tester l'égalité de deux triplets Attention, r est une rangée. Correction : Un triplet en C : typedef struct { int r; // rangee int h; // hauteur int nbmurs; Triplet; 3

Le test d'égalité (test de l'égalité de h et nbmurs, et test de l'égalité des rangées) : bool sont_egaux(triplet tr1,triplet tr2){ if ((tr1.h!= tr2.h) (tr1.nbmurs!= tr2.nbmurs)) return false; else { for (i=0;i<taillemax;i++){ if (r1[i]!=r2[i]) return false; return true; Question 9 Déclarer tout ce qu'il faut pour pouvoir parler de listes de Triplets. Écrire une fonction d'ajout en tête d'un Triplet dans une liste de Triplets. Correction : Pour les listes de triplets : typedef struct CellTriplet{ Triplet elem; struct CellTriplet* next; CellTriplet; typedef CellTriplet* ListeTriplet; void insereentetetriplet(listetriplet* pl, Triplet tp) { CellTriplet* p = (CellTriplet*)malloc(sizeof(CellTriplet)); p->elem = tp; p->next=*pl; *pl=p; Question 10 Déclarer le type HashTable comme étant un tableau (de taille SIZEHASH) de listes de Triplets. Écrire une fonction d'initialisation d'un élément de type HashTable. Correction : Déclaration de la Hashtable. typedef ListeTriplet Hashtable[TAILLEHASH]; L'initialisation consiste juste à mettre la liste vide dans chacune des cases de la Hastable : void init_ht(hashtable ht) { for (i=0; i<taillehash; i++) { ht[i]=null; Question 11 Écrire la fonction de hachage qui permettra de stocker le triplet (r, h, nbmurs) à l'intérieur de la liste située à la case de la table de hachage d'indice i calculé par la formule : i = (nbuns(r) h) mod SIZEHASH. La fonction nbuns(r) désigne le nombre de 1 de la rangée r, vous pouvez utiliser cette fonction sans la réécrire. Correction : 4

int hash(rangee r, int h){ return (intbin*hauteur) % SIZEHASH; À ce stade, il nous faut faire en sorte de pouvoir : rechercher un triplet donné dans une HashTable et récupérer le résultat (3ième champ du triplet). insérer un triplet si il n'existe pas dans la table. Question 12 Écrire une ou plusieurs fonctions qui vous permettront de faire ces traitements. Ces fonctions seront utilisées dans la question suivante. On n'écrira pas que du C, mais on fera également une vraie analyse algorithmique détaillée. Correction : Une solution optimisée consiste en une unique fonction de prototype : void search_and_insert(listetriplet l, Triplet tr, bool *resu, int *nwalls, CellTriplet *pos) qui : aecte vrai à *resu si le triplet a été trouvé, et dans ce cas la valeur de count se trouve dans la variable modiée nbwalls. dans le cas contraire, aecte faux à *resu, et le dernier paramètre de la fonction contient un pointeur vers la position d'insertion. emme du correcteur. Question 13 Compléter le code de l'annexe 2 (count et count_all) pour : déclarer et initialiser une Hashtable ; sauvegarder dans cette table chaque nouveau triplet calculé ; avant tout nouveau calcul, chercher si ce calcul a déjà été fait. Correction : Pour count_all la seule modication à faire est la déclaration, l'initialisation de la Hashtable et appel à la fonction count en passant la HashTable en paramètre :... Hashtable save ; init_ht(save); while(pc!= NULL) { int res = count (allrows,(*pc).el,hauteur,save);... Pour la fonction count : int count (ListeRangees allrows, Rangee r, int hauteur, Hashtable save) { if (hauteur==1) return 1; else { //ici ajouter de quoi chercher si count(allrows,r,hauteur) a deja ete calcule Triplet tp; bool resu;int nwalls; CellTriplet *pos = NULL; tp.r=r; tp.h=hauteur; tp.nbmurs = 0; // initialisation neuneu int indice = hash(r,h); search_and_insert(save[indice],tp,&resu,&nwalls,pos) if (resu) { //si oui : nwalls contient le résultat return nwalls; //si non : 5

else { Cell* pc = allrows; int sum = 0; while(pc!= NULL) { if (sontcompatibles(r,(*pc).el)) { sum = sum+ count(allrows,(*pc).el,hauteur-1); pc = (*pc).suivant ; //ajouter de quoi sauvegarder tp.nbmurs = sum; insertafter(pos,tp); // insertion triplet au bon endroit! return sum; //fin du "sinon" 6