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

daviddubois 93 Messages postés vendredi 19 mars 2004Date d'inscription 6 janvier 2012 Dernière intervention - 4 août 2007 à 20:36 - Dernière réponse : cs_Kysic 332 Messages postés mardi 12 juillet 2005Date d'inscription 17 juillet 2010 Dernière intervention
- 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
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 5 août 2007 à 13:17
3
Merci
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

Merci cs_DARKSIDIOUS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
fabulou 12 Messages postés lundi 15 mars 2004Date d'inscription 4 août 2007 Dernière intervention - 4 août 2007 à 22:56
0
Merci
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
Commenter la réponse de fabulou
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 5 août 2007 à 08:33
0
Merci
pourquoi ne pas utiliser la fonction standard Before du GregorianCalendar ?
Commenter la réponse de cs_DARKSIDIOUS
daviddubois 93 Messages postés vendredi 19 mars 2004Date d'inscription 6 janvier 2012 Dernière intervention - 5 août 2007 à 10:52
0
Merci
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
Commenter la réponse de daviddubois
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 5 août 2007 à 11:20
0
Merci
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 !
Commenter la réponse de cs_DARKSIDIOUS
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 5 août 2007 à 11:21
0
Merci
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; 
}
Commenter la réponse de cs_DARKSIDIOUS
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 5 août 2007 à 11:22
0
Merci
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;
}
Commenter la réponse de cs_DARKSIDIOUS
daviddubois 93 Messages postés vendredi 19 mars 2004Date d'inscription 6 janvier 2012 Dernière intervention - 5 août 2007 à 12:47
0
Merci
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;
    }
Commenter la réponse de daviddubois
daviddubois 93 Messages postés vendredi 19 mars 2004Date d'inscription 6 janvier 2012 Dernière intervention - 5 août 2007 à 13:31
0
Merci
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 !
Commenter la réponse de daviddubois
cs_Kysic 332 Messages postés mardi 12 juillet 2005Date d'inscription 17 juillet 2010 Dernière intervention - 5 août 2007 à 18:18
0
Merci
Salut, je propose :
return (this.annee annee ?  (this.mois mois ?  this.jour < jour  : this.mois < mois) : this.annee < annee);




http://kysicurl.free.fr/
Commenter la réponse de cs_Kysic
daviddubois 93 Messages postés vendredi 19 mars 2004Date d'inscription 6 janvier 2012 Dernière intervention - 5 août 2007 à 19:10
0
Merci
Salut,

Comprends rien

Tu sais m'expliquer st'e plait ?

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.