NFP119 : corrigé de la feuille d exercices 3

Documents pareils
Recherche dans un tableau

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

Classes et Objets en Ocaml.

modules & compilation

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

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

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)

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

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

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

Conventions d écriture et outils de mise au point


TP 1. Prise en main du langage Python

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

Cours de Programmation 2

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

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

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

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

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

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

Utilisation d objets : String et ArrayList

Notions fondamentales du langage C# Version 1.0

Initiation à la programmation en Python

TP : Gestion d une image au format PGM

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Algorithmique et Programmation, IMA

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

Baccalauréat ES Amérique du Nord 4 juin 2008

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

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

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

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

Programme Compte bancaire (code)

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours 1 : La compilation

STAGE IREM 0- Premiers pas en Python

OCL - Object Constraint Language

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

Programmation en Caml pour Débutants

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

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

Exercices du Cours de la programmation linéaire donné par le Dr. Ali DERBALA

Corrigé des exercices sur les références

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

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

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

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

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

Premiers Pas en Programmation Objet : les Classes et les Objets

1 Recherche en table par balayage

Une introduction rapide à Coq

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)

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Programmer en JAVA. par Tama

Initiation à la Programmation en Logique avec SISCtus Prolog

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

Latitude N Longitude E Altitude 376 m RÉSUMÉ MENSUEL DU TEMPS DE JANVIER 2014

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

Les algorithmes de base du graphisme

Organigramme / Algorigramme Dossier élève 1 SI

ACTIVITÉ DE PROGRAMMATION

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

V- Manipulations de nombres en binaire

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

Algorithmique & programmation

Cours d algorithmique pour la classe de 2nde

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Java Licence Professionnelle CISII,

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

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

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

Principes des langages de programmation INF 321. Eric Goubault

Le prototype de la fonction main()

PROJET 1 : BASE DE DONNÉES REPARTIES

Introduction à l algorithmique et à la programmation M1102 CM n 3

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

Informatique III: Programmation en C++

TP, première séquence d exercices.

Initiation à l algorithmique

Assistant d e tablissement de Tableaux

Arbres binaires de recherche

Arguments d un programme

Corrigés des premiers exercices sur les classes

Algorithmique et programmation : les bases (VBA) Corrigé

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

Chapitre 2 Devine mon nombre!

Présentation du langage et premières fonctions

Chapitre 1 : Évolution COURS

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Le langage C. Séance n 4

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Transcription:

NFP119 : corrigé de la feuille d exercices 3 María-Virginia Aponte 20 mars 2010 Exercice 1 Tapez ces phrases en TP et expliquez les réponses données par Ocaml. # [1;2;3];; - : int list = [1; 2; 3] # [];; - : a list = [] # [1;3;1,2];; This expression has type int * int but is here used with type int # [1;true;5;false];; This expression has type bool but is here used with type int # [1,true; 5,false];; - : (int * bool) list = [(1, true); (5, false)] # [1;3] @[4;8];; - : int list = [1; 3; 4; 8] # (@);; - : a list -> a list -> a list = <fun> # [1;3] @ [ a ];; This expression has type char but is here used with type int # [[1];[2;3]];; - : int list list = [[1]; [2; 3]] # [[1] @ [2;3]];; - : int list list = [[1; 2; 3]] # List.length [[1];[2;3]];; - : int = 2 # List.length [[1];[2;3]];; - : int = 2 # [1] @ 2;; This expression has type int but is here used with type int list # [1] @ [2];; 1

- : int list = [1; 2] # 1::[2];; - : int list = [1; 2] # [1]::[2];; This expression has type int but is here used with type int list # [1]::[[2]; [3;4]];; - : int list list = [[1]; [2]; [3; 4]] Exercice 2 Premières fonctions sur les listes Que fait la fonction suivante? Donnez un déroulement récursif pour exppliquer son fonctionnement. # let rec indice x l = with [] -> failwith "indice" a::reste -> if x=a then 1 else 1+(indice x reste) val indice : a -> a list -> int = <fun> # indice 4 [5;7;1];; Exception: Failure "indice". # indice 4 [5;7;4;9];; - : int = 3 Solution : Cette fonction donne la position de la première occurrence d un élément dans une liste, s il est présent et échoue sinon. En utilisant le filtrage, écrire des fontions pour : 1. Tester si une liste commence par 0 ou par 1. 2. Tester si une liste est vide. 3. Tester si une liste est composée d au mois un et d au plus deux élèments. # let unzero l = with 1::_ -> true 0::_ -> true _ -> false val unzero : int list -> bool = <fun> # let vide l = with [] -> true _ -> false ;; val vide : a list -> bool = <fun> # let undeux l = with [_;_] -> true 2

