CORRECTION INF121 : Contrôle continu (2h00) Mars Exercice 1 : Typage et valeur d une expression (15 points)

Documents pareils
Recherche dans un tableau

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>

Algorithmique et Programmation, IMA

TP 1. Prise en main du langage Python

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

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

STAGE IREM 0- Premiers pas en Python

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

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

Cours de Programmation 2

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

modules & compilation

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)

Solutions du chapitre 4

Principes des langages de programmation INF 321. Eric Goubault

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

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

OCL - Object Constraint Language

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

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

Les arbres binaires de recherche

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

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

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

Initiation à la programmation en Python

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

1 Recherche en table par balayage

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

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

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

Cours 1 : La compilation

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

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Théorie des Graphes Cours 3: Forêts et Arbres II / Modélisation

Présentation du langage et premières fonctions

CALCUL DES PROBABILITES

Coefficients binomiaux

Introduction à la Programmation Parallèle: MPI

S initier aux probabilités simples «Question de chance!»

Enseignement secondaire technique

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

L exclusion mutuelle distribuée

Introduction au langage C

Représentation d un entier en base b

Corrigé des TD 1 à 5

Probabilités sur un univers fini

La question est : dans 450 combien de fois 23. L opération est donc la division. Le diviseur. Le quotient

Les chaînes de caractères

Limites finies en un point

Algorithmique et programmation : les bases (VBA) Corrigé

Lambda-calcul et langages fonctionnels

Licence Sciences et Technologies Examen janvier 2010

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

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

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Qu est-ce qu une probabilité?

progression premiere et terminale

Les BRMS Business Rules Management System. Groupe GENITECH

S initier aux probabilités simples «Question de chance!»

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

Chapitre 10. Les interfaces Comparable et Comparator 1

2 Comment fonctionne un ordinateur, dans les grandes lignes

Table des matières. Introduction


De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

Cours de Systèmes d Exploitation

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

Genie Logiciel Avancé Projet :Gestion d une chaîne hotelier low cost

ALGORITHMIQUE ET PROGRAMMATION En C

Structurer ses données : les tableaux. Introduction à la programmation

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

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

MON LIVRET DE COMPETENCES EN LANGUE (Socle commun) Niveau A1/A2 / B1

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

Programmation en Caml pour Débutants

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)

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

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

CORRECTION EXERCICES ALGORITHME 1

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

Découverte de Python

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Examen Médian - 1 heure 30

Seconde Généralités sur les fonctions Exercices. Notion de fonction.

Quelques algorithmes simples dont l analyse n est pas si simple

Les processus légers : threads. Système L3, /31

Cours d algorithmique pour la classe de 2nde

Cours 7 : Utilisation de modules sous python

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

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

Transcription:

CORRECTION INF121 : Contrôle continu (2h00) Mars 2012 Documents autorisés : Uniquement une feuille A4 recto-verso de notes personnelles manuscrites. Notes : Vous répondrez aux exercices et au problème dans l ordre qui vous convient. Le total des points de chaque question correspond au nombres de minutes nécessaires pour résoudre la question. Les questions difficiles sont marquées par des étoiles (**). Vous pouvez admettre le résultat d une question, et l utiliser dans la suite. Rappel : Définir une fonction signifie : 1. Profil 2. Sémantique 3. Exemples 1. Si elle est récursive : Terminaison 2. Code OCaml Exercice 1 : Typage et valeur d une expression (15 points) Rappel : fst (a,b) = a et snd (a,b) = b Pour chaque phrase OCaml, indiquez le type du résultat et sa valeur. Si une expression est mal typée, indiquez le et justifiez. On donnera également le type des fonctions f et g. 1. (3 points) snd (2,true) && false - : bool = false 2. (3 points) let a = (1,2) in fst (a,2) - : int * int = (1, 2) 3. (3 points) fst (3,2 mod 2 = 0) + 1 - : int = 4 4. (3 points) let f (x : int) : int = (x mod 10, x / 10) in f (snd (f 123)) let f (x : int) : int = (x mod 10, x / 10) in f (snd (f 123));; ^^^^^^^^^^^^^^^^^^ Error: This expression has type int * int but an expression was expected of type int 5. (3 points) let g (x : float) : float float = (x,x) in g (g 2.) let g (x : float) : float * float = (x,x) in g (g 2.);; ^^^^^^ Error: This expression has type float * float but an expression was expected of type float 1

