IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[Débutante]Fonction qui modifie la valeur d'une varible


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut [Débutante]Fonction qui modifie la valeur d'une varible
    Bonsoir,

    je cherche à définir une fonction qui va parcourire un "string" caractère par caractère et qui incrémente une variable de 1 si elle trouve le "char" 'a', sinon on soustrait 1,
    voila ma tentative
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    let fct m p = for i=0 to (String.length m)  do match (String.get m i) with
      |'a' -> p=p+1
      |_-> p=p-1
    done;;
    fct "aaaac" 0;; j'ai donc essayé avec cette derniere ligne mais j'ai une exception:
    # fct "aaaac" 0;;
    Exception: Invalid_argument "index out of bounds".
    merci à l'avance

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    avant toute chose, merci de mettre ton code entre les balises code et /code à l'avenir. Tu peux faire ça en cliquant sur le bouton # lors de l'édition de tes messages.

    Concernant ta tentative, sache qu'elle est bien loin de « l'esprit fonctionnel » tant apprécié par nous autres, programmeurs caml. Cela n'est pas une tare, mais ne permet pas d'exploiter au maximum les capacités de ce beau langage, mais complexifie aussi sa lecture.

    Je te propose de revoir ta copie à zéro. Dans un premier temps, écris une fonction compare_char qui prend un argument de type char et qui incrémente une int ref déclarée préalablement si l'argument est un 'a'.
    Ensuite, tu pourra utiliser la fonction String.iter qui te simplifiera la vie :
    Citation Envoyé par Documentation officielle
    module String: sig .. end

    val iter : (char -> unit) -> string -> unit
    String.iter f s applies function f in turn to all the characters of s. It is equivalent to f s.[0]; f s.[1]; ...; f s.[String.length s - 1]; ().
    Cdlt,
    -- Yankel Scialom

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Pourquoi ne pas plutôt utiliser un style fonctionnel, sans référence, en prenant en paramètre un entier et en renvoyant en retour cet entier augmenté ou diminué de 1 ? C'est à la fois plus élégant et plus agréable à utiliser.

  4. #4
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    À partir du moment où tu utilises un string, tu utilises déjà des références alors une de plus ...
    -- Yankel Scialom

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    eh bien j'ai réussi à trouver donc quelques infomations concernant les réferences en ocaml:

    Caml n'est pas dynamique : si vous définissez un entier a valant 5, vous ne pourrez plus modifier sa valeur. On dispose pour cela d'un nouveau type : la référence. Si vous tapez let c = ref 0;;, vous obtenez un objet dont le type est « int ref » et dont vous pouvez modifier la valeur. Pour cela, on utilise l'opérateur := (deux points suivis de égal). En tapant c := 5;;, vous affectez à la référence c la valeur 5. Désormais, tout appel à la valeur de c rendra 5, jusqu'à modification. Et pour accéder à la valeur de c (si vous en avez besoin dans une fonction demandant un argument du type int), il suffit de taper !c.
    Bien sûr, vous pouvez mettre n'importe quel type d'objet dans une référence : une liste, un couple, une fonction, ... Cependant, il existe deux opérations réservées aux références entières : les fonctions incr (de « incrémentation ») et decr (« décrémentation ») permettent d'augmenter ou diminuer de 1 la valeur d'une référence.

  6. #6
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Pense à poster ta fonction finale et à cliquer sur une fois obtenue une fonction qui ... fonctionne .
    -- Yankel Scialom

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    À partir du moment où tu utilises un string, tu utilises déjà des références alors une de plus ...
    D'une part le raisonnement "alors une de plus" ne vaut pas grand chose, d'autre part j'évite toujours de modifier mes chaînes et je considère personnellement qu'elles sont immutables (tout comme une méthode privée en Python n'est privée que parce qu'on en est convaincu).

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    voila j'arrive à compiler ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     let fct m =let r = (ref 0) in ( for i=0 to (String.length m)  do( match (String.get m i) with
    				|'a' -> r:=!r+1 
    				|_-> r:= !r-1 )
    			      done); !r;;
    cependant quand je l'applique :

    j'obtiens une erreur d'exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Invalid_argument "index out of bounds"
    je sais pas pourquoi cela ne marche pas, est ce que quelqu'un pourrait m'éclairer.
    merci à l'avance

  9. #9
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    le dernier caractère est
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    le dernier caractère est
    ah les erreurs d'inattention :p, et bien merci beaucoup maintenant ca marche!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let fct m =let r = (ref 0) in ( for i=0 to ((String.length m)-1)  do( match (String.get m i) with
    				|'a' -> r:=!r+1 
    				|_-> r:= !r-1 )
    			      done); !r;;

  11. #11
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par bluestorm Voir le message
    D'une part le raisonnement "alors une de plus" ne vaut pas grand chose, d'autre part j'évite toujours de modifier mes chaînes et je considère personnellement qu'elles sont immutables (tout comme une méthode privée en Python n'est privée que parce qu'on en est convaincu).
    Certes ... rien à dire pour ma défense ...

    Citation Envoyé par Sara-SW Voir le message
    voila j'arrive à compiler ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     let fct m =let r = (ref 0) in ( for i=0 to (String.length m)  do( match (String.get m i) with
    				|'a' -> r:=!r+1 
    				|_-> r:= !r-1 )
    			      done); !r;;
    cependant quand je l'applique :

    j'obtiens une erreur d'exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Invalid_argument "index out of bounds"
    je sais pas pourquoi cela ne marche pas, est ce que quelqu'un pourrait m'éclairer.
    merci à l'avance
    Et la magnifique String.iter qui fait toute seule la boucle qu'il faut ? elle pue ?
    -- Yankel Scialom

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Et la magnifique String.iter qui fait toute seule la boucle qu'il faut ? elle pue ?


    attends on va lui donner un peu plus...

    String.iter : (char -> unit) -> string -> unit

    String.iter f s applies function f in turn to all the characters of s. It is equivalent to f s.[0]; f s.[1]; ...; f s.[String.length s - 1]; ().
    plus d'infos: http://caml.inria.fr/pub/docs/manual...ef/String.html
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  13. #13
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Message #2 :p
    -- Yankel Scialom

  14. #14
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Message #2 :p
    ah oui... ben là c'est grave alors
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2014, 21h54
  2. Fonction qui modifie les données d'une personne
    Par pope2008 dans le forum Pascal
    Réponses: 4
    Dernier message: 02/01/2012, 12h31
  3. [1.x] Fonction qui modifie un champ d'une table
    Par blasil64 dans le forum Symfony
    Réponses: 4
    Dernier message: 05/02/2010, 16h55
  4. fonction qui modifie les valeurs de combos <select>
    Par NicoO_O dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/05/2007, 13h02
  5. Réponses: 8
    Dernier message: 24/10/2006, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo