DS2 - fil

publicité
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
Téléchargement