Univ. Lille 1 - Licence STS 1ère année 2010-2011 Initiation à la programmation Devoir surveillé no 2 Lundi 11 janvier 2010 - Durée 1h30 - Documents et calculatrices non autorisés. Ce sujet contient deux exercices indépendants. Liste des fonctions du langage pouvant être utilisées pour ce sujet : print_int : int -> unit ; print_string : string -> unit ; print_endline : string -> unit ; print_newline : unit -> unit ; String.length : string -> int ; String.create : int -> string ; init_tas : int*string -> unit ; Exercice 0-1 Divisibilité par 3 On rappelle dans cet exercice les deux opérateurs de division des nombres entiers en / et mod. Caml : Question 1 Si on veut tester si un nombre entier n est divisible par un autre nombre entier p (supposé non nul), quel opérateur de division peut-on utiliser ? Donnez une expression en Caml dont la valeur booléenne indique si n est divisible ou non par p. Question 2 Réalisez la fonction chiffre_unite qui calcule le chire des unités de l'entier passé en paramètre. Voici quelques exemples d'appels à cette fonction. # # # - chiffre_unite (1234) ;; : int = 4 chiffre_unite (20) ;; : int = 0 chiffre_unite (5) ;; : int = 5 En s'appuyant sur l'écriture décimale d'un entier, il existe une méthode qui permet de tester si un nombre est un multiple de 3 sans faire la division par 3. Cette méthode consiste à additionner les chires (en base 10) de l'entier à tester, et tester si le nombre obtenu est divisible par 3. Par exemple, l'entier 12 est divisible par 3, parce que la somme de ses chires vaut 1 + 2 = 3 et 3 est un entier d'un seul chire divisible par 3. En revanche, 13 n'est pas divisible par 3 parce que la somme de ses chires vaut 1 + 3 = 4 et 4 n'est pas un entier divisible par 3. Lorsque la somme des chires est un nombre à plus de deux chires, c'est-à-dire un nombre au moins égal à 10, on recommence avec la somme jusqu'à obtenir un nombre à un seul chire. Par exemple, pour le nombre 123 456, on a 123 456 → 1 + 2 + 3 + 4 + 5 + 6 = 21 → 2 + 1 = 3, et comme 3 est divisible par 3, il en est de même pour 123 456. En revanche, pour 999 999 998 on a 999 999 998 → 8 × 9 + 8 = 80 → 8, et comme 8 n'est pas divisible par 3, il en est de même pour 999 999 998. 1 Question 3 Les seuls entiers compris entre 0 et 9 divisibles par 3 sont 0, 3, 6 et 9. Donnez une expression booléenne qui indique si un entier donné n compris entre 0 et 9 est divisible par 3. Question 4 On se donne la fonction let sc (n) = let s = ref 0 and n1 = ref n in while !n1 > 9 do s := !s + chiffre_unite(!n1); n1 := !n1 / 10 done ; !s + !n1 ;; En faisant un tableau montrant les valeurs successives que prennent les variables locales s et n1, quelle est la valeur prise par la fonction sc lorsque n=12345 ? Donnez ensuite la spécication de cette fonction. Question 5 Sans utiliser de division par trois, mais en utilisant la fonction précédente, réalisez la fonction est_divisible_par_trois qui donne la valeur true si l'entier passé en paramètre est divisible par trois, et la valeur false dans le cas contraire. # # # - est_divisible_par_trois (12) ;; : bool = true est_divisible_par_trois (13) ;; : bool = false est_divisible_par_trois (123456) ;; : bool = true Question 6 En utilisant la fonction est_divisible_par_trois, écrivez une instruction qui imprime la divisibilité par 3 de tous les entiers compris entre 100 et 200 sous la forme : 100 101 102 ... 199 200 n’est pas divisible par 3. n’est pas divisible par 3. est divisible par 3. n’est pas divisible par 3. n’est pas divisible par 3. Exercice 0-2 Sur les chaînes Dans cet exercice on réalise une fonction crochete paramétrée par une chaîne de caractères s et dont le résultat est une chaîne de caractères, obtenue en entourant chacun des caractères de la chaîne s par des crochets. Par exemple crochete("timoleon") vaut "[t][i][m][o][l][e][o][n]". Question 1 En supposant déjà écrite la fonction crochete, expliquez comment utiliser cette fonction pour initialiser le tas 1 avec un nombre quelconque de trèes surmontés d'un nombre quelconque de carreaux surmontés d'un nombre quelconque de c÷urs, surmontés d'un nombre quelconque de piques ? Question 2 Réalisez une fonction nommée encadre paramétrée par un caractère c dont le résultat est une chaîne de trois caractères, composée d'un crochet ouvrant, du caractère c et d'un crochet fermant. Question 3 Réalisez la fonction crochete. Question 4 Réalisez la fonction decrochete inverse de la fonction crochete, i.e. telle que pour toute chaîne s on ait 2 decrochete(crochete(s))=s. 3