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

avec Java Discussion :

problème boucle imbriquée


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut problème boucle imbriquée
    bonjour ,j ai un petit soucis ,ma boucle do while fonctionne correctement pour un nombre ,.Mais lorsque que je crèe une boucle for pour la parcourir ,j'ai un problème la boucle ne s'arrête plus .j 'ai beau chercher mais en vain,je suis bloqué ,pouvez vous juste m 'aiguiller
    merci pour votre aide
    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
    import java.util.Scanner;
     
    class Suite {
     
        public static void main(String[] args) {
     
            Scanner clavier = new Scanner(System.in);
     
            int debut;
            do {
                System.out.print("de (>= 1) ? ");
              debut = clavier.nextInt();
            } while (debut < 1);
     
            int fin;
            do {
                System.out.print("a (>= " + debut+ ") ? ");
                fin = clavier.nextInt();
            } while (fin < debut);
     
     
     
            int k =0;
            int count = 0;
            for (int i = debut; i < 50; i++) {
    			do {
     
     
    				if(i%3 ==0) {
    				i+=4;
    					k++;
    				}
    				if(i %4 ==0) {
    					i/=2;
    					k++;
    				}
    				else {
    					i-=1;
    					k++;
    				}
     
    			}while(i>0);
    			count++;
    			System.out.println(count+ " -> "+k);
    		}
     
            clavier.close();
        }
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    A l'intérieur de la boucle for, bouclant sur la variable i, il y a un do/while qui modifie i et dont la boucle est conditionnée par i>0.

    On boucle tant que i > 0, donc on sort quand i<=0.

    Premièrement, il te faut analyser ces modifications pour savoir si on sort bien de la boucle do/while, donc i prend une valeur <=0. Parce que si on boucle infiniment par le do/while, on ne risque pas de sortir du for.

    Seulement, il est évident que si c'est bien le cas (qu'on sorte du do/while), il y a aucune chance de sortir de la boucle for, puisqu'il faudrait que i vaille 50 et qu'il ne peut valoir qu'une valeur <=1 ( <=0 après être sorti du do/while puis à la suite du i++ du for, <=1 ).

    NB Tu peux ajouter des traces (des System.out.println) par exemple pour voir l'évolution de i, et les différentes itérations, pour voir quand ça entre dans la boucle, quand ça sort, les valeurs de i, des conditions, etc. Cela te permettra bien de voir comment ça boucle et pourquoi ça ne sort pas des boucles. Il y a également l'exécution en pas à pas en mode debug.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    merci joel pour ta réponse rapide,
    je suis sur éclipse,j ai essayé le mode print mais le problème c 'est que ça ne boucle indéfiniment et même si je l arrête , j 'ai beau remonté dans la console on dirai que ça ne remonte pas jusqu'au début ce qui fait que je ne vois pas les prints.je vais essayer le mode debug que je ne connais pas ..et suivre tes instructions,ce que je ne comprend pas c est que quand on rentre dans la boucle while avec i comme valeur "début" de la boucle for ,une fois i=0 de la boucle do while on sort,mais là,quand on sort de la boucle do,on devrait remonter dans la boucle for et prendre comme valeur de i (début+1) etc .... non ? jusqu 'à que i vaille 50 ?
    encore merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cpiter Voir le message
    je suis sur éclipse,j ai essayé le mode print mais le problème c 'est que ça ne boucle indéfiniment et même si je l arrête , j 'ai beau remonté dans la console on dirai que ça ne remonte pas jusqu'au début ce qui fait que je ne vois pas les prints.
    C'est sûr qu'il te faut prévoir de forcer l'arrêt du programme vu que ça boucle à l'infini (tu peux forcer par exemple en arrêtant au bout de 10 itérations (voire 1) pour commencer, avec un compteur (que tu as déjà d'ailleurs)). En debug, tu ne seras pas obligé de modifier le programme, mais ça peut être plus fastidieux, surtout si tu n'as pas l'habitude.
    Citation Envoyé par cpiter Voir le message
    ..et suivre tes instructions,ce que je ne comprend pas c est que quand on rentre dans la boucle while avec i comme valeur "début" de la boucle for ,une fois i=0 de la boucle do while on sort,mais là,quand on sort de la boucle do,on devrait remonter dans la boucle for et prendre comme valeur de i (début+1) etc .... non ? jusqu 'à que i vaille 50 ?
    encore merci
    La ligne avec le for ne fait rien d'autre que déclarer une variable (i), l'initialiser à une valeur de départ (debut), déclarer une condition qui sera testée à chaque itération (avant de l'exécuter), soit i<50 dans ton cas (enfin je pense que ça devrait être plutôt i<fin, mais c'est un autre sujet), et déclarer le code à exécuter lorsque l'itération est terminée, soit dans ton cas i++. Toute modification de la variable i est effective et donc est prise en compte à chaque itération.

    Le code suivant écrite juste 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<50; i++) {
        System.out.println(i),
        i=50;
    }
    Malgré que le for décrive ce qui semble être une suite de nombres de 0 à 49, le i=50 fait qu'à la fin de la première itération, on exécute i++, donc i vaut 51, la condition i<50 est donc fausse et on sort du for.

    En d'autres termes, écrire for(int i=0; i<50; i++) { /*code*/ }, c'est exactement la même chose, en terme de logique algorithmique, que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
       int i=0;
       while (i<50) {
          /* code */
          i++;
       }
    }
    Ce n'est pas comme tu le crois une indication de faire varier i de debut à 49 malgré tout ce qu'on peut faire à i à l'intérieur de la boucle.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    ah ok
    dans l exemple de la boucle for avec i=50 ,mon do while modifie la variable comme i=50 ...donc apres mon do while je suis toujours a zero et ça boucle à l infini,éffectivement j'ai essayé le for que tu m' as marqué avec le chiffre 38 et ça boucle indéfiniment avec 39 (38+1),pour le 50 de mon code c'est bien "fin " du scanner,mais j'ai fait plein d'essais.. donc si je t ai bien compris il va falloir que je trouve une autre sorte de boucle pour parcourir mon do while du chiffre début à fin ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    je réinitialise mon i avec i =count ainsi que mon k avec k = 0 en fin de boucle while ,je croyais avoir réussi mais si mon "début" vaut 5 et "fin" vaut 7 je fait toujours 7 boucles au lieu de 2 mais je progresse...

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    bingo
    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
    57
    58
    59
    60
    import java.util.Scanner;
     
    class Suite {
     
        public static void main(String[] args) {
     
            Scanner clavier = new Scanner(System.in);
     
            int debut;
            do {
                System.out.print("de (>= 1) ? ");
                debut = clavier.nextInt();
            } while (debut < 1);
     
            int fin;
            do {
                System.out.print("a (>= " + debut + ") ? ");
                fin = clavier.nextInt();
            } while (fin < debut);
     
            /*******************************************
             * Completez le programme a partir d'ici.
             *******************************************/
            int k=0;
            int temp = debut;
     
            for (int i = debut; i <=fin; ) {
     
            	while(i>0) {
            		if(i%3 == 0) {
            			i+=4;
            			k++;
            		}
            		if(i %4 == 0) {
            			i/=2;
            			k++;
            		}
            		else {
            			i-=1;
            			k++;
     
            		}
            	}
            	System.out.println(temp+" -> "+k);
            	temp+=1;
            	i=temp;
            	k =0;
     
     
     
     
    		}
     
     
            /*******************************************
             * Ne rien modifier apres cette ligne.
             *******************************************/
            clavier.close();
        }
    }
    merci joel pour ton aiguillage ,sans toi je ne voyais pas ou était le problème,j aurai progrèssé dans les initialisation de variables

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et comme ça, c'est quand même plus simple, non ?
    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
     
            for (int i = debut; i <=fin; i++) {
                    int k=0;
                    int j=i;
            	while (j>0) {
            		if(j%3 == 0) {
            			j+=4;
            			k++;
            		}
            		if(j%4 == 0) {
            			j/=2;
            			k++;
            		}
            		else {
            			j--;
            			k++;
            		}
            	}
            	System.out.println(i+" -> "+k);
    }
    On pourrait même faire (un bon exemple pour un for qui ne boucle pas seulement sur la partie for(...)) :

    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
     
            for (int i = debut; i <=fin; i++) {
                    int k=0;
            	for (int j=i; j>0; ) {
            		if(j%3 == 0) {
            			j+=4;
            			k++;
            		}
            		if(j%4 == 0) {
            			j/=2;
            			k++;
            		}
            		else {
            			j--;
            			k++;
            		}
            	}
            	System.out.println(i+" -> "+k);
    }

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    oh la que je me suis cassé la tête effectivement j = i permet de pas toucher à la variable i de la boucle for (c est le metier qui rentre )

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

Discussions similaires

  1. [Python 2.X] Problème Boucles imbriquées
    Par knibalpj dans le forum Général Python
    Réponses: 4
    Dernier message: 08/01/2017, 12h08
  2. Problème boucle imbriquée SqlDataReader
    Par xouzi dans le forum C#
    Réponses: 23
    Dernier message: 13/01/2011, 15h48
  3. [XSLT] problème de boucle imbriquée en xsl/xpath
    Par lol88 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/10/2009, 18h30
  4. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46
  5. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26

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