Exercice 2 : Fonctions récursives (35 points) 1. (10 points) Définir une fonction récursive qui prend deux entiers a et b et calcule la somme de tous les entiers entre a et b, a et b compris, ainsi la somme entre a et a vaut a. Nous supposons que a b. (a) Profil : somme : Z Z Z (b) Sémantique : calcule la somme de tous les entiers entre a et b. (c) Exemples : somme 0 10 = 55 somme 10 20 = 165 somme ( 4) 3 = 4 : somme a a = a somme a b = a + somme (a+1) b Terminaison : Nous exhibons une mesure m sur les paramètres de la fonction récursive. Par exemple m(a, b) = b a Nous montrons que cette mesure décroit à chaque appel récursif. let rec somme (a:int) (b:int):int = if a = b then a else a + somme (a+1) b;; m(a, b) = b a > m(a + 1, b) = b (a + 1) = b a 1 2. (6 points) (*) Donner la réalisation d une autre solution qui effectuera la récursion sur l autre argument. let rec sommedown (a:int) (b:int):int = if a = b then a else b + sommedown (a) (b-1);; 3. (7 points) Écrire une fonction non récursive qui effectue le même calcul, en utilisant uniquement des additions, soustractions, multiplications et divisions. Nous supposons que a b. let sommesimple (a:int) (b:int):int = Ou let sommesimplebis (a:int) (b:int):int = (b*(b+1) - a*(a-1))/2;; a*(b-a+1) + (b-a)*(b-a+1)/2;; 4. Complexité : (2 points) Donner le nombre total d appels récursifs faits dans la fonction écrite à la question 1. b-a appels récursifs et un appel non récursif (2 points) Compter le nombre d opérations effectuées dans la fonction écrite à la question 3. 2 multiplications + 1 division + 1 addition + 2 soustractions (4 points) Considérons que les additions, soustractions, multiplications et divisions coûtent le même temps. Quel est l algorithme qui est le plus rapide? Nous avons sommesimple : 6 opérations et somme : (b-a)*2 (ou (b-a)*3+1 en comptant = comme une soustraction) opérations. Donc si (b-a) < 3 (ou (b-a) < 5/3), c est-à-dire si la somme porte sur plus de 4 (ou 3) nombres alors l algorithme somme est plus rapide, sinon c est l algorithme sommesimple. 2

