Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2072 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Calculer le factorielle d'un nombre. // (Dev-C++)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calculer le factorielle d'un nombre. // (Dev-C++)

n°2218358
flixton
Posté le 02-02-2014 à 13:48:14  profilanswer
 

Bonjour tout le monde :
J'aimerai bien que vous me donnez un soutient pour pouvoir connaître ou j'ai commue l'erreur dans ce programme pour débutant.
Voila le code :  
#include <stdio.h>
#include <stdlib.h>
main()
{
int X,i,J,Fac;
printf (" Veuillez entrez une valeur : " );
scanf ("%d",&X);
if (X>0)  
 {for (i=2 ; i<X ; i++)
   Fac=X*(i);
   printf (" Le factorielle de %d est : %d ",X,Fac);
    }
else if(X==0)
    printf (" Le factorielle de %d est : 1\n ",X);
else
    printf(" Veuillez entrez un nombre posetive\n " );
system (" pause " );
}
Quand j'exécute le programme et je fais entrer les valeurs 1 et 2 et 3 il me donne la bon rep mais quand je saisie une valeur > 3 il me donne des faux rep.
Exp: Fact de 4=12 /// La rep vrait est 24  
Merci d'avance pour tous les gens qui veulent m'aidaient. (y)

mood
Publicité
Posté le 02-02-2014 à 13:48:14  profilanswer
 

n°2218362
Soileh
Lurkeur professionnel
Posté le 02-02-2014 à 14:22:06  profilanswer
 

:hello: !

 

Je vois 2 petites erreurs dans ton programme [:cupra] :

  • 1ère boucle for :
Code :
  1. for (i=2 ; i<X ; i++)


Ici, tu ne vas pas prendre en compte la dernière valeur de X.
ex. : si X=5, tu ne calculerais que jusqu'à la valeur 4.
Je mettrais cela à la place :

Code :
  1. for (i=2 ; i<=X ; i++)


  • Logique du calcul de la factorielle
Code :
  1. Fac=X*(i);


La factorielle est le calcul du produit des n premiers termes. Ici, tu ne calcules que le produit de 2 nombres : X qui est la dernière valeur de ta factorielle, et i qui est un nombre compris entre 2 et X-1 pour ton cas

Code :
  1. Fac=Fac*(i);


Et bien sûr, il faut aussi initialiser ta variable Fac à 1.

 

En espérant t'avoir aidé :jap:

 

Edit : ton programme ne tient pas compte non plus du cas X=1 on dirait :??: Je mettrais comme ça à la place :

Code :
  1. if( X > 1 )
  2. {
  3.     [...]
  4. }
  5. else
  6. {
  7.     [...]
  8. }


Message édité par Soileh le 02-02-2014 à 14:28:01

---------------
And in the end, the love you take is equal to the love you make
n°2218363
flixton
Posté le 02-02-2014 à 15:07:10  profilanswer
 

                                Merci beaucoup pour ton aide je suis totalement d'accord avec toi pour ce qui concerne le cas de X=1.Je l'est corrigé  :)  
Mais je vois que si je fait cette boucle : for (i=1 ; i<=X ; i++)  
                                                          Le programme va encore multiplier avec X une deuxième fois et ça je le vois comme une erreur. Exp  : Valeur=5 alors le prog va faire Fac= 5*5*4*3*2*1
Je te remercie aussi pour ta proposition : Fac=Fac*(i); Mais en vérité je connais cette astuce et je voulais essayer de faire autre chose. Mais il me semble que ça ne marchera pas :??:   :pfff:

n°2218366
Soileh
Lurkeur professionnel
Posté le 02-02-2014 à 15:33:46  profilanswer
 

flixton a écrit :

                                Merci beaucoup pour ton aide je suis totalement d'accord avec toi pour ce qui concerne le cas de X=1.Je l'est corrigé  :)  
Mais je vois que si je fait cette boucle : for (i=1 ; i<=X ; i++)
                                                          Le programme va encore multiplier avec X une deuxième fois et ça je le vois comme une erreur. Exp  : Valeur=5 alors le prog va faire Fac= 5*5*4*3*2*1
Je te remercie aussi pour ta proposition : Fac=Fac*(i); Mais en vérité je connais cette astuce et je voulais essayer de faire autre chose. Mais il me semble que ça ne marchera pas :??:   :pfff:


Si tu décomposes ta boucle, voici ce que tu obtiens :
Pour X = 5, ta boucle :

Code :
  1. for (i=1 ; i<=5 ; i++)


donne :

Code :
  1. Fac = 5 * 1;
  2. Fac = 5 * 2;
  3. Fac = 5 * 3;
  4. Fac = 5 * 4;
  5. Fac = 5 * 5;


Ce que je propose donne :

Code :
  1. Fac = Fac * 1;
  2. Fac = Fac * 1 * 2;
  3. Fac = Fac * 1 * 2 * 3;
  4. Fac = Fac * 1 * 2 * 3 * 4;
  5. Fac = Fac * 1 * 2 * 3 * 4 * 5;


Puis la boucle sort car i vaut 6 et est supérieure à 5.
Bien sûr, Fac aura initialement été initialisée à 1 au début du programme [:cupra]


Message édité par Soileh le 02-02-2014 à 15:36:03

---------------
And in the end, the love you take is equal to the love you make
n°2218367
gilou
Modérateur
Modzilla
Posté le 02-02-2014 à 15:42:47  profilanswer
 

L'initialisation n'est pas faite (Fac=1), et si tu fais une boucle for, ce serait avec: for (i=1 ; i<=X ; ++i) { Fac *= i;} qui marche pour X entier positif ou nul.
(on peut commencer la boucle a 2 et pas 1, mais ça rend l'algo moins lisible, pour une optimisation négligeable)
A+,


Message édité par gilou le 02-02-2014 à 15:44:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2218368
gilou
Modérateur
Modzilla
Posté le 02-02-2014 à 16:13:28  profilanswer
 

Noter aussi qu'une implémentation courante de la fonction utilise
 
int Fac2(int i, int j) {
    if (!j) return i;
    return Fac2(i*j, j-1);
}
 
et le fait que si X >= 0, Fac(X)  = Fac2(1, X);
5la forme de Fac2 permet de faire une optimisation (tail-recursion optimisation) qui évite les inconvénients des appels récursifs (pas d'accumulation de piles d'appel), tout en profitant de ses avantages.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2218404
flixton
Posté le 03-02-2014 à 00:40:46  profilanswer
 

Merci beaucoup mon ami, je n'oublierai jamais ton aide (Soileh, gilou)
J'ai compris l'erreur que j'ai commue grâce à un ami qui ma bien guidé, c'est presque comme ta mienne.(Soileh)
Voila toutes les étapes qui ma donné :
Dans ta boucle, tu fais: Fac=X* (i);
donc, si on exécute à la main pour X = 4:
pour i==1 : Fac = 4 * 1
pour i==2 : Fac = 4 * 2
pour i==3 : Fac = 4 * 3
 
A chaque fois, tu écrase la valeur précédente, donc c'est la dernière valeur qui est gardée (4 * 3).
Pour calculer ta factorielle, il te faut multiplier i par le calcul de valeur de la boucle précédente:
avant la boucle, tu dois mettre Fac = 1; (parce que sinon tu vas tout multiplier par 0, ce qui va faire 0 :)  )
Ensuite pour X = 4, il te faut faire 1 * 2 * 3 * 4 = (((1 * 2) * 3) * 4), entre parenthèses, c'est la valeur Fac de la boucle précédente.
pour i == 1: Fac = 1 * 1 = Fac * 1 = Fac * i
pour i == 2: Fac = 1 * 2 = Fac * 2 = Fac * i
pour i == 3: Fac = 2 * 3 = Fac * 3 = Fac * i
pour i == 4: Fac = 6 * 4 = Fac * 4 = Fac * i
Et pourtant j'ai pu refaire un nouveau code le voila :
#include <stdio.h>
#include <stdlib.h>
main()
{
int X,i,Fac;
printf (" Veuillez entrez une valeur : " );
scanf ("%d",&X);
Fac=1;
if (X>0)  
 {for (i=X ; i>=1 ; i--)
  Fac=Fac*(i);
   printf (" Le factorielle de %d est : %d ",X,Fac);
    }
else if (X==0)
    printf (" Le factorielle de %d est : 1\n ",X);
else
    printf(" Veuillez entrez un nombre posetive\n " );
system (" pause " );
}
Je remercie tous les gens qui m'ont ouvert la porte.  
A bientôt :mrgreen: :rose2:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Calculer le factorielle d'un nombre. // (Dev-C++)

 

Sujets relatifs
[C]Problème affichage Calendrier en C (débutant)[Résolu] A l'aide ! (C++ IA)
[C] tgetstr et tparmmini-projet en language C
[C/OpenGl] Entretien téléphoniqueWhile en C
Parc d'attraction en C[C++] Questions sur "new" et les arguments d'un constructeur
Aide pour un petit programme en CErreur compilation sur prog en C
Plus de sujets relatifs à : Calculer le factorielle d'un nombre. // (Dev-C++)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR