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 :

mon programme donne une valeur fausse


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut mon programme donne une valeur fausse
    mon programme donne une valeur fausse !
    j'ai ecrit un programme qui demande à l' utilisateur de saisir deux entiers positifs non nuls p et n. p étant bien sûr inférieur à n. Puis le programme affiche la combinaison de p dans n.

    voilà la formule
    n!/p! * (n-p)!

    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
     
    package Mesessaies; 
    import java.util.Scanner; 
    public class exercice1 
    { 
    public static void main (String []args) 
    { 
    int p,n; int factorielp=1,factorieln=1,factorieln_p=1; 
    Scanner sc=new Scanner(System.in); 
    System.out.print("entrez un nb entier non nul p:"); 
    p=sc.nextInt(); 
    System.out.print("entrez un nb entier non nul supérieur à p:"); 
    Scanner sc1=new Scanner(System.in); 
    n=sc.nextInt(); 
    for(int i=1; i<=n; i++) 
    { 
    factorielp+=i; 
    } 
    for (int i=1; i<=n;i++) 
    { 
    factorieln+=i; 
    } 
    int n_p=n-p; 
    for (int i=1; i<=n_p; i++) 
    { 
    factorieln_p +=i; 
    } 
    int combinaison=(factorieln)/(factorielp)*(factorieln_p); 
    System.out.println( "valeur combinaison="+combinaison) ; 
    } 
    }
    resultat
    entrez un nb entier non nul p:3
    entrez un nb entier non nul n supérieur à p:9
    valeur de combinaison =:22

    après la forumule, valeur de combinaison doit être 18 mais le prg trouve 22
    n/p*(n-p)
    9/3*(9-3)
    3*6=18

    Où est ce que je fais erreur ? veuillez m’expliquez s’il vous plaît

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par domxaline Voir le message
    après la forumule, valeur de combinaison doit être 18 mais le prg trouve 22
    n/p*(n-p)
    9/3*(9-3)
    3*6=18
    C'est normal que tu ne calcules pas les factoriels ???

    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    explique toi,s'il te plaît

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ben, dans la formule et le code source que tu donnes, tu calcules des factorielles, mais on ne les retrouves pas dans ton calcul "à la main"...

    a++

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    si je corrige mon programme comme ça !!

    {
    factorielp*=i;
    }

  6. #6
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    tu devrais écrire une méthode à part pour te calculer les factorielles, ça serait plus facile pour toi de tester ...

    De plus, il me semble que "qui dit factorielle dit récursivité". Mais en même temps ça ne change pas grand chose ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par domxaline Voir le message
    si je corrige mon programme comme ça !!

    {
    factorielp*=i;
    }
    Oui déjà la factorielle utilise la multiplication et non pas l'addition...


    Mais l'erreur est surtout dans ton calcul manuel : lorsque tu vérifies le résultat tu ne calcules pas les factorielles !


    a++

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Noe,
    Citation Envoyé par in Voir le message
    tu devrais écrire une méthode à part pour te calculer les factorielles, ça serait plus facile pour toi de tester ...

    De plus, il me semble que "qui dit factorielle dit récursivité". Mais en même temps ça ne change pas grand chose ...
    Bien que ce soit une habitude dans les cours, la factorielle est un des très mauvais exemples d'utilisation de la récursivité.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    j'ecris ainsi

    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
     package Mesessaies;
    import java.util.Scanner;
    public class exercice1 
    {
      public static void main (String []args)
      {
    	    int p,n; int factorielp=1,factorieln=1,factorieln_p=1;
    	    Scanner sc=new Scanner(System.in);
    	    System.out.print("entrez un nb entier non nul p:");
    	    p=sc.nextInt();
    	    System.out.print("entrez un nb entier non nul n supérieur à p:");
    	    Scanner sc1=new Scanner(System.in);
    	    n=sc.nextInt();
    	    for(int i=1; i<=n; i++)
    	      {
    	 	   factorielp=i*factorielp;
    	      }
    	    for (int i=1; i<=n;i++)
    	      {
    	 	   factorieln=i*factorieln;
    	      }
    	    int n_p=n-p;
    	    for (int i=1; i<=n_p; i++)
    	      {
    	 	   factorieln_p +=i;
    	      }
    resultat
    entrez un nb entier non nul p:2
    entrez un nb entier non nul n supérieur à p:6
    valeur de combinaison =:11

    valeur combinaison est 11 au lieu de 12

  10. #10
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par droggo Voir le message
    Bien que ce soit une habitude dans les cours, la factorielle est un des très mauvais exemples d'utilisation de la récursivité.
    Ouais, c'est bien ce que je me disais
    Je ne sais pas pourquoi j'ai ajouté ce commentaire ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par domxaline Voir le message
    entrez un nb entier non nul p:2
    entrez un nb entier non nul n supérieur à p:6
    valeur de combinaison =:11
    valeur combinaison est 11 au lieu de 12
    Alors, avant de commencer à débugguer ton programme, il va falloir commencer par débugguer ton calcul...
    En effet, pour p=2 et n=6, alors (n!*(n-p)!)/p!=(6!*4!)/2!=(6*5*4*3*2*4*3*2)/2=8640.
    Si déjà tu n'arrives pas à décomposer le calcul sur une feuille de papier, c'est sûr que tu vas avoir du mal à l'implémenter...

    Sinon, dans ton programme :
    - tu utilises un "n" à la place de "p" dans la première boucle
    - tu utilises "+" à la place de "*" dans la troisième boucle
    Tu ferais mieux de factoriser ton code : écris une fonction int factorielle(int k) qui renvoie k!, teste-la, puis utilise-la dans le reste du code au lieu de réécrire trois fois la même boucle avec des erreurs de copier-coller...

    Remarque : en fait je ne fais que répéter ce que les autres avaient dit avant moi... Est-ce que tu lis les réponses qu'on te donne ?

  12. #12
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par in Voir le message
    Ouais, c'est bien ce que je me disais
    Je ne sais pas pourquoi j'ai ajouté ce commentaire ...
    Tout algorithme récursif peut toujours être écrit en itératif... Et il s'y révèle généralement bien plus performant


    Citation Envoyé par in Voir le message
    tu devrais écrire une méthode à part pour te calculer les factorielles, ça serait plus facile pour toi de tester ...
    +1

    domxaline: Sur tes 3 calculs de factoriel il n'y en a qu'un qui est juste...
    Sur le premier tu itères sur le mauvais éléments, et sur le dernier tu continues à additionner les valeurs...


    Citation Envoyé par domxaline Voir le message
    resultat
    entrez un nb entier non nul p:2
    entrez un nb entier non nul n supérieur à p:6
    valeur de combinaison =:11
    Et les factorielles elles sont passé où ? Encore une fois tu ne les calcules pas !

    n!/p! * (n-p)!
    6!/2! * (6-2)!
    (1*2*3*4*5*6)/(1*2) * (1*2*3*4)
    720/2 * 24
    8640


    a++

    [edit] Bon ben bien grillé sur ce coup là !!!

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    excuse moi, peux tu m'ecrire mon programme complet avec la correction
    s'il te plaît
    je suis dans les nuages,merci beaucoup

  14. #14
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par domxaline Voir le message
    excuse moi, peux tu m'ecrire mon programme complet avec la correction
    s'il te plaît
    je suis dans les nuages,merci beaucoup
    Je demande d'abord à mes collègues de faire mon boulot et si ils veulent bien alors je fais le tien ...

    On t'as donné toutes les pistes nécessaires et ce n'est vraiment pas compliqué à finir. Fais quelques efforts, ça te sera utile pour l'avenir.
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    peux tu corriger simplement cette partie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for(int i=1; i<=n; i++) 
    { 
    factorielp+=i; 
    } 
    for (int i=1; i<=n;i++) 
    { 
    factorieln+=i; 
    } 
    int n_p=n-p; 
    for (int i=1; i<=n_p; i++) 
    { 
    factorieln_p +=i; 
    }

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Points : 909
    Points
    909
    Par défaut
    Je me répète, mais :
    Citation Envoyé par Astartee Voir le message
    Est-ce que tu lis les réponses qu'on te donne ?
    Ton programme on est déjà 2 ou 3 à te l'avoir corrigé...

  17. #17
    Membre régulier
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Points : 74
    Points
    74
    Par défaut
    Et si dans les boucles for tu mets "i<..." au lieu de "i<=...", c'est pas mieux?

    Oups... Je viens de voir la dernière réponse. Finalement, le problème est résolu ou pas?

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 245
    Points : 347
    Points
    347
    Par défaut
    Citation Envoyé par adiGuba Voir le message

    n!/p! * (n-p)!
    6!/2! * (6-2)!
    (1*2*3*4*5*6)/(1*2) * (1*2*3*4)
    720/2 * 24
    8640
    juste au passage
    k parmi n = n!/(k!(n-k)!)

    donc 2 parmi 6 =6!/(2!*4!)=15 ^^

    Tu trouvais pas que 8640 possibilités était un peu bcp ??

    Sinon pour en revenir au problème il est souvent nécessaire de sortir la tête du code et de poser à plat sur papier le problème et le code ne sera que plus facile.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/12/2010, 10h33
  2. Lancer mon programme dans une console, en dehors d'Eclipse.
    Par Pierre8r dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 10/10/2008, 20h14
  3. Comment protéger mon programme contre une copie ?
    Par bolanoy dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2008, 17h11
  4. Lien qui donne une valeur à une variable
    Par marie4449 dans le forum Langage
    Réponses: 1
    Dernier message: 10/04/2007, 13h08
  5. TINYINT [M] _ pourquoi donné une valeur à M ?
    Par sportBlond dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 31/08/2006, 12h45

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