Problème avec if imbriqués [Résolu]

Signaler
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012
-
Messages postés
332
Date d'inscription
mardi 12 juillet 2005
Statut
Membre
Dernière intervention
17 juillet 2010
-
Bonjour tout le monde,

J'aimerais tester trois conditions, si les trois conditions sont rencontrées, alors la valeur d'une variable booléenne prend la valeur "True".

J'aimerais utiliser un if imbriqué mais je ne sais pas comment utiliser un if imbriqué.

Voici ce que j'ai fait :

public boolean estAnterieur(int annee,int mois,int jour)
 {
  boolean controle=false;
  
  if(this.anneeEst-ce que c'est bon comme ça, je ne pense pas car ça n'a pas l'air de fonctionner.

Les valeurs par défaut sont 1999,12,23 et que j'envoi 1999,12,22 il me retourne False alors qu'il devrait me retourner True.

Merci d'avance pour votre aide.

D

15 réponses

Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Là par contre, c'est un problème d'algorithme

vu que : 2004 <= 2004 (OK)
             03 < 04 (Donc la date doit être forcément inférieure !)             23 <19 (PAS OK> false).

Du coup, ca donnerait plutôt :

if( this.annee
Messages postés
12
Date d'inscription
lundi 15 mars 2004
Statut
Membre
Dernière intervention
4 août 2007

Salut,

Le fait que ta fonction retourne false semble logique si ton this.jour est égal à 23,
comme 23 n'est pas inférieur à 22 la valeur de contrôle reste false.

Après il faut voir ce que tu veux que ta fonction fasse :
Cas1 : Elle indique si la date passée en paramètre est inférieur à la date par défaut,
Cas 2 : Elle indique si la date par défaut est inférieur à la date passé en paramètre.

Dans tout les cas, pour ne pas faire une répétition de if, tu peux utiliser les &&.

Ce qui donnerais  :
Cas 1 :
public boolean estAnterieur(int annee,int mois,int jour)  {
    boolean controle=false;

    if( annee<this.annee  &&  mois<this.mois &&  jour<this.jour ) {
        controle = true;
    }
    return controle; 
}

Cas 2 :
public boolean estAnterieur(int annee,int mois,int jour)  {
    boolean controle=false;


    if( this.annee<annee  && this. mois<mois &&  this.jour<jour ) {

        controle = true;
    }
    return controle; 

}

Fabulou
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
pourquoi ne pas utiliser la fonction standard Before du GregorianCalendar ?
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Salut Fabulou, Salut Darksidious,

Merci pour vos réponses.

@Fabulou :

C'est une bonne idée ces && mais il y'a quand même un petit hic :

On vérifie donc que la date du constructeur de la clase Annee soit inférieure à celle envoyée en paramètre.

J'ai fait les tests avec ces dates :

Constructeur : 1999,8,1
Date envoyée par la méthode : 2004,9,19

il me renvoit true.

Donc ça c'est OK.

Mais ce qui serait le top, c'est que d'abord l'année serait contrôlée, 1999 --> 2004, ok inférieur ou égal, on continue autrement la variable controle prend directement false.

Parce que si je change le 9 en 8 de 2004,9,19 il me renvoit false.

alors que le 1er aout 1999 est inférieur au 19 septembre 19 septembre 2004.

donc pour résumé, il faudrait d'abord checker l'année, si c'est inférieur ou égal, controle --> true, (si l'année est inférieure, on peut tout de suite arrêter) ensuite le mois, si c'est inférieur ou égal controle --> true et pour finir checker jour, si c'est inferieur, controle --> true.

Je ne pense pas que mon résonnement soit tout à fait correcte

 @ Darksidious,

Je ne peux pas utiliser cette fonction vue que je ne l'ai pas apprise à l'école, je dois donc utiliser les get, set et autres produits de la POO.

@+ et merci encore.

DD
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Pff, ca c'est bien les profs !

C'est bien de voir l'algorithmique, mais c'est également bien de prendre de bonnes habitudes dès le départ, et la bonne habitude, c'est de savoir où chercher pour faire ce qu'on veux faire au lieux de tout réinventer la poudre à chaque fois. Mais cà malheureusement, les profs ne nous le montre pas (en tout cas, pas mes profs !).

Que tu utilise un && ou des if imbriqués, tu aura le même résultat : Java optimise pour ne pas tout tester si une conditions n'est pas remplie de toute façon !

Donc si tu fait :If (true false && 1 / 0 0) ca ne plantera pas
Par contre, si tu fais :if (true false || 1 / 0 0) là ca plante !

Donc ton idée d'arrêter le test est bonne, mais c'est le compilateur de Java qui fera cette optimisation avec un && ce qui fait moins de code à lire, et surtout, rends le code bien plus compréhensible que 3 if imbriqués !
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
A et puis, pour ton problème de test qui ne marche pas, n'oublie pas de faire <= et non stritement inférieur ! :
public boolean estAnterieur(int annee,int mois,int jour)  {
    boolean controle=false;

    if( this.annee<=annee  && this. mois<=mois &&  this.jour<jour ) {
        controle = true;
    }
    return controle; 
}
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
Bon tant que j'y suis, plus court et plus élégant (en tout cas, plus standard) :

public boolean estAnterieur(int annee,int mois,int jour)  {
    if (this.annee <= annee && this.mois <= mois && this.jour < jour) {
        return true;
    }
    return false;
}
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Merci pour tes réponses Darksidious,

Pour ce qui est du <= j'y avais pensé car une date peut être inférieure dans une même année.

C'est intéressant d'apprendre que un if imbriqué et des && donne le même résultat, je ne le savais pas.

Par contre, si dans la classe "Annee" j'ai 2004,3,23 et que je lui envoie 2004,4,19, le code devrait me renvoyer True car l'année du constructeur est inférieure à 2004,4,19 mais il me renvoie quand même false.

Sais-tu pourquoi ?

Merci
 
if( this.annee<=annee  && this. mois<=mois &&  this.jour<jour ) {
        controle = true;
    }
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Merci pour cette solution Darksidious,

J'ai une question :

if( this.annee<annee) {
    return true;

Est-ce que ceal veut dire que si le constructeur cotnient 2004 et que j'envoie 2007, 2004 est inférieur à 2007, on renvoie true, est-ce que la fonction s'arrête ?

Merci pour tout !
Messages postés
332
Date d'inscription
mardi 12 juillet 2005
Statut
Membre
Dernière intervention
17 juillet 2010

Salut, je propose :
return (this.annee annee ?  (this.mois mois ?  this.jour < jour  : this.mois < mois) : this.annee < annee);




http://kysicurl.free.fr/
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Salut,

Comprends rien

Tu sais m'expliquer st'e plait ?

Merci
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Salut,

J'ai accepté la réponse car ce que Darksidious m'a communiqué est ce que j'avais besoin.

Je l'en remercie encore.

Bonne soirée.

DD
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
94
bah bien sûr que la fonction s'arrête : y'a un return !
Messages postés
332
Date d'inscription
mardi 12 juillet 2005
Statut
Membre
Dernière intervention
17 juillet 2010

en fait j'ai utlisé la structure : boolean ? valeur si vrai : valeur si faux.
exemple:int x ( true ? 2 : 3 ); // x 2int y (false ? 2 : 3 ); // y 3

et surtout, il est souvent interressant de faire
return i<2;
plutôt que :
if (i<2) return true;
else return false;
Donc en reprennantreturn (this.annee annee ?  (this.mois mois ?  this.jour < jour  : this.mois < mois) : this.annee < annee);
ça donne
if (this.anne == anne) {
    if (this.mois == mois) return this.jour < jour;
    else return this.mois < mois;
}
else return this.mois < mois;
Messages postés
332
Date d'inscription
mardi 12 juillet 2005
Statut
Membre
Dernière intervention
17 juillet 2010

mince, la dernière ligne est else return this.anne < annee; et nonreturn this.mois < mois;
http://kysicurl.free.fr/