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. #21
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    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 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    @ 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;
    }
    C'est exact, j'en suis bien conscient.
    Mais la raison d'etre de la boucle for et da la boucle while est celle que j'ai expliqué.

    Sinon, la quasi totalité des boucle while ayant une variable qui s'incremente est transcriptible en boucle for.

    Après tout ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (ValeurDebut ; Condition ; Pas)
    La consition n'etant pas lier obligatoirement a ValeurDebut et Pas, on peut tout a fait faire ce que tu as fait.

    En poussant a l'extreme, on peut tres bien mettre une variable differente pour ValeurDebut, Condition et Pas ou meme ne mettre aucune valeur.

    J'ai deja vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (;;)
    { 
       ...
    }
    Pour autant cela est-il bien ?

  2. #22
    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
    Unsigned int non, car l'utilisateur peut rentrer une valeur négative et donc le résultat sera ... indéterminé

    Pour autant cela est-il bien ?
    Pour faire une boucle infinie oui, mais personnellement je préfère while(1)
    Plus tu pédales moins fort, moins t'avances plus vite.

  3. #23
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    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 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par planete.game57 Voir le message
    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!

    Tu as oublier une chose, ne jamais faire confiance a l'utilisateur !
    Si tu met un int, verifie qu'il est bien positif, si tu met unsigned int, renseigne toi car je n'utilise jamais de unsigned. Si tu veux pouvoir stocker un tres grand nombre, un double est indiqué (meme s'il sert a representer un entier).


    Quand a savoir si le post est resolu ou non, c'est a toi de voir

  4. #24
    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, merci à vous deux!

    J'ai compris, donc je n'ai pas d'unsigned.

    Je transcrirais en boucle while dès que j'en aurais le temps.

    A bientôt!

  5. #25
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    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 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Unsigned int non, car l'utilisateur peut rentrer une valeur négative et donc le résultat sera ... indéterminé


    Pour faire une boucle infinie oui, mais personnellement je préfère while(1)
    Euh, non.

    Personnellement, la premiere fois que je suis tomber sur cette syntaxe, j'ai mis 5 min a comprendre ( d'autant plus qu'il n'y avait pas de commentaire).

    En general, si on veut faire propre, on met JAMAIS de boucle infini.
    C'est toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* Servira comme un booleen */
    int continuer = 1;
    while (continuer)
    {
        /* Plusieurs chose dans lequel continuer peut prendre 0 */
    }

    Après, il y a certain cas ou on est obliger de mettre while(1). Il y a toujours l'exception qui confirme la regle.
    En tout cas, for( ; ; ) est vraiment malvenue.

  6. #26
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    [HS]
    Quelques remarques sur le style.

    Je suis le premier à dire qu'il est important de commenter son code, mais il ne faut pas non plus tomber dans l'extrême inverse. Les commentaires totalement inutiles sont aussi néfaste que l'absence de commentaires.
    Typiquement le commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* Declarations des variables */
    n'apporte absolument rien et ne devrait pas être là, de même que les commentaires qui ne font que paraphraser le code.

    Concernant les prototypes des fonctions, je ne suis pas non plus d'accord avec ce qui est dit ici. Plusieurs cas de figure:
    • La fonction est "exporté", le prototype doit alors être présent dans un fichier d'en-tête qui sera lui-même inclus dans les fichiers source concernés.
    • La fonction est purement interne à l'unité de compilation, dans ce cas, le prototype est inutile. Il suffit de définir la fonction avant son utilisation et de la déclarer statique.
    • Le seul cas où il faut déclarer le prototype dans un fichier source concerne les fonctions interne lorsqu'il y a un cycle dans les appels de fonctions (A appelle B qui appelle A).


    Enfin la notation for( ;; ) est quand même suffisamment fréquente pour ne pas considérer cela comme une notation hermétique. En outre certain compilateur levant un warning sur l'expression while(1) (pour indiquer que l'expression est toujours vrai), l'expression for( ;; ) prends dans ce cas tout son intérêt.
    En outre, la suppression des boucles infinies n'est pas toujours réaliste (très dépendant des cas d'utilisation).
    Quant à l'utilisation de la valeur d'une variable qui n'est jamais modifiée pour simuler une boucle infinie, c'est plus de l'obfuscation qu'autre chose (je parle bien des cas où la variable n'est jamais modifiée et donc la boucle est dans les faits infinie, pas des cas où la variable est réellement utilisé pour sortir de la boucle).

    Concernant le choix de while ou de for, la connaissance à priori du nombre d'itérations n'est pas le seul critère de choix.
    L'exemple de Pouet_forever est typiquement un cas où l'utilisation d'une boucle for est plus logique.
    [/HS]

  7. #27
    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
    Merci pour les précisions!
    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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