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 le factorielle d'un nombre (Dev-C++)


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Stagiaire OFPPT
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Stagiaire OFPPT

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut Calculer le factorielle d'un nombre (Dev-C++)
    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 programme:

    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
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
        int X,i,Fac;
        printf (" Veuillez entrez une valeur :\n " );
        scanf ("%d",&X);
        if (X>0) {
            for (i=1;i<X;i--)
                Fac=X*i;
            printf (" Le factorielle de %d est : %d\n ",X,Fac);
        }
        else if(X==0)
            printf (" Le factorielle de %d est : 1 ",X);
        else
            printf(" Veuillez entrez un nombre posetive\n ");
        system (" pause ");
    }
    Quand j'exécute le programme et je fais entrer la valeur 3 il ne me repend pas vite et lorsqu'il affiche la réponse il donne : -2147483648
    Merci d'avance pour tous les gens qui mon aidaient.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il faudrait savoir si tu veut faire ton programme en C ou en C++. Tel qu'écrit, même s'il est presque correct en C++, il utilise un style d'écriture qui n'est pas du tout idiomatique en C++ (mais plus en C).

    Sinon, je n'ai pas tout lu en détails, mais ton i-- me semble très louche : Tu pars de 1, tu veux aller à X qui est positif, ce n'est pas en décrémentant que tu y arriveras
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Par défaut
    un plus des remarques de JolyLoic:

    *) tu risques rapidement de dépasser les limites d'un int lors du cacul de n!

    *) un n! est toujours supérieur ou égal à 1 (dans ton programme actuel, la première boucle consiste à multiplier par 1, ce qui n'est pas très util. 0! =1 et 1! = 1)

    donc pourquoi un int et pas ununsigned int . Tu devrais aussi inclure un test pour éviter les dépassements de capacité (voir<limits.h>) .

    Le calcul de n! est le cas idéal pour inclure la récursivité:

    http://franckh.developpez.com/tutori...i/recursivite/

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Personnellement, je suis relativement opposé à l'idée qui consiste à utiliser des calculs comme la factorielle ou l'exponentielle pour introduire la récursivité.

    De manière générale, j'estime qu'il n'est pas bon d'introduire la récursivité sur des algorithmes qui peuvent parfaitement s'effectuer avec de simples boucles .

    Ce n'est bien sur qu'un avis personnel, mais le problème des tours de Hanoï me semble bien plus adapté pour cela (car il est beaucoup plus difficile de s'en sortir avec des boucles)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre du Club
    Homme Profil pro
    Stagiaire OFPPT
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Stagiaire OFPPT

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut
    Merci pour votre aide et votre générosité mes amis.
    Je vais consulter votre proposition, il me faudra aussi travailler dur pour comprendre les fonctionnalités et les secrets de ce: Dev-C++ et la programmation en général, parce que comme vous le savez déjà, je ne suis q'un petit débutant :p

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Citation Envoyé par Matadox Voir le message
    Merci pour votre aide et votre générosité mes amis.
    Je vais consulter votre proposition, il me faudra aussi travailler dur pour comprendre les fonctionnalités et les secrets de ce: Dev-C++ et la programmation en général, parce que comme vous le savez déjà, je ne suis q'un petit débutant :p
    Attention : Dev-C++ n'est jamais qu'un EDI (Environnement de Développement Intégré). C'est à dire que c'est un ensemble d'outils composé
    d'un éditeur de texte, d'un compilateur, d'un éditeur de liens et d'un débogueur qui fonctionnent correctement ensemble.

    C'est un peu comme si tu disais que tu dois utiliser un batteur de la marque machin pour battre des oeufs en neige: cela n'a absolument aucun sens, parce que n'importe quelle marque de batteur ou un simple fouet manuel fait tout aussi bien l'affaire .

    Tu peux parfois être confronté à des problèmes propres à ton EDI, comme par exemple, le fait que le développement de Dev-C++ a longtemps été en sommeil et qu'il semble que sa dernière version utilise une version du compilateur qui n'est pas la plus récente, mais la plupart des problèmes auxquels tu sera confronté se résument souvent à :
    1. des problèmes d'algorithmie (comprends : de logique à mettre en place)
    2. des problèmes de conception (comprends : le fait de décider qui fait quoi et qui interagit avec quoi)
    3. des problèmes liés à une subtilité du langage (comprends : la manière dont le compilateur réagit face à une situation donnée).
    Tes principaux problèmes ici sont des problème d'algorithmie -- de logique à mettre en oeuvre pour obtenir le résultat auquel tu t'attends -- et d'utilisation du langage : Ton code est valide, mais utilise beaucoup trop les possibilités issues du "sous ensemble" que C représente dans C++ pour être considéré comme "du beau C++ à la mode de chez nous".

    Loic t'a montré la piste pour résourde le problème d'algorithmie. Je te proposerais volontiers de lire la deuxième ligne de ma signature, d'y réfléchir trente seconde et d'appliquer ce qu'elle pourra t'avoir inspiré. De manière générale, elle pourrait servir de ligne de conduite pour tous les développements .

    Une fois que tu auras résolu le problème d'algorithmie, reviens nous montrer ton code. Nous nous ferons un plaisir de t'indiquer comment en faire un code plus proche de ce que l'on appelle le C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre du Club
    Homme Profil pro
    Stagiaire OFPPT
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Stagiaire OFPPT

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut
    Merci beaucoup koala01 c'est très gentil de ta part. J'ai très bien compris tes mots, et j'ai fais de mon mieux pour le rendre correcte, mais ça n'arrivera pas avec mon bagage j'ai vue plusieurs réponse sur net, mais il mon pas beaucoup aidé et je me suis inscris sur plusieurs Forum pour pouvoir résoudre se problème. Il me semble que je vais laisser ça à coté pour faire autres choses et après je reviendrai pour le résoudre.
    J'ai arriver à ç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
     
    #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=1 ; 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 ");
    }
    Le programme me donne des réponses justes si je fait tapé 0 ou 1 ou 2 ou 3
    mais quand la valeur saisie est >3 il me donne des faux rep Exp : Fact de 4 =12

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    L'erreur est pourtant grosse comme une maison!

    Allez, je te mets sur la piste. C'est bel et bien une erreur de logique, et elle se trouve au niveau des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	{for (i=1 ; i<X ; i++)
    	  Fac=X * (i);
    Essayes peut être de te faire "aussi bête qu'un ordinateur", prend un bic et un papier et essaye de déterminer ce qui sera fait si tu essayes de calculer la factorielle de 5, par exemple.

    Une fois que tu auras compris ce qui ne va pas, tu auras fait un très grand pas dans la résolution de ton problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre du Club
    Homme Profil pro
    Stagiaire OFPPT
    Inscrit en
    Janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Stagiaire OFPPT

    Informations forums :
    Inscription : Janvier 2014
    Messages : 7
    Par défaut Re : Calculer le factorielle d'un nombre /// (Dev-C++)
    Merci beaucoup mon ami, je n'oublierai jamais ton aide.
    J'ai compris l'erreur que j'ai commue grâce à un ami qui ma bien guidé.
    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 :
    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
    #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

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Ah, tu vois qu'avec un tout petit peu de réflexion, on arrive assez rapidement à trouver ses erreurs

    Disons que j'aurais juste écris la boucle dans l'autre sens, par simple habitude:{for (i=1 ; i<=X ; i++) mais la multiplication étant de toutes manières commutative, cela ne change pas grand chose

    Maintenant, il ne te reste plus qu'à passer à une écriture correspondant réellement à l'esprit C++, car tout ton code est véritablement beaucoup plus proche du C que du C++

    Pour ce faire, il faudra remplacer l'inclusion des fichier <stdlib.h> et <stdio.h> par l'inclusion du seul fichier <iostream> (remarque l'absence d'extension dans le nom du fichier : c'est voulu ), remplacer les printf par l'utilisation du flux de sortie standard (cout, que l'on trouve dans l'espace de noms std par inclusion de <iostream>) et les scanf par l'utilisation du flux d'entrée standard (cin que l'on trouve également dans l'espace de noms std, toujours par inclusion du fichier d'en-tête <iostream>).

    Enfin, je te conseillerais de t'inspirer de cette entrée de la FAQ pour provoquer la pause finale. L'instruction system étant parfois beaucoup trop spécifique à un système d'exploitation particulier (ce n'est pas forcément le cas de system("PAUSE"), mais ce l'est très certainement de nombreuses autres instructions )

    A toi de jouer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Calculer la factorielle d'un nombre en C
    Par planete.game57 dans le forum Débuter
    Réponses: 26
    Dernier message: 19/10/2009, 23h12
  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