Structure conditionnelle - question

Résolu/Fermé
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 - Modifié par Vitaldix le 21/11/2012 à 20:40
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 21 nov. 2012 à 23:18
Bonjour,
j'ai les quelques lignes de codes suivantes extraites de mon programme :


System.out.println("Entrez un jour sous la forme JJ");
Scanner J = new Scanner(System.in);
byte JJ = J.nextByte();

if (JJ>31);
{
System.out.println("Veuillez ressaisir un jour");
Scanner nJ = new Scanner(System.in);
byte Nouveaujour = nJ.nextByte();
JJ = Nouveaujour;
}

Le problème c'est que, quelque soit mon JJ, ça me demande de ressaisir un jour.
Quelqu'un sait pourquoi ? Merci.

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 nov. 2012 à 20:50
Il ne faut pas mettre de point-virgule après le if.

Quelques remarques :
- il est inutile de déclarer plusieurs fois un Scanner sur System.in, on peut utiliser plusieurs fois le même
- ta variable NouveauJour ne sert à rien, tu peux directement affecter JJ
- au passage les noms de variables devraient commencer par des minuscules
- je ne vois pas l'intérêt d'avoir un byte ici, c'est un int dont tu as besoin

Et surtout : que se passe-t-il si ta deuxième saisie n'est toujours pas bonne ?
0
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 6
Modifié par Vitaldix le 21/11/2012 à 21:07
Ah oui ! ça me semble bizarre, il me semble que la dernière fois que j'avais fait ça, il se passait quelque chose de différent, une erreur a été signalée il me semble.

Concernant tes remarques :
-en fait, j'ai toujours fait comme je l'ai fait là, j'ai jamais essayé d'utiliser plusieurs fois le même. Bon pour l'instant, tant que ça marche je laisse comme ça, après pour l'améliorer au maximum j'essaierai de faire ça.

-je vois pas trop comment faire en fait...d'ailleurs sur ce point là, après j'aurai un problème puisque je vais devoir faire afficher le jour saisi (ainsi que mois et années) à la fin du programme...or là ma variable est déclarée juste dans mon "if", donc il va pas la reconnaître...comment faire pour la faire "sortir" de mon if ?

-est-ce que c'est important, ou c'est juste une convention ?

-un byte est moins lourd qu'un int non ? il y a pas besoin de taper 4995544 pour un jour ? et même si ça serait le cas, je compte rajouter des exceptions de toutes façons.


Je sais que ça ne va rien changer si la deuxième saisie n'est pas bonne, pour l'instant c'est juste un "test". Mais après je ferai
if (JJ>31)
{
while (true)
{
System.out.println("Veuillez ressaisir un jour");
Scanner nJ = new Scanner(System.in);
byte Nouveaujour = nJ.nextByte();
JJ = Nouveaujour;
if (JJ<31)
{ break; }

Merci.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 nov. 2012 à 21:14
"une erreur a été signalée il me semble."
Il y aura une erreur si tu mets un else derrière, parce qu'en fait le if est déjà terminé.

"j'ai toujours fait comme je l'ai fait là"
C'est une mauvaise habitude...

"ma variable est déclarée juste dans mon 'if'"
JJ est déjà déclarée en dehors, tu devrais t'en servir directement.

"est-ce que c'est important, ou c'est juste une convention"
Les conventions sont importantes !

"un byte est moins lourd qu'un int non ?"
Oui, mais ce n'est pas un entier, c'est la représentation d'un octet, si tu veux un entier court utilises les short mais ce n'est pas très pratique, de toute façon tu n'en es pas à optimiser ton code...
0
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 6
21 nov. 2012 à 21:24
Si ma variable change de valeur dans un "if" et seulement dans ce if, je peux récupérer cette nouvelle valeur en dehors de mon if ? Je ne vois pas comment :/
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 nov. 2012 à 21:29
L'objet est le même, si tu changes la valeur dans le if, la valeur sera changée partout !

Au lieu de faire :

byte Nouveaujour = nJ.nextByte();
JJ = Nouveaujour;

Tu devrais directement faire :

JJ = nJ.nextByte();
0
Vitaldix Messages postés 116 Date d'inscription vendredi 9 novembre 2012 Statut Membre Dernière intervention 18 août 2013 6
21 nov. 2012 à 21:37
D'accord, j'ai compris ! donc si je récapitule, tant que ma variable est déclarée à l'exterieur d'un if (ou d'une boucle), si sa valeur change dans un if (ou dans une boucle) elle le sera partout !
Donc c'est pour ça que ça marchait pas avant, car ma variable nouveaujour était une variable locale déclarée dans mon if, donc en dehors de celui-ci, la variable "n'existait plus".

Merci !


Au fait, est-ce que c'est possible, si je tape une année négative,
de convertir mon année en string
enlever le " - " devant l'année
pour ensuite ajouter "avant J-C" à la suite ?
Ou alors ce serait trop compliqué ?

Merci.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
21 nov. 2012 à 21:43
Bien sûr, tout est possible et c'est simple :

String strAnnee;
if (annee<0)
    strAnnee = String.valueOf(-annee)+" av. J.-C.";
else
   strAnnee = String.valueOf(annee);
0