GEF 243B Programmation informatique appliquée Boucles §
21-Jan-14 2 JGA Beaulieu Revue Quand devriez-vous utiliser un énoncé else-if au lieu dun switch Donnez une expression ternaire pour incrémenter a si b > 0, sinon, décrémentez a et assigné la vielle valeur de a à c
21-Jan-14 3 JGA Beaulieu Synopsis Le concept des boucles Boucle for Boucle while Boucle do-while Les énoncés continue et break Optimization du code avec les expressions logiques court-circuit
21-Jan-14 4 JGA Beaulieu Boucles Quest ce quun ordinateur peut faire très bien Opérations répétitives … (vous comprenez) Les répétitions pour accomplir une tâche sont partout dans la programmation Ces répétitions sappelles boucles et sont dautres abstractions dun langage de haut niveau
21-Jan-14 5 JGA Beaulieu Boucles – le concept Cette boucle représente une machine à actions perpétuelles (il ny a pas de sortie … laissez-moi sortir !!!). Un action ou une série dactions
21-Jan-14 6 JGA Beaulieu Boucles – le concept Si nous ne voulons pas une machine perpétuelle (et pour la plus part du temps on nen veut pas), nous devons imposer quelques genres de conditions sur la boucle pour quelle termine. Ces conditions sont des expressions logiques qui sont évaluées pour déterminer si il y a eu assez de travail de fait Ou dans certain cas si nous avons même besoin dentrer dans la boucle Il y a deux sortes de tests qui nous permettent de terminer des boucles: Pré-test Post-test
21-Jan-14 7 JGA Beaulieu Boucles – le concept Pré-test: Lexpression logique est évaluée en premier. Si Lexpression évalue à vrai, alors les actions dedans la boucle sont exécutées; si faux, la boucle termine. Post-test: Les actions sont exécutées en premier et lexpression est évaluée après. On utilise ce genre de boucle si on veut que le code dans la boucle exécute au moins une fois
21-Jan-14 8 JGA Beaulieu Boucles – le concept
21-Jan-14 9 JGA Beaulieu Boucles – le concept
21-Jan JGA Beaulieu Boucles – le concept Il y a des questions qui se posent par rapport à lévaluation des expressions logiques: Quelles sont les conditions initiales de lexpression? Comment est-ce que les conditions changent pour permettre à la boucle de terminer? Est-ce que jattend pour un événement ou simplement un nombre donné ditérations? Est-ce que la boucle va se terminer un jour?
21-Jan JGA Beaulieu Boucles – le concept Changement des conditions: Pour quune boucle se termine, une ou des conditions doivent changer Ce changement de condition est due aux actions dans la boucle (compteur, EOF, EOL,…) ou Comme résultat de stimuli externes (interruption qui change létat du senseur IR de notre robot). Si vos conditions ne changent pas, ou quelles changent de la mauvaise façon vous pouvez avoir une boucle infinie!!!
21-Jan JGA Beaulieu Boucles – le concept changement de condition
21-Jan JGA Beaulieu Boucles – le concept changement de condition
21-Jan JGA Beaulieu Boucle for Lénoncé for … Cest une boucle avec pré-test! La boucle for contient trois expressions: expr1: établie la condition initiale pour la boucle expr2: contient la condition limite pour la boucle expr3: contient linformation de mise à jour for (expr1; expr2; expr3) énoncé
21-Jan JGA Beaulieu Boucle for - exemples for (i=1; i<=maxIteration; i++) factoriel *= i; //notez où le ; est for (j=10; j>0; j--) //boucle qui décrémente { som += j; cputs(Fini); //vous allez utiliser cette fctn }
21-Jan JGA Beaulieu Boucle while Lénoncé while est une autre boucle avec pré- test. Si lexpression évalue à faux avec les conditions initiales, la boucle termine sans quaucun énoncé dans la boucle exécute Un contrôle de boucle simple. … while (expression) énoncé Est-ce que ça pourrait être plus simple?
21-Jan JGA Beaulieu Boucle while - exemples while (i++ < n) factoriel *= i; //cest tout!! while ((c = getchar()) != EOF) //End of File { if(c>=a && c<= z) minusculesCompte++; nombreTotalDeCaractères++; }
21-Jan JGA Beaulieu Boucle do-while Et vous lavez deviné, do-while est la boucle avec post-test. do énoncé while (expression); Remarquez le ; Comme vous le voyez, lexpression logique est à la fin de la boucle. Donc lénoncé VA exécuter Soyez prudent, vous devez vous assurer que lénoncé peut exécuter même si la condition initiale évalue à faux
21-Jan JGA Beaulieu Boucle do-while - exemples //Ici on compte des Smarties dans une //boite, on suppose que le singulier de //Smarties est Smarty et que la boite //nest pas vide quand on commence do { if (couleurDuSmarty == "rouge") smartiesRouges++; else autresSmarties++; boite -= 1; } while (boite != vide);
21-Jan JGA Beaulieu Énoncés continue et break Lénoncé continue narrête pas une boucle, il fait seulement arrêter litération en cours et recommence la boucle Pour les boucles do-while et while, continue transfert le contrôle pour réévaluer la condition limite Pour la boucle for, continue met à jour lexpression logique (i.e. i++ ) et vérifie la condition limite
21-Jan JGA Beaulieu Énoncés continue while (expression) { … if (condition) continue; … }
21-Jan JGA Beaulieu Énoncés continue et break Nous avons vue lénoncé break avec lénoncé switch. Le break peut être utilisé dans nimporte quelle boucle pour terminer si une autre condition se produit. Si il y a des boucles imbriquées, seulement la boucle courante se termine. while (condition) { … for (…;…;…;) { … if (autreCondition) break; //for arrête, while arrête pas … } x = x + y; … }
21-Jan JGA Beaulieu Énoncés continue et break Quelle est le résultat de ce code? for (cnt=0; cnt<10; cnt++) { if (cnt==4) //boucle for loop termine, continue; if (cnt==6) break; printf("cnt=%d\n",cnt); }
21-Jan JGA Beaulieu Optimisations du code avec les expressions logiques Dans certains langages, lexpression logique entière dune boucle ou une sélection est évaluée avant que la décision soit prise (Pascal, Ada, Cobol,…) En C, lexpression est évaluée de la gauche vers la droite et aussitôt que la condition nécessaire est évaluée, et le reste de lexpression ne lest pas On nomme cela un court circuit
21-Jan JGA Beaulieu Optimisations du code avec les expressions logiques Conditions nécessaires utilisées pour court-circuit Si le premier terme dans une expression && est fausse Si le premier terme dans une expression || est vraie Le reste de lexpression na pas besoin dêtre évaluée, pcq la décision a été faite Ceci est plus vite, mais programmeur fait attention!!!
21-Jan JGA Beaulieu Court-circuit dans une expression logique if(numAttacks++ 0) { victim=ChooseOpponent(); AttackCountry(victim, soldiers); } return numAttacks;
21-Jan JGA Beaulieu Court-circuit dans une expression logique #include void main(void) { int test1=0, test2=0; int rouge=1, bleue=2; if( (test1=rouge)==0 && (test2=bleue)==0 ) printf("Le test évalue à faux"); printf("La valeur test1 est %d et test2 est %d", test1, test2); getch(); }
21-Jan JGA Beaulieu Optimisations du code avec les expressions logiques Côté positif: Ceci peut vous permettre doptimiser votre code si vous placez les conditions en ordre dans lequel elles sont le plus probables Côté négatif: Si vous avez des effets secondaires dans une condition (++, --), et que cette condition nest pas évaluée, alors les effets secondaires ne seront pas exécutés. Dans une expression avec || mettez la condition qui est le plus susceptible dêtre vrai en premier Dans une expression avec && mettez la condition qui est le plus susceptible dêtre fausse en premier
21-Jan JGA Beaulieu Court-circuit dans une expression logique Dernier test, que ce passe-t-il ici? int a=0, b=1, c=2; if(a && b++ <= c) printf("What did this do?");
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Comme vous pouvez le voir sur la dernière diapo, il y a un potentiel pour des erreurs de logique dans les expressions logiques. En déboguant, le plus difficile est de trouver les erreurs de logique. Pourquoi? Et bien cest parce que vous êtes déjà convaincu que vous aviez raison en premier lieu! Dans un cours nous allons discuter des organigrammes (flowcharts) comme une façon de voir votre logique Aujourdhui nous discutons des erreurs de logique communes
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot La boucle brisée: Une condition que vous voulez qui se produise narrivera jamais. Par exemple si a ne peut jamais être plus grand que z alors vous avez une boucle infinie: while (a < z) {…} Une erreur de logique grossière. Une idée brisée: while (a > b && a == b) //exécute jamais for (i = 1; i < 20; i--) //arrête jamais
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Une erreur en ponctuation: for (i = 1; i <= 100; i++); {…} La boucle roule sur un énoncé vide Ensuite le code dans les accolades exécute exactement une fois if (a < b); {…} if exécute (ou pas) un énoncé vide encore Le bloc entre les accolades exécute peu importe le résultat du test Lénoncé composé ne fait pas parti du if
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Une erreur dans lutilisation de lopérateur (erreur logique) = au lieu de == for (i = 1; i = 10; i++) {…} Le i=10 dans la boucle va assigner la valeur 10 à i Le compilateur va générer un attention dans ce cas, et cest pourquoi vous devriez toujours lire les attentions et essayer de les corriger
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Une erreur dans lutilisation de lopérateur (erreur logique) Utilisation des opérateur logique sur les bits & et | au lieu de && et || while (a & b | c) {…} Cest permi par le compilateur Ne génére pas dattention ou erreur Ne vous donnera pas les résultats attendus
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Une erreur dans la comparaison des floats ( a et b sont floats: if (a == b) {…} Exactement égale est trop exacte pour la comparaison de floats if (fabs(a-b) < ) {…}
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Loublie dune mise à jour dans une condition de boucle: while (a < b) {… //a ne change jamais dans la boucle } Pas assez … je voulais faire dix itérations: for (i=1; i <10; i++) //9 itérations
21-Jan JGA Beaulieu Erreurs communes dans les structures de contrôle de flot Mettre trop souvent à jour une condition : While (i != 13) {… i++; //met i to 1, 3, 5, …, 13 … i++; //met i to 2, 4, 6, …, 14 …// (13 ne se produira jamais) } for (i = 1; i <= 10; i++) {… i++; //Probablement une erreur }
21-Jan JGA Beaulieu Quiz Time Je lit un fichier, mais je ne sait pas si il est vide ou combien ditems il y a dedans. Quelle genre de boucle est-ce que je devrait utiliser? Quand jappelle ma fonction, je sais combien ditérations je veux prendre. Quelle genre de boucle? Je veut lire un senseur au moins une fois même si il ny a pas durgence. Quelle boucle? Quelle boucle(s) utilise un pré-test?