Exercice 01 :
· Ecrire une fonction qui calcul le produit scalaire pour u1,u2, v1, v2 en sachant qu'il est égal à u1*v1 + u2*v2.
Sol : let ProduitScalaire (u1, u2, v1, v2 )= u1 *. v1 +. u2 *. v2;;
ProduitScalaire (1.0, 2.0, 5.5, 4.5);; On obtient float =14.5
· Ecrire une fonction (booléenne) qui renseigne si deux vecteurs sont orthogonaux ou pas.
Sol : let orthogonal (u1, u2, v1, v2) = (ProduitScalaire (u1, u2, v1, v2) = 0.);;
orthogonal (1.5, 2.0, 2.0, -1.5);; On obtient bool = true
· Ecrire une fonction qui calcul la norme d'un vecteur.
Sol : let norme (u1, u2) = sqrt (ProduitScalaire (u1, u2, v1, v2));;
norme (1.0, 2.0) ;; On obtient float = 2.236067
Exercice 02 :
· Ecrire une fonction qui calcul le maximum et le minimum de deux nombres entiers.
Sol : let max2 (x, y) = if x >= y then x else y;;
let min2 (x, y) = if x < y then x else y;;
· Ecrire une fonction qui ordonne deux entiers.
Sol : let ordre2 (x, y) = min2(x,y), max2 (x, y);;
· Ecrire une fonction qui calcul le maximum et le minimum de quatre nombres entiers.
Sol : let max4 (w, x, y, z) = max2 (max2(w, x), max2(y, z));;
L et min4 (w, x, y, z) = min2 (min2(w, x), min2(y, z));;
· Ecrire une fonction qui ordonne quatre entiers.
Sol : let ordre4 (w, x, y, z) = let ma = max4 (w, x, y, z) and mi = min4 (w, x, y, z)
and a = min2 (max2(w, x), max2(y, z))
and b = max2 (min2(w, x), min2(y, z))
in (mi, min2(a,b), max2 (a, b), ma);;
· Sans utiliser les précédentes fonctions écrire la fonction max3 qui calcul la maximum de trois entiers.
Sol 1 : let max3 (x, y, z) = if x >= y then if x >= z then x else z
else if y>= z then y else z;;
Sol 2 : let max3 (x, y, z) = if x >= y && x >= z then x
else if y>= z && y >= z then y
else z;;
La Récursivité :
Exercice 03 :
Ecrire une fonction qui calcul la multiplication de deux entiers par additions successives utilisant la formule récurrente a * b = a + (b-1) *a
Sol : let rec fois (a, b) = if b = 0 then 0 else a + fois(a, b-1);;
fois (5, 7);; donne int = 35
Exercice 04 :
Ecrire une fonction qui calcul la distance entre deux points d'une droite avec la prise en compte que si le premier est situé avant le second. Sinon on se ramène au cas normal c-a-d en inversant les deux entiers.
Sol : let rec distance a b = if a < b then b-a else distance b a;;
Exercice 05 :
Ecrire une fonction qui calcul le factoriel d'un nombre entier.
Sol : let rec fact n = if n = 1 then 1 else n* fact (n - 1);;
fact 3;; donne int = 6
Exercice 06 :
Ecrire une fonction qui calcul la puissance d'un nombre entier.
Sol : let rec puiss x n = if n = 0 then 1 else x * puiss x (n - 1);;
puiss 3 2;; donne int = 9
Exercice 07 :
Ecrire une fonction qui calcul le Nième terme de la suite de FIBONACCI donnée par la formule : U(0) = U(1) = 1 et U(N) = U(N-1) + U(N-2) pour tout N >=2.
Sol : let rec fibo n = if n = 0 or n = 1 then 1 else fibo (n-1) + fibo (n- 2) ;;
Exercice 08 : Méthode de Newton pour l'équation x2 - a = 0.
Sol : let rec racine a n = if n = 1 then 1. else
x = (racine a (n-1)) in ((( x *. x) -. a) /. (2. *. x));;
racine 2. 50;; donne float 1.4142135....
D’autres fonctions à écrire ! !
Q 1 : Reprendre la fonction carre du cours, et l’utiliser pour définir la fonction polynôme :
P(X) = X2 + 2X + 1. Calculer P(1) et P(2).
Sol :
let carre(x) = x * x;;
let p(x) = carre(x) + 2 * x + 1;; (* p : int -> int = fun *)
p(1);; (* - : int = 4 *)
p(2);; (* - : int = 9 *)
Q 2 : Écrire la fonction définie par: f(x) = x/2 si x est pair 3x + 1 si x est impair
Sol : let f(x) = if x mod 2 = 0 then x/2 else 3*x+1;; (* f : int -> int = *)
Les COUPLES ET n-UPLETS :
Q 3 : On représente des nombres complexes comme des couples de réels (re,im).
Définir des fonctions conj(z) (conjugué de z) et mul(z1,z2) (produit de z1 et z2).
Écrire une fonction qui calcule |z|2 pour tout z.
Sol : let conj(re,im) = (re,-.im);; (* conj : 'a * float -> 'a * float = *)
let mult((ra,ia),(rb,ib)) = (ra *. rb -. ia *. ib),(ra *. ib +. rb *. ia);;
(* mult : (float * float) * (float * float) -> float * float =
let modu2(z) = let (r,i) = mult(z,conj(z)) in r;; (* modu2 : float * float -> float = *)
modu2 (0.,1.);; (* - : float = 1.0 *)
modu2 (1.,1.);; (* - : float = 2.0 *)
GESTION DES POLYNOMES :
Exercice : On désire faire la gestion de polynômes monômes à l’aide de tableaux.
On suppose pour cela que les monômes des polynômes sont tous positifs ou nuls.
(Pas de monômes de degré négatifs).
Questions :
1 - Ecrire une fonction imprime_Monome qui permet d’afficher un monôme (c-a-d son coeff et son degré) de la façon suivante coeff ^ X degré.
Pour une meilleur présentation on n’affichera pas :
- Le monôme si le coeff est nul
- Le coeff s’il est de 1.
- coeff X^ 0 mais seulement son coeff (si degré = 0)
Sol :
let imprime_monome coeff degre =
if degre = 0 then print_int coeff
else if coeff <> 0 then
begin print_string « + » ; if coeff <> 1 then print_int coeff ;
print_string « x » ;
if degre <> 1 then begin print_string « ^ » ;
print_int degre ;
end
end ;;
Exemple :
imprime_monome 3 4;; donnera : + 3 x ^ 4- : unit = ()
2 – Ecrire une fonction imprime_polynome qui permet d’afficher un polynôme.
(Il suffit de faire appel à la fonction imprime_Monome pour tous les monômes du polynôme à afficher).
Exemple Pour le polynôme P(X) = X2 + 2X + 3 on verrait : 3 + 2 X + X ^2
Sol :
let imprime_poly p = for i = 0 to vect_length p – 1 do imprime_monome p.(i) i done ;;
Pour l’exemple: let p=[|3; 2; 1|];;
imprime_poly p;;
Ont aura 3 + 2 x + x^2- : unit = ()
Les références :
Exercice 1 : Ecrivez un programme qui crée une boite nommée b contenant 10, puis qui augmente le contenu de cette boite de 5, et qui pour terminer affiche le contenu de la boite (qui sera 15).
Sol : let b = ref 10 in b := !b + 5; print_int !b;;
Ont aura: 15- : unit = ()
Exercice 2 : Ecrivez un programme qui demande un entier n à l'utilisateur, et qui lui demande ensuite n fois un entier, pour afficher à la fin la somme de ces n entiers. Sol : let n = read_int() inlet total = ref 0 in for i = 1 to n do let entier = read_int() in total := !total + entier;done;print_int !total;; Exemple:
4 la valeur de n
32 les valeurs de la variable entier74
16- : unit = () le résultat (valeur de total)
Exercice 3 : Modifier le code précédent pour écrire un programme qui calcule la somme des entiers de 1 à n, où n est donné par l'utilisateur.Sol : La modification à faire, c'est de remplacer le read_int() par la valeur du compteur i. On peut alors remplacer entier par i dans l'affectation.let n = read_int() in let total = ref 0 in for i = 1 to n do total := !total + i; done;print_int !total;; Exemple:
5 la valeur de n
15- : unit = () le résultat (valeur de total)
Exercice 4 : Modifier encore le code précédent pour écrire un programme qui calcule la somme des racines des nombres entiers de 1 à n, où n est donné par l'utilisateur. Vérifiez que pour n = 100, le résultat de votre programme soit bien 671.462947103.Sol : Cette fois si, il faut utiliser une boite contenant des réelles. Le contenu initial est alors 0. (le zéro des réels). Pour prendre la racine de la valeur du compteur, il faut d'abord le convertir en un réel, avec float_of_int on le rappelle. Il ne faut pas oublier de mettre un print_float à la fin pour afficher le total.let n = read_int() in let total = ref 0. in for i = 1 to n do let ajout = sqrt (float_of_int i) in total := !total +. ajout;done;print_float !total;;Exemple:
100 la valeur de n
671.462947103 - : unit = () le résultat (valeur de total)
Exercice 5 : Ecrivez un programme qui demande à l'utilisateur un entier n, puis qui lui demande n entiers, et affiche alors le nombre d'entiers fournis qui étaient supérieurs ou égaux à 5.Sol : On utilise une boite nommée quantite qui retient le nombre d'entiers supérieurs à 5 qui ont déjà été fournis. A chaque fois que l'utilisateur donne un entier, on test s'il est supérieur à 5, et dans ce cas, on remplace augmente le contenu de quantité de 1.Sol : let n = read_int() in let quantite = ref 0 in for i = 1 to n do let valeur = read_int() inif (valeur >= 5)then quantite := !quantite + 1;done;print_int !quantite;; Exemple:
4 la valeur de n
782 Les valeurs de la variable valeur3
2- : unit = () le résultat (valeur de la variable quantite)