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