Université Paris 6
Licence d'informatique
Module de Programmation
Année 2000-2001


Travaux dirigés n° 2





Exercice 1

Évaluez les expressions ci-dessous. On supposera qu'à chaque question correspond une nouvelle session Caml interactive.
1.
let l = 3::[];;
l=[3];;
1::l;;
[]@l@[4];;
l::[1];;
l@["34"; "2"];;

2.
let xxx = (3,"45",true);;
let zzz = (3, ("45", true)) and ttt = ((3, "45"), true);;
xxx = zzz;; 
xxx = ttt;;
let f (x,y,z) = (x, string_of_int x ^ y, not z);;
f xxx;;

3.
type t = {x : int; y : int};;
let rec1 = {x = 3; y = 1};;
let rec2 = {y = 1; x = 3};;
rec1 = rec2;;
type t' = {xxx : int; yyy : t};;
let rec3 = {xxx = 1; yyy = {x = 4; y = 5}};;
rec3.yyy.x;;

4.
type C = C1 | C2 | C3 of int * float * string list;;
let x = C3(1, 1.2, ["aaa"; "bbb"]);;
let f c = match c with
| C1 -> 1
| C3(x,y,z) -> x
| C2 -> 0;;
f x;;

Exercice 2 (Listes) Nous allons nous familiariser ici avec le type des listes. Définissez et donner le type des fonctions suivantes :
1. head_liste, tail_liste et nth_liste qui retournent respectivement le premier, le dernier et le nth_liste-ième élément d'une liste.
2. rang_pair_liste qui extrait la liste des éléments de rang pair d'une liste.
3. somme_liste qui calcule la somme des éléments d'une liste.
4. for_all qui détermine si un prédicat est vérifié par tous les éléments d'une liste.
5. reverse_liste qui renverse une liste.
6. Écrivez la fonction merge qui fusionne deux listes triées. En déduire une fonction de tri par dichotomie.


Exercice 3 (Types sommes et listes) Un étudiant s'il est présent lors d'une composition a une note qui est de type float. À la fin de l'année, il a passé 5 compositions et est censé avoir 5 notes d'importance égales. Compte tenu qu'une absence à une de ces compositions est éliminatoire, on se propose de dresser la liste des reçus parmi une liste d'étudiants. Pour cela on découpe le problème de la façon suivante :
1. (Types) Définissez le type note et le type étudiant qui rassemble les 5 notes d'un étudiant.
2. (É) crire une fonction somme_notes qui calcule la somme d'une liste de notes.
3. (É) crire une fonction nombre_notes qui calcule le nombre de notes effectives (étudiant présent) dans une liste de notes.
4. (E) n utilisant ces deux fonctions, écrire la fonction reçu qui pour un étudiant donné indique s'il est reçu ou non.
5. (E) n déduire une fonction liste_des_reçus qui dresse la liste des reçus parmi une liste d'étudiants inscrits.
6. (É) crire une fonction somme_nombre_notes qui calcule ces deux informations en un seul parcours de la liste. En déduire une nouvelle version de la fonction reçu.


Exercice 4 (Représentation d'un jeu de cartes)

Dans cet exercice, on se propose de modéliser en Caml le jeu de 32 cartes servant à la belote.


1. Une carte est définie par sa couleur (carreau, coeur, pique, trèfle) et sa hauteur (as, roi, dame, valet, dix, neuf, huit, sept). Définissez les types énumérés couleur et hauteur à cet effet.


2. Définissez le type carte comme un enregistrement contenant les informations de couleur et de hauteur.


3. Définissez les valeurs représentant l'as de trèfle, la dame de coeur et le 8 de carreau.


4. En utilisant le type list prédéfini en Caml, définissez le type main représentant un ensemble (une liste) de cartes.


5. En quoi le type main ne répond t-il pas entièrement à la question ? Donnez un contre-exemple.


Exercice 5 (Le comptage des points)

En fin de partie, les cartes sont évaluées de la façon suivante : quelle que soit la couleur de l'atout, l'as vaut 11 points, le roi vaut 4 points, la dame vaut 3 points, le dix vaut 10 points, le huit et le sept ne valent aucun point. Dans la couleur de l'atout, le valet vaut 20 points et le 9 vaut 14 points, mais dans les autres couleurs, le valet ne vaut que 2 points et le 9 ne vaut rien du tout.


1. Écrivez une fonction valeur donnant la valeur d'une carte. Commencez par réfléchir au type que devra posséder cette fonction.


2. Utilisez la fonction précédente pour définir une fonction valeur_main donnant la valeur d'une liste de cartes.


Exercice 6 (Le rangement des cartes)

Dans cet exercice, on souhaite ranger une main par couleur et par valeur (on rappelle que la valeur d'une carte dépend de sa couleur). L'ordre souhaité pour les couleurs est celui du bridge (Trèfle, Carreau, Coeur, Pique).


1. Écrivez un prédicat inf qui retourne le booléen true si son premier argument est une carte devant être placée avant la carte donnée en second argument.


2. Écrivez une fonction insere qui introduit une carte à l'endroit souhaité dans une main déjà convenablement rangée.


3. Écrivez une fonction range qui classe une main.


Ce document a été traduit de LATEX par HEVEA.