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

Langage Java Discussion :

[Débutant] Problème boucle for


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut [Débutant] Problème boucle for
    Bonjour,

    J'ai fait un programme pour explorer un fichier.
    Il y a quand même quelque chose que je comprends pas
    Un moment j'ai un dossier qui contient 2 fichiers. Normalement, le programme ne dervrait pas re rentrer dans le for car la longueur du tableau = 2 (vérifier en l'affichant avec la variable sol et pourtant il rentre et remonte un dossier au dessus et m'affiche sol=8. Je comprends plus rien!!.

    Voici l'arborescence de mon dossier sitecss:

    sitecss/css/
    sitecss/images/
    sitecss/javascript/
    sitecss/asso.html
    sitecss/histoire.html
    sitecss/index.html
    sitecss/media.html
    sitecss/test.doc

    sitecss/css/ie.css
    sitecss/css/nt.css

    ...etc juste avec cette arboresence je peux poser mon problème
    sol = 2 quand il rentre dans le sous-dossier sitecss/css et ensuite il rentre encore dans la boucle et passe sol à sol = 8 ??!!


    Mon programme:


    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     import java.io.*; 
    import javax.swing.JOptionPane; 
     
    class Exploration 
     
    { 
     
        public static void main (String [] args) 
     
     
            { 
     
                File toto= new File("sitecss"); 
                Exploration.recu(toto); 
                System.exit(0); 
     
            } 
     
     
        private static void recu(File toto) 
     
            { 
                String couin ="couin"+toto.toString();  
                JOptionPane.showMessageDialog(null,couin); 
                File [] tata= toto.listFiles(); 
                JOptionPane.showMessageDialog(null,tata); 
                for (int i = 0 ; i<tata.length ; i++) 
     
                    { 
                        int sol = tata.length; 
     
                        JOptionPane.showMessageDialog(null,sol); 
                        if (tata[i].isDirectory()) 
     
                            { 
     
                            toto= new 
     
                            File(tata[i].toString()); 
     
                            JOptionPane.showMessageDialog(null,toto); 
     
                            recu (toto); 
     
                            } 
     
                        else 
     
                            JOptionPane.showMessageDialog(null,tata[i]); 
     
                    } 
     
            } 
     
    }
    [ Modéré par Viena ]
    Ajout balises de code : Pensez aux balises [code], votre message est plus lisible et la lecture plus facile.

    Les Règles du Forum



  2. #2
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Salut !

    Alors déjà, tu ne postes pas dans le bon forum...
    En ce qui concerne ton problème, tu fais une boucle qui part de i = 0 jusqu'à i = tata.length, si tu ne spécifies pas que ton nombre doit être supérieur ou égal à 2. Ta boucle sera toujours effectuée...
    +++
    Ju
    "Il y a 3 personnes en ce monde sur qui tu peux compter : moi, le pape et le cavalier solitaire ! "
    Penser à svp

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci bcp, désolé de ne pas avoir posté au bon endroit, je vais lire la F.A.Q.

    En fait j'ai bien précisé i<tata.length.

    Donc la boucle for incrémente i de + 1 à chaque fois.

    tata.length = 2 et ensuite il rerentre dans la boucle for et il est égal à 8.

    C'est à partir d'ici que je ne comprends plus.

    Quand i arrive à 2 (tata.length=2) il ne devrait pas rerentrer: car i = 2 et non i <2 , car il vient de s'incrémenter et que sa valeur est passé à 2.

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci de l'avoir déplacé.

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pour te renseigner sur le changement de valeur, pense au fait que tu utilises la recursivité dans ton algo, ce qui complexifie un poil la compréhension de ta boucle FOR ...

    Normalement, si je comprend bien le fonctionnement de ton algo ... tu devrais avoir lors du premier tour un tata.length = 8 (dossier siteCSS) et lors du second affichage, un tata.length=2 puisqu'il est dans le dossier CSS (qui contient 2 fichiers), etc. pour le parcours de CSS. Ensuite, il reviendra a 8 en ressortant de CSS et avant d'entrer dans le second sous dossier en sachant que ton i passera a 2 ... et ainsi de suite ...

    Par contre je ne vois pas ce que vous entendez par la verification qu'il est >= à 2 ... j'ose croire que les conditions de la boucle FOR sont correctes et vont suffir au bon fonctionnement de l'algo ... essaie d'afficher la valeur de ton "i" dans le but que l'on voit mieux le déroulement des opérations et que tu saches OU devient infinie ta boucle
    See you, space cowboy... and if you're satisfied, click on

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci de ton aide!

    Effectivement j'utilise le principe de la récursivité, le problème vienderait peut être de la.

    J'ai déja crée une variable et j'affiche sa valeur ensuite pour la controler:

    int sol = tata.length;

    JOptionPane.showMessageDialog(null,sol);
    if (tata[i].isDirectory())

    Le problème vient qu'un moment cette variable est égale à 2 ( quand il est dans le dossier css) et qu'ensuite cette variable = 8. il refait un tour de la boucle for il ne revient pas au début de la fonction, pour en être sur j'avais aussi utiliser des méthodes JOptionPane...etc pour le vérifier.
    Il remonte d'un sous dossier en fait. en fin de compte ce programme marche très bien, mais comment marche cette boucle for reste un mystère pour moi.
    Comment fait t'il pour repasser de 2 à 8 si je lui dis <2 il devrait arrêter la boucle for et revenir à la ligne de mon prgramme java ou j'apelle cette fonction récursive.

  7. #7
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pour ton information, voici, selon moi, les données que tu devrais afficher en affichant sol, i, toto.toString() et tata[i].toString() a chaque fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1/  i=1 sol=8 toto=siteCSS tata=CSS/
    2/  i=1 sol=2 toto=CSS     tata=ie.css
    3/  i=2 sol=2 toto=CSS     tata=nt.css
    4/  i=2 sol=8 toto=siteCSS tata=images/
    5/  i=3 sol=8 toto=siteCSS tata=javascript/
    6/  i=4 sol=8 toto=siteCSS tata=asso.html
    7/  i=5 sol=8 toto=siteCSS tata=histoire.html
    8/  i=6 sol=8 toto=siteCSS tata=index.html
    9/  i=7 sol=8 toto=siteCSS tata=media.html
    10/ i=8 sol=8 toto=siteCSS tata=test.doc
    Maintenant, je ne garantie rien ... mais il me semble que ca ressemblerait a cela ... sachant que des appels qui n'aurait aucune boucle se feraient normalement sur images/ et javascript/ également...
    See you, space cowboy... and if you're satisfied, click on

  8. #8
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    3/ i=2 sol=2 toto=CSS tata=nt.css
    4/ i=2 sol=8 toto=siteCSS tata=images/
    C'est ce passage que j'ai pas compris
    Quand c'est un dossier et non un fichier la jre va revenir à la ligne au début de ma fonction récursive et non pas directement au début de ma boucle for donc i ne sera pas = 2 mais sera réinitialisé à 0, avec le nouveau chemin.

    Comment ici :

    3/ i=2 sol=2 toto=CSS tata=nt.css
    4/ i=2 sol=8 toto=siteCSS tata=images/
    i pourrait être égal 2 fois à 2?

    Pour moi ca serait plus:

    4/ i=1 sol=8 toto=siteCSS tata=images/

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Après avoir vérifier c'est bien cela, lors de l'appel à la fonction récursive si la condition isDirectory est vrai la jre renverra le programme au début de la fonction.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     import java.io.*;
    import javax.swing.JOptionPane;
     
    class Exploration
     
    {
     
        public static void main (String [] args)
     
     
            {
     
                File toto= new File("sitecss");
                Exploration.recu(toto);
                System.exit(0);
     
            }
     
     
        private static void recu(File toto)
     
            {
                String couin ="audebut"+toto.toString(); 
                JOptionPane.showMessageDialog(null,couin);
                File [] tata= toto.listFiles();
                JOptionPane.showMessageDialog(null,tata);
                for (int i = 0 ; i<tata.length ; i++)
     
                    {
                        JOptionPane.showMessageDialog(null,"i:"+i);
                        int sol = tata.length;
     
                        JOptionPane.showMessageDialog(null,sol);
                        if (tata[i].isDirectory())
     
                            {
     
                            toto= new
     
                            File(tata[i].toString());
     
                            JOptionPane.showMessageDialog(null,toto);
     
                            recu (toto);
     
                            }
     
                        else
     
                            JOptionPane.showMessageDialog(null,tata[i]);
     
                    }
     
            }
     
    }
    Alors comment expliquer que i =2 c'est ok pour moi mais tout à coup sans repasser par le début de la fonction tata.length =8 ??? ; il doit pas changer lui en pricipe sauf si la jre repasse au début de la fontion. Encore un mystère de fifo.

    [ Modéré par Viena ]
    Ajout balises de code : Pensez aux balises [code], votre message est plus lisible et la lecture plus facile.

    Les Règles du Forum

  10. #10
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Nan, il n'y a aucun mystere ici ... je te refais le petit schema de maniere plus detaillée ^^

    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
    23
     
    /**Premier appel de recu(String) : P1, 
    on a alors i(P1)=0, sol(P1)=8, toto(P1)=siteCSS*/
    1/  appel en cours= P1 i=0 sol=8 toto=siteCSS tata=CSS/
      /**C'est un dossier on rappelle recu(String) => P2, 
      on a alors i(P2)=0, sol(P2)=2, toto(P1)=CSS*/
           2/ appel en cours= P2  i=0 sol=2 toto=CSS tata=ie.css
           3/ appel en cours= P2  i=1 sol=2 toto=CSS tata=nt.css
            /**Il n'y a plus de fichier dans CSS donc on ressort de P2 
            et on reprend P1 la ou il en etait ...*/
            donc (dans le FOR, apres l'appel de recu(String)):
    4/  appel en cours= P1 i=1 sol=8 toto=siteCSS tata=images/
       /**On appelle encore recu(String) (donc P3) 
       mais aucun fichier donc on retourne dans P1*/
    5/  appel en cours= P1 i=2 sol=8 toto=siteCSS tata=javascript/
       /**On appelle toujours recu(String) (donc P4) 
       mais aucun fichier donc on retourne dans P1*/
    6/  appel en cours= P1 i=3 sol=8 toto=siteCSS tata=asso.html
    7/  appel en cours= P1 i=4 sol=8 toto=siteCSS tata=histoire.html
    8/  appel en cours= P1 i=5 sol=8 toto=siteCSS tata=index.html
    9/  appel en cours= P1 i=6 sol=8 toto=siteCSS tata=media.html
    10/ appel en cours= P1 i=7 sol=8 toto=siteCSS tata=test.doc
    /**Il n'y a plus de fichiers dans P1 donc le programme d'arrete.*/
    EDIT: J'ai refait les indices i ... ils démarraient de 0 et non de 1
    See you, space cowboy... and if you're satisfied, click on

  11. #11
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci Bizur!

    Je viens de comprendre.



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

Discussions similaires

  1. [Débutant] une boucle for me rend fou.
    Par SirDarken dans le forum Langage
    Réponses: 6
    Dernier message: 12/09/2006, 23h25
  2. [VBA-E, Débutant] Problème Boucle for
    Par strifer dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/08/2006, 12h30
  3. Grand Débutant : problème boucle et variable
    Par carelha dans le forum Langage
    Réponses: 2
    Dernier message: 02/08/2006, 19h33
  4. [FLASH 8] Problème Boucle For
    Par Begood dans le forum Flash
    Réponses: 6
    Dernier message: 21/03/2006, 11h36
  5. [XML][XSLT] Débutant {Probléme avec For-each-group}
    Par Silvia12 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 29/01/2006, 21h38

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