logo

problème sur Caml


algorithmiqueproblème sur Caml

#msg2881501 Posté le 16-02-10 à 18:42
Posté par ProfilBthomas Bthomas

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.
re : problème sur Caml#msg2881592 Posté le 16-02-10 à 19:18
Posté par ProfilDrysss Drysss

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??
re : problème sur Caml#msg2881609 Posté le 16-02-10 à 19:26
Posté par ProfilBthomas Bthomas

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
re : problème sur Caml#msg2881802 Posté le 16-02-10 à 21:38
Posté par ProfilBthomas Bthomas

personne ne voit mon erreur svp ?
Je cherche depuis samedi mais je n'arrive pas à faire marcher mon programme...
re : problème sur Caml#msg2881927 Posté le 16-02-10 à 23:44
Posté par ProfilBthomas Bthomas

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.
re : problème sur Caml#msg2882812 Posté le 17-02-10 à 15:00
Posté par ProfilBthomas Bthomas

y a quelqu'un svp?
re : problème sur Caml#msg2883877 Posté le 17-02-10 à 19:32
Posté par ProfilBthomas Bthomas

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

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?
re : problème sur Caml#msg2883966 Posté le 17-02-10 à 20:05
Posté par ProfilBthomas Bthomas

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...
re : problème sur Caml#msg2883980 Posté le 17-02-10 à 20:07
Posté par ProfilBthomas Bthomas

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   
re : problème sur Caml#msg2884070 Posté le 17-02-10 à 20:39
Posté par ProfilDrysss Drysss

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.
re : problème sur Caml#msg2884101 Posté le 17-02-10 à 20:52
Posté par ProfilBthomas Bthomas

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...
re : problème sur Caml#msg2886530 Posté le 18-02-10 à 21:10
Posté par ProfilBthomas Bthomas

qulequ'un a une idée?
re : problème sur Caml#msg2886828 Posté le 18-02-10 à 23:14
Posté par ProfilDrysss Drysss

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).
re : problème sur Caml#msg2886956 Posté le 19-02-10 à 00:24
Posté par ProfilBthomas Bthomas

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.
re : problème sur Caml#msg2887105 Posté le 19-02-10 à 09:02
Posté par ProfilDrysss Drysss

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...

Répondre à ce sujet

réservé Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster
attention Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.

  • Ce topic

    imprimer Imprimer
    réduire la tailleRéduire   /   agrandir la tailleAgrandir

    Pour plus d'options, connection connectez vous !
  • Fiches de maths



maths haut de pagehaut Retrouvez cette page sur ilemaths l'île des mathématiques
© Tom_Pascal & Océane 2012