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 :

Modification condition dans une boucle for


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut Modification condition dans une boucle for
    Bonjour,

    Pour un programme j'aurai besoin de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<=1000;if(n=0){i=i+2;}else{i=i+4})
    Est ce qu'il existe une façon de faire ça ?

    Merci.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    Salut !

    Pourquoi ne pas utiliser une boucle while ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i=0;
    while(i<1001) {
        if (n==0) i+=2;
        else i+=4;
    }

  3. #3
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Si tu tiens au for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; i<=1000; i=i+2+2*(n!=0))
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Janvier 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    En utilisant les ternaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0 ; i<=1000 ; (n==0) ? i+=2 : i+=4)
    Les ternaires permettent de construire une condition if+else en une seule instruction
    un exemple simple des ternaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (age>=18) ? printf("majeur") : printf("mineur");

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut
    Ok, merci pour vos réponses, elles sont toutes très bien, par contre mon but est de faire le programme le plus rapide possible, d'après vous quelle est la solution la plus rapide ?
    Merci.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je dirais "aucune".

    La boucle reste la même. Dans tous les cas, il y a un test ; il ne s'écrit juste pas de la même manière. Celle de CGi est peut-être un poil plus lente : il y a une multiplication.

    La seule façon de vérifier est de comparer l'assembleur généré.

  7. #7
    Membre régulier Avatar de Mipwiq
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 42
    Points : 81
    Points
    81
    Par défaut
    d'après vous quelle est la solution la plus rapide ?
    Il n' y a pas de grande différence entre la vitesse d'exécution d'un while et celle d'un for, ou alors cette différence est légère. Après, tout dépend sur quel genre de processeur tu travailles, mais en général ce n'est pas la principale source de ralentissement d'un programme.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Janvier 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Si tu code en c tu peut facilement évaluer la vitesse d’exécution en ms avec time.h

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    clock_t debut=clock();
     
    //bloque d'instructions dont tu veux évaluer le temps d'execution
     
    clock_t fin=clock(); 
     
    //on affiche la différence entre début et fin en s (ex: 1.33)
    printf("%f", (float)(fin-debut)/1000);

  9. #9
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Celle de CGi est peut-être un poil plus lente : il y a une multiplication.
    Oui, mais par 2, et une multiplication par 2 c'est très rapide!
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    D'où le "un poil"

    Clairement, le choix parmi les boucles proposées n'aura quasiment aucune influence sur les performances.

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    for est souvent utilisé pour des parcours "pas à pas".
    Donc dans ce cas là, je recommanderais l'utilisation d'une boucle while pour améliorer la lisibilité du code.

    Citation Envoyé par debian21 Voir le message
    Si tu code en c tu peut facilement évaluer la vitesse d’exécution en ms avec time.h

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    clock_t debut=clock();
     
    //bloque d'instructions dont tu veux évaluer le temps d'execution
     
    clock_t fin=clock(); 
     
    //on affiche la différence entre début et fin en s (ex: 1.33)
    printf("%f", (float)(fin-debut)/1000);
    Je me méfierais de cette méthode :
    - les résultats dépendent beaucoup de ce qui s'exécute sur l'ordinateur ;
    - il vaut mieux mettre le bloc d'instruction dans une boucle pour limiter la marge d'erreur.

    Dans un petit code comme celui-ci, il vaut mieux regarder le code assembleur généré.

  12. #12
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Question bête d'ou viens le n?

    A priori, s'il ne change pas dans la boucle autant le sortir du calcul avec une solution du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int step = ( n == 0 ? 2 : 4);
    int i = 0;
    while ( i < 1001) { i += step; }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut
    L'idée pour être plus précis est de faire des calculs sur les nombres premiers, sachant que les nombres premiers finissent toujours pas 1,3,7 ou 9 je voulais faire des sauts de valeurs différentes pour éviter de faire des calculs sur des nombres dont on sait qu'ils ne sont pas premiers,

    donc les saut dans la boucle sont +2, +4, +2, +2.

    ça permet d'éviter des milliards de calculs quand on arrive à des nombres de plusieurs milliards.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(f=11 ; f<=1000 ; (g==2) ? f+=4 : f+=2)
       {...}
    Quand je fais ça j'ai l'erreur suivante :
    lvalue required as left operande of assignment

  14. #14
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Mets des parenthèses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(f=11 ; f<=1000 ; (g==2) ? (f+=4) : (f+=2))
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Points : 68
    Points
    68
    Par défaut
    Ok merci à tous, j'ai réussi à faire ce que je voulais.

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

Discussions similaires

  1. Utilisation de condition dans une boucle for-each
    Par siro1 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 09/03/2012, 17h07
  2. Plusieurs conditions dans une boucle for
    Par kimikou dans le forum C
    Réponses: 2
    Dernier message: 16/11/2011, 00h03
  3. [PHP 5.3] Tester des conditions dans une boucle for
    Par coulane dans le forum Langage
    Réponses: 4
    Dernier message: 16/06/2010, 11h50
  4. Condition dans une boucle for
    Par nicolasferraris dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/04/2009, 17h28
  5. Appliquer un next sous conditions dans une boucle for
    Par Kibald dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/01/2009, 08h56

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