[_] -> true _ -> false ;; val undeux : a list -> bool = <fun> # undeux [1;2;3];; - : bool = false Exercice 3 Écrivez les fonctions suivantes. Il s agit de fonctions présentes dans le module List dont vous pourrez tester le fonctionnement et comparer avec celui des votres. 1. nieme (List.nth). Renvoie le n-ième élément d une liste. 2. inverse (List.rev). Renvoie la liste argument en ordre inversé. 3. applatit (List.flatten). Concatène les éléments d une liste de listes. 4. existe List.exist) Teste si au moins un des éléments de la liste satisfait une condition passée en argument. let rec nieme l i = with [] -> failwith "nieme" a::r -> if i<0 then failwith "nieme" else if i=0 then a else nieme r (i-1);; val nieme : a list -> int -> a = <fun> # nieme [1] (-2);; Exception: Failure "nieme". # nieme [1] 2;; Exception: Failure "nieme". # nieme [3;5;7] 2;; - : int = 5 let rec inverse l = a::r -> (inverse r)@[a];; val inverse : a list -> a list = <fun> # inverse [1;2;3];; - : int list = [3; 2; 1] # let rec applatit l = a::r -> a @ (applatit r);; val applatit : a list list -> a list = <fun> # applatit [[1;2]; [3;4]; [5]];; - : int list = [1; 2; 3; 4; 5] # let rec existe cond l = with [] -> false 3

a::r -> cond a existe cond r;; val existe : ( a -> bool) -> a list -> bool = <fun> # existe (fun x -> x mod 2 = 0) [1;7;6;9];; - : bool = true # existe (fun x -> x mod 2 = 0) [1;7;9];; - : bool = false Exercice 4 Considérez la fonction remplace vue en cours. Modifiez cette fonction en une fonction remplace tous de sorte qu elle remplace toutes les occurrences de l élément cherché. # let rec remplace e x l = a::reste -> if e=a then x::reste else a::(remplace e x reste) val remplace : a -> a -> a list -> a list = <fun> # let rec remplace_tous e x l = a::reste -> if e=a then x::(remplace_tous e x reste) else a::(remplace_tous e x reste) ;; val remplace_tous : a -> a -> a list -> a list = <fun> # remplace_tous 3 5 [3;4;3;7;9];; - : int list = [5; 4; 5; 7; 9] # remplace_tous 3 5 [1;2;0;9];; - : int list = [1; 2; 0; 9] Exercice 5 Fonctions récursives sur les listes 1. Ecrire une fonction range list qui prend deux entiers (i, n) et fabrique une liste formée de l intervalle [i ; (i+1) ; (i+2) ;.. (i+n-1)]. Exemple : l appel range list (3,5) renvoie la liste [3 ; 4 ; 5 ; 6 ; 7]. 2. Ecrire la fonction calcule l intersection de deux listes. On suppose que celles-ci n ont pas d éléments répétés. Utilisez si nécessaire des fonctions du module List. # let rec range_list i n = if n<=0 then [] else i::(range_list (i+1) (n-1));; val range_list : int -> int -> int list = <fun> # range_list 1 0;; - : int list = [] # range_list 2 4;; 4

