Un programme ecrit en C doit obeir a certaines regles bien deIinies. Le langage reconnat uniquement la structure de Ionction: un programme ecrit en C est un ensemble de Ionctions dont chacune peut s`appeler elle-mme et appeler les autres Ionctions. Une Ionction particuliere, dont la presence dans le programme est obligatoire, est la Ionction main . Le programme commencera toujours sont execution au debut de cette Ionction. La structure la plus simple d`un programme C est alors:
main( )
deIinition des variables instructions }
Remarquez les parentheses obligatoires apres le nom de la Ionction (ici main ) et les accolades d`ouverture et de Iermeture delimitant le debut et la Iin de la Ionction. 22 Les commenLalres en C Dans un programme C il est possible (et d`ailleurs preIerable) d`ajouter des commentaires Iacilitant ainsi la lecture et la comprehension du programme par le programmeur lui-mme et par les autres personnes aussi. Le debut d`un commentaire est marque par /* et sa Iin par */, notons que les commentaires imbriques sont interdits. Exemple:
/* ce programme est ecrit en C */ ce commentaire est bon.
/* ceci /* est Iaux */ donc a eviter */ tandis que celui-ci est Iaux.
2.3 Les Ionctions precompilees et les header Iiles Il existe en C des Ionctions precompilees qui peuvent tre incluses dans nos programmes, ces Ionctions sont contenues dans des Iichiers speciaux appeles library Iiles (extension *.lib). Pour acceder a ces Ionctions une directive doit tre issue au compilateur indiquant d`inclure les header Iiles (extension *.h) contenant les declarations correspondantes a ces Ionctions. La syntaxe de la directive est la suivante:
#includeIichier.h~
Cette directive doit tre ecrite au tout debut du programme.
Exemple:
#includestdio.h~ main( )
printI("Hello world"); }
Ou stdio.h est le header Iile contenant la declaration de la Ionction printI. Nous reparlerons des header Iiles et des Ionctions dans les chapitres suivants. 24 8epresenLaLlon des donnees en C L`ordinateur a besoin de manipuler et de stocker les donnees qu`on lui Iourni. Le langage C permet la representation des donnees sous diIIerents Iormats repondant ainsi a ces besoins. Les diIIerents types de donnees sont les suivants:
2.4.1 Les constantes deIinition: les constantes sont des donnees dont la valeur ne peut pas tre modiIiee durant l`execution du programme.
En C on a les types de constantes suivants:
2.4.1.1 Les constantes entieres Ce sont tout simplement des valeurs entieres.
Exemple: -5 124
2.4.1.2 Les constantes reelles Ce sont des valeurs representees en virgule-Ilottante. Exemple: -12.36 123.21 134.1e3 111.12E-6 2.4.1.3 Les constantes caractere Elles representent un seul caractere. Exemple: a` B` 2` Le caractere etant un des caracteres du code ASCII a l`exception de l`apostrophe et du backslash. Notez que dans une constante caractere le caractere est entoure de deux apostrophes. Remarque: dans le troisieme exemple le 2` represente le caractere 2 et non pas l`entier 2 ( en ASCII le caractere 2 a pour code numerique 50 en decimal). 2.4.1.4 Les constantes sequences d`echappement Elles representent des caracteres speciaux. Une sequence d`echappement est Iormee du caractere backslash suivi d`un autre caractere. Les principales sequences d`echappement sont les suivantes: \n saut de ligne \t tabulation:pousser de 5 caracteres \b eIIacer un caractere (backspace) \a alerte:bip sur le haut parleur \\ imprime le caractere backslash \` imprime l`apostrophe 2.4.1.5 Les constantes chanes de caracteres Une chane de caracteres represente un suite de caracteres et de sequences d`echappement delimitee par de guillemets. Exemple: "Je suis une chane \n" 2.4.2 Les variables deIinition: Les variables sont des donnees dont la valeur peut tre modiIiee durant l'execution du programme. Toute variable est representee par un indentiIicateur qui doit tre declare avant son utilisation. La declaration se Iait de la maniere suivante: type identiIicateur valeur; type etant un des types reconnus par le langage C identiIicateur etant le nom par lequel on designera la variable valeur etant la valeur initiale qu'on souhaite attribuer a la valeur. Si dans la declaration la variable n'est pas initialisee (on ne lui attribut pas de valeur initiale) cette derniere peut alors contenir n'importe quoi. En ce qui concerne l'identiIicateur il doit obeir aux regles suivantes: -Il peut tre compose de n'importe quelle combinaison de lettres et de chiIIres mais doit necessairement commencer par une lettre ou un trait de soulignement (underscore). -La longeur maximale de l'identiIicateur depend du compilateur (32 caracteres en Borland C). -Les lettres minuscules sont diIIerenciees des majuscules ainsi somme et SOMME sont deux identiIicateurs diIIerents et peuvent tre utilises dans le mme programme. Il est temps de parler des diIIerents types de variables que C nous presente. En C les types de donnees sont: 2.4.2.1 Le type char Il permet de declarer un variable comme caractere. Exemple: char c'a'; 2.4.2.2 Le type int Il permet de declarer un variable comme entier positiI ou negatiI. Exemple: int a200; Remarque: Un int doit tre compris entre deux valeurs limites (consequence de l'architecture de l'ordinateur), sur le PC par exemple entre -32768 et 32767. 2.4.2.3 Le type Iloat Il permet de declarer une variable comme reel en virgule-Ilottante compris entre -10e38 et 10e38. Exemple: Iloat b2.32e3; 2.4.2.4 Le type double Mme que Iloat mais pour des nombres compris entre -10e308 et 10e308. 2.4.3 Les tableaux DeIinition: Les tableaux constituent un moyen pratique qui permet de regrouper plusieurs variables de mme type. la declaration d'un tableau se Iait de la maniere suivante: type identiIicateur|constante entiere positive|; Exemple: int tab|4|; declare un tableau de 4 valeurs entieres. Lab0 Lab1 Lab2 Lab3 On peut acceder aux elements individuels du tableau en indiquant entre les crochets l'indice correspondant a cet element. Notons que l'indice du premier element est 0 et non pas 1. ainsi tab|0| indique le premier element . . . tab|3| indique le dernier element
La declaration des tableaux ne se limite pas a une seule dimension, en eIIet on peut declarer des tableaux a plusieurs dimensions. Exemple: char tab|5||3|; declare un tableau de 5*315 elements Lab00
Lab21
Lab42 Le premier indice est le numero de la ligne et le second celui de la colonne.
Comme toute autre variable un tableau peut tre initialise durant sa declaration. Exemple: int tab|3|0,1,2};
0 1 2
int tab|2||2| 1,2},3,4} }; 1 2 3 4
int tab|4|1,2}; ici les deux premiers elements du tableau sont initialises. Notons qu'on peut pas commencer l'initialisation par les derniers elements du tableau. 2.4.4 Les structures DeIinition: Si un tableau permet de regrouper des variables de mme type, une structure permet par contre de regrouper des variables de types diIIerents. La declaration d'une structure se Iait de la Iaon suivante: struct identiIicateur
type element 1; type element 2; . . . type element n; }; Les elements de la structure sont appeles les champs ou les membres de cette structure. Notons que les structures constituent un moyen pratique de regrouper des elements qui sont en relation. Exemple: struct client
char nom|20|; int numero; }; Pour acceder a un champ d'une structure l'operateur " . " est utilise. Exemple: client.numero permet d'acceder au champ numero dans client. Apres avoir declare une structure on peut directement declarer des variables de ce type de structure. Exemple: struct client
char nom|20|; int numero; }; struct client client1,client2; donc client1 et client2 sont des structures client. La declaration de variables de type structure peut aussi se Iaire durant la declaration de la structure. Exemple: struct client
char nom|20|; int numero; }client1,client2; client1 et client2 sont deux structures independantes, on peut acceder aux champs de chacune d'elle les modiIier et les traiter. ChaplLre 3 Les operaLeurs Le langage C est base sur un noyau d'operateurs simple mais assez important et eIIicace permettant d'ecrire des expressions reduites aboutissant a des calculs rapides. Avant de commencer la discussion sur les operateurs il est necessaire de clariIier et d'expliquer les mots utilises apres: Les constantes et les variables declarees dans le programme constituent les donnees manipulees par l'ordinateur. Les operateurs ont pour but de permettre la manipulation et le traitement de ces donnees. DiIIerentes donnees peuvent tre groupees a l'aide des operateurs pour Iormer des expressions. Explication Iaite passons a la discussion des diIIerents operateurs du langage C. Il existe en C diIIerentes categories d'operateurs. 3.1 Operateurs arithmetiques Ils permettent d'ecrire des expressions mathematiques mettant en jeu des operandes numeriques. plus unaire : Il permet de signaler une valeur positive. Exemple: a 200; a (200-c); moins unaire -: Il permet de signaler une valeur negative. Exemple: a -32; a -b; plus binaire : Il retourne la somme de ses deux operandes. Exemple: a 23; a bc; moins binaire -: Il retourne la diIIerence de ses deux operandes. Exemple: a 41-12; a b-c; multiplication *: Cet operateur multiplie ses deux operandes. Exemple: a 30*12; a c*b; division /: Cet operateur divise son premier operande par le second. Exemple: a 4/2; a c/b; Remarque: il est tres important de noter que la division de deux entiers retourne un entier. Ainsi a5/6; retourne 0 et non pas 0.83333... . Pour remedier a ce probleme il Iaut que l'un des operandes soit un reel par suite a 5.0/6; retournera comme reponse 0.83333... . modulo : Il retourne le reste de la division du premier operande par le second. Exemple: a1295; retourne 4 car 129 5*25 4. 3.2 Operateurs logiques Ils permettent de realiser des expressions logiques ou booleennes, permettant ainsi de Iormer des expressions complexes a partir d'expressions simples. negation ! decrite par la table qui suit.
! vral faux faux vral ET logique && decrit par la table qui suit.
8 8 vral vral vral vral faux faux faux vral faux faux faux faux OU logique ,, decrit par la table qui suit.
8 $$8 vral vral vral vral faux vral faux vral vral faux faux faux Notons que A et B representent des expressions et que le resultat de telles operations est 0 pour Iaux et 1 pour vrai. Nous reviendrons sur ces operateurs plus tard dans les autres chapitres et les exercises. 3.3 Operateurs relationnels Ils permettent de Iormer des expressions de contrle en comparant les deux operandes.
lnferlorlLe sLrlcLe lnferlorlLe large superlorlLe sLrlcLe superlorlLe large egallLe lnegallLe ! 3.4 Operateurs d'aIIectation
affecLaLlon slmple
affecLaLlon avec calcul arlLhmeLlque ces operaLeurs effecLuenL le calcul arlLhmeLlque de leur premler operande avec le second en laffecLanL au premler + * / Lxemple a +b equlvauL aa+b lncremenLaLlon a[ouLe 1 son operande + + Lxemple a++ equlvauL a a+1 decremenLaLlon Remarque: lorsque l'operateur d'incrementation ou de decrementation est place avant son operande ce dernier est incremente avant d'tre utilise dans l'expression, c'est la pre-incrementation. lorsque l'operateur d'incrementation ou de decrementation est place apres son operande ce dernier est incremente apres son utilisation dans l'expression, c'est la post-incrementation. 3.5 L'operateur conditionnel ou ternaire Le seul operateur ternaire du langage C est l'operateur ?: aussi appele l'operateur conditionnel. Il evalue son second ou son troisieme operande selon que sont premier operande est vrai ou Iaux. Sa syntaxe est la suivante: operande1?operande2:operande3 Exemple: a (c~b)?12:15 Si la variable c est superieure a la variable b alors la variable a sera egale a 12 sinon elle sera egale a 15. 3.6 Autres operateurs L'operateur . permet comme nous l'avons vu dans le chapitre precedent d'acceder au champs d'une structure. L'operateur d'evaluation sequentielle note , permet tout simplement d'evaluer ses deux operandes dans l'ordre de gauche a droite. Exemple: a (b,b12); incremente b, eIIectue la somme b12 puis aIIecte le resultat a a. 3.7 Priorite et ordre d'evaluation des operateurs Peut tre que vous vous posez deja la question suivante: comment evalue t'on une expression si elle contient plusieurs operateurs? En Iait dans le langage C chaque operateur a sa priorite et son ordre d'evaluation. Dans une expression comportant plusieurs operateurs ceux de plus grande priorite sont evalues en premier ensuite ceux de priorite plus petite et ainsi de suite jusqu'a arriver a ceux dont la priorite est la plus petite. Dans le cas ou plusieurs operateurs sont de mme priorite leur ordre d'evaluation determine alors celui qui sera evalue en premier. Je vous presente ci-dessous un tableau de priorite et d'ordre d'evaluation des diIIerents operateurs:
peraLeur rdre devaluaLlon ( ) Cauche urolLe ! + + (molns unalre) urolLe Cauche * / C u + C u C u ! C u C u $$ C u ? C u + * / u C C u 3.8 Les conversions de type 3.8.1 La conversion implicite ou automatique Si on regroupe dans une mme expression des types de donnees diIIerents le compilateur procede a une conversion des types selon la regle suivante: Le type dont le poids est le plus Iaible est converti au type dont le poids le plus Iort. Ainsi un char en presence d'un int sera convertit en int (la valeur correspondante sera alors le code ASCII du caractere correspondant), un int en presence d'un Iloat sera convertit en Iloat. Le type dont le poids est le plus Iort est le double. Exemple: char a'A'; int b32; alors ab sera un int contenant 97 car le char a ete convertit en int. Il est aussi important de noter que dans une expression d'aIIectation le compilateur procede a une conversion implicite en changeant le type de la variable a droite au type de la variable a gauche. Exemple: int a12; Iloat ba; alors b sera egale a 12.0 int cb; alors c sera egale a 12 et la valeur decimale est tronquee. 3.8.2 La conversion explicite ou Iorcee Nous avons vu que le compilateur procede a une conversion quand cette conversion lui parat logique: int --~ Iloat par exemple. Cepandant il est tout a Iait possible de proceder a la conversion d'un Iloat en un int par exemple. Cette conversion est dite une conversion Iorcee ou explicite. Une conversion Iorcee peut tre achevee en utilisant un cast, la syntaxe d'un cast est la suivante: (type souhaite) expression Exemple: (int)(5.31/5) retournera un int (valeur tronquee), en eIIet 5.31/5 retourne un Iloat mais puisque un cast est utilise avant l'expression le Iloat sera convertit en int. ChaplLre 4 Les foncLlons denLrees/sorLles en C Aprs avo|r exp|or |es types de donnes et |es oprateurs du |angage C nous passons ma|ntenant g |tude de que|ques fonct|ons qu| vont nous permettre de ||re g part|r du c|av|er et daff|cher sur |cran de notre ord|nateur Aprs tout tout programme aura beso|n de donnes que nous devons |u| fourn|r pour |es man|pu|er et aff|chera en retour d|ffrents rsu|tats sur |cran 41 #lnclude sLdloh
Le |angage C nous fourn|t des fonct|ons prdf|n|es de |ecture g part|r du c|av|er et dcr|ture sur |cran qu| sont contenues dans |e header f||e std|oh donc au dbut de tout programme qu| devra ut|||ser ces fonct|ons nous devrons |nc|ure au dbut |a d|rect|ve su|vante #|nc|ude std|oh 42 La foncLlon geLchar()
La fonct|on getchar permet |a rcuprat|on dun seu| caractre g part|r du c|av|er La syntaxe dut|||sat|on de getchar est |a su|vante var|ab|egetchar() notez que var|ab|e do|t tre de type char et |es parenthses aprs getchar
Lxemp|e
#|nc|ude ma|n()
char c cgetchar()
43 La foncLlon puLchar()
La fonct|on putchar permet |aff|chage dun seu| caractre sur |cran de |ord|nateur La fonct|on putchar const|tue a|ors |a fonct|on comp|menta|re de getchar La syntaxe dut|||sat|on est |a su|vante putchar(var|ab|e) o var|ab|e est de type char Lxemp|e
#|nc|ude ma|n()
char c cgetchar() putchar(c)
Cet exemp|e attend |entre dun caractre g part|r du c|av|er et |aff|che sur |cran
44 La foncLlon scanf()
Les deux fonct|ons d[g voques b|en quut||es prsentent un |ncovn|ent ma[eur que fa|re pour pouvo|r entrer une cha|ne comp|te ou mme un nombre? Dans |e cas dun cha|ne on devra constru|re une bouc|e et dans |e cas dun nombre on devra auss| convert|r |es caractres en ch|ffres tout ce|g se montre trs |ourd cest a|ors que v|ent g |a|de |a fonct|on scanf Ln effet e||e permet de rcuprer n|mporte que||e comb|na|son de va|eurs numr|ques de caractres et de cha|nes La syntaxe dut|||sat|on de scanf est |a su|vante scanf(cha|ne de contr|e var1 var2 varN) o cha|ne de contr|e reprsente certa|nes donnes de formattage et var1 var2 varN reprsentent |es var|ab|es g remp||r La cha|ne de contr|e est entoure de gu|||emets const|tue de groupes de caractres chaque groupe tant en re|at|on avec une des var|ab|es ment|onnes Le groupe devra commencer par |e s|gne su|v|t dun nombre |nd|quant |a |argeur de |a var|ab|e g ||re et ensu|te un caractre b|en df|n| (|e type) |nd|quant s| |a var|ab|e est un caractre un nombre (so|t ent|er so|t dc|ma|) ou une cha|ne La syntaxe du groupe possde a|ors |a forme gnr|que su|vante |argeurtype Notez que |argument entre crochets est facu|tat|f Les d|ffrents types sont donns dans |e tab|eau su|vant 1ype Donnes g rcuprer c caractre d nombre ent|er e ou f un nombre dc|ma| en notat|on re||e (f) ou exponent|e||e (e) s une cha|ne de caractres
S| |a cha|ne cont|ent p|us quun groupe || sont souvent spars par des espaces et a|ns| |es donnes entres do|vent tre spares par des espaces Le type de chaque var|ab|e do|t correspondre au type de son groupe et chaque var|ab|e do|t tre prcde du s|gne sauf s| e||e est une cha|ne 1hor|e d|ff|c||e? passons aux exemp|es
1) | est un ent|er our obten|r | de |ut|||sateur on cr|t scanf(d|) sur |e c|av|er nous tapons 123
2) a est un caractre scanf(ca) d
3) v|||e est une cha|ne scanf(sv|||e)
| pas de car v|||e est une cha|ne
beyrouth
4) | et [ sont deux ent|ers | ne do|t pas tre p|us |arge que tro|s ch|ffres scanf(3d d|[) 231 1024
| notez |espace separateur
43 La foncLlon prlnLf()
Comme |a fonct|on scanf() permet dacqur|r tout type de donnes g part|r du c|av|er |a fonct|on pr|ntf() permet quant g e||e daff|cher tout type de donnes g |cran de |ord|nateur Cette fonct|on permet daff|cher n|mporte que||e comb|na|son de caractres de nombres et de cha|nes La syntaxe de |a fonct|on pr|ntf() est |a su|vante pr|ntf(cha|ne de contr|earg1 arg2 argN) o cha|ne de contr|e reprsente certa|nes donnes de formattage et arg1 arg2 argN |es var|ab|es (ou ventue||ement |es express|ons) g aff|cher chaque groupe est en re|at|on avec |argument correspondant dans |a ||ste des arguments Le groupe possde |a forme gnr|que su|vante f|ag|argeurprc|s|ontype Les |ments entre crochets tant facu|tat|fs La |argeur |nd|que |e nombre m|n|mum de caractres aff|chs et |a prc|s|on |nd|que |e nombre max|mum de caractres aff|chs (pour un nombre dc|ma| |a prc|s|on |nd|que |e nombre max|ma| de caractres aprs |a v|rgu|e qu| est par dfaut 6) Les d|fferents types sont donns dans |e tab|eau su|vant 1ype S|gn|f|cat|on c un caractre d un ent|er f un re| s une cha|ne de caractres e notat|on exponent|e||e
Les d|ffrents f|ags sont donns dans |e tab|eau su|vant I|ag S|gn|f|cat|on va|eur par dfaut [ust|f|cat|on g gauche [ust|f|cat|on g dro|te + aff|chage du s|gne (+ ou )avant |a va|eur numr|que un|quement |e est aff|ch espace |es va|eurs pos|t|ves sont prcdes dun espace aucun espace nest aff|ch
ChaplLre 3 Les lnsLrucLlons du langage C Le |angage C d|spose dun nombre d|nstruct|ons fa|b|e ma|s certa|nement eff|cace ar dfaut |es |nstruct|ons sont xcutes squent|e||ement et cet ordre peut tre mod|f| par |es |nstruct|ons de contr|e et de bouc|e a|ns| que |es |nstruct|ons dchappement Nous a||ons dans ce chap|tre exam|ner success|vement |es |nstruct|ons de base ce||es de bouc|e et enf|n ce||es dchappement 31 Les lnsLrucLlons de base
Les |nstruct|ons de base sont xcutes squent|e||ement se|on |ordre de |eur appar|t|on dans |e programme L||es ne mod|f|ent pas |ordre dxcut|on du programme Cn constate deux types d|nstruct|ons de base ||nstruct|on s|mp|e et |e b|oc d|nstruct|ons 311 lnsLrucLlon slmple
Une |nstruct|on s|mp|e est toute |nstruct|on su|v|e dun po|ntv|rgu|e La syntaxe est |a su|vante expression;
Un b|oc d|nstruct|ons peut tre ut|||s n|mporte o une |nstruct|on s|mp|e peut appara|tre Gnra|ement un b|oc d|nstruct|ons est form dune su|te d|nstruct|ons d||m|te par des acco|ades La syntaxe est a|ors
instruction1; instruction2; . . . instructionN; ] Notez qu'aprs l'accolade fermante il n'y a pas de point-virgule. L'utilit du bloc d'instructions sera evidente quant il sera utilis avec les instructions de contrle et de boucle.
32 Les lnsLrucLlons de conLrle eL de boucle
Les |nstruct|ons de contr|e permettent de mod|f|er |ordre dxcut|on squent|e| des |nstruct|ons Cn peut a|ns| drouter |xcut|on se|on quune cond|t|on est vra|e ou fausse 321 LlnsLrucLlon lfelse
L|nstruct|on |f permet |xcut|on dune |nstruct|on ou dun b|oc d|nstruct|ons s| et seu|ement s| |a cond|t|on qu| est une express|on |og|que est vr|f|e La syntaxe est |a su|vante if(condition) instruction; /` ou ventuellement un bloc d'instructions `/
f peut tre auss| ut|||se avec e|se (qu| est facu|tat|ve) et a|ns| s| |a cond|t|on est vr|f|e ||nstruct|on (ou |e b|oc d|nstruct|ons) d|rectement aprs |e |f sera xcute s|non (cond|t|on fausse) ||nstruct|on (ou |e b|oc d|nstruct|ons) aprs |e e|se sera xcute La syntaxe comp|te de ||nstruct|on |fe|se sera a|ors if(condition) instruction; else autre_instruction;
Lxemp|e if(note > 15) groupe'A'; else groupe'B';
Les |nstruct|ons |fe|se peuvent tre |mbr|ques |une dans |autre Lors dune te||e s|tuat|on un e|se se rapporte tou[ours au prem|er |f qu| |e prcde | est conse||| despacer |es pa|res de |fe|se hor|zonta|ement |une de |autre pour assurer |a c|aret de |a |ecture Lxemp|e if(condition1) if(condition2) instruction1; else instruction2; instruction3; Lorsque condition1 n'est pas vrifie c'est instruction3 qui est xcute sinon condition2 est teste si elle est vraie instruction1 est xcute et si elle est fausse instruction2 est xcute. Le else se rapporte ainsi au second if. A noter que l'utilisation des accolades changera la rgle du else correspondant au premier if qui le prcde. Exemple: if(condition1)
if(condition2) instruction1; ] else instruction2; instruction3; Lorsque condition1 n'est pas vrifie instruction2 est xcute puis instruction3, sinon si condition2 est vrifie instruction1 est xcute puis instruction3. Le else se rapporte dans ce cas au premier if. 322 LlnsLrucLlon swlLch
mag|nez quon veut |mpr|mer g |cran un des caractres A 8 C D L ou I se|on |e ch|ffre entr par |ut|||sateur et se|on |e pr|nc|pe su|vant 1 --> A 2 --> B 3 --> C 4 --> D 5 --> E 6 --> F L'criture de ce raisonnement en une suite d'instructions if-else est, quoique faisable, gnante. C'est ici que l'utilisation de l'instruction switch peut paratre utile. En effet cette instruction permet de sauter directement vers l'instruction correcte selon la valeur d'une variable appele slecteur. La syntaxe est la suivante: switch(slecteur)
case cas1: instruction1; case cas2: instruction2; . . . case casN: instructionN; default: instruction_par_dfaut; /` le cas "default" tant facultatif `/ ] Notez qu'il n'y a pas de point-virgule aprs l'accolade de fermeture. Le fonctionnement est le suivant: Lorsque le selecteur (qui peut en effet tre une expression ou une variable) donne un rsultat identique celui d'une certaine ligne commencant par case, un saut est ffectu vers cette ligne et l'instruction(s) correspondante(s) est (sont) xcute(s). Par suite toutes les autres lignes commencant par case auront leurs instructions correspondantes xcutes. Lorsqu'aucun cas n'est valide un saut est ffectu vers la ligne commencant par default (si elle existe) et les instructions correspondantes seront xcutes.
Notre exemp|e scr|t a|ors switch(choix)
case 1: printf("A"); case 2: printf("B"); case 3: printf("C"); case 4: printf("D"); case 5: printf("E"); case 6: printf("F"); default: printf("autre."); ] L'entre par un utilisateur du choix 1 donnera en sortie: ABCDEFautre. Nous constatons que l'xcution des autres instructions aprs celle qui correspond au bon choix semble tre gnante (au lieu d'afficher A on affiche ABCDEFautre.) ; Ne craignez rien le remde existe: c'est l'instruction break (plus de details plus tard). 323 LlnsLrucLlon whlle
L|nstruct|on wh||e permet |xcut|on rpte dune |nstruct|on ou dun b|oc d|nstruct|ons tant quune certa|ne cond|t|on est vra|e La syntaxe est la suivante: while(condition) instruction; Le fonctionnement est le suivant: lorsque l'instruction while est rencontre la condition entre parenthses est teste; si elle est vraie alors l'instruction ou le bloc d'instructions aprs le while est xcut(e) et la condition est teste nouveau; si elle reste vraie le cycle sera rpt nouveau jusqu' ce que la condition devienne fausse; l'xcution continue alors directement la premire instruction aprs le while.
Lxemp|e i1; while(i<10)
printf(" l'intrieur du while\n"); i++; ] printf(" l'extrieur du while\n");
l'cran on aura alors: l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'intrieur du while l'extrieur du while
emarque || faut tou[ours sassurer que |a cond|t|on sera g un certa|n moment fausse s|non on restera dans |a bouc|e wh||e |ndf|n|ment Dans notre exemp|e cest ||nstruct|on |++ qu| assurera ce|g 324 LlnsLrucLlon dowhlle
L|nstruct|on dowh||e est presque |dent|que g ||nstruct|on wh||e La d|ffrence est que dans |e dowh||e |a cond|t|on est teste aprs avo|r xcuter ||nstruct|on ou |e b|oc d|nstruct|ons annexe La syntaxe est |a su|vante do instruction; while(condition); Lorsque do est rencontr l'instruction est xcute puis la condition est teste, si elle est vrifie la boucle est rpte sinon l'xcution continue la premire instruction aprs le while.
Lxemp|e i1; do
printf("d ",i); i++; ]while(i<10); Sur l'cran on obtient 1 2 3 4 5 6 7 8 9 323 LlnsLrucLlon for
L|nstruct|on for permet |xcut|on rpt|t|ve dune |nstruct|on ou dun b|oc d|nstruct|ons un nombre b|en dterm|n de fo|s et ce|g grce a un compteur La syntaxe est |a su|vante for(initialisation; condition; incrmentation) instruction; Le fonctionnement est le suivant: Lorsque for est rencontre pour la premire fois dans un programme, la partie initialisation est xcute en premier. La partie initialisation permet en effet de donner au compteur unr valeur initiale. Puis la condition est teste, si elle est vrifie instruction est xcute sinon le programme saute l'instruction immdiatement aprs le for. Aprs xcution de instruction, la partie incrmentation est xcute, elle permet en effet de changer la valeur du compteur. A nouveau condition est teste et la boucle se rpte nouveau tant que condition reste vraie. Notez que initialisation ne s'effectue qu'une seule et unique fois durant tout le passage par la boucle for et cel au tout dbut.
Lxemp|e for(i1;i<10;i++) printf("bonjour\n"); Cette boucle sera itre 9 fois et ainsi bonjour sera affich 9 fois. 33 Les lnsLrucLlons dechappemenL
Ces |nstruct|ons permettent d|nterrompre |a squence norma|e dxcut|on des |nstrcut|ons surtout |es |nstruct|ons de contr|e et de bouc|e 331 LlnsLrucLlon break
L|nstruct|on break na de s|gn|f|cat|on que |orsque||e est ut|||se g ||ntr|eur de |une des |nstruct|ons su|vantes wh||e sw|tch dowh||e et for Lorsqu||e est est rencontre un saut est effectu g |a prem|re |nstruct|on aprs ||nstruct|on de contr|e qu| |a cont|ent La syntaxe est |a su|vante break; Prenons quelques exemples.
Lxemp|e 1 int i1; while(i!0) /` boucle infinie `/
agetchar(); if(a'x') break; ] Lorsque la touche x est tape au clavier l'instruction break est xcute et la sortie de la boucle while infinie est effectue. Exemple 2: Rappelez vous que dans l'exemple du sawitch au paragraphe 5.2.2 on avait le problme que les instructions aprs la bonne instruction taient elles aussi xcutes. Le remde est alors d'utiliser le break. Reprenons l'exemple en le rectifiant: switch(choix)
case 1: printf("A"); break; case 2: printf("B"); break; case 3: printf("C"); break; case 4: printf("D"); break; case 5: printf("E"); break; case 6: printf("F"); break; default: printf("autre."); /` break non ncessaire `/ ] Ainsi lorsque la bonne instruction est xcute un break est rencontr ce qui permet de sortir directement du switch. 332 lnsLrucLlon conLlnue
L|nstruct|on cont|nue na de s|gn|f|cat|on que |orsque||e est ut|||se au se|n dune des bouc|es su|vantes wh||e dowh||e et for Lorsque||e est rencontre |e programme passe d|rectement g ||trant|on su|vante de |a bouc|e o e||e se trouve sans effectuer |es |nstruct|ons restantes du passage actue| La syntaxe est |a su|vante continue;
Lxemp|e for(j1;j<4;j++)
if(j!2) printf("d\n",j); else continue; ] A l'cran on voit s'afficher: 1 3 4 333 LlnsLrucLlon nulle
Cette |nstruct|on ne ra||se abso|uement r|en La syntaxe est s|mp|ememt |e po|ntv|rgu|e Son ut|||t rs|de dans |e fa|t que||e permet de perdre du temps L||e est presque [ama|s ut|||se