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 :

Bonne maniére d'écrire une condition pour une boucle.


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 16
    Points
    16
    Par défaut Bonne maniére d'écrire une condition pour une boucle.
    Bonjour,

    Je me pose des questions bêtes :

    Lorsque je donne le code suivant, où a est une variable et f une fonction définie ailleurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i=1;i<f(a),i++)
    {
       ...
    }
    Le programme va t'il à chaque itération calculer f(a) ? Où faut il faire le calcul avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    b=f(a);
    for(i=1;i<b,i++)
    {
       ...
    }
    J'ai bien conscience que dans la plupart du temps la différence est minime.

    Dans le même genre, est il bien de laisser des calculs dans du code, du genre a = 2*1.325/3 ? Le calcul est fait à la compilation ou au moment de lancer le programme ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 741
    Points : 31 071
    Points
    31 071
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par erik2003 Voir le message
    Lorsque je donne le code suivant, où a est une variable et f une fonction définie ailleurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=1;i<f(a),i++)
    {
       ...
    }
    Le programme va t'il à chaque itération calculer f(a) ? Où faut il faire le calcul avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    b=f(a);
    for(i=1;i<b,i++)
    {
       ...
    }
    Bonjour
    Dans un for(instruction1; évaluation; instruction2) (avec des points-virgules et non des virgules qui sont possibles mais qui produisent un autre comportement), l'instruction 1 est faite une fois, l'évaluation est faite à chaque tour de boucle et l'instruction 2 aussi. Donc, sauf si le résultat de f() dépend d'une info modifiée dans la boucle, vaut mieux la sauvegarder avant.
    Ou alors t'as une 3° possibilité
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=f(a) - 1; i>=1;i--)
    {
       ...
    }

    Citation Envoyé par erik2003 Voir le message
    Je me pose des questions bêtes :
    Hum... c'est quand-même pas compliqué de créer une fonction f() affichant un truc à la con pour voir s'il s'affiche une ou plusieurs fois...

    Citation Envoyé par erik2003 Voir le message
    J'ai bien conscience que dans la plupart du temps la différence est minime.
    Ben justement non. Tu ne peux pas présumer de la complexité de f, ni de son évolution...

    Citation Envoyé par erik2003 Voir le message
    Dans le même genre, est il bien de laisser des calculs dans du code, du genre a = 2*1.325/3 ? Le calcul est fait à la compilation ou au moment de lancer le programme ?
    Les compilos d'aujourd'hui sont capables d'optimiser ce genre de calcul mais il est certain qu'il vaut mieux réduire autant que possible (2.650/3). Toutefois on trouve une exception: quand tu veux montrer au lecteur que tu as pensé à un point important => exemple char nom[20 + 1] pour bien montrer que tu n'as pas oublié le '\0'. Et on le retrouvera au fgets => fgets(nom, 20 + 1, stdin) (parce que fgets() garde un espace pour le '\0' donc faut bien lui passer la taille exacte et non une taille tronquée).

    Mais même dans ce cas, on préfère éviter les "magic numbers" (des nombres en dur) et les remplacer par une macro facilitant l'évolution
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define NB_CAR                 (20)
     
    char nom[NB_CAR + 1];
    ...
    fgets(nom, NB_CAR + 1, stdin)

    Toutefois tu auras quand-même parfois d'autres cas où tu écriras des opérations "inutiles". Par exemple en géométrie où un calcul de circonférence de cercle s'écrira plus volontier 3.1416 * 2 * r que 6.2832 * r...

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Merci.

    Citation Envoyé par Sve@r Voir le message

    Hum... c'est quand-même pas compliqué de créer une fonction f() affichant un truc à la con pour voir s'il s'affiche une ou plusieurs fois...
    Effectivement.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/02/2015, 11h13
  2. [XL-2010] Une formule pour une condition SI
    Par philiber30 dans le forum Excel
    Réponses: 3
    Dernier message: 23/09/2014, 16h41
  3. Réponses: 1
    Dernier message: 21/01/2011, 11h17
  4. masquer ou afficher une condition liée à une condition?
    Par secondechance dans le forum IHM
    Réponses: 2
    Dernier message: 14/11/2008, 21h36
  5. écrire le résultat d'une macro dans une cellule d'une feuille à choisir
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2008, 12h56

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