DS 1

publicité
Lycée Alphonse Daudet MPSI
Année 2016-2017 DS Option Informatique
Option Informatique
DS 01 Durée : 2h.
Attention : 2 pages + 2 pages d'annexes. Le sujet comporte 6 exercices.
Toutes les fonctions devront être écrites dans le langage Caml
Light.
.
Les calculatrices sont interdites, mais l'aide mémoire (cf annexe) est autorisé
Exercice 1.
On considère la fonction suivante :
l e t r e c f n = match n with
| 0 −> ""
| n −> f ( n /10) ^ s t r i n g _ o f _ i n t ( n mod 1 0 ) ; ;
Que retourne l'exécution de (f n) lorsque...
1. ...n est un entier strictement positif ?
2. ...n= 0 ?
3. ...n est un entier strictement négatif ?
Exercice 2.
Prédécesseur
Écrire une fonction predecesseur : int -> int prenant pour argument un entier n et retournant comme résultat
l'entier 0 si n= 0 et l'entier n-1 sinon (y compris pour n< 0).
Exercice 3.
Liste triée
Écrire une fonction est_triee : 'a list -> bool qui prend comme argument une liste et renvoie le booléen true
si la liste est triée par ordre croissant, et false dans tout autre cas.
Attention, l'argument devra bien être une liste et non un vecteur.
Exercice 4.
Max
Dans le cours d'informatique non optionnelle, on a vu l'algorithme de calcul du maximum d'une liste.
1. Écrire une fonction petit_max : 'a -> 'a -> 'a qui prend deux arguments de type 'a et retourne le plus
grand des deux.
Bien sûr cette fonction existe déjà en Caml, et s'appelle tout simplement max...
2. Écrire une fonction max_vect : 'a vect -> 'a qui prend comme argument un tableau de type 'a vect et rend
comme résultat le plus grand élément de ce tableau.
3. Écrire une fonction max_list : 'a list -> 'a qui prend comme argument une liste de type 'a list et rend
comme résultat le plus grand élément de cette liste.
Comportement non spécié si le tableau ou la liste donnée est vide. Si votre fonction donne une erreur, tant mieux.
Lycée Alphonse Daudet MPSI
Exercice 5.
Année 2016-2017 DS Option Informatique
Dichotomie
Dans le cours d'informatique non optionnelle, on a vu en détails l'algorithme de recherche dichotomique d'un élément
dans une liste triée.
1. Expliquer pourquoi cet algorithme est inecace si on veut l'utiliser en Caml avec le type 'a list, mais est
pertinent si on l'utilise avec le type 'a vect.
2. Implémenter cet algorithme en utilisant le type 'a vect, autrement dit écrire une fonction recherche_dichotomique
: 'a -> 'a vect -> bool qui prend comme argument un élément de type 'a et un tableau de type 'a vect
et rend comme résultat le booléen indiquant si l'élément est ou pas dans le tableau, en utilisant l'algorithme de
recherche dichotomique.
Exercice 6.
Rendu de monnaie.
Une machine à café propose diverses boissons, toutes à 40 centimes. Elle accepte les pièces de 10 centimes, 20 centimes,
50 centimes et 1 euro. Elle dispose d'un stock de pièce implémenté par un vecteur reserve : 'int vect, avec :
• reserve.(0) le stock de pièces de 10 centimes ;
• reserve.(1) le stock de pièces de 20 centimes ;
• reserve.(2) le stock de pièces de 50 centimes ;
• reserve.(3) le stock de pièces de 1 euro.
Un utilisateur introduit un certain nombre de pièces dans la machine, lui aussi implémenté par un vecteur mise :
'int vect, de longueur 4 avec convention identique à celle choisie pour reserve.
Le problème est le suivant : comment déterminer si la machine peut, ou pas, rendre la monnaie à l'utilisateur ?
Par exemple, si l'utilisateur entre une pièce de 50 centimes (donc si on a mise = [|0,0,1,0|]), le rendu de monnaie
est possible si et seulement si la machine dispose d'une pièce de 10 centimes, i. e. si et seulement si on a reserve.(0)>0.
Mais si l'utilisateur entre une pièce de 50 centimes et une pièce de 10 centimes (donc si on a mise = [|1,0,1,0|]), le
rendu de monnaie est également possible si on a reserve.(1)>0, même pour reserve.(0)=0.
Décrire un algorithme permettant de résoudre le problème du rendu de monnaie. Il n'est pas demandé d'implémenter cet algorithme. On pourra séquencer sa solution en identiant des sous-problèmes particuliers si on le
désire.
Téléchargement