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

Scheme Discussion :

Aide pour une fonction


Sujet :

Scheme

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Aide pour une fonction
    Salut.

    Dans le cadre de mes études j'ai un petit projet a faire en scheme (jvais pas tout déballer c'est inutile ) et je bloque sur une fonction.

    J'ai une liste de couple composée de cette facon: ((caractéristique1 valeur) (caractéristique2 valeur)...) nommée LQR.

    Et je dois écrire une fonction qui prend en paramètre une caractéristique, cette liste de couple et renvoie la valeur si elle existe, et 'sais-pas (avec display je suppose) si elle ne s'y trouve pas.

    Voila.

    Si quelqu'un peut m'aider il me sauverait la vie!

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    As-tu au moins une idée du comment procéder à la main pas en Scheme.
    Sais-tu comment on procède pour balayer une liste ?
    Comment on accède aux éléments d'une sous liste puisque tu as une liste de couples ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Voila en gros ce que j'ai déjà fait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define RenvoieValeur; oui ou non
      (lambda (c l); une caractéristique et une liste de couples
        (cond ((null? l) (display "sais-pas"))
              ((list? (car l)) (RenvoieValeur c (car l))) je dois modifier cette ligne pour ajouter la récursivité sur le cdr l
              ((eq? (car l) c)(cadr l))
              (else '()))))
    Problème, comment faire pour "sortir" du programme et afficher un simple "sais-pas" lorsque la caractéristique n'existe pas?

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ton programme n'est pas bon.
    Tu dois envisager 3 cas
    1. La liste l est vide
    2. le premier élément du couple en tête de liste est égal à c, tu renvoie le deuxième élément (comment obtient des éléments ?)
    3. le premier élément du couple en tête de liste n'est pas égal à c, tu continues ta recherche dans le rest de la liste
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je sais que mon programme n'est pas bon^^

    L'idée c'est que soit:
    -la caractéristique est présente et on renvoit sa valeur.
    -elle n'existe pas et le programme affiche "sais-pas.

    Sauf qu'en scheme, je n'ai aucune idée de comment on fait et c'est pour ça que je viens ici

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    OK allons-y dans l'ordre : première chose il faut que tu sache parcourir une liste élément pas élément de manière récursive.
    Es-tu capable d'écrire une fonction récursive qui affiche les éléments d'une liste
    (my-display-liste (list 1 2 3 4))
    ==>
    1
    2
    3
    4
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    On vient simplement de commencer a voir la fonction "display" pour l'affichage.

    Auparavant on avait fait tout ce qui est liste et arbres (ABR principalement).

    Du coup, aucune idée de comment faire l'affichage d'une liste d'éléments..
    Je ne vois pas comment faire une récurrence qui ferait que dans mon cas d'arret liste vide, on n'ait pas d'affichage ni de résultat.

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ah oui, donc un "template" de ce type la ne te dit rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (define usage-de-liste
      (lambda (x)
        (if (null? x)
           (action-lorsque-on-a-fini)
          (begin
            (action-avec-le-premier-element (car x))
            ; on continue avec le reste de la liste
            (usage-de-liste (cdr x))))))
    
    (define action-lorsque-on-a-fini
      (lambda ()
          (display "c'est fini")))
    
    (define action-avec-le-premier-element
      (lambda (x)
          (display x)
          (newline)))
    PS : tu verras plus tard une méthode plus évoluée pour faire le travail plus simplement.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci!

    En fait, c'est un peu le même genre de programme que je dois réaliser.

    Il faut que je test a chaque fois si (caar l) est égal a ma caractéristique c donnée, si oui, affichage de la valeur correspondante (oui ou non) sinon, passer sur (cdr l) et faire ma récurrence.

    Pour finir, si la caractéristique n'a pas été trouvée, afficher "sais-pas".

    Et sans avoir jamais travaillé avec "display", "begin" j'ai pu comprendre ton code snas difficulté

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je vois que tu commences à comprendre. Tant mieux.
    Maintenant, la balle est dans ton camps, propse un code !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (define renvoievaleur;
      (lambda (c l);
        (if (null? l)
            (display "sais-pas")
            (begin
              (actionpremier c (car l))
              (renvoievaleur c (cdr l))))))
    
    (define actionpremier;
      (lambda (c l)
        (if (eq? c (car l))
            ((display (cadr l))(newline))
            '())))
    Ca marche au moins mais ya encore une erreur
    Le cas d'arrêt n'est pas bon dans le sens ou c'est uniquement si la valeur n'est pas trouvée que "sais-pas" doit s'afficher.
    Et que faire dans le cas ou c n'est pas égal au (car l), que faire pour que le programme ne renvoie rien et s'arrête en somme

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le template que j'ai proposé permettait un parcours complet de liste.
    Dans ton problème, le parcours de la liste n'est pas forcément complet. En effet, il s'arrête lorsque la caractéristique est trouvée.
    On peut écrire un deuxième template qui tient compte de cette condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (define usage-de-liste-avec-arret-sur-condition
      (lambda (elem l)
        (if (null? l)
           (action-liste-vide)
           (action-liste-pas-vide elem l))))
    
    (define action-liste-vide
      (lambda ()
          (display "c'est fini")))
    
    (define action-liste-pas-vide
      (lambda (elem l)
          (if (element-recherche elem (car l))
              (action-element-trouve elem l)
              (usage-de-liste-avec-arret-sur-condition elem (cdr l)))))
    Ici, j'ai rajouté un premier argument elem pour coller un peu plus à ce que tu veux faire.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai réussi a faire autrement

    J'ai d'abord créé une fonction qui cherchait si ma caractéristique existait et si oui, me renvoyait une liste avec ce couple, et sinon, une liste vide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define ReglesPossibles; une liste de listes
      (lambda (a e); un élément et un ensemble de règles
        (cond ((null? e)'())
              ((list? (car e))(append (ReglesPossibles a (car e))(ReglesPossibles a (cdr e))))
              ((eq? (car e) a) (list e))
              (else '()))))
    Puis j'ai créé une fonction qui selon le résultat renvoyé par cette fonction, effectue l'opération demandée:
    -soit afficher la valeur de cette caractéristique
    -soit afficher "sais-pas"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define RenvoieValeur; soit (oui ou non) si la caractéristique existe, soit "sais-pas"
      (lambda (c l); une caractéristique et une liste de couples
        (if (null? (ReglesPossibles c l))
            (display "sais-pas")
            (cadar (ReglesPossibles c l)))))
    Merci néanmoins de ton aide!
    Cela m'aura fait réfléchir et chercher ci et la sur le net plusieurs choses que je ne connaissais pas sur scheme
    Mais je risque revenir rapidement quand même ^^

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Effectivement ce code fonctionne mais il est très compliqué.
    Sur le principe que je t'ai donné, on aurait pu écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (define RenvoieValeur0; une liste de listes
      (lambda (a e) ; un élément et un ensemble de règles
        (if (null? e) 
            (display "sais pas\n")
            (teste-valeur a e))))
    
    
    (define teste-valeur
      (lambda (a e)
        (if (eq? a (caar e))
            (cadar e)
            (RenvoieValeur0 a (cdr e)))))
    Maintenant, on peut simplifier grandement le code puisque tu connais cond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (define RenvoieValeur; une liste de listes
      (lambda (a e) ; un élément et un ensemble de règles
        (cond ((null? e) (display "sais pas\n"))
              ((eq? a (caar e)) (cadar e))
              (else (RenvoieValeur a (cdr e))))))
    PS peut-être un petit click sur
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'avais déjà du définir la fonction ReglesPossibles pour une question précédente, donc je ne faisais que la réutiliser.

    Je pense utiliser du coup le 2eme code que tu m'as fourni, bien plus simple il est vrai!

    Et c'est exactement ce que je cherchais a faire mais jsais pas, beaucoup de mal après les fêtes

    Merci beaucoup a toi

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

Discussions similaires

  1. Aide pour une fonction
    Par vincent62149 dans le forum Excel
    Réponses: 1
    Dernier message: 06/07/2007, 17h38
  2. [FPDF] Besoin d'aide pour une fonction publipostage..;
    Par dark$hadow dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 10/02/2007, 15h39
  3. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  4. Aide pour une fonction
    Par mimi060101 dans le forum Scheme
    Réponses: 1
    Dernier message: 24/02/2006, 16h59

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