La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

5. Les structures répétitives P. Costamagna – ISEN N1.

Présentations similaires


Présentation au sujet: "5. Les structures répétitives P. Costamagna – ISEN N1."— Transcription de la présentation:

1 5. Les structures répétitives P. Costamagna – ISEN N1

2 P. Costamagna2 A. A quoi sert une boucle ? 2 ème méthode permettant de rompre lordre séquentiel dun programme. = structures itératives ou boucles. Les boucles permettent de faire exécuter plusieurs fois certaines phases de programme sans qu'il soit nécessaire à chaque fois de réécrire les instructions correspondantes. Il existe 3 types de boucles quil faut apprendre à choisir judicieusement.

3 P. Costamagna3 B. La boucle TANT QUE … Fonctionnement : évaluation du booléen si sa valeur est vraie, alors le bloc instructions (1) est exécuté le booléen est à nouveau évalué si sa valeur... arrêt de la boucle quand le booléen devient faux le programme continue en séquence avec les instructions(2). Langage intermédiaire Tant que booléen faire instructions (1)... Ftq instructions (2) … le booléen est évalué. C est le test de continuité (booléen vrai) ou test d'arrêt (booléen faux). Instructions (1) est appelé corps de la boucle

4 P. Costamagna4 B. La boucle TANT QUE … (suite1) Remarques : Cette boucle peut ne jamais être parcourue si le booléen est faux dès le début. Langage C while (expression) { instructions (1)... } instructions (2) … Inversement le nombre ditérations peut être infini si le booléen reste toujours vrai. Il est possible dimbriquer des boucles TANT QUE. Pas de ; à la fin de linstruction while.

5 P. Costamagna5 B. La boucle TANT QUE … (suite2) Ecrire en langage C largement commenté, un algorithme qui affiche la valeur inverse du code octal dun entier positif. Exemple : 611 en base 10 devient en base 8 En effet 611 = 3 x x x x 8 3 Notre algorithme affichera donc Pour obtenir ce résultat, on utilise la méthode des divisions successives par 8 : Chaque carré en pointillés représente une division par 8. Les restes successifs donnent le code octal de lentier. Ce calcul ne sera effectué que dans le cas où le nombre à convertir est positif. Exercice

6 P. Costamagna6 B. La boucle TANT QUE … (suite3) #include "ESLib.h" int main () { int n; /* nombre a convertir */ int q; /* quotient de la division entiere */ int r; /* reste de la division entiere */ /* saisie du nombre a convertir */ ecrisChaine ("Saisir un entier positif "); n = lisEntier(); sautDeLigne(); Correction

7 P. Costamagna7 B. La boucle TANT QUE … (suite4) /* Conversion effectuee uniquement si le nbre saisi est positif */ if (n >0) { q = n; /* initialisation du 1er diviseur avec la valeur à convertir */ /* Arret des divisions successives des que le quotient devient nul */ while (q > 0) { /* calcul du nouveau quotient */ q = n / 8; /* calcul du reste */ r = n % 8; /* affichage du résultat au fur et a mesure des divisions */ ecrisEntier(r); /* initialisation du nouveau diviseur a considerer */ n = q; } La variable q doit être déterminée en arrivant sur cette instruction La variable q doit être modifiée dans le corps de la boucle pour permettre une sortie de boucle Initialisation de la variable q

8 P. Costamagna8 B. La boucle TANT QUE … (suite5) else ecrisChaine ("Conversion non prevue"); sautDeLigne(); system ("pause"); return 0; }

9 P. Costamagna9 C. La boucle REPETER … Fonctionnement : le bloc instructions (1) est exécuté une fois le booléen est évalué si sa valeur est vraie, le bloc dinstructions (1) est à nouveau exécuté le booléen est à nouveau évalué … arrêt de la boucle quand le booléen devient faux le programme continue en séquence avec les instructions(2). Langage intermédiaire Répéter instructions (1)... Tant que (booléen) instructions (2) …

