daviddubois
Messages postés93Date d'inscriptionvendredi 19 mars 2004StatutMembreDernière intervention 6 janvier 2012
-
4 août 2007 à 20:36
cs_Kysic
Messages postés332Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention17 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.
fabulou
Messages postés12Date d'inscriptionlundi 15 mars 2004StatutMembreDerniè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;
daviddubois
Messages postés93Date d'inscriptionvendredi 19 mars 2004StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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 !
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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;
daviddubois
Messages postés93Date d'inscriptionvendredi 19 mars 2004StatutMembreDerniè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.
daviddubois
Messages postés93Date d'inscriptionvendredi 19 mars 2004StatutMembreDerniè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 ?
cs_Kysic
Messages postés332Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention17 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;