Introduction à l algorithmique et à la programmation M1102 CM n 3 DUT Informatique 1 re année Eric REMY eric.remy@univ-amu.fr IUT d Aix-Marseille, site d Arles Version du 2 octobre 2013 E. Remy (IUT d Arles) M1102 CM n 3 1 / 36
Supports de cours, livres et sites Web La page Web de ce cours (ça va changer!) (cours, TD, TP, corrections) La prise de note est indispensable La pratique de la programmation est encore plus indispensable! Livre de John R. Hubbard (2 à l IUT ou à acheter d occasion) Livre de Claude Delannoy (2 à l IUT ; réédité régulièrement) Le WikiLivre Le site du Zéro (à prendre avec des pincettes!) Plus de renseignements sur la page Web du cours de C++, en suivant «ces autres cours». Certaines diapos du cours seront à étudier par vous-mêmes. ÝÑ E. Remy (IUT d Arles) M1102 CM n 3 2 / 36
Historique (rapide) du langage C++ Langage C Programmation structurée B. Kernighan & D. Ritchie Création d UNIX 1973 ANSI/ISO 1989 (et 1999) Langage C++ Programmation orientée objet B. Stroustrup «1980 ANSI/ISO 1998 2011 (0x0b) Le C++ est un des principaux langages de développement actuellement en entreprise. Ce sera le langage de la majorité de vos TP à l IUT. La syntaxe de C a donné celle de C++ (et Objective-C), qui a ensuite forcement influencé celles d autres langages : JAVA, php, etc. E. Remy (IUT d Arles) M1102 CM n 3 3 / 36
L historique des normes... pour information! Les normes ISO du C et du C++ 1978 (pas de standard) B. Kernighan & D. Ritchie «K&R» 1989 C ANSI «C89» (X3.159-1989) 1990 C ISO «C90» (ISO/IEC 9899 : 1990) 1995 «C95» (ISO/IEC 9899 : 1990 /AMD1 : 1995, Normative Amendment to C90) 1998 «C++98» (ISO/IEC 14882 : 1998) 1999 «C99» (ISO/IEC 9899 : 1999) 2001 «C99» corrigé (ISO/IEC 9899 : 1999/Cor 1 : 2001, correction to C99) 2003 «C++03» (ISO/IEC 14882 : 2003) 2004 «C99» corrigé (ISO/IEC 9899 : 1999/Cor 2 : 2004, correction to C99) 2005 «C++TR1» (ISO/IEC TR 19768 : 2005) 2011 «C++0x0b» a.k.a. «C++11» (ISO/IEC 14883 : 2011) E. Remy (IUT d Arles) M1102 CM n 3 4 / 36
Premier programme : programme source Un programme source est un texte dont la structure correspond à celle imposée par le langage de programmation (ici, C++). HelloWorld.cpp 1 #i n c l u d e <i o s t r e a m > // Toujours commencer par tous les #includes. 2 u s i n g namespace s t d ; // Définir le namespace «std» par défaut. 3 i n t main ( ) // Programme principal. 4 { 5 cout << " H e l l o world! " << e n d l ; // Écrire à l écran «Hello world!». 6 r e t u r n 0 ; // Renvoyer «Ok» au système d exploitation. 7 } // Important : ici, retour à la ligne! 8 Les deux premières lignes seront expliquées (beaucoup) plus tard. Patience!... Les parties commençant par des «//» sont ignorées jusqu à la fin de ligne : ce sont des commentaires. Le fichier finit sur une ligne 8 vide, c est-à-dire par un «Ðâ» à la fin de la ligne 7. E. Remy (IUT d Arles) M1102 CM n 3 5 / 36
Premier programme : compilation (1/2) Le programme source ne peut pas démarrer et fonctionner en l état... Pour transformer ce programme source en un programme exécutable, il faut le traduire grâce à un compilateur adapté : au langage (ici, C++, mais il y a plein d autres langages!) ; au type de microprocesseur (par exemple, Intel 386, IA32, AMD64, PowerPC, ARM, etc.) et au système d exploitation (par exemple, Windows, MacOS X, Linux, Android, BeOS, etc.). Nous utiliserons le compilateur GNU g++ (gratuit et librement utilisable) Ñ En particulier MinGW-g++ pour Windows En ligne de commande du système (utilisation identique sous Windows, MacOS, Linux, etc.) : rudimentaire certes!... mais sans (mauvaise) surprise!!! E. Remy (IUT d Arles) M1102 CM n 3 6 / 36
Premier programme : compilation (2/2) En TP, des consignes précises seront présentes sur le sujet de TP : suivez-les! La «compilation» (par abus de langage) g++ Wall c HelloWorld.cpp À partir de «HelloWorld.cpp», on fabrique «HelloWorld.o». En vérité, il y 3 opérations consécutives : préprocessing, compilation (véritable) et assemblage. L édition de liens (US : linking) g++ Wall o HelloWorld.exe HelloWorld.o À partir de «HelloWorld.o», on fabrique «HelloWorld.exe». En tapant maintenant dans la ligne de commande «HelloWorld» (le «.exe» est facultatif ici), vous pouvez admirer le résultat : votre premier programme démarre et vous parle! Votre programme a été chargé en mémoire et exécuté. E. Remy (IUT d Arles) M1102 CM n 3 7 / 36
Corriger les erreurs : déboguer (1/2) Différents types d erreurs suivant les étapes du procéssus : Les erreurs à la compilation : «Error» : la phase de compilation ne peut pas se dérouler jusqu au bout ; le fichier «.o» ne sera pas produit. Exemple : erreur de syntaxe, faute de frappe, variable inexistante, parenthèse non-refermée, etc. «Warning» : la phase de compilation peut aller à son terme mais il y a bien une erreur à corriger. Exemple : affectation d un réel à un entier, manque de précision, etc. Les erreurs d édition de liens Exemple : fichier(s) «.o» manquant(s) Les erreurs à l exécution Exemple : erreur de l utilisateur, division par zéro, ressources systèmes insuffisantes, etc. E. Remy (IUT d Arles) M1102 CM n 3 8 / 36
Corriger les erreurs : déboguer (2/2) Ce qu il faut faire : Corriger la première erreur détectée Si c était une error et pas un warning, pas la peine de regarder plus loin puisque la suite de la compilation est probablement incorrecte... Puis recommencer : compilation, édition de liens, exécution... Jusqu à ce qu il n y ait plus d erreur. Ce n est pas parce que le compilateur ou vous-même ne voyez plus d erreur qu il n y en a plus aucune! (hélas!) ;) Le plus difficile est d être capable de regarder votre propre programme avec un regard neuf : vous devez oublier ce que vous pensez que ça fait, pour arriver à voir ce que vous avez réellement fait! (Et si vous ne trouvez pas, demandez un regard neuf : le prof, un(e) copain/copine) E. Remy (IUT d Arles) M1102 CM n 3 9 / 36
Instruction et bloc d instruction Chaque instruction C/C++ se termine par un «;» : cout << "Blah Blah"<< endl; Un bloc : une suite d instructions peut être groupée pour compter comme une unique «grosse» instruction : 1 { // Début du bloc, équivalent de «Début» en algorithmique. 2 x = x 2 2 ; 3 y = x + 1 ; 4 cout << " x=" << x << " y=" << y << e n d l ; 5 } // Fin du bloc, équivalent de «Fin» en algorithmique. Merci de ne pas créer des blocs avec une seule instruction dedans : ça gène la lecture! À quoi ça sert? Ñ À nommer le groupe (fonction), à le répéter (boucle), etc. À l extrême, «;» est l instruction vide (celle qui ne fait rien)! ãñ Elle est légale, et parfois source de pièges subtils... E. Remy (IUT d Arles) M1102 CM n 3 10 / 36
Commentaires Les commentaires sont ignorés par le compilateur ; ils aident la lecture des humains. Commentaires longs et courts 1 / Commentaire long, é v e n t u e l l e m e n t 2 s u r p l u s i e u r s l i g n e s / 3 4 // Commentaire court, jusqu à la fin de cette ligne. Pour la mise au point : permet de retirer temporairement quelques lignes d un programme. Interdit d emboîter deux commentaires longs, mais... On peut emboiter des commentaires courts dans un long. Pour commenter «etu=etu+1;» : Pas bien : traduire les instructions en français (exemple : «// Ajoute 1 à etu») Bien : donner la raison de faire ça (exemple : «// On passe à l étudiant suivant») Vous devez commenter votre code! (Pour vous, pour le lecteur,... pour le correcteur!) E. Remy (IUT d Arles) M1102 CM n 3 11 / 36
Mise en page et bonnes pratiques de rédaction C++ Le compilateur se préoccupe habituellement peu des «blancs» (espace(s), tabulation(s), retour à la ligne, etc.) Vous pourriez donc : Écrire votre programme sur une seule ligne! (pas facile à relire... Ne le faites jamais!) Écrire comme bon vous semble... Mais ça restera difficile de lire le programme de quelqu un d autre : déconseillé aussi. Écrire en respectant la mise en forme traditionnelle (obligatoire pour ce cours) : Indenter les blocs et les instructions en fonction de leur niveau d emboîtement ; Couper toutes les lignes trop longues pour être entièrement vues dans l éditeur. Pas difficile : simplement faire comme dans les exemples du cours... E. Remy (IUT d Arles) M1102 CM n 3 12 / 36
Deuxième programme : réagir à l age Voici un programme capable de réagir à l age de l utilisateur : age.cpp 1 #i n c l u d e <i o s t r e a m > 2 u s i n g namespace s t d ; 3 4 i n t main ( ) 5 { 6 i n t age ; // Variable entière pour mémoriser l age de l utilisateur 7 cout << " Quel e s t v o t r e age? >" ; // Message pour l utilisateur 8 c i n >> age ; // Lecture de l age tapé par l utilisateur 9 i f ( age >= 18) // Si l age de l utilisateur est supérieur à 18 ans, 10 cout << " Vous e t e s majeur ( e ) " << e n d l ; // alors il est majeur, 11 e l s e i f ( age >= 0) // sinon s il est positif (et donc <18) 12 cout << " Vous e t e s mineur ( e ) " << e n d l ; // alors il est mineur, 13 e l s e // sinon c est que la valeur est négative! 14 cout << " Vous vous moquez de moi? " << e n d l ; 15 r e t u r n 0 ; // Fin «normale» du programme 16 } 17 E. Remy (IUT d Arles) M1102 CM n 3 13 / 36
Les 4 étapes de la compilation 1 Preprocessing : Le préprocesseur traite toutes les lignes commençant par «#» Inclusion de fichier : par exemple, «#include <iostream>» Substitutions lexicales : les «macros» et les constantes symboliques comme «M_PI» (la valeur de π définie grâce à «#include <cmath>») Pas des instructions C/C++ : pas de «;»! 2 Compilation (proprement dite) : Vérification de la syntaxe C++ Traduction vers le langage de la machine (en «assembleur») 3 Assemblage : Traduction finale en code machine (valeurs numériques appelées op-codes) Production du fichier objet «.o» ou «.obj» 4 Édition de liens : Unification des symboles internes entre les différents fichiers «.o» Étude et vérification des symboles externes («.so» ou «.DLL») Production du programme exécutable Les trois premières forment, par abus de langage, ce qu on appelle compilation. E. Remy (IUT d Arles) M1102 CM n 3 14 / 36
Créer une variable Pour créer une variable, il faut : 1 Choisir son type (liste des types possibles page suivante) ; 2 Choisir son nom : parlant, court, précis, etc. Les seuls caractères autorisés sont : «a... za... Z0...9 _». Ne pas commencer par un chiffre. Ne pas mettre d espace. 3 Choisir sa valeur initiale (initialiser) en prenant garde à ce qu elle soit du bon type! 1 { 2 i n t nombre_d_oeufs ; // Définition (création) de la variable. (Une instruction) 3 nombre_d_oeufs = 3 ; // Initialisation de cette variable. (Une deuxième instruction) 4 i n t nombre_carottes = 6 ; // Idem, mais en une seule instruction. 5 f l o a t q t e _ l a i t = 0. 7 5 ; // «0.75» est bien une valeur réelle. 6 f l o a t q t e _ f a r i n e =350.0; // Le «.0» rend cette valeur réelle aussi. 7 c h a r l e t t r e= g ; // Cette variable contient la lettre G minuscule. (Notez les quotes/apostrophes!) 8 b o o l recommencer=f a l s e ; // Un booléen ayant une valeur fausse. 9 } E. Remy (IUT d Arles) M1102 CM n 3 15 / 36
Les types élémentaires (1/2) Les types marqués sont à connaître au plus tôt. Type Plage Exemple Remarques bool t false,trueu true Seulement deux valeurs possibles... unsigned char r0; 255s B ou 66 Entier très court (1 octet, 8 bits) ; Pour le code ASCII d une lettre. (signed) char r 128; 127s B ou 66 Idem mais codé en complément à deux. unsigned short ( int ) r0; 65535s 54321U Entier court (2 octets, 16 bits) (signed) short ( int ) r 32768; 32767s 4321 Idem mais codé en complément à deux. unsigned ( int ) r0; 2 32 1s 1234567890 Entier (4 octets, 32 bits). «r0; 4, 294.10 9 s (signed) int r 2 31 ; 2 31 1s 123456789U Idem mais codé en complément à deux. «r 2, 14.10 9 ; 2, 14.10 9 s unsigned long ( int ) r0; 2 32 1s 1234567890UL Idem unsigned int! (signed) long ( int ) r 2 31 ; 2 31 1s 1234567890L Idem int! unsigned long long ( int ) r0; 2 64 1s (très gros!) Entier long (8 octets, 64 bits). «r0; 1, 84.10 19 s (signed) long long ( int ) r 2 63 ; 2 63 1s (très gros!) Idem mais codé en complément à deux. «r 9, 22.10 18 ; 9, 22.10 18 s Les plages sont données pour le cas d un PC Intel x386 (32 bits). En 64 bits, évidement, ça change... E. Remy (IUT d Arles) M1102 CM n 3 16 / 36
Les types élémentaires (2/2) Type Exemple Remarques float 123.456e12f IEEE 754, 4 octets, précision environ 6 chiffres, exposant 10 38 double 12.34e260 IEEE 754, 8 octets, précision environ 10 chiffres, exposant 10 308 long double 12.34e260L Pas normalisé! 10 octets, taille interne du FPU string "Ca va?" Taille variable suivant le contenu ( string n est pas un type, c est une classe... mais on y reviendra!) string permet de stocker une suite de lettres : une chaîne de caractères Les instructions suivantes 1 s t r i n g nom = "Remy" ; 2 s t r i n g prenom = " E r i c " ; 3 cout << " Je m a p p e l l e " << prenom << 4 << nom <<. << e n d l ; Produisent à l écran : Je m appelle Eric Remy.ê Exemple : variable2.cpp E. Remy (IUT d Arles) M1102 CM n 3 17 / 36
Les constantes typées Comme une définition de variable, mais avec const devant... On peut lire la valeur de la constante mais... On ne peut pas changer la valeur de la constante, donc... Forcément, il faut l initialiser à la création! Déclaration de constantes 1 c o n s t f l o a t p i = 3.141592 f ; // Valeur de π 2 c o n s t i n t max_etu = 7 0 ; // Nombre maximal d étudiants Façon moderne (C++) et souhaitable de faire une constante mais Il en existe une autre plus archaïque (celle du C «Kernighan & Ritchie»)... E. Remy (IUT d Arles) M1102 CM n 3 18 / 36
Les constantes symboliques «macro» Syntaxe : #define MAX_T (300) Le «#» indique bien que c est le préprocesseur et non le compilateur qui est concerné. Dans toute la suite «MAX_T» sera remplacé par «(300)» Pas réellement une constante : aucun typage! Tradition : nom des symboles en MAJUSCULE (pour mieux les repérer) On peut faire des choses très bien... mais aussi très mal! Prudence! Plus rigolo! On peut paramétrer la substitution syntaxique : #define FOIS10(x) ((x) 10) Alors «FOIS10(20)» sera remplacé par «((20) 10)» Toujours mettre des parenthèses car... Elles évitent une association malheureuse éventuelle! Sans les deux séries de parenthèses, «20 FOIS10(2+3)» serait développé en «20 2+3 10» (70) au lieu de «20 ((2+3) 10)» (1000)! E. Remy (IUT d Arles) M1102 CM n 3 19 / 36
Les expressions (1/2) Une expression est une formule dont le calcul met en œuvre des opérateurs : ils expriment l action à faire (par exemple ` est l opérateur d addition) un ou des opérandes : ils sont ce sur quoi porte l action (par exemple deux valeurs numériques) Vous êtes déjà parfaitement à l aise avec ce qu est une expression : vous en utilisez en mathématiques depuis des années sans vraiment y avoir pensé! Une expression peut être évaluée (par exemple, on peut effectuer l addition de deux valeurs numériques) Le résultat de l évaluation se caractérise par une valeur et un type (en mathématiques, on parlerait d ensemble de définition) E. Remy (IUT d Arles) M1102 CM n 3 20 / 36
Les expressions (2/2) Les trois expressions mathématiques b 2 4.a.c, x 1 traduisent simplement en C++ par Les 3 expressions traduites en C++?? b b` 2.a et x 2 2.a se 1 d o u b l e a =..., b =..., c =... ; // 1ère instruction : définitions de a, b et c 2 d o u b l e d e l t a = b b 4 a c ; // 2ème instruction : définition et calcul de 3 d o u b l e x1 = ( b s q r t ( d e l t a ) ) / ( 2 a ) ; // 3ème instruction : définition et calcul de x 1 4 d o u b l e x2 = ( b+s q r t ( d e l t a ) ) / ( 2 a ) ; // 4ème instruction : définition et calcul de x 2 Opérandes : a, b, c, 4, 2,... Opérateurs : +,,, /... mais aussi = (l opérateur d affectation)! sqrt () (pour square root, racine carrée en français) n est pas un opérateur mais une fonction. La seule différence est que cela s écrit en toutes lettres et pas avec un symbole! E. Remy (IUT d Arles) M1102 CM n 3 21 / 36
Les opérateurs logiques Les opérateurs logiques s appliquent à des valeurs booléennes (vraies ou fausses) et donnent un résultat booléen. 5 opérateurs : && (et), (ou), ^^ (ou exclusif),! (négation ; un seul opérande après l opérateur), == (test d égalité),!= (test de différence) Les expressions logiques sont particulièrement utiles dans les tests et les boucles. Exemple d expression logique 1 i f ( ( s e x e==" f é minin " && s t a t u t==" e n c e i n t e " ) // Si vous êtes une femme et enceinte 2 ( s t a t u t==" h andicap é " ) // ou bien que vous êtes handicapé, alors... 3 ) 4 cout << " Vous avez d r o i t à une p l a c e a s s i s e dans l e bus " ; Ne pas confondre «=» (l affectation) avec «==» (le test d égalité)! Ne pas les confondre avec les opérateurs logiques «bit à bit»... E. Remy (IUT d Arles) M1102 CM n 3 22 / 36
Les opérateurs logiques «bit à bit» Les opérateurs logiques «bit à bit» s appliquent à des valeurs numériques entières et donnent un résultat numérique entier. 3 opérateurs : & (et), (ou), ^ (ou exclusif) et ~ (négation) Le principe est le même mais «en colonne» sur les bits de l écriture binaire des opérandes 2 opérateurs de décalage : << (décalage de n rangs vers la gauche, multiplication par 2 n ), >> (décalage de n rangs vers la droite, division par 2 n ) Exemple d expressions logiques «bit à bit» 1 u n s i g n e d c h a r a =12; // a=00001100 2=12 10 2 u n s i g n e d c h a r b=10; // b=00001010 2=10 10 3 4 u n s i g n e d c h a r c=a&b ; // c=00001000 2=8 10 5 u n s i g n e d c h a r d=a b ; // d=00001110 2=14 10 6 u n s i g n e d c h a r e=a^b ; // e=00000110 2=6 10 7 8 u n s i g n e d c h a r f=~a ; // f=11110011 2=3 10 9 u n s i g n e d c h a r g=a<<3; // g=01100000 2=12 10 ˆ 2 3 96 10 10 u n s i g n e d c h a r h=a>>2; // h=00000011 2=12 10 2 2 3 10 E. Remy (IUT d Arles) M1102 CM n 3 23 / 36
Les priorités des opérateurs (1/2) Liste des opérateurs : les opérateurs de chaque ligne sont prioritaires sur ceux des lignes du dessous. Deux opérateurs d une même ligne de programme seront évalués dans l ordre où ils apparaissent dans l expression («dans l ordre de lecture»). Il est toujours possible (voire préférable) d utiliser des parenthèses pour forcer/clarifier l ordre d évaluation. Ces opérateurs là sont à connaître en premier. E. Remy (IUT d Arles) M1102 CM n 3 24 / 36
Les priorités des opérateurs (2/2) Plus prioritaire :: (opérateur de résolution de portée)., >, [ ] (accès à un tableau), () (appel de fonction), () (parenthèses), sizeof () ++,, ~,!, (unaire), & (prise d adresse), (indirection), new, delete, delete [ ], () (conversion de type) (multiplication), / (division), % (modulo) + (addition), (soustraction) << (décalage à gauche, injection dans un flux), >> (décalage à droite, extraction d un flux) <=, >=, <, > (comparaisons) ==,!= (comparaisons) & (et bit à bit) ^ (ou exclusif bit à bit) (ou bit à bit) && (et logique) ^^ (ou exclusif logique) (ou logique) (? : ) (opérateur ternaire) = (affectation) et ses variantes : +=, =, =, /=, <<=, >>=, &=, =, ~=, (mise en séquence) Moins prioritaire E. Remy (IUT d Arles) M1102 CM n 3 25 / 36
Condition : if()... else if()... else... Syntaxe du if() 1... // Instructions qui précèdent le choix. Toujours effectuées. 2 i f ( expr_cond1 ) 3 { 4... // Ici, si expr_cond1 est vraie. 5 } 6 e l s e i f ( expr_ cond2 ) // Le(s) éventuels groupe(s) «else if()» est/sont facultatif(s). 7 { 8... // On vient ici, si expr_cond1 est fausse mais que expr_cond2 est vraie. 9 } 10 e l s e // Évidement le groupe «else» est facultatif. 11 { 12... // Effectué sinon, c est-à-dire dans tous les autres cas. 13 } 14... // Instructions qui suivent le choix. Toujours effectuées. Les parenthèses font partie de la syntaxe : ne les oubliez pas! Les accolades ne sont nécessaires que s il y a plusieurs instructions dedans. E. Remy (IUT d Arles) M1102 CM n 3 26 / 36
Choix multiple : switch() { case :... break ;... default :... } (1/2) Syntaxe du switch() 1... // Instructions qui précèdent le choix. 2 s w i t c h ( e x p r e s s i o n ) 3 { 4 c a s e e x p r _ c o n s t 1 : // Si expression==expr_const1 5... // alors on exécute ces instructions. 6 b reak ; // Pour sortir du switch! Sinon on continue au cas d après! (C est parfois pratique). 7 c a s e e x p r _ c o n s t 2 : // Si expression==expr_const2 8... // alors on exécute ces instructions. 9 b reak ; // Pour sortir du switch! 10 // Éventuellement ici encore d autres «case expr_constn :»... 11 d e f a u l t : // Si expression est différente de tous 12... // les cas précédant, on vient ici. 13 } 14... // Instructions qui suivent le choix. Souvenez-vous : le break est facultatif!... mais pratiquement toujours nécessaire! Tests complexes (x==a+2, ď, etc.) impossibles : utiliser if ()... else if ()... E. Remy (IUT d Arles) M1102 CM n 3 27 / 36
Choix multiple : switch() { case :... break ;... default :... } (2/2) Exemple de switch() 1 c h a r c a r = ; 2 do 3 c i n >> c a r ; // On lit une lettre tapée par l utilisateur 4 w h i l e ( car < a c a r > z ) ; // Tant que ce n est pas une minuscule. 5 s w i t c h ( c a r ) 6 { 7 c a s e a : c a s e e : c a s e i : 8 c a s e o : c a s e u : c a s e y : 9 cout << " La l e t t r e " << c a r << " e s t une v o y e l l e! " ; 10 b reak ; 11 d e f a u l t : 12 cout <<" La l e t t r e " << c a r << " e s t une consonne! " ; 13 } La structure de contrôle switch est très pratique pour présenter des choix à l utilisateur. Exemple : switch.cpp E. Remy (IUT d Arles) M1102 CM n 3 28 / 36
Boucle «Tant que» : while() Équivalent au «TantQue» du cours d Algorithmique Répète une instruction (ou un bloc d instructions) tant que la condition est vérifiée. Exemple de while() 1 w h i l e ( e x p r e s s i o n _ c o n d i t i o n ) 2 { 3... // bloc effectué tant qu expression_condition est vraie 4 } Il n y a pas de «FinTantQue» puisque c est la fin de l instruction (ou du bloc) qui répond à ce besoin. Attention à ne pas mettre de «;» après la parenthèse fermante du while ()! Si la condition est fausse dès le début, les instructions ne sont jamais effectuées. Si la condition reste toujours vraie... C est une boucle infinie! Pensez à Ctrl C! Exemple : while.cpp E. Remy (IUT d Arles) M1102 CM n 3 29 / 36
Boucle «Faire... Tant que» : do... while() ; Équivalent au «Faire... TantQue» du cours d Algorithmique Répète une instruction (ou un bloc d instructions) tant que la condition est vérifiée. Exemple de do... while() ; 1 do 2 { 3... // Bloc effectué au moins une fois, puis encore tant 4 // qu expression_condition reste vraie 5 } 6 w h i l e ( e x p r e s s i o n _ c o n d i t i o n ) ; N oubliez pas le «;» à la fin! Même si la condition est fausse à la fin du premier tour, les instructions sont forcément effectuées au moins une fois. Si la condition reste toujours vraie... C est une boucle infinie! Pensez à Ctrl C! Exemple : switch.cpp (pour tester qu on a bien donné une lettre et pas autre chose) E. Remy (IUT d Arles) M1102 CM n 3 30 / 36
Boucle «Pour... de... à... Faire» : for(... ;... ;...) (1/3) Équivalent au «Pour... de... à... Faire» du cours d Algorithmique Répète une instruction (ou un bloc d instructions) autant de fois que nécessaire pour qu une variable (nommée compteur) parcoure une plage de valeurs connue. Syntaxe de for() 1 f o r ( / i n i t i a l i s a t i o n ( s ) / ; / t e s t / ; / i n c r é mentation ( s ) / ) 2 { 3... // Bloc effectué tant que test est vrai. 4 } Si la condition est fausse avant le premier tour, les instructions du bloc ne seront jamais effectuées. Si la condition reste toujours vraie... C est une boucle infinie! Pensez à Ctrl C! Attention à ne pas mettre de «;» après la parenthèse fermante du for ()! E. Remy (IUT d Arles) M1102 CM n 3 31 / 36
Boucle «Pour... de... à... Faire» : for(... ;... ;...) (2/3) Comparez ce for () avec le while () équivalent : Syntaxe de for() 1... 2 3 f o r ( i n t i =0 ; i <10 ; i=i +1) 4 { 5... // Instructions à répéter 6 7 } 8... 1... 2 i n t i =0; 3 w h i l e ( i <10) 4 { 5... // Instructions à répéter 6 i=i +1; 7 } 8... Possible de définir la variable de boucle dans la partie «initialisation(s)». Construction bien plus générale qu en algorithmique. Exemple : for.cpp E. Remy (IUT d Arles) M1102 CM n 3 32 / 36
Boucle «Pour... de... à... Faire» : for(... ;... ;...) (3/3) Exemple de for() 1 u n s i g n e d i n t i ; // Définition des variables. 2 c h a r c ; 3 4 f o r ( i =0, c= a ; i <26 ; i=i +1, c=c+1 ) 5 { // i et c évoluent en parallèle respectivement de 0 à 25 et de a à z! 6 cout << " La l e t t r e numé ro " << i +1 7 << " de l a l p h a b e t e s t " << c <<. << e n d l ; 8 } Attention à ne pas mettre de «;» après le for () sinon vous répétez «rien»! Exemple de for() erroné 1 f o r ( u n s i g n e d i n t i =0 ; i <10 ; i ++); // Répète 10 fois «rien» 2 cout<<" t r u c "<<e n d l ; // Puis écrit truc une seule fois (instruction hors boucle!) E. Remy (IUT d Arles) M1102 CM n 3 33 / 36
Flux d entrée et de sortie Trois flux standards sont définis par «#include <iostream>» : cin : l entrée standard, par défaut, ce que l utilisateur tape au clavier ; cout : la sortie standard, par défaut, la console ; cerr : la sortie standard d erreur, par défaut, la console aussi. Il est possible de rediriger chacun de ces flux... mais ça dépend du système d exploitation. Exemple d utilisation des flux standards 1 i n t n ; 2 cout << " Donnez un e n t i e r, svp " << e n d l ; 3 c i n >> n ; 4 cout << " Vous avez tape n=" << n << e n d l ; 5 c e r r << " Arg! Panique!!! " << e n d l ; E. Remy (IUT d Arles) M1102 CM n 3 34 / 36
Mise en forme des sorties (1/2) Manipulateurs définis par «#include <iomanip>» : endl : insère une fin de ligne. setw(x) : la prochaine sortie sera sur une largeur de x caractères quitte à rajouter des espaces pour compléter. setfill(c) : utilisera c comme caractère de remplissage. left : la prochaine sortie sera cadrée à gauche (réglage par défaut). right : la prochaine sortie sera cadrée à droite. uppercase : la prochaine sortie sera convertie en majuscule. lowercase : la prochaine sortie sera convertie en minuscule. fixed : prochaine sortie en virgule fixe, ex. : «0.00012». scientific : prochaine sortie en notation ingénieur, ex. : «1.2e-4». flush : vide le tampon de sortie, assurant que toutes les écritures précédentes sont effectuées. E. Remy (IUT d Arles) M1102 CM n 3 35 / 36
Mise en forme des sorties (2/2) Exemple d utilisation des manipulateurs de sortie 1 #i n c l u d e <iomanip> 2... 3 c o n s t i n t v a l 1 =1234; 4 c o n s t d o u b l e v a l 2 =3.1415; 5 6 // Cadré à droite, sur 8 colonnes, avec des 0 pour compléter à gauche. 7 cout << r i g h t << setw ( 8 ) << s e t f i l l ( 0 ) << v a l 1 << e n d l ; 8 // Cadré à gauche (par défaut), sur 5 colones (complété à droite par des espaces), 9 // avec 2 chiffres après la virgule. 10 cout << f i x e d << setw ( 5 ) << s e t p r e c i s i o n ( 2 ) << s e t f i l l ( # ) << v a l 2 <<e n d l ; Produit à l écran : 1 00001234 2 3.14## Autre exemple : iomanip.cpp (Affichage d un indicateur de progression). E. Remy (IUT d Arles) M1102 CM n 3 36 / 36