- : int list = [2; 3; 4; 5] # let rec intersect (l1,l2) = 1 x::r -> if List.mem x l2 then x::(intersect (r,l2)) else intersect (r,l2);; val intersect : a list * a list -> a list = <fun> # intersect ([1;2;3], [7;2;5]);; - : int list = [2] Exercice 6 Dans cet exercice, on s intéresse à une notion d ensemble où il est possible qu un même élément apparaisse plusieurs fois. Un tel ensemble est appelé multi-ensemble, et à chaque élément e d un multi-ensemble, on associe le nombre de fois où il apparaît, appelé multiplicité de e. Ainsi, on peut voir un élément d un multiensemble comme un couple constitué de la valeur proprement dite et de sa multiplicité. Par exemple, le multi-ensemble où 1, 3 et 2 apparaissent respectivement 20, 4 et 1 fois, sera représenté de la manière suivante : {(1, 20), (3, 4), (2, 1)}. On souhaite modéliser les multi-ensembles d entiers à l aide d une liste en Ocaml. Les éléments de cette liste auront le type suivant : type multielement = { e : i n t ; mult : i n t } où le champ e correspond à l élémént et mult à sa multiciplité dans l ensemble. Vous devez implanter les opérations suivantes sur les multi-ensembles : 1. Donnez une variable me qui contient le multi-ensemble de l exemple donné plus haut. # let me = [{e=1; mult=20}; {e=3; mult=4}; {e=2; mult=1}];; val me : multielement list = [{e = 1; mult = 20}; {e = 3; mult = 4}; {e = 2; mult = 1}] 2. ajout : int * multielement list -> multielement list prend un entier n et un multi-ensemble e, et renvoie le nouveau multi-ensemble où n est ajouté. Si n appartient déjà au multi-ensemble, alors cette opération incrémente sa multiplicite ; s il n appartient pas au multi-ensemble, alors il est rajouté avec une multiplicité de 1. # let rec ajout (i,me) = match me with [] -> [ {e=i; mult=1}] {e=x; mult=n}::r -> if x=i then {e=x; mult=n+1}::r else {e=x; mult=n}::(ajout (i,r));; val ajout : int * multielement list -> multielement list = <fun> # ajout (2, me);; - : multielement list = [{e = 1; mult = 20}; {e = 3; mult = 4}; {e = 2; mult = 2}] 3. enleve prend un entier n et un multi-ensemble e, et renvoie le nouveau multi-ensemble où n est soit enlevé si sa multiciplité est de 1, soit laissé avec une multiplicité decrémentée. let rec enleve i me = match me 5

{e=x; mult=n}::r -> if x=i then if n<=1 then r else {e=x; mult=n-1}::r else {e=x; mult=n}::(enleve i r);; val enleve : int -> multielement list -> multielement list = <fun> # enleve 3 me;; - : multielement list = [{e = 1; mult = 20}; {e = 3; mult = 3}; {e = 2; mult = 1}] # enleve 2 me;; - : multielement list = [{e = 1; mult = 20}; {e = 3; mult = 4}] 4. appartient teste si un entier n appartient à un multi-ensemble. #let rec appartient i me = match me with [] -> false {e=x; mult=n}::r -> x=i && n>0 appartient i r;; val appartient : int -> multielement list -> bool = <fun> # appartient 3 me;; - : bool = true # appartient 6 me;; - : bool = false 5. multi prend un entier n et un multi-ensemble e et renvoie la multiciplité de n dans le multi-ensemble. Renvoie 0 si n n appartient pas à e. # let rec multi i me = match me with [] -> 0 {e=x; mult=n}::r -> if x=i then n else multi i r;; val multi : int -> multielement list -> int = <fun> # multi 1 me;; - : int = 20 # multi 6 me;; - : int = 0 6. union renvoie l union de deux multi-ensembles. Les multiplicités des éléments communs sont ajoutées dans le multi-ensemble résultat de l union. # let rec supprimme i m = match m {e=x; mult=n}::r -> if x=i then r else {e=x; mult=n}::(supprimme i r);; val supprimme : int -> multielement list -> multielement list = <fun> # supprimme 2 me;; - : multielement list = [{e = 1; mult = 20}; {e = 3; mult = 4}] # let rec union m1 m2 = match m1 with [] -> m2 {e=x; mult=n}::r -> let k = multi x m2 in 6

if k>0 then {e=x; mult=n+k}::(union r (supprimme x m2)) else {e=x; mult=n}::(union r m2);; val union : multielement list -> multielement list -> multielement list = <fun> let m2 = [{e=5;mult=10}; {e=1;mult=2}; {e=2;mult=2}];; # union me m2;; - : multielement list = [{e = 1; mult = 22}; {e = 3; mult = 4}; {e = 2; mult = 3}; {e = 5; mult = 10}] 7. On aimerait rendre les fonctions précédentes génériques pour n importe quel type de donnée à ajouter dans le multi-ensemble, porvu que cette donnéé soit munie d une multiplicité. Peut-on définir un type de multi-ensembles générique? Donnez la définition de ce type. type a multielement = {e: a; mult: int} 7