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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    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 316
    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 316
    Points : 52 948
    Points
    52 948
    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 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    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 éclairé
    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
    Points : 842
    Points
    842
    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 :

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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!

  11. #11
    Membre éclairé
    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
    Points : 842
    Points
    842
    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();
    }

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    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.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    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!

  14. #14
    Membre éclairé
    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
    Points : 842
    Points
    842
    Par défaut
    Oui c'est parce que le buffer n'est pas vide
    Essaye avec ça

    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
     
    #include <stdio.h>
     
    void clrBuff(void) {
    	int c;
    	while ((c=getchar()) != '\n' && c != EOF);
    }
     
    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);
    	clrBuff();
     
    	facto = factorielle(nb);
     
    	printf("La factorielle de %d est : %d", nb, facto);
     
    	getchar();
    }

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    OK, d'accord, oui car avant ça fonctionnait, je fais le programme, et vous me dites ce qu'il en est.
    A tout de suite

    PS : Par contre, je veut essayer de le faire simplement, c'est pas encore de mon niveau les clrbuf ... mais ça va bientôt arriver, même les fonctions on a pas encore fait.

    Donc voici mon programme à l'heure actuelle qui à l'air de bien fonctionner.
    Dit moi ce que tu en pense.

    C'est OK?

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    int main() {
        unsigned int nb, factorielle, n;
    	nb = 0;
    	factorielle = 0;
        puts("ENTRER UN NOMBRE POSITIF POUR CONNAITRE SA FACTORIELLE");
    	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();
     
    }
    Merci

    PS : Il me plait comme ça, comme j'ai réussi à faire ça, à la limite les fonctions on va les voir d'ici très peu et j'aurais plein d'exercices avec les fonctions pour m'entrainer, mais là comme je n'ai plus trop le temps, est-ce que ce programme est peut-être bon ...?
    Je note pour les fonctions, car grâce à vous j'ai déjà compris

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    Par défaut
    Si tu veux etre rigoureux, voici quelque remarque/conseil pour un "meilleur" code.

    Deja, les commentaire sont completement absent. Sur un petit programme, pourquoi pas (et encore), mais quand tu voudra faire quelque chose de plus consequent, tu va sacrement morfler.

    L'indentation est quelque peu ... hasardeuse.

    En regle general, je prefere les declaration de variable ligne par ligne regroupé en theme (avec bien sur des commentaire).
    Sur ton code, toujours pareille, cela n'est pas flagrant car tu ne fait aps grand chose, mais des que tu va aborder plus grand, rebelote, c'est la galere assuré.
    Il m'est deja arriver d'aider quelqu'un qui faisait un petit jeu (tetris) et qui m'avait claquer 13 variable les une a la suite des autres sans le moindres commentaire et avec ses abreviation. Heuresement que je savais ce qu'il voulait faire car j'ai beaucoup nagé ...

    Semantiquement parlant, tu utilise une boucle while. Sais tu ce qui differencie une boucle while d'une boucle for ? La boucle while permet de faire un nombre de fois inconnue la boucle lors que la boucle for repete la boucle un nombre de fois connue.
    Ici, tu demande a l'utilisateur un nombre. Tu vas donc connaitre ce nombre par avance et donc, il faut faire une boucle for au lieu d'une while !
    Ce n'est pas pour ca que ton code sera faux, mais si tu veut etre rigoureux, faut prendre de bon reflexe et savoir ce que tu dois utiliser.

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 078
    Points : 2 339
    Points
    2 339
    Par défaut
    En tenant compte de mes remarques precedente :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main()
    {
        /* Declarations des variables */
        /* Cette valeur sera fixer par l'utilisateur, aucun besoins de lui mettre quelque chose de particulier */
        int nombre;
        /* Nous mettons par default 1 car 0! == 1 */
        int resultat = 1;
        int i;
     
        printf("Entrez un nombre positif ou nul pour connaitre son factorielle : \n");
        scanf("%d", &nombre);
     
        /* Nous commencons la boucle qu'a partir de 2 car 0! == 1 et 1! == 1, 1 etant la valeur par initialisation.
           Nous avons donc seulement besoins de multiplier si le nombre rentrer par l'utilisateur est >= 2 */
        for (i=2 ; i<=nombre ; i++)
            resultat *= i;
     
        printf("La factorielle de %d est : %d", nombre, resultat);
     
        return 0;
    }
    Voila, il ne te reste plus qu'a mettre en place conio et getch. J'ai utilisé un raccourci du C :

    resultat *= i; == resultat = resultat * i;


    Il reste plus qu'a mettre sous forme de fonction :

    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>
     
    /* Le prototype, TRES IMPORTANT (en fait, pas tant que ca mais c'est une bonne habitude a prendre) */
    int Factorielle (int nombre);
     
    int main()
    {
        /* Declarations de la variables */
        int nombre;
        printf("Entrez un nombre positif ou nul pour connaitre son factorielle : \n");
        scanf("%d", &nombre);
     
        printf("La factorielle de %d est : %d.\n", nombre, Factorielle(nombre));
     
        return 0;
    }
     
    int Factorielle (int nombre)
    {
        int i;
        int resultat = 1;
     
        /* Nous commencons la boucle qu'a partir de 2 car 0! == 1 et 1! == 1, 1 etant la valeur par initialisation.
        Nous avons donc seulement besoins de multiplier si le nombre rentrer par l'utilisateur est >= 2 */
        for (i=2 ; i<=nombre ; i++)
            resultat *= i;
     
        return resultat;
    }
    Et voila

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Pour ta première réponse, bien sur tout ce que tu dit est logique pour moi car j'ai fait du PHP et tout a toujours été clair et logique.
    L'indentation, les commentaires ... je sais faire.

    Mais là je débute à peine C, mais je vais prendre les bonnes habitudes de suite, tu a raison même pour les touts petits exercices, je m'était pas rendu compte en PHP mais c'est plus que très utile.

    Je voit pour le programme.

    Par contre, bien pour ta remarque sur les boucles
    Et justement je te ne l'est pas dit, mais je dois d'abord faire le programme avec une boucle while puis une for, donc ça doit être possible mais si le nombre est connu. Je dois faire les deux justement.

    J'allais adapter mon code après avoir eu le bon programme.

    Bon, je fais le programme maintenant, je te le propose et la boucle for, ça attendra pour les vacances, car j'ai du boulot.
    Merci à tout de suite.

  19. #19
    Membre éclairé
    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
    Points : 842
    Points
    842
    Par défaut
    @ SofEvans : Je ne suis pas d'accord avec toi !
    Avec la boucle for tu peux boucler et ne pas connaître le nombre d'itérations

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int str_len(char str[]) {
    	int i;
    	for (i = 0; str[i] != '\0'; i++);
    	return i;
    }

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    OK parfait

    Par contre, il vaut mieux mettre un unsigned int non?
    Car ici, par exemple factorielle de -5 met 1 comme résultat.

    J'ai le programme avec la boucle for, c'est parfait, je vais de même avec while car il faut que je passe les deux versions.

    Tout est OK?
    Je peut mettre résolu?
    Merci @ vous!

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

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