Toujours avec les fonctions en caml

bonjour à Tous …
j’essaye de faire des exercices de caml pour comprendre un peu mais j’y arrive pas alors si vous pouvez m’aider …voici l’énoncé :
" On désire faire la gestion de polynôme monômes à l’aide de tableaux; On suppose pour cela que les monômes sont tous positifs ou nuls ( pas de monômes de degré négatifs )
-écrire la fonction qui permet d’ajouter deux polynômes P et Q
exemple:
(1+2X+3X²)+(4+5X+6X²) = (1+4)+(2+5)X+(3+6)X²=5+7X+9X²

et de même pour la multiplication
exemple :
(X+2)²=(X+2)(X+2)

pour l’affichage des résultat on peut se servir des fonctions suivantes

let imprime_monome c d = if d=0 then print_int c else 
if c <>0 then begin 
print_string"+";
if c<>1 then print_int c ;
 print_string"x" ;
 if d<>1 then 
begin print_string "^";	
print_int d;
end
end;;


let imprime_poly p = for i=0 to vect_length p -1 do imprime_monome p.(i) i done;;

:open_mouth:

Je suppose que le stockage dans les tableaux se fait de la manière suivante :
par exemple pour 5X² + 3X + 6 le tableau est [|6;3;5|] ?
C’est pas génial, ça, j’aurais préféré des listes…
Enfin bon pour l’addition, le résultat correspond à l’addition terme à terme dans le tableau : R.(i) ← P.(i) + Q.(i) pour tout i
après s’il faut adapter la taille lorsque le monome de plus haut degré se trouve être nul… c’est une autre histoire.
Pour la multiplication, je te donne l’indication suivante :
si on multiplie le monome de degré i du polynome P avec le monome de degré j du polynome Q, le résultat est un monome de degré i+j
L’algorithme en français pour la multiplication devient alors :

initialiser le résultat R avec une taille adequate, mettre à 0 toutes les cases
pour tout i de 0 au degré de P

pour tout j de 0 au degré de Q

R(i+j) <— R(i+j) + P(i)*Q(j)
fin pour
fin pour
renvoyer R

j’ai essayé avec l’addition mais sa ne marche pas … y’a une erreur au niveau du end qui est avant le else …

let add p q =  if vect_length p > vect_length q then  begin  for i= 0 to vect_length p-1 do for j=0 to vect_length q-1 do  p.(i)<- p.(i)+q.(j) done;
imprime_poly p end else  begin for i= 0 to vect_length p-1 do for j=0 to vect_length q-1 do  q.(j)<- p.(i)+q.(j) done;
imprime_poly q ;end ;;

[/code]

Quel est le message d’erreur ? (toujours donner le message d’erreur, quand on programme !)

sunmat a écrit:

Quel est le message d’erreur ? (toujours donner le message d’erreur, quand on programme !)

Quel est le message d’erreur? Toujours lire le message d’erreur quand on programme! :laughing:

j’ai refai le code et y’a toujour une érreur et le message qui s’indique est :

Toplevel input:
>let add p q = let r= make_vect max (length p -1, length q -1) 0 in  
>                               ^^^
This expression has type 'a * 'a -> 'a,
but is used with type int.

et voici ce que j’ai fai:

let add p q = let r= make_vect max (length p -1, length q -1) 0 in  
for i=0 to length p-1 do for j=0 to length q-1 do  
for k=0 to length r-1 do
r.(k)<- r.(k) + p.(i)+q.(j);
done ;done; done;
imprime_poly r;;

j’ai fai ossi pour la multiplication sa marche et tou mai j’ai mi le résultat dan vecteur standar alor si vou pouvé m’aidé pour le fair d’une taille ki change avec la taille des 2 premier vecteur


let mul p q= begin let r= make_vect 100 0 in for i=0 to vect_length p-1 do for j=0 to vect_length q-1 do r.(i+j)<-r.(i+j)+p.(i) *q.(j) done; done; imprime_poly r; end;;

thanks

Pour l’addition c’est bon alors ?
Pour la multiplication :

let multiplie p q = 
let dp = vect_length p and dq = vect_length q in
let r = make_vect dp+dq 0 in
for i = 0 to dp-1 do
for j = 0 do dq-1 do
r.(i+j) <- p.(i)*q.(j)
done
done ; r
;; 

Je n’ai pas testé mais ça doit être ça.

avec kelke modification sa se compile merci …

