sujet

Transcription

sujet
API2-prime
7 janvier 2013 - 2h
Licence SESI - Semestre 3
Devoir surveillé numéro 2
UNIQUEMENT POUR LES ETUDIANTS DES GROUPES A,B,C
INDIQUEZ VOTRE GROUPE SUR VOTRE COPIE
Dans un exercice il est possible d’utiliser une fonction d’une question précédente même si la réponse
n’a pas été fournie.
Avant de débuter, lisez le sujet en entier.
Soyez lisible et précis dans vos réponses.
Exercice 1 : Questions de cours (répondre en 1 ligne)
On considère dans ces questions une table de hachage t qui associe des chaı̂nes de caractères à des chaı̂nes
de caractères.
Question 1.1 Donner l’instruction permettant d’obtenir la valeur associé à la clé "Dupont" (on suppose
qu’elle existe).
Question 1.2 Donner l’instruction permettant d’obtenir le nombre de valeurs associées à la clé "Dupont".
Question 1.3
Etant donnés les instructions suivantes :
let cpt = ref 0;;
let compter s k v =
if s = v then begin
cpt := ! cpt + 1;
end
;;
donner l’instruction permettant de compter le nombre de clés qui sont associées à la valeur "09786545".
Exercice 2 : Calcul sur des parcours
Dans cet exercice, on modélise un parcours comme une liste de points qui correspondent à des relevés
topographiques. Chaque point correspond à la distance par rapport au point précédent et à l’altitude absolue.
Un parcours comporte au moins deux points. Voici un exemple de parcours qui comporte 5 points :
800
altitude
distance entre ces deux points : 1000.19 mètres
600
400
0
1000
3000 4050
9050
position
Les points seront modélisés par le type suivant :
type point = {
position : int ; (* position en metres depuis le point precedent *)
altitude : int ; (* altitude absolue en metres *)
}
1
Question 2.1
Quel est le type d’un parcours ?
Question 2.2 Ecrire une fonction altitude_max qui étant donné un parcours calcule l’altitude maximale
de celui-ci. Par exemple :
# let p = [ { position
{ position
{ position
{ position
{ position
# altitude_max p ;;
- : int = 620
=
=
=
=
=
0; altitude = 600 };
1000; altitude = 620
2000; altitude = 560
1050; altitude = 600
5000; altitude = 550
};
};
};
} ];;
Question 2.3 Ecrire une fonction altitude_cumulee qui étant donné un parcours calcule l’altitude cumulée, c’est-à-dire la somme des altitudes positives entre deux points. Par exemple :
# altitude_cumulee p ;;
- : int = 60
Question 2.4 Ecrire une fonction distance qui étant donnés deux points calcule la distance en mètres
entre ceux-ci (on supposera le parcours rectiligne entre deux points, comme dans un triangle rectangle). Par
exemple :
# distance ( List . hd p ) ( List . hd ( List . tl p ));;
- : float = 1 00 0 . 19 9 9 80 0 0 39 9 9 03
Question 2.5 Ecrire une fonction longueur qui étant donné un parcours calcule la longueur en mètres
de celui-ci. Par exemple :
# longueur p ;;
- : float = 9 05 2 . 11 1 3 99 8 7 96 5 9 07
On souhaite maintenant comparer des parcours. Un parcours est plus court qu’un autre si :
– le nombre de mètres parcourus est plus petit ;
– ou bien si le nombre de mètres parcourus est identique mais que l’altitude cumulée est plus petite ;
– ou bien si le nombre de mètres parcourus et l’altitude cumulée sont identiques mais que l’altitude
maximale est plus petite.
Question 2.6 Ecrire une fonction booléenne est_plus_court qui étant donnés deux parcours p1 et p2
retourne vrai si p1 est plus court que p2 , faux sinon.
Exercice 3 : Nombres romains
Dans cet exercice, on cherche à convertir une chaı̂ne de caractères représentant un nombre en chiffres
romains en un entier. On rappelle que M=1000, D=500, C=100, L=50, X=10, V=5 et I=1.
Question 3.1 Ecrire une fonction convertir qui renvoie un nombre entier en fonction d’un caractère
romain. La fonction lèvera une exception si le caractère ne représente pas un chiffre romain. Par exemple :
# convertir ’M ’;;
- : int = 1000
# convertir ’U ’;;
Exception : Failure "N ’ est pas un chiffre romain " .
2
Question 3.2 L’évaluation d’un nombre se fait de la manière suivante : si le premier chiffre du nombre a
une valeur inférieure au deuxième, alors on le soustrait de la valeur de tout le reste, sinon on l’additionne à
la valeur de tout le reste. Ecrire une fonction récursive conversion qui effectue la conversion d’une chaı̂ne
de caractères qui représente un nombre romain en entier. Par exemple :
#
#
-
conversion " MCCLIV " ;;
: int = 1254
conversion " MCCLVI " ;;
: int = 1256
Exercice 4 : Comparaison de chaı̂nes de caractères
On dispose de deux chaı̂nes de caractères de même longueur. On souhaite compter le nombre de lettres
que ces deux chaı̂nes ont en commun à la même position.
Par exemple :
#
#
-
n o m b re _ l e tt r e s _ e n _ c o m m u n " bonbon " " banane " ;;
: int = 2
n o m b re _ l e tt r e s _ e n _ c o m m u n " cannettes " " bonnetier " ;;
: int = 5
Question 4.1
Quel est le type de la fonction !nombre lettres en commun ! ?
Question 4.2
exceptions.
Ecrire une version récursive ou itérative qui utilise ou non, à votre guise, la gestion des
3

Documents pareils