Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

problème sur Caml

Posté par
Bthomas
16-02-10 à 18:42

Bonjour,
je suis en première année de prépa math et suis des cours d'info depuis janvier.
Je bloque complètement sur une question d'un DM d'info ( langage utilisé Caml light) :
Je dois écrire la fonction div_eucl qui renvoie le couple formé du quotient ( un entier sous forme de chaîne ) et du reste ( un entier ) dans la division euclidienne d'un entier sous forme de chaîne par un entier.
       Par exemple , je lui dis div_eucl « 135214 » 8716 et il te renvoie « 15 » 4474.
L'avantage du programme est qu'on peut diviser un entier aussi grand qu'on veut, puisque le nombre de caractères qu'on peut mettre dans une chaîne est presque illimité alors que caml ( en tout cas le light ) ne calcule pas avec des entiers au dessus de 2^30-1=1073741823.
        Pour répondre, je me suis inspiré de l'algorithme qu'on fait naturellement en posant une division euclidienne et ça a donné :

let div_eucl e d=
let a=ref"" in
let q=ref"" in
let l=string_length e in
for i=0 to l-1 do begin
a:=!a^"e.(i)" ;
q:=!q^(string_of_int ((int_of_string !a)/d)) ;
a:=string_of_int((int_of_string !a) mod d)
end
done;
(!q,int_of_string !a);;

Caml ne signale aucune erreur de syntaxe  et m'a bien dit
div_eucl : string -> int -> string * int = <fun>
C'est donc ce qui était attendue. Mais à chaque fois que je lui donne un calcul, il me dit
Uncaught exception: Failure "int_of_string"
Mon algorithme en lui même me semble bon, je l'ai testé à la main avec des nombres pas trop grands et c'est bien ce qu'on fait quand on pose une division. Le seul petit défaut que je lui avais trouvé est qu'il mettait quelques zéros inutiles devant mon quotient, mais j'ai aussi mis au point un programme ( qui marche !! ) pour éliminer les zéros inutiles sur mes chaînes. Pour résoudre le problème du  : Failure "int_of_string", j'ai essayé de mettre des parenthèses, d'enlever des espaces, … mais je ne trouve pas. Si quelqu'un trouve le problème, ça serait vraiment sympa. Merci d'avance.

Posté par
Drysss
re : problème sur Caml 16-02-10 à 19:18

Int_of_string et string_of_int bug souvent.
Crée toi une vraie division entre chaines qui marche à côté et un vrai modulo et ca devrait mieux marcher.

(En général, on utilise rarement les fonctions truc_of_machin)


PS : je ne comprends pas ton pogramme : il y a une fonction ^ qui existe sur caml??

Posté par
Bthomas
re : problème sur Caml 16-02-10 à 19:26

la fonction ^ est appelée fonction de concaténation, elle est utilisée pour faire fusionner deux chaînes. ex : "ma"^"th"="math"
sinon, l'énoncé me demande une fonction div_eucl : string -> int -> string * int . Donc si je fais une fonction div_eucl : string -> string -> string * string, il faudra quand même que je finisse par un int_of_string pour finir, donc ça ne résout pas mon problème
Merci quand même

Posté par
Bthomas
re : problème sur Caml 16-02-10 à 21:38

personne ne voit mon erreur svp ?
Je cherche depuis samedi mais je n'arrive pas à faire marcher mon programme...

Posté par
Bthomas
re : problème sur Caml 16-02-10 à 23:44

Je ne trouve toujours pas ce qui ne va pas avec mon int_of_string  
mes copains en fac info (plus habitués à la version objective de Caml ) ne trouvent pas non plus. Vous êtes mon dernier recours. S'il y en a un parmi vous qui s'y connaît en Caml, svp.

Posté par
Bthomas
re : problème sur Caml 17-02-10 à 15:00

y a quelqu'un svp?

Posté par
Bthomas
re : problème sur Caml 17-02-10 à 19:32

Posté par
Drysss
re : problème sur Caml 17-02-10 à 19:53

le problème  est simple et clair : tu uses et abuses des fonctions int_of_string(fonction assez peu naturelle quand même) et string_of_int.

En plus je ne vois pas l'intérêt de garder des chaines pendant le processus d'itération vu que tu n'arrêtes pas de les transformer en int. Tu n'as qu'à bosser avec des entiers tout le long de ton itération et à la fin mettre des int_of_string, il y aura moins de chances de bug.
Et tu pourras quand même gérer les grands entiers.


Sinon t'as essayé de taper à la main les opérations que tu demandes à caml?
int_of_string (string_of_int 13053) ca marche par exemple?

Posté par
Bthomas
re : problème sur Caml 17-02-10 à 20:05