(4 points) Considérons que chaque addition, soustraction prend t fois moins de temps que chaque multiplication ou division. Déterminer la valeur de t pour que l algorithme 1 soit plus rapide moins que celui de la fonction demandée à la question 3. Soit m le nombre de * ou / et p le nombre de + ou - dans la formule simple. Nous avons sommesimple : m+pt et somme : (b-a)*2t (ou (b-a) +1 en comptant = comme une soustraction). somme est plus rapide si 2 (b-a) < m+pt (ou 3 (b-a) + 1 < m+pt) d où pt > 2 (b-a) -m et t > (2 (b-a) - m) / p) (ou pt > 3 (b-a) - (m+1) et t > (3 (b-a) - (m+1)) / p) Pour la formule (y (y+1) - x (x-1))/2 on a m=p=3 : t > 2/3 (b-a) -1 (ou t > b-a -4/3) Exercise 3 : Jouons au Tarot (75 points) Un jeu de tarot comporte 78 cartes à jouer : Cinquante-six cartes réparties en quatorze cartes des quatre couleurs traditionnelles : pique, cœur, carreau et trèfle. La différence avec un jeu traditionnel de 52 cartes est le cavalier, figure s intercalant entre la dame et le valet. Dans l ordre décroissant de force et de valeur, on trouve donc : + les honneurs : Roi, Dame, Cavalier et Valet + les petites : 10, 9, 8, 7, 6, 5, 4, 3, 2, 1. Le 1 est la plus petite carte du paquet contrairement à ce qui se pratique dans de nombreux jeux où l As est plus fort que le Roi. Vingt et une cartes portant un numéro : ce sont les atouts (ou tarots) qui ont priorité sur les couleurs. Le numéro indique la force de chaque atout, du plus fort, le 21, au plus faible, le 1. L «excuse», une carte marquée d une étoile et représentant un joueur de mandoline. Il s agit d une sorte de joker. a) Modélisation (7 points) Nous définissons les types suivants : type dos = Petite of int Valet Cavalier Dame Roi;; type couleur = Trefle Pique Carreau Coeur ;; type carte = Atout of int Excuse Normale of dos couleur ;; type carteliste = Nil Cons of carte carteliste;; Nous définissons le type main qui modélise l ensemble des cartes en possession d un joueur, par type main = carteliste. Nous définissons le type pli qui représente l ensemble des cartes gagnées à chaque tour de jeu par type pli = carteliste. Notre modélisation doit être valable pour 3, 4 ou 5 joueurs. 1. (7 points) Représentez en OCaml (dans votre type) la main contenant les cartes suivantes : «valet de pique», «9 d atout», «excuse», «roi de carreau», «9 de coeur», «21 d atout». let main = Cons( Normale(Valet,Pique), Cons( Atout(9), 3

Cons( Excuse, Cons( Normale(Roi,Carreau), Cons( Normale(Petite(9),Coeur), Cons( Atout(21),Nil))))));; b) Points (40 points) À la fin de la partie, on compte les points contenus dans les plis (i.e., les cartes prises par un groupe de joueur). On omet de nombreuses règles subtiles du tarot ici, pour se concentrer sur l essentiel. Chaque carte vaut un nombre précis de point, donné par la règle suivante : Atout 1, Excuse et Atout 21 : 4.5 points Roi : 4.5 points Dame : 3.5 points Cavalier : 2.5 points Valet : 1.5 points Toute autre carte : 0.5 points 1. (2 points) Combien de points compte la main donnée à la question a)1)? 16 2. (2 points) Combien de points compte le pli qui est composé des cartes valet de pique, douze d atout, excuse et roi de carreau? 11 3. (6 points) Définir une fonction valeur: carte float, qui à une carte associe son nombre de points. (a) Profil : valeur: carte float (b) Sémantique : A une carte associe son nombre de points. (c) Exemples : valeur Excuse = 4.5 valeur Roi = 4.5 (a) Code OCaml let valeur (c:carte): float = match c with Excuse -> 4.5 Atout (1) -> 4.5 Atout (21) -> 4.5 Normale (Roi,_) -> 4.5 Normale (Dame,_) -> 3.5 Normale (Cavalier,_) -> 2.5 Normale (Valet,_) -> 1.5 _ -> 0.5 ;; 4. (7 points) Définir la fonction compte: pli float, qui compte les points contenus dans un pli. (a) Profil : compte: pli float (b) Sémantique : compte les points contenus dans un pli. (c) Exemples : compte(main) = 16 : compte(nil) = 0. compte(cons(t, q)) = valeur(t) +.compte(q) let rec compte (l:pli):float = match l with Nil -> 0. Cons(t,q) -> valeur t +. compte q ;; 4

5. (10 points) Nous considérons le type suivant : type pliliste = Nil Cons of pli pliliste;; Définir une fonction veriftotal: pliliste bool, qui vérifie que le total des points de la liste des plis passés en paramètre est bien 91 points. Vous pouvez réutiliser la fonction compte de la question précédente et toute autre fonction intermédiaire que vous jugerez nécessaire. (a) Profil : veriftotal: pliliste bool (b) Sémantique : vérifie que le total des points de la liste des plis passés en paramètre est bien 91 points. Pour cela nous introduisons une fonction récursive qui calcule la somme des points d une liste et nous testons si le résultat est bien 91. (c) Exemples : veriftotal(main) = false sommepointspli(n il) = 0. sommepointspli(cons(t, q)) = compte(t) +.sommepointspli(q) let veriftotal (p: pli liste) : bool = let rec sommepointspli (l: pli liste) : float = Nil -> 0. Cons(t,q) -> compte t +. sommepointspli q in sommepointspli p = 91. ;; match l with 6. (6 points) Définir une fonction nbatout: main int, qui compte le nombre d atouts contenus dans une main passée en paramètre. (a) Profil : nbatout: main int (b) Sémantique : compte le nombre d atouts contenus dans une main passée en paramètre. (c) Exemples : nbatout(main) = 3 nbatout(nil) = 0. nbatout(cons(t, q)) = 1 + nbatout(q) let rec nbatout (l:main):int = match l with Nil -> 0 Cons(t,q) -> match t with Atout(_) -> 1+ nbatout q _ -> nbatout q;; 7. (7 points) Si un joueur possède plus de 10 atouts dans sa main intiale, il peut obtenir des points bonus, nous dirons qu il a une poignée. Plus précisément une simple poignée correspond à au moins 10 Atouts et au plus 12 Atouts et une prime de 20 points, une double poignée correspond à au moins 13 Atouts et au plus 14 et une prime de 30 points et une triple poignée correspond à au moins 15 Atouts et à une prime de 40 points. Définir la fonction pointbonus: main float, qui détermine en fonction de la main d un joueur le nombre de points bonus attribués en fonction de son nombre d atouts. Vous devrez réutiliser la fonction nbatout de la question précédente. 5

1. Profil : pointbonus: main float 2. Sémantique : détermine en fonction de la main d un joueur le nombre de points bonus attribués en fonction de son nombre d atouts 3. Exemples : pointbonus(main) = 0 1. Code OCaml let pointbonus (m: main) : float = let nba = nbatout m in if nba >= 15 then 40. else if nba >=13 then 30. else if nba >= 10 then 20. else 0.;; c) Vérification (28 points) Afin de détecter les éventuels tricheurs nous allons vérifier que les cartes ne sont jouées qu une seule fois. 1. (8 points) Définir une fonction appart : carte pli bool qui détermine si une carte donnée appartient à un pli. (a) Profil : appart : carte pli bool (b) Sémantique : détermine si une carte donnée appartient à un pli. (c) Exemples : appartexcusemain = true : appart(c, Nil) = false appart(c, Cons(t, q)) = true si c = t sinon appartcq let rec appart (c:carte) (p:pli) : bool = match p with Nil -> false Cons(t,q) -> if t = c then true else appart c q;; 2. (8 points) Définir une fonction oter : carte main main qui supprime toute les occurrences d une carte donnée dans une main. (a) Profil : oter : carte main main (b) Sémantique : supprime toute les occurrences d une carte donnée dans une main. (c) Exemples : oter Excuse main = Cons( Normale(Valet,Pique), Cons( Atout(9), Cons( Normale(Roi,Carreau), Cons( Normale(Petite(9),Coeur), Cons( Atout(21),Nil)))));; otercnil = Nil oterccons(x, r) = r si c = x sinon Cons(x, (oter(c)(r)) 6

let rec oter (c:carte) (p:pli) : pli = match p with Nil -> Nil Cons(t,q) -> if t = c then oter c q else Cons(t,oter c q);; 3. (12 points) Définir une fonction unicite : main bool qui détermine si une main ne contient pas deux fois la même carte. Vous pouvez utiliser la fonction appart. (a) Profil : unicite : main bool (b) Sémantique : détermine si une main ne contient pas deux fois la même carte (c) Exemples : unicite(main) = true unicite(nil) = true unicite(cons(t, q)) = false si t apprtient a q sinon unicite(q) let rec unicite2 (p:pli) : bool = match p with Nil -> true Cons(t,q) -> if appart t q then false else unicite2 d) Jeu de la carte (***) BONUS (20 points) Définir une fonction qui détermine étant donné un pli d au moins une carte, la carte qui l emporte. Vous pouvez d abord définir des fonctions intermédiaires avant de répondre à cette question. Nous indiquons les règles élémentaires du tarot permettant de déterminer qui emporte un pli. Si la première carte est un atout, c est l atout le plus fort présent dans le pli qui l emporte. Si la première carte détermine la couleur jouée, alors c est l atout le plus fort présent dans le pli qui l emporte, sinon s il n y a pas d atout, c est la plus forte carte de la couleur jouée qui l emporte. Si la première carte d un pli est l excuse, c est la carte suivante qui détermine la couleur jouée. Rappel Soit un type défini par type alphabet = A B C;; alors A>B>C. Nous donnons uniquement le code OCaml let rec quigagne (p:pli) : carte = let rec plusgrand (x:int) (p:pli): int = match p with Nil -> x Cons (Atout(y),q) -> if y>x then plusgrand y q else plusgrand x q Cons (t,q) -> plusgrand x q in let rec contientatout (p:pli) = match p with Nil -> false Cons (Atout(y),q) -> true Cons (t,q) -> contientatout q in let rec plusgrandcouleur (d:dos) (p:pli) (c:couleur):carte = match p with Nil -> Normale(d,c) Cons(Normale(ddo,coul),q) -> if (sup ddo d)&&(coul=c) q;; 7

then plusgrandcouleur ddo q c else plusgrandcouleur d q c Cons (t,q) -> plusgrandcouleur d q c in match p with Nil -> failwith "pli vide" Cons(first, reste) -> match first with Excuse -> quigagne reste Atout(x) -> Atout(plusgrand x reste) Normale(d,c) -> if contientatout(reste) then Atout(plusgrand 0 reste) else plusgrandcouleur d reste c ;; 8