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

Lisp Discussion :

Lisp: compter un nombre d'élément d'une matrice


Sujet :

Lisp

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Lisp: compter un nombre d'élément d'une matrice
    Bonjour, je débute en lisp et je rencontre le problème suivant: j'ai reussis à crée une matrice de taille n*m mais j'aimerai compter le nombre d'élément à NIL que contient cette matrice et je ne sait pas comment parcourir les lignes et colonne d'une matrice en lisp.

    voilà mon code pour l'instant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (defun creer-grille(dim nb-coul)
      (setq flow (make-grille
                  :dimensions dim
                  :matrice (make-array dim :initial-element nil)
                  :nb-couleurs nb-coul)))
     
     
    (defun init-matrice(G n m)
      "Initialise tous les éléments de la matrice comme étant des structures zone"
      (defun init-case(G i j)
        (setf (aref (grille-matrice G) i j) (make-zone)))
    cordialement

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Salut !

    S'il s'agit de matrices, il serait peut-être mieux de fournir M et N au lieu de DIM qui doit être une liste, si je ne me trompe pas ?

    La façon naturelle de traverser un array c'est d'utiliser DOTIMES. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defvar *a* #2A((1 2 NIL NIL 3) (3 4 NIL NIL NIL)))
    (let ((res 0))
      (dotimes (i (array-dimension *a* 0) res)
        (dotimes (j (array-dimension *a* 1))
          (when (aref *a* i j)
            (incf res))))) => 5
    Le troisième argument de DOTIMES est optionnel. C'est ce qu'il doit renvoyer (NIL par défaut).

    Je dois dire que ton code n'est pas fameux.

    Dans CREER-GRILLE tu affectionnes la variable FLOW sans l'avoir déclarée; en plus, tu ne l'utilises jamais. En lisp, les affectations, elles aussi, renvoient des valeurs (normalment c'est ce que l'on a affecté), alors ta fonction renvoie la valeur renvoiée par SETQ. C'est bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (defun creer-grille(dim nb-coul)
      (make-grille :dimensions dim
                   :matrice (make-array dim :initial-element nil)
                   :nb-couleurs nb-coul))
    Ça sera mieux.

    Quant'à la deuxième fonction, c'est encore plus bizarre. Un DEFUN à l'intérieur d'un autre DEFUN, qu'est-ce que c'est ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    merci beaucoup c'est presque ce que je veux au détail près que j'ai une matrice n*m je me demande s'il ne vaut pas mieux passer par un defun ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defvar *a* #2A((1 2 NIL NIL 3) (3 4 NIL NIL NIL)))
    (let ((res 0))
      (dotimes (i (array-dimension *a* 0) res)
        (dotimes (j (array-dimension *a* 1))
          (when (aref *a* i j)
            (incf res))))) => 5

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Ah, donc tu voulais créer une fonction auxiliaire ? À mon gout, ce n'est pas indispensable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (defun init-grille-matrice(g)
      "Initialise tous les éléments de la matrice comme étant des structures zone"
      (let ((a (grille-matrice g)))
        (dotimes (i (array-dimension a 0))
          (dotimes (j (array-dimension a 1))
            (setf (aref a i j) (make-zone))))))
    D'ailleurs, DEFUN sert à creer des fonctions globales, alors que des fonctions locales sont creées à l'aide de FLET ou LABELS.

    Les arguments N et M dans la définition de INIT-MATRICE, ce sont les dimensions de la matrice ? Je pense qu'ils non sont nécessaires. D'une part, la matrice contient l'information de ses dimensions. D'autre part, si les dimensions d'une grille ne correspondent pas nécessairement à celles de sa matrice, il vaut mieux les garder dans la structure même.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    par habitude je n'utilise que des defun ou defparameter. Oui n et m se sont les dimensions de la matrice. (de la grille de jeu plutôt)

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Mais non, DEFUN vs FLET n'est pas question d'habitude. DEFUN déclares des fonctions globales. Regarde:
    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
    18
    19
    20
    21
    22
    CL-USER> (g 2)
    EVAL: undefined function G
       [Condition of type SYSTEM::SIMPLE-UNDEFINED-FUNCTION]
    ; Evaluation aborted on NIL
    CL-USER> ; Quit to level 1
    CL-USER> ; Evaluation aborted on #<SYSTEM::SIMPLE-UNDEFINED-FUNCTION #x000333FC2110>
    CL-USER> 
    (defun f (x)
      (defun g (x)
        (1+ x))
      (g (g x)))
    F
    CL-USER> (g 2)
    EVAL: undefined function G
       [Condition of type SYSTEM::SIMPLE-UNDEFINED-FUNCTION]
    ; Evaluation aborted on NIL
    CL-USER> ; Quit to level 1
    CL-USER> ; Evaluation aborted on #<SYSTEM::SIMPLE-UNDEFINED-FUNCTION #x000333FC14E8>
    CL-USER> (f 3)
    5
    CL-USER> (g 2)
    3
    D'abord je me convaincs que la fonction G n'existe pas. Ensuit je déclare une fonction F dont à l'intérieur je déclare une fonction G avec DEFUN. Cependent, la fonction G n'existe pas encore, car le corps de F n'a pas été évalué. Donc je calcule (F 3); cet appel de la fonction F a un effet secondaire, notamment il déclare une nouvelle fonction globale. Et voilà, enfin je peux utiliser G. Bizarre, eh?

    La conclusion est que DEFUN n'a pas la même signification que DEFINE en Scheme et qu'il faut utiliser FLET et LABELS pour créer des fonctions locales. D'ailleurs, des fonctions locales sont pour la plupart utiles si elles sont clôtures (closures); autrement on peut tout simplement déclarer une fonction globale et ne pas exporter son symbole si elle n'est qu'auxiliaire.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    oui merci beaucoup de l'exemple

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/09/2019, 22h36
  2. Compter le nombre d'éléments dans une matrice
    Par ky0zZ dans le forum Général Java
    Réponses: 3
    Dernier message: 05/01/2014, 13h09
  3. Réponses: 5
    Dernier message: 26/11/2012, 12h51
  4. Compter le nombre d'éléments dans une liste
    Par marcus73 dans le forum SAS Base
    Réponses: 3
    Dernier message: 30/12/2011, 13h56
  5. Compter le nombre d'éléments dans une image
    Par guykams.univ dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 02/12/2010, 19h38

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