int_of_string (string_of_int 13053) marche très bien
   Sinon, tant qu'on reste avec un dividende, de 6 chiffres comme dans mon exemple, l'utilisation de chaîne est superflue, mais l'intérêt du programme est justement de pouvoir diviser des nombres de 500 chiffres, qu'on ne peut représenter que sous formes de chaînes. J'utilise beaucoup de int_of_string ou de string_of_int parce que les opérations / et mod ne marchent qu'avec des entiers alors que ^ ne marche qu'avec des chaînes, et l'algorithme qu'on fait en posant une division utilise alternativement ces fonctions. Mais si tu as une idée pour traîter cette question avec un autre algorithme ou en présentant mon algorithme différemment, je t'écoute.

P.S. : Je précise quand même qu'un programme qui enlève le diviseur au dividende jusqu'à ce que le reste soit plus petit que le diviseur ne convient pas. Il marche parfaitement pour des petits nombres mais si on veut diviser un nombre de 500 chiffres par 2, c'est un peu long...

Posté par
Bthomas
re : problème sur Caml 17-02-10 à 20:07

en fait ce que je comprends pas c'est que si je lui demande toutes les opérations de mon programme une par une, ça marche très bien, mais mon programme ne marche pas   

Posté par
Drysss
re : problème sur Caml 17-02-10 à 20:39

Oui mais si tu transformes tes chaines en entier, si caml ne peut gérer ce nombre, int_of_string buggera car le nombre est trop grand.
Donc soit ton programme permet de gérer les grands entiers (ce que je pense) même si tu prends des entiers pendant l'itération (les entiers restent petits car tu prends tout le temps mod d!) soit ton programme ne marche pas pour les grands entiers dans tout les cas.

Tu comprends ce que je veux dire?

PS : je ne comprends pas pourquoi ton programme ne marche pas. Mais bon c'est aussi ca la différence entre l'info et les maths.

Posté par
Bthomas
re : problème sur Caml 17-02-10 à 20:52

dans mon programme, le diviseur est un entier et les chaînes créee par mon programme ne dépasse jamais beaucoup le diviseur. Je suis d'accord que mon programme aurait du mal à marcher si le diviseur est à la limite de taille que peut supporter Caml, mais là, il bug même quand je lui demande div_eucl "4" 2 ;;
Je ne comprend vraiment pas pourquoi...

Posté par
Bthomas
re : problème sur Caml 18-02-10 à 21:10

qulequ'un a une idée?

Posté par
Drysss
re : problème sur Caml 18-02-10 à 23:14

T'y mets VRAIMENT de la mauvaise volonté donc je vais faire les modifications :


let div_eucl e d=
let a=ref 0 in
let q=ref"" in
let l=string_length e in
for i=0 to l-1 do begin
a:=!a * 10 + e.(i) ;
q:=!q^(string_of_int (!a /d)) ;
a:=!a mod d
done;
(!q,!a);;


Et voilà, on évite int_of_string et ca permet toujours de gérer des grands entiers.

(PS : je n'ai pas caml sur cet ordi, donc je n'ais pas pu tester).

Posté par
Bthomas
re : problème sur Caml 19-02-10 à 00:24

A la 6ème ligne de ton programme tu aditionnes un entier et un caractère. Si cette opération était possible, je suis d'accord que ce ne serait pas la peine d'utiliser des int_of_string ou des int_of_char...

Ceci dit, je viens de trouver mon erreur : j'avais mis des "" autour d'un caractère au lieu d'utiliser un string_of_char ( le genre de fonctions que tu décris comme peu naturelle). Finalement, je n'ai pas résolu mon problème en enlevant mon int_of_string contre lequel tu t'acharnais mais en rajoutant un string_of_char.
Ensuite, je te rapelle que je débute sur Caml. Peut-être que si je ne trouvais pas, ça venait de mon manque d'expérience plutôt que de ma "mauvaise volonté" ( je cherche depuis dimanche ).

Merci quand même d'avoir essayé de m'aider. La prochaine fois essaie simplement de ne pas critiquer quelqu'un quand tu n'es pas sûr de toi. Je ne peux pas t'en vouloir de ne pas avoir trouvé, d'autant plus que tu n'as pas Caml, mais essaie d'être un peu patient quand même.

Merci aussi à tous ceux qui ont passé du temps à chercher mon problème et ont préféré ne pas intervenir plutôt que de me proposer des réponses dont ils n'étaient pas sûrs.

Posté par
Drysss
re : problème sur Caml 19-02-10 à 09:02

Désolé de t'avoir aidé à résoudre ton probleme !
Promis, je le ferais plus.

PS : reprends mon programme et ajoute un char_of_int, il restera quand même bien, au lieu de t'entêter à utiliser des string_of_int imbriqués dans des int_of_string...



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !