IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Premier 0 d'un entier ignoré dans la variable.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Par défaut Premier 0 d'un entier ignoré dans la variable.
    Bonjour,

    Dans le cadre de ma formation au CNAM je dois coder un jeu de Mastermind en Java. Le programme est bien avancé mais j'ai détecté un problème lors de la saisie d'une proposition qui commence par un 0, ce dernier est ignoré. Hors le 0 fait partie des chiffres possibles.

    Voici le code qui demande la proposition à l'utilisateur. Y a t-il une solution pour que le premier 0 ne soit pas ignoré?

    Je peut poster le reste du programme si nécessaire.

    D'avance merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // demande de la proposition du joueur, la boucle permet de vérifier la saisie d'une chaine de 4 chiffres.
    	int saisie;
    	do {
    	        System.out.println("Saisissez votre proposition :");
    		saisie = sc.nextInt();
                    sc.nextLine();
     
     		if (String.valueOf(saisie).length() != nbChiffres) {
    		     System.out.println("La proposition doit etre une chaine de 4 chiffres");
    		}
    	} while (String.valueOf(saisie).length() != nbChiffres);
     
    	// transfert de la proposition dans un tableau d'integer
    	for (int i = 0; i < nbChiffres; i++) {
    		proposition[nbChiffres-1-i] = saisie % 10;
    		saisie = saisie/10;
    	}

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Hello,

    comme tu le sais peut-être, un int sert à stocker un nombre. Un nombre comme 8 ou 57, pas un texte comme "bonjour mamie". Un nombre.

    Un nombre qu'on peut donc additionner, multiplier, un nombre qui représente une quantité.

    Et donc, pourrais-tu s'il te plaît nous parler de qui a le plus de moutons dans son champ : Jean qui a 187 moutons ou Luc qui a 0187 moutons ?

    Comment ça aucun n'en a plus que l'autre ? Voyons c'est impossible, l'un des deux a quatre chiffres et l'autre en a trois !

    C'est impossible... Ou alors peut-être qu'il ne faut pas faire intervenir des nombres, quand un zéro au début est une information importante. Car une telle information importante ne peut évidemment pas être une quantité, donc pas un nombre. Donc pas un int.

    Utilise des String. Ce sont des représentations de texte arbitraire, qui font en sorte qu'un numéro de téléphone comme par 06 et non pas par 6.
    Ou qu'une combinaison de Mastermind soit 0187 et pas 187.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Par défaut
    Bonsoir.

    Merci pour ta réponse. En effet, je me doutais bien que le problème venait du fait que le 0 est non significatif.

    J'ai donc modifié mon code pour utiliser un String, pour le convertir en int je soustrait '0' (chiffre 0 mais en ASCII).

    Il y a surement plus élégant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    String saisie;
    int propSize;
    boolean tailleSaisieOk;
    boolean typeSaisieOk;
    do {
    	tailleSaisieOk = true;
    	typeSaisieOk = true;
     
    	System.out.println("Saisissez votre proposition :");
    	saisie = sc.nextLine();
     
    	if(saisie.length() != nbChiffres) {
                 tailleSaisieOk = false;
    	}
    	if (tailleSaisieOk) {		
     	      // transfert de la proposition dans un tableau d'entier
    	      for (int i = 0; i < nbChiffres; i++) {
    		      proposition[i] = (int) (saisie.charAt(i)-'0');
    		      if (proposition[i]<0 || proposition[i]>chiffreMax) {
    			      typeSaisieOk = false;
    		}
               }
    	}
     
    	//messages d'erreurs de saisie
    	if (!tailleSaisieOk) {
    		System.out.println("La proposition doit etre une chaine de " + nbChiffres + " chiffres");
    	}
    	if (!typeSaisieOk) {
    		System.out.println("Les chiffres proposés doivent être compris entre 0 et " + chiffreMax);
    	}		
    } while (tailleSaisieOk==false || typeSaisieOk==false);

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Ben est-il "naturel" de faire saisir 0 pour le premier? pourquoi ne pas commencer à 1? (du point de vue de l'utilisateur après tu passes à ta vision des index)

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 8
    Par défaut
    Bonsoir,

    Merci pour ta réponse.

    Comme je le dis dans mon premier message, il s'agit d'un exercice dans le cadre d'une formation au CNAM, et il est bien précisé que le 0 doit faire parti des chiffres possibles dans l’énoncé de cet exercice.

    Probablement que c'est pour nous mettre face à ce type de contrainte.

    En tout cas merci pour vos retours, le jeu semble fonctionner correctement.

    Alex

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Sans parler du fait qu'en Java un nombre qui commence par 0 est écrit en octal (base 8) et non pas en base 10...
    Ce qui veut dire aussi que Luc ne peut pas avoir 0187 moutons puisque 8 n'est pas un digit admis en base 8


    La solution consiste donc a stocker les propositions soit dans un tableau de int/short/char/byte, soit dans une chaîne de charactere.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par Tothemax Voir le message
    Il y a surement plus élégant ?
    Moi je ferais une méthode spécifique pour valider ce qui est tapé, et je ferais ça juste avec une regex.
    (D'accord une regex va obliger à compiler la regex à chaque fois, donc la solution proposée a une complexité d'utilisation de temps et mémoire moindres... Mais ce genre de considérations sont des micro-optimisations, sans intérêt lors de l'usage réel, et donc une perte de temps de la personne qui s'est chargée de le faire.)

    Citation Envoyé par bouye Voir le message
    Sans parler du fait qu'en Java un nombre qui commence par 0 est écrit en octal (base 8) et non pas en base 10...
    Vu que les nombres en question sont obtenus en lisant l'entrée standard avec un Scanner, pas tapés en dur dans le programme, ça ne me semble pas une observation très pertinente. Les Scanner et autres outils de lecture d'entrée utilisateurs, savent qu'un zéro en début de nombre, ça doit juste être ignoré et ce n'est pas la marque d'un nombre écrit en octal, et d'ailleurs c'est quoi l'octal ? Ce serait vraiment stupide et Java n'a pas ce genre de tares.

    L'écriture octale, c'est pour le programmeur qui choisit d'écrire dans son programme des nombres qui commencent par zéro. Le programmeur est censé savoir qu'il doit avoir une raison d'écrire des choses, notamment un zéro devant ses nombres. Et s'il se plante et qu'il ne savait pas et qu'il n'y a pas de raison de le punir pour autant, il aura tôt de détecter grâce à ses tests, que les choses ne marchent pas quand il met ce zéro qui n'avait aucune raison d'être là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#nextInt-int-
    public int nextInt(int radix)

    Scans the next token of the input as an int. This method will throw InputMismatchException if the next token cannot be translated into a valid int value as described below. If the translation is successful, the scanner advances past the input that matched.

    If the next token matches the Integer regular expression defined above then the token is converted into an int value as if by removing all locale specific prefixes, group separators, and locale specific suffixes, then mapping non-ASCII digits into ASCII digits via Character.digit, prepending a negative sign (-) if the locale specific negative prefixes and suffixes were present, and passing the resulting string to Integer.parseInt with the specified radix.

    Parameters:
    radix - the radix used to interpret the token as an int value

    Returns:
    the int scanned from the input

    Throws:
    InputMismatchException - if the next token does not match the Integer regular expression, or is out of range
    NoSuchElementException - if input is exhausted
    IllegalStateException - if this scanner is closed
    Bon, la n'est pas la question de toute maniere.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. valueChangeListener ignoré dans une subview
    Par faeder dans le forum JSF
    Réponses: 3
    Dernier message: 05/07/2007, 09h43
  2. [Requête_VBA_Access] Paramètre ignoré dans une requête
    Par Tari_calaelen dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/07/2007, 16h06
  3. [ALGO] décaler entiers nuls dans un tableau
    Par max__ dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 07/06/2006, 16h22
  4. Premiere occurence d'un entier dans une chaine
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h04
  5. Réponses: 16
    Dernier message: 03/03/2006, 20h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo