Boucles, tests et sauts en C
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Boucles, tests et sauts en C



  1. #1
    Dlzlogic

    Boucles, tests et sauts en C


    ------

    Bonjour,
    J'ouvre cette discussion pour éviter de polluer une discussion existante sur un point précis.
    En programmation l'opération de base est le saut, généralement associé à un test.
    La formalisation est la suivante :
    Si telle condition est vraie, alors l'exécution se poursuit là.
    Dans le langage C, il y a plusieurs moyens d'écrire cela. (liste non exhaustive)
    Code:
    if ([condition])
    {
      // traitement OUI
    }
    else
    {
     // traitement NON
    }
    Dans la pratique, cette question peut se poser de façon répétitive pour un certain nombre d'éléments. Il faudra alors utiliser la notion de boucle.
    Il existe en C deux écritures possibles avec les mots clé for et while
    Ces deux instructions nécessitent 3 expressions
    expr1 : initialisation
    expr2 : test
    expr3 : incrémentation
    Avec l'instruction for, le code se présentera de la façon suivante
    Code:
    for (expr1; expr2; expr3)
      [instruction]
    Avec l'instruction while
    Code:
    expr1;
    while (expr2)
    {
      [instruction]
      expr3;
    }
    Le choix entre les deux ne dépend que de préférence, compréhension, clarté.
    K&R : "Le choix entre while et for est surtout une affaire de goût".

    On notera au passage qu'il y a une instruction particulière qui utilise l'instruction while :
    Code:
    expr1;
    do
    {
      [instruction]
    }while (expr2);
    L'instruction expr3 n'est pas précisée, mais elle soit exister directement ou non.

    Autre cas particulier : la boucle infinie.
    Cela peut s'écrire indifféremment
    Code:
    for ( ; ; )
    {
    ...
    }
    ou 
    while (!NULL) 
    {
    ...
    }
    Il est bien-sûr indispensable que le bloc contienne une instruction break ou return.

    Concernant les conditions, il existe 2 instructions, if et switch.
    L'instruction switch a une caractéristique particulière par rapport au if, les adresses de sauts, c'est à dire les différentes possibilités sont prévues dès la compilation.
    Code:
    switch (n)
    {
      case 0: trait0; break;  
      case 1: trait1;   
      case 10: trait10; break;  
      case 2: trait2; break;  
      défault:
        traitement_default;
    }
    On remarquera que si n vaut 1, alors les traitements 1 et 10 sont efféctués.
    Cette instruction est généralement utilisée lorsque le nombre de cas est grand et strictement connu.
    C'est une application stricte du célèbre goto etiquette, déprécié pour des raisons historiques.

    -----

  2. #2
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    Code:
    for ( ; ; ){...}ou while (!NULL) {...}

    Il est bien-sûr indispensable que le bloc contienne une instruction break ou return.
    Ce n'est pas pour te contrarier mais ce n'est pas toujours vrai.
    En embarqué par exemple, le programme ne se termine jamais. Si tu veux écrire un programme à la manière d'un automate, la boucle va tourner en scrutant l'évolution des signaux de manière à faire avancer l'automation et à le faire changer d'état.

    On peut aussi faire un programme principal qui tourne sur une boucle infinie et qui ne fait rien. Ce sont les évènements (interruptions) qui vont faire avancer le processus.

    A+

    A+

  3. #3
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Oui, absolument.
    Il faut tout de même trouver un truc pour arrêter la boucle autrement qu'en retirant la prise d'alimentation.
    Mais assurément, on peut imaginer des systèmes qui tournent indéfiniment.
    Mais j'avoue mon incapacité de réaction. Conclusion, j'ai tout faux. OK.

  4. #4
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Il est bien-sûr indispensable que le bloc contienne une instruction break ou return.
    Bien-sûr, j'ai oublié de préfixer cette phrase par "Si on veut en sortir".
    Sans rancune.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    Conclusion, j'ai tout faux. OK.
    Non, ta présentation est claire et concise. Je voulais juste tempérer le "indispensable". D'ailleurs, à la réflexion, si on veut respecter les normes les plus récentes, main renvoyant un int, le compilateur nous fera savoir qu'il y a une possibilité de ne pas atteindre le return final.

    A+
    Dernière modification par Jack ; 23/02/2013 à 23h03.

  7. #6
    invite43901482

    Re : Boucles, tests et sauts en C

    De toute façon les boucles infinis ne sont jamais conseillées, elles sont sources de bugs (et ça dans tous les langages les permettant)...

    Que ça soit while ou for, la syntaxe en C n'a peu d'importance et comme le dis K&R c'est une histoire de goût. En python on préférera clairement la boucle for.

    Par contre, j'ai pas compris le but de ce post, je ne vois aucune question.

    Dans tous les cas, lors d'une boucle on recherche toujours la condition d'arrêt. (en espérant que je ne sors pas du sujet proposé).

  8. #7
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    Par contre, j'ai pas compris le but de ce post, je ne vois aucune question.
    Ca fait référence à ce fil:
    http://forums.futura-sciences.com/pr...e-chainee.html

    De toute façon les boucles infinis ne sont jamais conseillées
    Mais parfois elles sont indispensables.

  9. #8
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Citation Envoyé par fred1599 Voir le message
    De toute façon les boucles infinis ne sont jamais conseillées, elles sont sources de bugs (et ça dans tous les langages les permettant)...

    Que ça soit while ou for, la syntaxe en C n'a peu d'importance et comme le dis K&R c'est une histoire de goût. En python on préférera clairement la boucle for.

    Par contre, j'ai pas compris le but de ce post, je ne vois aucune question.

    Dans tous les cas, lors d'une boucle on recherche toujours la condition d'arrêt. (en espérant que je ne sors pas du sujet proposé).
    Bonjour,
    Des boucles infinies, il y en a des quantités. Votre machine tourne indéfiniment. Elle attend soit un ordre pour exécuter un programme, soit pour lancer la procédure de fermeture. Chacun des programme, pour peu qu'il soit interactif, contient lui aussi au moins une boucle infinie.

    Dans le cas précis de la boucle, il me semble qu'il est plus facile pour un débutant de préciser d'abord l'élément qui lequel on travaille, plutôt que de l'utiliser en même temps comme élément à modifier (suppression dans une liste) et élément servant au test. Ceci explique mon intervention dans le sujet origine de ce post. Et naturellement je maintiens fermement cette préférence personnelle.

    Un parlant de bug, une telle écriture est beaucoup plus dangereuse :
    for (int i = 0; i=max; i++)
    {
    ...
    }

    Dans tous les cas, lors d'une boucle on recherche toujours la condition d'arrêt.
    Je préfèrerais largement l'expression "condition de sortie".

  10. #9
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    for (int i = 0; i=max; i++)
    ... et d'une manière générale, utiliser une affectation comme condition logique est à manier avec précaution.

    A+

  11. #10
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Citation Envoyé par Jack Voir le message
    ... et d'une manière générale, utiliser une affectation comme condition logique est à manier avec précaution.

    A+
    for (int i = 0; i=max; i++)
    Toutes mes excuses, je voulais naturellement écrire
    for (int i = 0; i == max; i++)
    C'est à dire une comparaison "exacte". Une affectation n'est pas une condition. Le compilateur le signale d'ailleurs.

  12. #11
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    Je suis d'accord avec ce que tu veux montrer, mais il me semble que l'erreur courante consiste plutôt à écrire:
    for (int i = 0; i != max; i++)
    qu'il faut avantageusement remplacer par
    for (int i = 0; i< max; i++)

  13. #12
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Oui, tout à fait ça, décidément, c'est pas mon jour.

  14. #13
    invitebf26947a

    Re : Boucles, tests et sauts en C

    Merci,
    je me suis senti un peu concerné.^^
    Il y a aussi "goto"

  15. #14
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Si vous voulez éviter de vous faire traiter de tous les noms d'oiseau possibles, éviter de mettre en public l'instruction goto. Vous remarquerez que j'ai été très discret sur ce point.

  16. #15
    invitebf26947a

    Re : Boucles, tests et sauts en C

    Oui, tellement discret que je ne l'avais même pas vu.

    J'utilise "goto" par habitude, car en assembleur on a pas de boucle for, while....on a que des goto.

    Pourquoi serai-je un pigeon si j'utilise "goto"?

  17. #16
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Citation Envoyé par deyni Voir le message
    Oui, tellement discret que je ne l'avais même pas vu.

    J'utilise "goto" par habitude, car en assembleur on a pas de boucle for, while....on a que des goto.

    Pourquoi serai-je un pigeon si j'utilise "goto"?
    Parce que peu d'utilisateurs savent que avec le langage C (les autres je sais pas) il est impossible de compiler si un goto ne respecte pas la non-insertion dans un bloc. Donc "goto" interdit, pas plus compliqué que ça.
    En fait, le but de mon post était justement d'expliquer que seul le goto existait (jump) et que les for, while, switch n'étaient que des facilités de langage. Et en particulier, le "for" du 'C' évite de se poser des questions "que se passe-il si la liste est vide ?".

  18. #17
    invitebf26947a

    Re : Boucles, tests et sauts en C

    Quelle est la non-insertion dans un bloc?
    Si on la respecte où est le problème?
    Pourquoi est-ce impossible de le compiler?

  19. #18
    Dlzlogic

    Re : Boucles, tests et sauts en C

    Ca veut dire que un bloc délimité par un "goto" et son étiquette ne peut avoir d’initialisation, d'étiquette de branchement, et je ne sais quoi du même genre. Pour les puristes cherchant des mots qui manquent, un bloc entre accolade est un bloc indépendant qui possède sa propre adresse et contient sa fin de bloc.
    Si on respecte cela, aucun problème de compile ni d'exécution, mais je vous paye des cerises si personne ne réagit.
    Si on ne respecte pas ces conditions le compilateur ne l'acceptera pas (en tout cas le mien).

  20. #19
    Jack
    Modérateur

    Re : Boucles, tests et sauts en C

    On peut également programmer de manière structurée en asm. Il existe d'ailleurs des assembleurs "structurés" qui autorisent le repeat, for, etc. Le goto n'est donc pas absolument indispensables.

    a+

  21. #20
    abracadabra75

    Re : Boucles, tests et sauts en C

    Bonjour.
    En assembleur il est impossible d'éviter les jump que l'on doit utiliser de façon rigoureuse: structurer le programme est possible (même conseillé), relevant alors de la discipline que l'on s'impose: on créé des 'blocs' à sortie contrôlée c'est à dire d'où en aucun cas on ne peut sortir pour aller à une adresse quelconque, l'exécution de ces blocs se faisant par un 'call' (ou instruction analogue suivant l'assembleur utilisé).
    Structurer un programme conduit à modifier sa façon de raisonner. Une fois intégrée à la pensée, cette façon de procéder devient (m'est devenue) automatique. C'est un apprentissage comme un autre.
    Les langages évolués ont crée les boucles for, do, while, etc pour clarifier l'écriture et la faciliter, le confort évitant les erreurs.
    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

Discussions similaires

  1. Sauts de classes
    Par invite93500192 dans le forum Orientation après le BAC
    Réponses: 2
    Dernier message: 12/10/2011, 15h00
  2. amménagement autour de sauts de loups
    Par invitebaf39463 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 0
    Dernier message: 05/03/2011, 17h01
  3. sauts de PH
    Par invitead405762 dans le forum Chimie
    Réponses: 1
    Dernier message: 23/09/2010, 08h17
  4. 2 sauts de potentiel détermination des concentration
    Par invite1d656ca6 dans le forum Chimie
    Réponses: 2
    Dernier message: 22/12/2006, 14h04
  5. sauts de pH : définition
    Par invitee1eeca17 dans le forum Chimie
    Réponses: 3
    Dernier message: 09/04/2005, 11h36