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 :

Problème avec une boucle while avec opérateur &&


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 17
    Par défaut Problème avec une boucle while avec opérateur &&
    Bonjour, je suis face à un paradoxe que je ne comprend pas du tout, voici le code

    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
     
    public class main {
     
    	public static void main(String[] args) {
     
    		char [] tj = new char [] {'T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		char [] ti = new char [] {'T','G','G','A','G','C','A','T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		int j = tj.length-1;
    		int i = ti.length-1;
     
    		while(i>=0 && j>=0) {
    			if (tj[j]==ti[i]){
    				i--;
    				j--;
    			}
    			else{
    				i--;
    			}
    			System.out.println("i="+i+"   "+"j="+j);
    		}
     
    	}
     
    }
    ce qui donne le résultat suivant :

    i=25 j=18
    i=24 j=17
    i=23 j=16
    i=22 j=15
    i=21 j=14
    i=20 j=13
    i=19 j=12
    i=18 j=11
    i=17 j=10
    i=16 j=9
    i=15 j=8
    i=14 j=7
    i=13 j=6
    i=12 j=5
    i=11 j=4
    i=10 j=3
    i=9 j=2
    i=8 j=1
    i=7 j=0
    i=6 j=-1



    Mais je comprend pas pourquoi la boucle while s’arrête, on a bien i = 6 et dans les conditions d’arrêt de la boucle i et j doivent être inférieur à 0 ors il y a que j qui est inférieur à 0 pas i.

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    En logique booléenne, "a et b" est vrai si a et b sont vrais en même temps. Autrement dit, si a est faux ou si b est faux, alors "a et b" est faux. Pour avoir une condition qui est vraie si l'un des deux opérandes est vrai, alors il faut utiliser un ou.

    Mais, attention, si tu mets un ou au lieu du et, tu vas rencontrer un autre problème : la boucle va pouvoir s'exécuter avec un i négatif (ou un j négatif), donc planter pour un indice de tableau incorrect (ArrayIndexOutOfBoundException). Cependant, il n'y a pas de raison de continuer la boucle de toute manière, avec un i négatif ou un j négatif : le but de la boucle étant de comparer l'élément tab[i] et tab[j], cette comparaison n'a aucun sens si i ou j (ou les deux) vaut -1.



    PS. Rappel :
    a b a et b
    faux faux faux
    faux vrai faux
    vrai faux faux
    vrai vrai vrai

    a b a ou b
    faux faux faux
    faux vrai vrai
    vrai faux vrai
    vrai vrai vrai

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 17
    Par défaut
    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
     
    public class main {
     
    	public static void main(String[] args) {
     
    		char [] tj = new char [] {'T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		char [] ti = new char [] {'T','G','G','A','G','C','A','T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		int j = tj.length-1;
    		int i = ti.length-1;
     
    		while(i>0 && j>0) {
    			if (tj[j]==ti[i]){
    				i--;
    				j--;
    			}
    			else{
    				i--;
    			}
    			System.out.println("i="+i+"   "+"j="+j);
    		}
     
    	}
     
    }
    J'ai mal posé mon problème je veux que ma boucle while continue, j'aimerai avoir le résultat suivant :
    i=25 j=18
    i=24 j=17
    i=23 j=16
    i=22 j=15
    i=21 j=14
    i=20 j=13
    i=19 j=12
    i=18 j=11
    i=17 j=10
    i=16 j=9
    i=15 j=8
    i=14 j=7
    i=13 j=6
    i=12 j=5
    i=11 j=4
    i=10 j=3
    i=9 j=2
    i=8 j=1
    i=7 j=0
    i=6 j=0
    i=5 j=0
    i=4 j=0
    i=3 j=0
    i=2 j=0
    i=1 j=0
    i=0 j=0

    ors avec le code que j'ai j'arrive à ce résultat:

    i=25 j=18
    i=24 j=17
    i=23 j=16
    i=22 j=15
    i=21 j=14
    i=20 j=13
    i=19 j=12
    i=18 j=11
    i=17 j=10
    i=16 j=9
    i=15 j=8
    i=14 j=7
    i=13 j=6
    i=12 j=5
    i=11 j=4
    i=10 j=3
    i=9 j=2
    i=8 j=1
    i=7 j=0

    Ce que je ne comprend pas c'est que la boucle s’arrête avec i = 7 donc pour la condition i > 0 c'est FAUX et j = 0 donc pour la condition j > 0 c'est VRAI d’après le tableau avec la condition et FAUX + VRAI donne FAUX alors pourquoi ma boucle s’arrête ?

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par paulbach Voir le message
    Ce que je ne comprend pas c'est que la boucle s’arrête avec i = 7 donc pour la condition i > 0 c'est FAUX et j = 0 donc pour la condition j > 0 c'est VRAI d’après le tableau avec la condition et FAUX + VRAI donne FAUX alors pourquoi ma boucle s’arrête ?
    La boucle tant que s'exécute tant que la condition est vraie, donc s'arrête lorsqu'elle est fausse. FAUX et VRAI (attention à la notation + : en logique booléenne, ce signe (addition) signifie OU, . (multiplication) étant le signe du ET) donnant FAUX, la boucle s'arrête donc.
    En fait, ce que tu cherches à faire, c'est boucler tant qu'une des deux contions est vraie, donc un ou. En revanche, il faut arrêter de décrémenter les indices lorsqu'ils ont atteint leur valeur la plus basse (donc 0), même si la boucle continue.

    Donc le code est :
    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
     
    public class main {
     
    	public static void main(String[] args) {
     
    		char [] tj = new char [] {'T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		char [] ti = new char [] {'T','G','G','A','G','C','A','T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		int j = tj.length-1;
    		int i = ti.length-1;
     
    		while(i>0 || j>0) { // tant que l'un des indices n'est pas 0
    			if (tj[j]==ti[i]){
    				if ( j>0 ) { // on ne décrémente plus dès qu'on a atteint 0
    					j--;
    				}
    			}
    			if ( i>0 ) { // le décrément étant fait dans les 2 cas (if et else), autant le sortir du if/else
    				i--;
    			}
    			System.out.println("i="+i+"   "+"j="+j);
    		}
     
    	}
     
    }
    Cependant, ce code ne fait pas exactement ce que tu veux si les tableaux ne contiennent qu'une seule valeur, ou sont vides. Parce qu'il faudrait faire d'une part un do/while plutôt qu'un while pour traiter les tableaux à une seule valeur, et faire un if pour éliminer le cas des tableaux vides :

    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
    public class main {
     
    	public static void main(String[] args) {
     
    		char [] tj = new char [] {'T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		char [] ti = new char [] {'T','G','G','A','G','C','A','T','T','G','T','T','T','A','C','G','T','G','C','A','G','G','A','G','C','A','T'};
    		int j = tj.length-1;
    		int i = ti.length-1;
     
    		if ( i>=0 && j>=0 ) {
    			do {
    				if (tj[j]==ti[i]){
    					if ( j>0 ) { // on ne décrémente plus dès qu'on a atteint 0
    						j--;
    					}
    				}
    				if ( i>0 ) { // le décrément étant fait dans les 2 cas (if et else), autant le sortir du if/else
    					i--;
    				}
    				System.out.println("i="+i+"   "+"j="+j);
    			} while(i>0 || j>0) ; // tant que l'un des indices n'est pas 0
    		}
     
    	}
     
    }
    Reste le cas où l'un des deux tableaux est vide, et pas l'autre : ne sachant que faire dans ce cas, ce cas n'est pas traité.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2015
    Messages : 17
    Par défaut
    Je viens de comprendre la subtilité du While, merci beaucoup.

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

Discussions similaires

  1. [MySQL] Remplir un tableau associatif avec une boucle while
    Par Palsajicoco dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/07/2009, 09h59
  2. [MySQL] Insérer 700 tuples avec une boucle while
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/07/2008, 21h10
  3. Break avec une boucle while
    Par hallaj dans le forum Langage
    Réponses: 6
    Dernier message: 22/07/2008, 18h36
  4. [MySQL] affichage d'une liste avec une boucle while
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/01/2007, 20h19
  5. Structure while avec une boucle for en test
    Par le_voisin dans le forum C++
    Réponses: 9
    Dernier message: 09/09/2006, 19h16

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