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

avec Java Discussion :

Compréhension d'un code


Sujet :

avec Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut Compréhension d'un code
    Bonjour,

    Je débute en langage Java et je rame pas mal.

    Quelqu'un saurait-il me dire ce que fait le programme suivant ?
    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
    public class Mystere {
        public static void main(String[] args) {
     
            int n;
            String res = "";
     
            Terminal.ecrireString("Entrez un nombre positif : ");
            n = Terminal.lireInt();
            while (n > 0) {
                if (n % 2 == 0) {
                    res = '0' + res;
                } else {
                    res = '1' + res;
                }
                n = n / 2;
            }
            Terminal.ecrireStringln(res);
        }
    }
    Je comprends à peu près chaque ligne individuellement, mais je ne comprend pas le résultat obtenu après exécution.

    Les méthodes utilisées sont faites maison mais assez parlantes pour que ça reste compréhensible.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Bonjour,

    Je te donne 3 indices :
    • si tu regardes ton programme, tu verras que ta variable res ne peut contenir que des 0 ou des 1
    • ton algo ajoute un 1 à ta chaine chaque fois que le reste de la division par 2 n'est pas nul
    • ce que tu rentres et ce que tu as en retour, sont des écritures différentes d'une même valeur


    Nous sommes le 01/11 je t’enverrai la réponse avant le 02/11 si tu n'as pas trouvé

    Bonne réflexion,
    Développeur Java
    Site Web

  3. #3
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Que fait ton programme ?

    Tu lui rentres un nombre au format décimal et il le converti en binaire

    Bonne soirée
    Développeur Java
    Site Web

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton aide. Par contre je ne comprends pas deux chose :

    -Pourquoi affecte on "" à la variable res ?
    -A quoi sert la ligne n=n/2 ?

    Merci d'avance.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Rhylsadar Voir le message
    -Pourquoi affecte on "" à la variable res ?
    Pour ne pas avoir de NullPointerException lors de la première concaténation dans la boucle.
    Citation Envoyé par Rhylsadar Voir le message
    -A quoi sert la ligne n=n/2 ?
    A diviser n par deux.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    A diviser n par deux.
    Mais pourquoi divise t on n par 2 ?

    Edit : je viens de comprendre

    Un grand merci à tous les deux.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    J'ai un autre soucis (beaucoup d'autres ) je profite donc de mon post pour continuer à vous poser des questions.
    Le programme suivant demande à l'utilisateur d'entrer 2 nombres entiers et de choisir quelle opération il veut effectuer.
    Après saisie le calcul doit être effectué et le résultat affiché.
    En ligne 35 mon compilateur me dit que la variable "res" n'a pas été initialisée et le programme ne s’exécute pas du tout.
    J'ai essayé pas mal de chose mais rien n'y fait et j'ai les yeux qui piquent Merci d'avance.




    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
    34
    35
    36
    public class Operation {
    	public static void main(String[] args) {
    		int a, b, res;
    		String c = "";
    		boolean test = false;
     
    		Terminal.ecrireStringln("Veuillez entrer un nombre entier: ");
    		a = Terminal.lireInt();
    		Terminal.ecrireStringln("Puis un autre: ");
    		b = Terminal.lireInt();
     
    		while (test == false) {
    			Terminal.ecrireString("Quelle opération souhaitez vous effectuer (entrez un opérateur ) : ");
    			c = Terminal.lireString();
    			if (c == "+" || c == "-" || c == "*" || c == "/") {
    				test = true;
    			} else {
    				test = false;
     
    			}
    		}
     
    		if (c == "+") {
    			res = a + b;
    		} else if (c == "-") {
    			res = a - b;
    		} else if (c == "*") {
    			res = a * b;
    		} else if (c == "/") {
    			res = a / b;
    		} 
     
    		Terminal.ecrireIntln(res);
    	}
     
    }

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le compilateur n'est pas assez malin pour découvrir qu'à cause de ceci dans ton while

    (c == "+" || c == "-" || c == "*" || c == "/")


    c ne peux pas valoir autre chose. Du coup, il se plaint que si c n'est pas à une de ces valeurs (cf le if/the/else avant l'affichage), res ne recevra aucune valeur. Et en java une varialbe doit toujours être initialisé avant d'être utilisée.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Le compilateur n'est pas assez malin pour découvrir qu'à cause de ceci dans ton while

    (c == "+" || c == "-" || c == "*" || c == "/")


    c ne peux pas valoir autre chose. Du coup, il se plaint que si c n'est pas à une de ces valeurs (cf le if/the/else avant l'affichage), res ne recevra aucune valeur. Et en java une varialbe doit toujours être initialisé avant d'être utilisée.
    Ok, mais comment puis je initialiser res ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 458
    Points
    458
    Par défaut
    En lui affectant une valeur par défaut, par exemple lors de sa déclaration.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par EyZox Voir le message
    En lui affectant une valeur par défaut, par exemple lors de sa déclaration.
    J'ai essayé avec 0 et 1 mais dans ce cas le résultat final de l'opération me renvoi 0 ou 1... Je pense qu'il y a une erreur quelque part mais où ?

  12. #12
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    Si tu es débutant, je ne saurais trop te conseiller d’adopter la démarche inverse de ce que tu fais.
    Plutôt que de chercher à comprendre un code source essaie de développer en java d’après un cahier des charges avec ta propre logique de programmation.

    C’est un peu comme en maths, pour bien comprendre ton cours tu dois faire des exos toi même et non lire ce qu'a fait un autre.

    Bon courage
    Développeur Java
    Site Web

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par autran Voir le message
    Si tu es débutant, je ne saurais trop te conseiller d’adopter la démarche inverse de ce que tu fais.
    Plutôt que de chercher à comprendre un code source essaie de développer en java d’après un cahier des charges avec ta propre logique de programmation.

    C’est un peu comme en maths, pour bien comprendre ton cours tu dois faire des exos toi même et non lire ce qu'a fait un autre.

    Bon courage
    Je suis d'accord avec toi mais j'ai écrit le second programme moi même à partir d'un énoncé mais visiblement ça ne fonctionne pas

  14. #14
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,
    Citation Envoyé par Rhylsadar Voir le message
    J'ai essayé avec 0 et 1 mais dans ce cas le résultat final de l'opération me renvoi 0 ou 1... Je pense qu'il y a une erreur quelque part mais où ?
    en debugant tu va très vite t'appercevoir que aucun de tes tests de comparaison de chaine ne fonctionne, d'ou le fait qu'il te retourne la valeur d'initialisation de res !
    et donc tu dois te demander pourquoi ?
    tous simplement parcequ'on ne compare pas la valeur d'une chaine avec "==" mais en faisant "ma chaine".equals(maVariable)
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 458
    Points
    458
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    bonjour,


    en debugant tu va très vite t'appercevoir que aucun de tes tests de comparaison de chaine ne fonctionne, d'ou le fait qu'il te retourne la valeur d'initialisation de res !
    et donc tu dois te demander pourquoi ?
    tous simplement parcequ'on ne compare pas la valeur d'une chaine avec "==" mais en faisant "ma chaine".equals(maVariable)
    C'est ce que je me suis dis, mais dans ce cas, il devrait rester coincé dans sa boucle while(test == false) non ?
    Apparemment ce n'est pas le cas puisqu'il obtient un résultat. Est ce du a une subtilité de Java que je ne connais pas encore ?

    Dans tout les cas, c'est mieux d'utiliser equals().
    == peut marcher dans certains cas sur les String et les wrapper du style Integer, Boolean, Long etc.. , mais c'est assez hasardeux et vu que tu débutes, t'expliquer pourquoi risque de t'embrouiller plus qu'autre chose.

    PS : Même si ça n'a rien a voir avec ton problème, tu as une condition en double.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Rhylsadar Voir le message
    J'ai essayé avec 0 et 1 mais dans ce cas le résultat final de l'opération me renvoi 0 ou 1... Je pense qu'il y a une erreur quelque part mais où ?
    Montre le code modifié.

  17. #17
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par EyZox Voir le message
    C'est ce que je me suis dis, mais dans ce cas, il devrait rester coincé dans sa boucle while(test == false) non ?
    Apparemment ce n'est pas le cas puisqu'il obtient un résultat. Est ce du a une subtilité de Java que je ne connais pas encore ?

    Dans tout les cas, c'est mieux d'utiliser equals().
    == peut marcher dans certains cas sur les String et les wrapper du style Integer, Boolean, Long etc.. , mais c'est assez hasardeux et vu que tu débutes, t'expliquer pourquoi risque de t'embrouiller plus qu'autre chose.
    Visiblement tu ne métrises pas non plus le sujet !
    le == peut être utilisé pour les comparaison entre valeur primitive (int, long, char...), on peux l'utiliser pour comparer des références d'objets (cela compare la référence pas le contenu de l'objet)
    String est une class (ainsi que les wrapper des types primitifs) pas un primitif, par conséquent comme pour toutes les instances d'objet il faut utiliser la méthode equals() pour comparer la/les valeur(s) d'instance.

    Il n'y a donc rien de hasardeux et rien de bien compliqué !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Rédacteur

    Avatar de autran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2015
    Messages
    1 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 1 241
    Points : 7 653
    Points
    7 653
    Billets dans le blog
    55
    Par défaut
    OK, trêve de théorie fumeuse
    essaye ça, c'est court et ça marche
    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
    switch (c)
    {
    	case "+":
    	        res = a + b;
    	        break;
    	case "-":
    		res = a - b;
    	        break;
    	case "*":
    		res = a * b;
    		break;
    	case "/":
    		res = a / b;
    		break;
    }
    Développeur Java
    Site Web

  19. #19
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par autran Voir le message
    OK, trêve de théorie fumeuse
    Ce ne sont pas des théories fumeuses !
    Je pense qu'il est important quand quelqu'un écrit "== peut marcher dans certains cas sur les String et les wrapper du style Integer, Boolean, Long etc.. , mais c'est assez hasardeux" d'expliquer car tu sera d'accord avec moi, mais un débutant qui lit ça ne comprendra pas pourquoi ce qu'il écrit ne fonctionne pas !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2013
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2013
    Messages : 191
    Points : 458
    Points
    458
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    Visiblement tu ne métrises pas non plus le sujet !
    le == peut être utilisé pour les comparaison entre valeur primitive (int, long, char...), on peux l'utiliser pour comparer des références d'objets (cela compare la référence pas le contenu de l'objet)
    String est une class (ainsi que les wrapper des types primitifs) pas un primitif, par conséquent comme pour toutes les instances d'objet il faut utiliser la méthode equals() pour comparer la/les valeur(s) d'instance.

    Il n'y a donc rien de hasardeux et rien de bien compliqué !
    Il me semble qu'il y a un pool de Integer, un pool de String etc ... donc les objets ne sont pas forcément ré-instancié, non ?
    Donc si "c" et "c" représente le même String en pool, == fonctionne puisque même référence mais on ne maitrise pas le pool.

    Un débutant n'a pas besoin de comprendre pourquoi, il a juste besoin de le savoir.

    un débutant qui lit ça ne comprendra pas pourquoi ce qu'il écrit ne fonctionne pas !
    Je vais te répondre exactement l'inverse, si on lui que == ne marche jamais sur les String : "un débutant qui lit ça ne comprendra pas pourquoi ce qu'il écrit fonctionne !"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. J'ai un probleme tres coriace I need help
    Par red1kissi dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/06/2006, 08h29
  2. Panier virtuel need Help!!
    Par louli_computing dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 12/06/2006, 13h53
  3. Récupération xml récalcitrante edit : need help
    Par InDaWinD dans le forum Général Python
    Réponses: 3
    Dernier message: 14/04/2006, 11h28
  4. Need help pour installer upgrade linux Debian
    Par jejerome dans le forum Administration système
    Réponses: 2
    Dernier message: 26/03/2006, 19h26
  5. need help pour : boucle & expression régulière
    Par Fabouney dans le forum Langage
    Réponses: 5
    Dernier message: 05/08/2005, 02h22

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