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

 C Discussion :

Calculer la factorielle d'un nombre en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut Calculer la factorielle d'un nombre en C
    Bonjour,

    Je débute dans le C, et je viens de faire un programme qui permet de calculer la factorielle d'un nombre en C.

    Le résultat qu'il m'affiche est toujours : "La factorielle de -1 est 0", et je faire ce programme avec une boucle for et while.

    Mais je ne suis parvenu qu'à celà et ça ne fonctionne pas très bien.

    Voici mon code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    void main () {
        int nb, factorielle;
    	nb = 0;
    	factorielle = 0;
        puts("ENTRER UN NOMBRE");
    	scanf("%d", &nb);
    	if (nb != 0)
    	{
    		factorielle = nb;
    		do {
    			nb = nb - 1;
    			factorielle = factorielle * nb;
    		}
    		while (nb > 1);
    	}
    	else
    	{
    		factorielle = 0;
    	}
     
    	printf("La factorielle de %d est : %d", nb, factorielle);
     
    	getch();
     
    }
    J'espère que vous pourrez m'aider.
    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    Ca y est, j'ai réussi.

    Mon programme fonctionne.

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    void main () {
        int nb, factorielle, n;
    	nb = 0;
    	factorielle = 0;
        puts("ENTRER UN NOMBRE");
    	scanf("%d", &nb);
    	if (nb != 0)
    	{
    		n = nb;
    		factorielle = nb;
    		do {
    			nb = nb - 1;
    			factorielle = factorielle * nb;
    		}
    		while (nb > 1);
    	}
    	else
    	{
    		n = 0;
    		factorielle = 0;
    	}
     
    	printf("La factorielle de %d est : %d", n, factorielle);
     
    	getch();
     
    }

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jeo,
    Citation Envoyé par planete.game57 Voir le message
    Mon programme fonctionne.
    Presque.

    Il renvoie 0 pour 0!, alors que 0! == 1 par définition.

    D'autre part, il vaudrait mieux créer une fonction qui se charge du calcul de la factorielle, plutôt que le faire dans le main.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Pourquoi utiliser un type int pour les variables factorielle et nb ?

    La factorielle d'un nombre négatif n'a pas de sens et le résultat est toujours positif

    De plus, le résultat de la factorielle va assez rapidement dépasser la capacité de stockage d'un simple int... il serait judicieux de prendre également en considération ce cas.

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Encore et toujours ce void main() .....

    Juste par curiosité, ou as tu appris le C ?
    Parce que ikuzar a fait la meme erreur et d'autre gens aussi la font. Or developpez n'a (a ma connaissance) jamais mis cette syntaxe et ce sont les principaux tutoriel pour debutant.

    Alors, as tu appris cette syntaxe sur internet (et dans ce cas, donne moi la source) ou est tu dans la meme classe qu'ikuzar ?
    Ou alors cette syntaxe est obligatoire sous certaine conditions (du style programmation sous PIC et j'en passe ...).


    Pour info, il y a deux syntaxe standart en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int argc, char *argv[])

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    Bonsoir à tous!

    Je suis désolé pour le délai de réponse, j'étais en cours.
    Je vous répond.

    @droggo

    Oui, effectivement, merci.
    J'ai corrigé.

    Par contre, comme je débute dans C, je veut bien utiliser une fonction si c'est mieux mais peux-tu m'expliquer exactement comment faire ??

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    int main () {
        int nb, factorielle, n;
    	nb = 0;
    	factorielle = 0;
        puts("ENTRER UN NOMBRE");
    	scanf("%d", &nb);
    	if (nb != 0)
    	{
    		n = nb;
    		factorielle = nb;
    		do {
    			nb = nb - 1;
    			factorielle = factorielle * nb;
    		}
    		while (nb > 1);
    	}
    	else
    	{
    		n = 0;
    		factorielle = 1;
    	}
     
    	printf("La factorielle de %d est : %d", n, factorielle);
     
    	getch();
     
    }
    Presque.

    Il renvoie 0 pour 0!, alors que 0! == 1 par définition.

    D'autre part, il vaudrait mieux créer une fonction qui se charge du calcul de la factorielle, plutôt que le faire dans le main.
    @Dut

    Oui tu a parfaitement raison, je débute
    D'après ce que j'ai appris, j'utilise donc un long int c'est ça?
    Sinon que dois-je utiliser ?

    Pour que les nombres négatifs soit pas pris en compte, comment faire?

    Pourquoi utiliser un type int pour les variables factorielle et nb ?

    La factorielle d'un nombre négatif n'a pas de sens et le résultat est toujours positif

    De plus, le résultat de la factorielle va assez rapidement dépasser la capacité de stockage d'un simple int... il serait judicieux de prendre également en considération ce cas.
    @SofEvans

    Je te donne 100% raison. Je t'explique pourquoi ce void main().

    Bien sur que sur votre site et que sur le SDZ, c'est int main et int main (int argc, char *argv[]).

    Mais le problème c'est qu'en cours, on utilise Microsoft Visual Studio, et là pas de bol mes profs utilise toujours le void main () car Microsoft en fait encore qu'à sa tête à ne respecter aucun standard comme pour Internet Explorer au passage ...
    Je n'en connais pas assez pour critiquer mais d'après ce que je voit, c'est un logiciel très lourd, plus long à installer qu'un OS!!! Il bombarde le PC de logiciels, quand on crée des projets c'est un désastre, 50 fichiers pour rien, et j'en parle pas plus.
    En cours on utilise ça mais je vous avoue que j'aime pas du TOUT.

    Chez moi j'utilise Code::Blocks et effectivement j'utilise int main et au moins Code::Blocks est très rapide d'installation, efficace, rapide, le top quoi!
    Je garde les bonnes manières chez moi.

    Par contre, ikuzar, je le connais pas. Je vais aller voir son post.
    Voilà tu sais tout de mon point de vue.

    Merci d'avance pour vos réponses.

    Encore et toujours ce void main() .....

    Juste par curiosité, ou as tu appris le C ?
    Parce que ikuzar a fait la meme erreur et d'autre gens aussi la font.

    Alors, as tu appris cette syntaxe sur internet (et dans ce cas, donne moi la source) ou est tu dans la meme classe qu'ikuzar ?
    Ou alors cette syntaxe est obligatoire sous certaine conditions (du style programmation sous PIC et j'en passe ...).


    Pour info, il y a deux syntaxe standart en C :

    Code :

    int main (int argc, char *argv[])

    Code :

    int main()

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par planete.game57 Voir le message
    @SofEvans

    Je te donne 100% raison. Je t'explique pourquoi ce void main().

    Bien sur que sur votre site et que sur le SDZ, c'est int main et int main (int argc, char *argv[]).

    Mais le problème c'est qu'en cours, on utilise Microsoft Visual Studio, et là pas de bol mes profs utilise toujours le void main () car Microsoft en fait encore qu'à sa tête à ne respecter aucun standard comme pour Internet Explorer au passage ...
    Je n'en connais pas assez pour critiquer mais d'après ce que je voit, c'est un logiciel très lourd, plus long à installer qu'un OS!!! Il bombarde le PC de logiciels, quand on crée des projets c'est un désastre, 50 fichiers pour rien, et j'en parle pas plus.
    En cours on utilise ça mais je vous avoue que j'aime pas du TOUT.

    Chez moi j'utilise Code::Blocks et effectivement j'utilise int main et au moins Code::Blocks est très rapide d'installation, efficace, rapide, le top quoi!
    Je garde les bonnes manières chez moi.

    Par contre, ikuzar, je le connais pas. Je vais aller voir son post.
    Voilà tu sais tout de mon point de vue.

    Merci d'avance pour vos réponses.

    Ah daccord !

    J'ai utilisé pendant un moment visual studio et il est vrai qu'a chaque creation de projet ... c'est 5 repertoire creer avec d'autres sous repertoire et plusieurs fichier créer a la volée (avec deux fichier DEBUG dont un lance l'appli).


    Encore une fois, ce sont les prof qui donne les mauvais exemple. Ce n'est pas pour jeter la pierre, j'en ai connu de tres bon comme de tres mauvais, mais des mauvaise habitudes sont souvent pris en cours.

    Pour ta fonction, tu peux faire quelque chose comme ceci :

    la fonction retourne la factorielle du nombre passer par valeur en argument. Le prototype donnerai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Factorielle (int nombre);

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    Voilà tu a tout compris!

    D'accord!

    Pour le int Factorielle (int nombre);
    je laisse mes 3 variables initialisés, et je met directement après dans le programme :
    int Factorielle (int nb) {
    ICI je met tous mon programme
    }

    C'est bien cela?

    Pour l'instant, ça va j'ai seulement une petite chose à faire mais là on va bientôt aborder les fonctions, donc ça sera plus simple pour moi.

    Si tu veux bien m'expliquer avec mon programme je veut bien sinon te casse pas la tête je vais le voir en cours, mais ça à pas l'air très compliqué.

    Sinon, petite question à part encore avec Visual Studio.
    J'ai toujours ces 2 erreurs pourtant j'ai bien tout taper correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Avertissement	1	warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	c:\users\planete game 57\desktop\ex tp3\ex 3-2.cpp	10
     
    Avertissement	2	warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.	c:\users\planete game 57\desktop\ex tp3\ex 3-2.cpp	29
    Au moins, Visual Studio arrêtera de m'enbêter avec ça si tu saurais me dire d'où ça vient mais getch et scanf sont bien mit correctement en code.

    Merci d'avance.
    Et je compte sur les 2 autres membres pour me répondre aussi.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    @Pouet_forever

    Ok merci!!! Merci d'avoir répondu aux 2 questions précédentes des 2 autres membres.

    Vous êtes très rapide, c'est impressionnant, je regarde ça d'ici peu et je fais en conséquence et vous propose ça.

    Merci!

  10. #10
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Pour le code de la factorielle tu peux t'appuyer sur ce code :

    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
     
    #include <stdio.h>
     
    int factorielle(int nb) {
    	int facto = 1;
    	/* Ton code ici */
    	return facto;
    }
     
    int main (void) {
        int nb, facto;
     
        puts("ENTRER UN NOMBRE");
    	scanf("%d", &nb);
     
    	facto = factorielle(nb);
     
    	printf("La factorielle de %d est : %d", nb, facto);
     
    	getchar();
    }

  11. #11
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Pour visual, c'est normal qu'ils te mette ces warning (et non error). Si tu veux encore avoir des warning, je crois bien qu'il va falloir que tu les supporte car je n'ai pas trouver de methode pour desactivé uniquement ceux la.

    Pour la fonction :

    L'ideal serait de faire quelque chose dans le main du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(void)
    {
        int nombre = 4;
        int resultat = Factorielle (nombre);
     
        printf ("Le resultat de %d! est %d.\n",nombre, resultat);
     
        return 0;
    }
    Apres, tu pourrais mettre un scanf pour 'nombre'.

    Ensuite, tu vois que tu appelle la fonction 'Factorielle' et que tu stocke le resultat de cette fonction dans un int. Donc, tu dois faire ceci au dessus du main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int Fatcorielle (int nombre)
    {
        int resultat;
        /* Le code permettant d'obtenir le factorielle de nombre qui sera stocker dans resultat */
        return resultat;
    }
    A noter que les variable resultat du main et de la fonction n'ont rien a voir, ils ne sont pas identique.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Par défaut
    @Pouet_forever,

    Je suis de retour.

    Alors pour int main(), sur le SDZ, on peut le laisser sans void même si ça ne renvoit aucun argument, je suis d'accord que mettre void c'est bien plus logique mais comme je fais d'habitude en ne mettant rien, pour les cours je vais rien faire, mais comme le prochain chapitre c'est les fonctions, dans ce cas là, il faudra être précis et logique je pense, merci de m'avoir prévenu!

    Par contre, getchar est censé attendre aussi, mais sous Visual Studio, je saisit mon nombre, et il ne me renvoi même pas la facto, il quitte dès que j'ai saisit le nombre, donc je suis obligé de garder getch.

    Je regarde pour modifier mon programme et te tient au courant d'ici 1 dizaine de minutes.

    Je regarde la réponse de SofEvans également.

    Merci @ vous en attendant!

  13. #13
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Pour les fonctions je te conseille de lire les tutos
    Celui du site par exemple : http://melem.developpez.com/langagec...age=demo#LII-B

    Sachant que la factorielle ne sera pas négative, tu peux déjà utiliser le type unsigned. Ensuite tu peux utiliser le unsigned long int voire même le unsigned long long int
    Pour faire une pause tu peux utiliser getchar() à la place de getc()

    Sinon pour une fonction sans argument (dont le main) on préférera cette écriture :

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

Discussions similaires

  1. Calculer le factorielle d'un nombre (Dev-C++)
    Par Matadox dans le forum Débuter
    Réponses: 9
    Dernier message: 03/02/2014, 00h51
  2. script samba qui calcule le factoriel d'un nombre entier
    Par miryam22 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/05/2008, 10h00
  3. Prog pour calculer la factorielle d'un nombre
    Par Lenezir dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 09h42
  4. Calcul de la factorielle d'un nombre naturel
    Par Sadgunner dans le forum Pascal
    Réponses: 9
    Dernier message: 20/06/2006, 21h56
  5. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00

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