let multiplie p q= begin let dp = vect_length p and dq = vect_length q in let r= make_vect (dp+dq) 0 in for i=0 to dp-1 do for j=0 to dq-1 do r.(i+j)<-r.(i+j)+p.(i) *q.(j) done done; imprime_poly r;

mais pour l’addition sa marche toujour pas !![/code]

Conseils :

  1. Précise l’objet que tu manipules, length n’a pas de sens tout seul. Ici, pour un tableau, c’est vect_length.

  2. max comme toute fonction en caml prend ses arguments sans parenthèses.

  3. Pour plus de lisibilité, sépare tes boucles. La mise en forme qui suit permet directement de voir ce qui manquait dans le programme (deux done;)

let add p q =
if vect_length p > vect_length q then begin
for i= 0 to (vect_length p)-1 do
for j=0 to (vect_length q)-1 do
p.(i)<- p.(i)+q.(j)
done;
done;
imprime_poly p;
end
else begin
for i= 0 to (vect_length p)-1 do
for j=0 to (vect_length q)-1 do
q.(j)<- p.(i)+q.(j)
done;
done;
imprime_poly q;end ;;

mon message ne respecte pas les alinéas que j’avais mis, chaque boucle est décalée par rapport à celle dans laquelle elle est incluse (si elle existe), ce qui permet de discerner les boucles principales des secondaires, et si les boucles sont toutes fermées.

Note : j’avais fait une erreur dans mon algo, plus haut, c’est pas
r.(i+j) ← p.(i)*q.(j)
mais
r.(i+j) ← r.(i+j) + p.(i)*q.(j)
Mais apparemment tu avais vu.

pour ulquiorra

let add p q =
if vect_length p > vect_length q then begin
for i= 0 to (vect_length p)-1 do
for j=0 to (vect_length q)-1 do
p.(i)<- p.(i)+q.(j)
done;
done;
imprime_poly p;
end
else begin
for i= 0 to (vect_length p)-1 do
for j=0 to (vect_length q)-1 do
q.(j)<- p.(i)+q.(j)
done;
done;
imprime_poly q;end ;;

ce code ne donne pas un résultat juste; c’est ce que j’ai fais au début

et je voudrais savoir quand je fais entrer le code suivant :

let add p q= begin let dp = vect_length p and dq = vect_length q in 
let k= max (dp-1,dq-1) in let r= make_vect k 0 in for i=0 to dp-1 do for j=0 to dq-1 do r.(k)<-r.(k)+p.(i) +q.(j) done done; imprime_poly r;
end ;;

sa m’affiche :

add : int vect -> int vect -> unit = <fun>

mais si je fais l’appel de cette fonction le message d’erreure suivant s’affiche ```
#Uncaught exception: Invalid_argument « vect_item »


et merci sunmat pour la multiplication !!
 :unamused:

erf l’addition, c’est pourtant simple :

let add p q = 
let dp = vect_length p and dq = vect_length q in
let r = make_vect (max dp dq) 0 in
for i = 0 to (min dp dq)-1 do
r.(i) <- p.(i) + q.(i)
done
for i = (min dp dq) to (max dp dq)-1 do
if dq < dp then r.(i) <- p.(i) else r.(i) <- q.(i)
done ; r ;;

C’est vrai j’ai juste corrigé la syntaxe sans m’intéresser au résultat désolé. Cependant, n’abandonne pas tes idées, cherche les erreurs de ton code et corrige les. Dans l’esprit de ton code :

let add p q =
if vect_length p > vect_length q then begin
for i= 0 to (vect_length q)-1 do
p.(i)<- p.(i)+q.(i);
done;
imprime_poly p;
end
else begin
for i= 0 to (vect_length p)-1 do
q.(i)<- p.(i)+q.(i);
done;
imprime_poly q;end;;

ahhhhhhhhhhh merciii bocoup sunmat
j’ai fai quelque modif pour imprimé le résultat et sa marche !!
mercii bocou ```
let add p q = begin
let dp = vect_length p and dq = vect_length q in
let r = make_vect (max (dp,dq)) 0 in
begin
for i = 0 to (min (dp,dq))-1 do
r.(i) ← p.(i) + q.(i)
done;
for i = (min (dp,dq)) to (max (dp,dq))-1 do
if dq < dp then r.(i) ← p.(i) else r.(i) ← q.(i)
done ;
end;
imprime_poly r
end ;;