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 :

Pourquoi le programme ne marche pas ?


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut Pourquoi le programme ne marche pas ?
    Salut à tous,
    J'ai un petit soucis avec le programme ci-dessus. Je cherche à déterminer un indice qui correspond à une valeur donnée de la suite numerique (w(n)) de premier terme w(0)=1 et d'expression generale w(n)= (n+1)*w/n+1/n.Le programme marche quand l=1, quand l=3, et ne marche pas quand l=5. pour l=5, le programme ne me donne pas la valeur de n. Il se plante en fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Ex115p46 {
        static void  w(){
            double w=1;
            int n=0;
            System.out.println("Saisir l impaire:");
            int l=Clavier.lireInt();	  
            while(w!=l){
                n=n+1;
                w=(n+1)*w/n+1/n;
    	}
    	System.out.println("la valeur de n est:"+n);
        }
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Bonjour,

    Est ce que tu as vérifié si la condition d'arrêt de la boucle while était parfois vrai.
    Essaies de noter le déroulement de la boucle sur papier, et voir si la valeur de w peut être égale à 5 à un moment.
    Je n'ai pas fait tourner ton programme alors je fais peut être fausse route...

    A+.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par eric39 Voir le message
    Bonjour,

    Est ce que tu as vérifié si la condition d'arrêt de la boucle while était parfois vrai.
    Essaies de noter le déroulement de la boucle sur papier, et voir si la valeur de w peut être égale à 5 à un moment.
    Je n'ai pas fait tourner ton programme alors je fais peut être fausse route...

    A+.
    Bonjour eric,

    oui j'ai regardé ça. En fait cette suite numérique ne prend que des valeurs impaires. Sur papier ça marche bien avec la valeur 5.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    OK,
    Si pour toi le résultat est correct sur papier, c'est que tu ne prends pas en compte l'utilisation du symbole "/" en java avec une variable de type int. Cette opération donne le résultat de la division euclidienne soir une division entière.
    Tu devrais déclarer la variable n en tant que double.

    Tu as alors:
    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
     
    1 tour
    1!=5
    n=1
    w=(1+1)*1/1+1/1 =>3
     
    2 tour
    3!=5
    n=2
    w=(2+1)*3/2+1/2 =>4.5
     
    3 tour
    4.5!=5
    n=3
    w=6.0
    donc jamais 5...
    A+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par eric39 Voir le message
    OK,
    Si pour toi le résultat est correct sur papier, c'est que tu ne prends pas en compte l'utilisation du symbole "/" en java avec une variable de type int. Cette opération donne le résultat de la division euclidienne soir une division entière.
    Tu devrais déclarer la variable n en tant que double.

    Tu as alors:
    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
     
    1 tour
    1!=5
    n=1
    w=(1+1)*1/1+1/1 =>3
     
    2 tour
    3!=5
    n=2
    w=(2+1)*3/2+1/2 =>4.5
     
    3 tour
    4.5!=5
    n=3
    w=6.0
    donc jamais 5...
    A+
    Merci eric, effectivement le problème résidait sur ce que tu as su dénicher.
    Si je comprends bien l'opérateur / appliqué aux entiers par exemple: 11/2 ne me donnera pas 5.5 mais juste 5 ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Oui c'est ça:
    Essaies le code suivant, tu verras le résultat directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            int a = 2;
            System.out.println("Division entière: " + (11/a));
     
            double b = 2;
            System.out.println("Division: " + (11/b));
    A+

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par eric39 Voir le message
    Oui c'est ça:
    Essaies le code suivant, tu verras le résultat directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            int a = 2;
            System.out.println("Division entière: " + (11/a));
     
            double b = 2;
            System.out.println("Division: " + (11/b));
    A+
    oui effectivement tu as raison.
    le premier affiche 5
    le deuxieme affiche 5.5

    si je comprends bien dans le premier cas le fait que 2 est un entier, le compilateur considère que 11 est aussi un entier.Ainsi on a une division entiere.
    Et dans le deuxieme cas le fait que b est un double le compilateur considère que 11 est un double. Ainsi on a une division double.

    Est-ce qu'il n' yavait pas moyen de faire un cast sur l'expression de w?

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Fait plustot un cast sur Clavier.lireInt(); et met le n en double.

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Oui, tu peux aussi faire un cast pour utiliser n en tant que double, directement dans le calcul de w.

    Mais je pense qu'il est plus simple de déclarer n en double...

    A+

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Catsoumoto Voir le message
    Fait plustot un cast sur Clavier.lireInt(); et met le n en double.
    En faisant (double) Clavier.lireInt(), je transforme en fait l en double. Et w étant déjà un double quand je fais while( w!=l) en fait je compare deux valeurs doubles. Mais quand je ne convertis pas l en double c'est-àdire quand je laisse l entier, le programme marche aussi.C'est comme si le compilateur arrive à comparer un entier avec un double. Vous en pensez quoi?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par eric39 Voir le message
    Oui, tu peux aussi faire un cast pour utiliser n en tant que double, directement dans le calcul de w.

    Mais je pense qu'il est plus simple de déclarer n en double...

    A+
    Je pense aussi que c'est plus simple de déclarer n en double. Car quand je fais:

    w=((double)n+1)*w+1/n ça ne marche pas.ça continue à se planter pour l=5. je vais essayer de voir pourquoi il se plante

  12. #12
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Il plante parce que les cas de division par 'n' de ta formule de calcul ne sont pas castés en double. Tu dois surtout faire les cast dans le cas des divisions par 'n'.

    A+

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par eric39 Voir le message
    Il plante parce que les cas de division par 'n' de ta formule de calcul ne sont pas castés en double. Tu dois surtout faire les cast dans le cas des divisions par 'n'.

    A+

    oui c'est vrai eric,
    j'ai omis de faire le cast sur le n de 1/n
    donc on a:

    w=((double) n+1)*w+1/(double)n
    et ça marche.

    merci beaucoup eric

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Ce que je veux comprendre maintenant est de savoir:
    quand je fais while( w!=l), w est en double et l est un entier. Le programme tourne sans problème.
    Et quand je fais (double) Clavier.lireInt(), je convertis en fait l en double.Et le programme compare deux doubles. là aussi ça marche

    Finalement java peut comparer un entier avec un double?

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Je suis aller un peux vite je pensais que Clavier.lireInt() initialisé n dsl.

    Mais sinon le compilateur fait un cast tous seul du Int en Double et donc peux comparer l et w.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par Catsoumoto Voir le message
    Je suis aller un peux vite je pensais que Clavier.lireInt() initialisé n dsl.

    Mais sinon le compilateur fait un cast tous seul du Int en Double et donc peux comparer l et w.
    Merci Catsoumoto pour ta réponse!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pourquoi ma fonction ne marche pas?
    Par isma92 dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 30/01/2007, 15h22
  2. Sos mon programme ne marche pas
    Par monalisa_dulouvre dans le forum C
    Réponses: 49
    Dernier message: 26/12/2006, 19h35
  3. Réponses: 4
    Dernier message: 09/09/2006, 22h48
  4. Pourquoi mon script ne marche pas?
    Par amarcil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/05/2006, 22h37
  5. Pourquoi ce trigger ne marche pas ??
    Par Le Basque dans le forum Développement
    Réponses: 4
    Dernier message: 20/09/2004, 16h46

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