Problème avec if imbriqués

Résolu
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012 - 4 août 2007 à 20:36
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010 - 5 août 2007 à 19:47
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

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 13:17
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
3
fabulou Messages postés 12 Date d'inscription lundi 15 mars 2004 Statut Membre Dernière intervention 4 août 2007
4 août 2007 à 22:56
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
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 08:33
pourquoi ne pas utiliser la fonction standard Before du GregorianCalendar ?
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
5 août 2007 à 10:52
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 11:20
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 !
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 11:21
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; 
}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 11:22
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;
}
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
5 août 2007 à 12:47
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;
    }
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
5 août 2007 à 13:31
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 !
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
5 août 2007 à 18:18
Salut, je propose :
return (this.annee annee ?  (this.mois mois ?  this.jour < jour  : this.mois < mois) : this.annee < annee);




http://kysicurl.free.fr/
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
5 août 2007 à 19:10
Salut,

Comprends rien

Tu sais m'expliquer st'e plait ?

Merci
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
5 août 2007 à 19:16
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
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 août 2007 à 19:42
bah bien sûr que la fonction s'arrête : y'a un return !
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
5 août 2007 à 19:46
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;
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
5 août 2007 à 19:47
mince, la dernière ligne est else return this.anne < annee; et nonreturn this.mois < mois;
http://kysicurl.free.fr/
0
Rejoignez-nous