10 P. Costamagna10 C. La boucle REPETER … (suite1) Remarques : Cette boucle est toujours exécutée au moins une fois. Langage C do { instructions (1)... } while (expression); instructions (2) … Le nombre ditérations peut être infini si le booléen reste toujours vrai. Il est possible dimbriquer des boucles REPETER. Pas de ; à la fin de linstruction do mais un ; à la fin de linstruction while.

11 P. Costamagna11 C. La boucle REPETER … (suite2) Ecrire en langage C, un algorithme qui oblige un utilisateur à saisir la réponse O(ui) ou N(on)à une question. Exercice #include "ESLib.h" int main () { char rep; /* caractere a saisir pour la reponse */ do { ecrisChaine ("Voulez vous saisir qlqchose ? (O/N)" ); rep = lisCaractere(); } while (rep != 'O' && rep != 'N'); Correction sautDeLigne(); system ("pause"); return 0; } Initialisation de la variable rep lors du 1er passage dans la boucle, puis modification de cette variable lors des passages suivants

12 P. Costamagna12 D. Notion de compteur de boucle Les 2 structures de boucles étudiées (TANT QUE et REPETER, sont utilisées dans des situations où lon ne sait pas par avance combien de tours seront nécessaires. Possibilité néanmoins de compter les tours de boucle effectués à laide dune variable entière, initialisée à 0 et dont on augmente de un la valeur à chaque tour. Cest le compteur de boucle. Ce compteur peut alors servir à comptabiliser les passages dans la boucle (compteur passif) ou servir à limiter le nombre de tours de boucles (compteur actif)

13 P. Costamagna13 D. Notion de compteur de boucle (suite1) A partir de lexercice précédent, écrire en langage C, un algorithme qui affiche le nombre dessais nécessaire à lutilisateur pour effectuer la bonne saisie. Exercice #include "ESLib.h" int main () { char rep; /* caractere a saisir pour la reponse */ int cpt ; /* compteur de boucle */ /* initialisation du compteur de passages */ cpt = 0; Correction do { ecrisChaine ("Voulez vous saisir qlqchose ? (O/N)" ); rep = lisCaractere(); /* incrémentation du nombre de passages */ cpt = cpt +1; } while (rep != 'O' && rep != 'N'); ecrisChaine ("Nombre d'essais = "); ecrisEntier (cpt); sautDeLigne(); system ("pause"); return 0; }

14 P. Costamagna14 D. Notion de compteur de boucle (suite2) A partir de lexercice précédent, écrire en langage C, un algorithme qui limite le nombre dessais à 3 pour effectuer une saisie correcte. Exercice #include "ESLib.h" int main () { char rep; /* caractere a saisir pour la reponse */ int cpt ; /* compteur de boucle */ /* initialisation du compteur de passages */ cpt = 0; Correction do { ecrisChaine ("Voulez vous saisir qlqchose ? (O/N)" ); rep = lisCaractere(); /* incrémentation du nombre de passages */ cpt = cpt +1; } while (rep != 'O' && rep != 'N' && cpt <3); if (cpt == 3) ecrisChaine ("Nombre d'essais depasse "); sautDeLigne(); system ("pause"); return 0; }

15 P. Costamagna15 E. La boucle POUR … Langage intermédiaire Pour cpt = depart à arret pas val instructions (1) Fpour instructions (2) … variable correspondant au compteur de boucle. valeur initiale de la boucle valeur de sortie de la boucle pas dincrémentation de la boucle

16 P. Costamagna16 E. La boucle POUR … (suite1) Fonctionnement : Lors du 1 er passage, le compteur est initialisé avec la valeur de départ et est comparé avec la valeur darrêt Si départ <= arrêt alors le bloc instructions (1) est exécuté une fois Lors des passages suivants, le compteur est incrémenté à chaque nouveau passage de la valeur du pas Si la nouvelle valeur du compteur est <= arrêt, le bloc dinstructions (1) est à nouveau exécuté le compteur est à nouveau incrémenté … arrêt de la boucle quand le compteur devient > arrêt. le programme continue en séquence avec les instructions(2). Ce déroulement est donné pour un pas positif. Dans le cas dun pas négatif, les comparaisons sont inversées.

17 P. Costamagna17 E. La boucle POUR … (suite2) Remarques : Il est inutile dinitialiser le compteur de boucle avant la boucle POUR. La valeur du compteur ainsi que les valeurs de départ et darrêt de la boucle ne doivent pas être modifiées à lintérieur de la boucle. depart et arret peuvent être des valeurs fixées ou des expressions. Cette structure de boucle est à privilégier dans les situations où lon connaît davance le nombre de passages à effectuer dans la boucle. Cette structure de boucle nest pas du tout indispensable. Son grand intérêt est dépargner un peu de fatigue au programmeur, en lui évitant de gérer lui- même la progression du compteur de boucle.

18 P. Costamagna18 E. La boucle POUR … (suite3) for (i=1 ; i <=8 ; i= i+2) ecrisEntier (i) Langage C for (expr1 ; expr2 ; expr3) { instructions (1)... } instructions (2) … Pas de ; à la fin de linstruction. expr1: initialisation du compteur de boucle expr2: test darrêt de la boucle expr3: incrémentation du compteur de boucle Exemple

19 P. Costamagna19 E. La boucle POUR … (suite4) Ecrire en langage C, un algorithme qui affiche la table de multiplication de 1 à 10 dun nombre choisi par lutilisateur. Exercice Correction #include "ESLib.h" int main () { int n; /* valeur de la table de multiplication */ int cpt; /* cpt de boucle pour les 10 multiplications */ ecrisChaine ("Saisir un nombre "); n = lisEntier(); sautDeLigne(); for (cpt=1; cpt <=10; cpt = cpt+1) { ecrisEntier(cpt); ecrisChaine (" x "); ecrisEntier(n); ecrisChaine (" = "); ecrisEntier (n * cpt); sautDeLigne(); } sautDeLigne(); system ("pause"); return 0; }

20 P. Costamagna20 F. Choisir la bonne boucle En réalité une seule boucle aurait pu suffire. Suivant la nature du pb à résoudre telle ou telle forme de boucle savérera plus adaptée en conduisant à des formulations plus simples. Questions à se poser Le nombre de tours de boucle est il connu ? OUI utiliser la boucle POUR NON Peut on commencer l'action avant de tester une situation? OUI utiliser la boucle REPETER NON utiliser la boucle TANT QUE

21 P. Costamagna21 G. Quelques erreurs à éviter ….. while( i < 10 ) { ecrisChaine ("hello world !"); i = i + 1; } Le compteur de la boucle TANT QUE nest pas initialisé: ….. i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); i = i + 1; } Erreur dans la comparaison la condition ne sera jamais vraie, donc la boucle ne sera pas exécutée : i = 0; while( i > 10 ) { ecrisChaine ("hello world !"); i = i + 1; } i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); i = i + 1; }

22 P. Costamagna22 G. Quelques erreurs à éviter (suite1) i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); } Le compteur de la boucle TANT QUE nest pas incrémenté boucle infinie: i = 0; while( i < 10 ) { ecrisChaine ("hello world !"); i = i + 1; } Attention aux ; en trop. La boucle suivante ne fait rien pendant 10 fois puis affiche la phrase hello world ! une seule fois : for ( i = 0; i < 10; i = i+1 ); ecrisChaine ("hello world !"); for ( i = 0; i < 10; i = i+1 ) ecrisChaine ("hello world !");


Télécharger ppt "5. Les structures répétitives P. Costamagna – ISEN N1."

Présentations similaires


Annonces Google