Sie sind auf Seite 1von 35

Chapitre 2 : Boucles, adresses et pointeurs, fonctions A) Les 3 boucles en C : 1) Boucle do ... while ... (Rpter ....

Tant que) :
1.a) Syntaxe :
do instruction rpter while (condition de continuer rpter (boucler) encore);
L'instruction rpter peut tre simple (une seule action), structure (une autre instruction de contrle) ou compose (c'est le cas le plus frquent).

1.b) onctionne!ent :
tape 1 : effectuer (d'abord) l'instruction rpter tape : !rifier (apr"s) la condition de continuer : a) si la condition est !raie, on re!ient l'tape 1 b) si non (la condition est fausse), on termine la boucle

Attention :
#ontrairement au lan$a$e %&'#&L, la condition de cette boucle est la condition pour continuer rpter encore. (n %ascal, c'est la condition d'arrter la boucle.

1.c) "o!aines d#utilisation :


)n utilise la boucle do ... *+ile ... quand on ne sait pas l'a!ance, le nombre de fois qu'on doit rpter le mme traitement. Les e,emples sui!ants permettent de !oir quelques Chapitre 2 : Boucles de rptitions et fonctions Page 27

applications possibles a!ec cette boucle.

1. Rpter le mme traitement en mode conversationnel :


crire un bloc d'instructions permettant de saisir l'-$e et le se,e d'une personne. (nsuite, on affic+e un messa$e du $enre : #'est un enfant de se,e masculin )n rp"te le mme traitement .usqu' ce que l'usa$er dcide de quitter. 'olution : int c+ar do 3 printf(45n(ntre6 le se,e et l'-$e 4)/ scanf(47c7d4, 8se,e, 8a$e)/ printf(4#'est un 4)/ if (a$e 9: 11) printf(4enfant 4)/ else if (a$e 9 1; ) printf(4adolescent 4) / else printf(4adulte 4)/ if ( toupper(se,e) :: '<' ) 01 to upper : en ma.uscule10 printf(4de se,e fminin5n4)/ else printf(4de se,e masculin5n4)/ printf(45n=oule6>!ous continuer ? ()02) 4)/ fflus+(stdin)/ reponse : toupper ($etc+ar())/ @ *+ile ( reponse :: ')' )/ a$e / se,e, reponse / 01 )ui ou 2on l'usa$er !eut continuer 10

Chapitre 2 : Boucles de rptitions et fonctions

Page 28

2. Validation de donnes :
crire un bloc d'instructions permettant de saisir et !alider l'-$e d'une personne (un entier situ entre 1 et 1 A). 'olution : const int B&CD : 1 A / int a$e, !alide / 01 )ui ou non l'-$e est !alide 10 do 3 printf(4(ntre6 l'-$e entre 1 et 7d scanf(47d4, 8a$e)/ !alide : (a$e E: 1 88 a$e 9: B&CD) / if ( F!alide ) printf(4a$e lu est +ors inter!alle, retape6 '.=.%.5n4)/ @ *+ile (F!alide)/ 4, B&CD)/

Attention :
La !alidation d'un tGpe (entier ou non, rel ou non) sera prsente au c+apitre H (c+aInes des caract"res).

3. Calcul scientifique :
(,emple 1 : crire un bloc d'instructions permettant de calculer et d'affic+er la somme sui!ante : somme : 'olution : const int L)M2(1 : 1J , L)M2( : AJ , L(N%&' : A / int terme, somme / 1J K 1A K J K A K ... K AJ

somme : J / terme : L)M2(1 /

Chapitre 2 : Boucles de rptitions et fonctions

Page 29

do

3 somme K: terme / terme K: L(N%&'/ @ *+ile (terme 9: L)M2( )/ printf(4La somme calcule est : 7d5n4, somme)/ (,emple :

crire un pro$ramme permettant d'estimer la !aleur de %D (H.1O1....) selon la formule sui!ante : %D >>>>> : 1 > 10H K 10A > 10P K 10Q K .... O 'olution : 01 <ic+ier %D.&QA 10 Rinclude 9stdio.+E !oid main() 3 const int LDBDS( : QQQQ , L(N%&' : / int denominateur : 1 / 01 premier dnominateur !aut 1 10 10QQQQ

float pi'urO : J.J, si$ne : 1.J / do 3 pi'urO K: si$ne 0 denominateur / si$ne : >si$ne / 01 c+an$er de si$ne 10 denominateur K: L(N%&' / @ *+ile ( denominateur 9: LDBDS( ) / printf(4La !aleur estime de %D est 71 .Tf5n4,O 1 pi'urO)/ printf(45n&ppuGe6 sur (ntre 4)/ $etc+ar()/

(,cution : La !aleur estime de %D est &ppuGe6 sur (ntre H.1O1HQP

Chapitre 2 : Boucles de rptitions et fonctions

Page 30

Attention :
)n utilise sou!ent cette boucle pour estimer une racine de l'quation f(,) : J, pour la rec+erc+e squentielle d'un lment dans un tableau (plus tard dans le cours), etc ....

1.d) $xercices :
(,ercice 1 : crire un pro$ramme permettant de saisir et de !alider si un entier lu est positif ou non. (nsuite, on affic+e l'entier tel que lu et l'en!ers (ici OH P). 'olution : 01 <ic+ier : (n!ers1.# 10 Rinclude 9stdio.+E !oid main() 3 int n / 01 'aisie et !alider : 10 do 3

printf(4(ntre6 un entier positif 4)/ scanf(47d4, 8n)/

if ( n 9 J ) printf(4n : 7d est n$atif5n4, n)/ @ *+ile (n 9 J)/ printf(4L'entier lu : printf(4& l'en!ers do 3 printf(47d4, n 7 1J)/ n 0: 1J / @ *+ile ( n E J )/ printf(45n5n&ppuGe6 sur (ntre 4)/ fflus+(stdin)/ $etc+ar()/ @ : 7d5n4, n)/ 4)/

Chapitre 2 : Boucles de rptitions et fonctions

Page 31

(,cution : (ntre6 un entier positif >;PO n : >;PO est n$atif (ntre6 un entier positif AH Q L'entier lu : AH Q & l'en!ers : Q HA &ppuGe6 sur (ntre (,ercice :

crire un pro$ramme permettant de saisir un entier positif (e,emple AO T). Dl calcule l'en!ers du nombre lu (ici T OA) et affic+e ces deu, !aleurs. 'olution : 01 <ic+ier (n!ers .# Rinclude 9stdio.+E !oid main() 3 int n , en!ers / 10

printf(4(ntre6 un entier positif 4)/ scanf(47d4, 8n)/ printf(4L'entier lu n : 7d5n4, n)/

01 #alcul de l'en!ers : 10 en!ers : J / do 3 en!ers : 1J 1 en!ers K n 7 1J / n 0: 1J / @ *+ile ( n E J ) / printf(4& l'en!ers : 7d4, en!ers)/

printf(45n5n&ppuGe6 sur (ntre 4)/ fflus+(stdin)/ $etc+ar()/ @

Chapitre 2 : Boucles de rptitions et fonctions

Page 32

(,cution : (ntre6 un entier positif 1 HO L'entier lu n : 1 HO & l'en!ers : OH 1 &ppuGe6 sur (ntre (,ercice H : crire un pro$ramme permettant de saisir les informations d'un placement : > le capital (un rel) > le tau, d'intrt (compos) annuel en 7 > la dure du placement en nombre de mois. Le pro$ramme calcule et affic+e le capital la fin du terme. Dl fonctionne aussi pour plusieurs clients .usqu' ce que l'usa$er dcide de quitter.

(,ercice O : crire un pro$ramme permettant de saisir et de !alider d'un entier positif (e,emple n : T O). Le pro$ramme calcule et affic+e l'cran la somme des c+iffres qui forment l'entier lu (ici, la somme des c+iffres est 1 : T K K O). (,ercice A (scientifique) : crire un pro$ramme permettant de trou!er toutes les racines de l'quation f(,) : J, oU : f(,) : , H > 1Q, K HJ

( S+or"me en mat+matique : 'i f est continue dans l'inter!alle Va, bW (e,emple :VJ, .AW) et f(a) 1 f(b) 9 J, alors : il G a au moins une racine de f(,) : J dans Va, bW )

2) Boucle while ... :


2.a) Syntaxe :
while (condition) instruction
Chapitre 2 : Boucles de rptitions et fonctions Page 33

L'instruction rpter peut tre simple (une seule action), structure (une autre instruction de contrle) ou compose (c'est le cas le plus frquent). Dl n'G a pas de 4do4 (faire) comme le %&'#&L.

2.b) onctionne!ent :
tape 1 : !rifier d'abord la condition tape : si la condition !aut !raie alors a) on effectue l'instruction rpter b) on re!ient l'tape 1 si non, on quitte la boucle

2.c) "o!aines d#utilisation :


)n utilise la boucle *+ile ... quand on ne sait pas l'a!ance le nombre de fois qu'on doit rpter le mme traitement. )n l'utilise surtout pour la lecture d'un fic+ier, la rec+erc+e d'un lment dans un tableau, les calculs scientifiques.

1. a lecture d!un fichier :


'upposons qu'on dispose du fic+ier nomm 4(ntiers.Xta4 qui contient un entier par li$ne, e,emple : TA >1 ; HP etc ... crire un pro$ramme permettant de lire le fic+ier, d'affic+er son contenu, de compter et d'affic+er le nombre d'entiers lus dont la !aleur est suprieur 1J.

"otes sur la lecture d!un fichier te#te :


. Xclarer : <DL( 1 aLire / . )u!erture pour la lecture : aLire : fopen(4(ntiers.Xta4, 4r4)/ oU 4r4 !ient de 4for readin$4 (pour lire). . Sest non fin de fic+ier . Lecture . <ermeture : : : *+ile ( Ffeof(aLire) ) fscanf(aLire, .......) / fclose(aLire) /

Chapitre 2 : Boucles de rptitions et fonctions

Page 3$

'olution : 01 <ic+ier : YZDL(1.&QA 10 Rinclude 9stdio.+E !oid main() 3 const int L)M2( : 1J / int n , nb<ois : J / 01 dclaration du fic+ier 10

<DL( 1 aLire /

aLire : fopen(4(ntiers.Xta4, 4r4)/ printf(4Les entiers lus dans le fic+ier :5n5n4)/ 01 La lecture, li$ne par li$ne : 10 *+ile ( Ffeof(aLire) ) 01 Sant que non fin du fic+ier 10 3 fscanf(aLire , 47d5n4, 8n)/ printf(47Ad5n4, n)/ @ if ( n E L)M2( ) nb<ois : nb<ois K 1 / 01 <ermeture du fic+ier (fclose) 10

fclose(aLire)/

printf(4Le nombre d'entiers suprieur 7d est 7d5n4, L)M2(, nb<ois)/ printf(45n&ppuGe6 sur (ntre 4)/ $etc+ar()/ @ (,cution: Les entiers lus dans le fic+ier : J >1 1A >HJ Q >AJ OJ Le nombre d'entiers suprieur 1J est O &ppuGe6 sur (ntre

2. a recherche d!une %aleur :


=oir la rec+erc+e dic+otomique (plus tard dans le cours).

Chapitre 2 : Boucles de rptitions et fonctions

Page 3&

3. 'uelques e#ercices de calcul :


(,ercice 1 : crire un pro$ramme permettant de saisir et de !alider d'un entier positif (e,emple n : T O). Le pro$ramme calcule et affic+e l'cran la somme des c+iffres qui forment l'entier lu (ici, la somme des c+iffres est 1 : T K K O). 'olution : 01 <ic+ier : YZDL( .&QA 10 Rinclude 9stdio.+E !oid main() 3 int n , !alide, somme#+iffre / 01 'aisie et !alider n : 10 !alide : J / 01 #e n'est pas !alide 10 *+ile ( F!alide ) 3 printf(4(ntre6 un entier suprieur 6ro 4)/ scanf(47d4, 8n)/ !alide : n E J / if (F!alide) printf(4!aleur n$ati!e, retape6, '.=.%.5n5n4)/

printf(4L'entier lu est 7d5n4, n)/ printf(4La somme des c+iffres de n : 7d est 4, n)/ 01 #alcul de la somme des c+iffres : 10 somme#+iffre : J / *+ile (n) 01 c'est>>dire *+ile ( n F: J), ici *+ile (n E J) 10 3 somme#+iffre K: n 7 1J / 01 on a.oute le dernier c+iffre 10 n 0: 1J/ @ printf(47Hd5n4, somme#+iffre)/ printf(45n&ppuGe6 sur (ntre 4)/ fflus+(stdin)/ $etc+ar()/ @

Chapitre 2 : Boucles de rptitions et fonctions

Page 3(

(,cution : (ntre6 un entier suprieur 6ro >ATP; !aleur n$ati!e, retape6, '.=.%. (ntre6 un entier suprieur 6ro ;PHT L'entier lu est ;PHT La somme des c+iffres de n : ;PHT est &ppuGe6 sur (ntre (,ercice :

crire un bloc d'instruction permettant de calculer et d'affic+er la somme sui!ante : somme : 1 K 10H K 10A K 10P K ... K 10QQQ 'olution : const int L)M2(1 : 1 , L)M2( : QQQ / float denominateur : L)M2(1, somme : J / *+ile ( denominateur 9: L)M2( ) 3 somme K: 1 0 denominateur / denominateur K: / @ printf(4La somme demande : 71J.Tf5n4, somme)/ (,ercice H : crire un bloc d'instructions utilisant la boucle *+ile qui permet d'estimer la !aleur de %D selon la formule sui!ante : %D >>>>> : 1 > 10H K 10A > 10P K 10Q K .... O 10QQQQ

Chapitre 2 : Boucles de rptitions et fonctions

Page 37

3) Boucle for ... :

3.a) Syntaxe :
for (<exp1>;<exp2>;<exp3>) instruction

> l'instruction rpter peut tre simple ou compose (bloc) > l'e,pression 1 (e,p1) : initialisation l'e,pression (e,p ) : condition de continue qui est !alue a!ant c+aque itration

l'e,pression H (e,pH) : l'incrmentation ou la dcrmentation (instruction de fin d[itration) (,emple de sGnta,e : for ( i : 1 / i 9: 1J / i : i K 1 ) printf(4LonsoirF5n4)/ #ette boucle fait affic+er 1J li$nes qui contient le messa$e LonsoirF

3.b) onctionne!ent :
Dnitialiser la !ariable de contrle de la boucle Sant que la condition de continue !aut !raie <aire > effectuer l'instruction rpter > incrmenter ou dcrmenter la !ariable de contrle

3.c) "o!aines d#utilisation :


)n utilise la boucle for quand on sait l'a!ance le nombre de fois qu'on rp"te le mme traitement. #'est le cas des !aleurs conscuti!es entre deu, bornes donnes. )n l'utilise aussi sou!ent pour parcourir les indices d'un tableau.

Chapitre 2 : Boucles de rptitions et fonctions

Page 38

1. e no)*re de fois de la rptition est connue :


(,ercice 1 : crire un bloc d'instruction permettant d'affic+er les lettres ma.uscules l'cran : &L#X(<\ZD]^LB2)%_M'S`=YCab 'olution : c+ar lettre / for ( lettre : '&' / lettre 9: 'b' / lettre : lettre K 1 ) printf(47c4, lettre)/ printf(45n4)/ (,ercice : J T

crire un bloc d'instruction permettant d'affic+er les consonnes en minuscules l'cran. 'olution : c+ar lettre /

for ( lettre : 'a' / lettre 9: '6' / lettre : lettre K 1 ) if ( lettre F: 'a' 88 lettre F: 'e' 88 lettre F: 'i' 88 lettre F: 'o' 88 lettre F: 'u' 88 lettre F: 'G' ) printf(47c4, lettre)/ printf(45n4)/

(,ercice H : Xonner une autre solution de l'e,ercice if par un s*itc+. (,ercice O : crire un bloc d'instruction permettant de calculer et d'affic+er la somme sui!ante : somme : 1 K 10 K 10H K ... K 101JJJ en remplacant le

Chapitre 2 : Boucles de rptitions et fonctions

Page 39

'olution : const int L)M2(1 : 1 , L)M2( : QQQ / int denominateur/ float somme : J / for ( denominateur : L)M2(1 / denominateur 9: L)M2( denominateur : denominateur K 1 ) somme K: 1.J 0 denominateur / printf(4La somme demande : 71J.Tf5n4, somme)/ /

(,ercice A : crire un bloc d'instructions utilisant la boucle for qui permet d'estimer la !aleur de %D selon la formule sui!ante : %D >>>>> : 1 > 10H K 10A > 10P K 10Q K .... O )bser!ations : (n premi"re !ue, les dnominateurs ne sont pas conscutifs : 1 H A P Q ... QQQQ 10QQQQ

%ar contre, on peut les crire diffremment : ( 1 J K 1) 1 ( 1 1 K 1) ( H 1 A K 1) .... ( 1 OQQQ K 1) QQQQ

Xans cette nou!elle criture, les !aleurs J, 1, , ... OQQQ sont conscuti!es, on peut utiliser la boucle for. 'olution : const int LDBDS( : QQQQ / float pi'urO : J.J, si$ne : 1.J / int d / for ( d : J / d 9: LDBDS( 0 / dKK ) 3 pi'urO K: si$ne 0 ( 1 d K 1) / si$ne : > si$ne / @ printf(4La !aleur estime de %D est 71 .Tf 4,O 1 %DN'urO)/ Chapitre 2 : Boucles de rptitions et fonctions Page $0

2otes : Xans l'incrmentation de la !ariable d de la boucle for, on utilise tr"s sou!ent dKK la place de d : d K 1. KK est l'oprateur de post>incrmentation (utiliser d'abord la !aleur, incrmenter apr"s a!oir utilis la !aleur) : (,emples : 1. int d : A / printf(4d : 7d5n4, d)/ 01 affic+er A 10 dKK / 01 incrmenter d, d !aut T 10 printf(4d : 7d5n4, d)/ 01 affic+er T 10 . int d : A / if ( dKK ) printf(4d : 7d5n4, d)/ #ette instruction affic+e d : T l'cran. (n effet, a!ec if ( dKK ) on a actions : a) if (A) , comme A est non nul :E if (!rai) b) d est incrment :E d !aut T L'instruction printf... fait affic+er la !aleur T de d. )n utilise sou!ent l'oprateur KK pour l'incrmentation dans la boucle for et dans la manipulation des pointeurs (c+apitre H). L'oprateur >> pour la dcrmentation est aussi utile pour la boucle for (!oir e,ercice sui!ant). (,ercice T : crire un bloc d'instruction permettant d'affic+er les A li$nes sui!antes l'cran : A O H 1 O H 1 H 1 1 1 'olution : Rdefine 2LNLD\2( A int L, # / 01 %our L !arie de A en descendant 1 faire 10 for ( L : 2LNLD\2( / L E: 1 / L>> ) 3 for ( # : L / # E: 1 / #>> ) printf(47 d4, #)/ printf(45n4)/ @ Chapitre 2 : Boucles de rptitions et fonctions Page $1

(,ercice 1(application scientifique) : #alcul de l'int$rale dfinie : 'oit f une fonction int$rable dans l'inter!alle Va, bW. `ne mt+ode permet d'estimer l'int$rale de f(,) d, dans Va, bW s'appelle la mt+ode des trap"6es : )n di!ise Va, bW en n sous>inter!alles de mme lon$ueur + ( + : (b>a) 0 n ). &pr"s certains d!eloppements mat+matiques, on arri!e la formule sui!ante: Dnt$rale f(&) K f(L) : + W >>>>>>>>>>>> K n>1 f( & K i+ ) V i: 1

crire un pro$ramme permettant de tester cette mt+ode en estimant : e 1 >>> d, 1 , e e (S+oriquement, c'est Lo$(,) e : Lo$(e) > Lo$(1) : 1 > J : 1) e 1 (,ercice ; : %armi les entiers entre 1JJ et AJJ, seuls O nombres peu!ent tre reprsents par la somme des cubes de leurs c+iffres. crire un bloc d'instructions pour dcou!rir et affic+er ces nombres. 'olution : Rdefine L)M2(1 1JJ Rdefine L)M2( AJJ int nombre, somme#ube , !aleur, #+iffre / for ( nombre : L)M2(1 / nombre 9 L)M2( 3 !aleur : nombre / somme#ube : J / / nombreKK )

*+ile ( !aleur E J ) 3 #+iffre : !aleur 7 1J / somme#ube : somme#ube K #+iffre 1 #+iffre 1 #+iffre / !aleur : !aleur 0 1J / @ if ( nombre :: somme#ube ) printf(4nombre : 7Ad, somme des cubes de ses c+iffres : 7Ad5n4, nombre, somme#ube)/ @ Chapitre 2 : Boucles de rptitions et fonctions Page $2

(,ercice Q : `n nombre parfait est un nombre entier qui est $al la somme de ses di!iseurs propres (sauf lui>mme). (,emples: T et T : 1 K ; : 1 K K H K O K P K 1O

; sont deu, nombres parfaits.

crire un pro$ramme qui permet de dcou!rir tous les nombres parfaits entre et AJJ et d'affic+er les informations du $enre sui!ant l'cran : =oici les nombres parfaits entre 1) T : 1 K ) ; : 1 K etc ... (,ercice 1J : crire un pro$ramme qui permet de dcou!rir et d'affic+er tous les di!iseurs du nombre P J raison de A di!iseurs par li$ne. L'affic+a$e est du $enre : =oici les di!iseurs de P J : 1) T) 'olution : Rinclude 9stdio.+E !oid main() 3 Rdefine 2)BLM( P J Rdefine %&MN(#M&2 A 1 ) etc .... H) H O) O A) A K H K O K P K 1O et AJJ :

01 A di!iseurs par cran 10

int n , d : J / 01 #ompteur du nombre des !iseurs de P J 10 for ( n : 1 / n 9: 2)BLM( / nKK ) if ( 2)BLM( 7 n :: J ) 01 n est di!iseur du 2)BLM( (reste : J)10 3 dKK / 01 un di!iseur de plus 10 printf(47Hd) 7Od4, d, n)/ if ( d 7 %&MN(#M&2 :: J ) printf(45n4)/ @ @

2. Parcourir les indices d!un ta*leau :


)n !erra des e,emples au c+apitre O sur les tableau,.

Chapitre 2 : Boucles de rptitions et fonctions

Page $3

B) Adresses %s &ointeurs : 1) Domaines d utilisation :


)n utilise tr"s sou!ent les adresses dans : 1. la saisie des donnes a!ec scanf / . les appels des fonctions pour rece!oir des !aleurs retournes / )n utilise des pointeurs dans : 1. la transmission des ar$uments par pointeurs (rsultats de retour) / . la manipulation des tableau, / H. les fic+iers : <DL( 1 aLire, 1 a#reer /

O. les c+aInes de caract"res / A. les structures de donnes a!ances (liste linaire c+aIne, arbre binaire, ...) etc .....

2) !ntroduction au" adresses et au" pointeurs :


(n pro$rammation, on utilise tr"s sou!ent les caractristiques sui!ants d'une !ariable : 1. son nom (identificateur) . son contenu (sa !aleur) H. son tGpe (entier, rel, caract"re, ...) \r-ce au tGpe de la !ariable, le compilateur connaIt le nombre d'octets (bGte) pour mmoriser une telle !ariable. Le # dispose d'un oprateur nomm 4si6eof4 pour cet effet : si6eof(c+ar) si6eof(float) etc .... !aut 1, si$nifie qu'on utilise 1 octet pour mmoriser un caract"re !aut O, si$nifie qu'on utilise O octets pour mmoriser un rel

'i a est une !ariable de tGpe 4int4, si6eof(a) est qui!alent si6eof(int) : si6eof (un tGpe) 9::E si6eof(une !ariable du tGpe)

Chapitre 2 : Boucles de rptitions et fonctions

Page $$

2. a) Les adresses :
(n #, on a.oute un caractristique de plus une !ariable : son adresse (son emplacement en mmoire) dtermine par l'oprateur 8 (adresse de) L'adresse d'une !ariable est dtermine sou!ent la compilation de la mani"re squentielle :

+#e)ple d!illustration des adresses :


'oit le pro$ramme sui!ant : 01 <ic+ier &dresse1.&QA (introduction au, adresses) Xans ce pro$ramme, on affic+e une adresse a!ec le code format 7u u pour 4unsi$ned inte$er4 : entier sans si$ne (positif) : entre 6ro et TAAHA 10 Rinclude 9stdio.+E int float c+ar int a , d c : : : : A, b : 1 H.O '=' 1JJ H / / / /

!oid main() 3 printf(42om printf(4>>> printf(4 a printf(4 b printf(4 , printf(4 d printf(4 c

SGpe >>>>>>>

2b. octets >>>>>>>>>>

&dresse >>>>>>>>>>> 7u 7u 7u 7u 7u

!aleur5n4)/ >>>>>>>>5n4)/ 7d5n4, 7d5n4, 7T. f5n4, 7c5n4, 7d5n4,

int 7d si6eof(a), 8a, a)/ int 7d si6eof(b), 8b, b)/ float 7d si6eof(,), 8,, ,)/ c+ar 7d si6eof(c+ar), 8d, d)/ int 7d si6eof(int), 8c, c)/

printf(45n5nL'oprateur 1 (contenu de l'adresse) :5n4)/ printf(4Le contenu l'adresse 7u est 7d5n4, 8b, 1(8b))/ printf(4Le contenu l'adresse 7u est 7T. f5n4, 8,, 1(8,))/ printf(45n5n&ppuGe6 sur (ntre 4)/ $etc+ar()/ @

Chapitre 2 : Boucles de rptitions et fonctions

Page $&

(,cution : L'e,cution du pro$ramme a!ec S`ML) #KK sur un DLB %'0 ce qui suit : 2om >>> a b , d c SGpe >>>>>>> int int float c+ar int 2b. octets >>>>>>>>>> O 1 &dresse >>>>>>>>>>> 1PJ 1P 1PO 1P; 1PQ donne

!aleur >>>>>>>> A H 1 H.OJ = 1JJ

L'oprateur 1 (contenu de l'adresse) : Le contenu l'adresse 1P est H Le contenu l'adresse 1PO est 1 H.OJ &ppuGe6 sur (ntre 'c+mas d'e,plication : `ne case d'un octet dispose d'une adresse en mmoire. Xpendant du tGpe de la !ariable le compilateur alloue un nombre de cases ( dans cet en!ironnement de tra!ail : cases pour un entier (maintenant, les entiers sont sur O octets),O pour un rel, 1 pour un caract"re, etc.). Les !aleurs sont codes en binaire. %our une meilleure compr+ension, on reprsente ici comme des !aleurs usuelles (entier, rel, caract"re). 2om a !aleur (en binaire) fgggggggggggggggh i i fg A ggh i i fgggggggggggggggh i i fg H ggh i i fgggggggggggggggh i i fgg ggh i i fgg 1 H.O ggh i i fgg ggh i i fgggggggggggggggh i '=' i fgggggggggggggggh i i fgg 1JJ ggh i i fgggggggggggggggh &dresse 1PJ 1P1 1P 1PH 1PO 1PA 1PT 1PP 1P; 1PQ 1;J (adresse du dbut de d) (adresse du dbut de c) (adresse du dbut de ,) (adresse du dbut de b) (adresse du dbut de a)

d c

Chapitre 2 : Boucles de rptitions et fonctions

Page $(

)n !oit aussi l'oprateur 414 1(adresse) &insi :

dont :

9:::E le contenu (la !aleur) qui se trou!e cette adresse 1(8b) 9::E le contenu l'adresse 1P 9::E H (!aleur de b)

1(8,) 9::E le contenu l'adresse 1PO 9::E 1 H.OJ (!aleur de ,) )n re!ient maintenant la lecture de la premi"re semaine : printf(4(ntre6 la !aleur de b 4)/ scanf(47d4, 8b)/ )n interpr"te scanf(47d4, 8b)/ comme suit : Lire la !aleur tape et dposer cette !aleur l'adresse 1P de b) :::E b !aut la !aleur saisie. (l'adresse

2. b) Les pointeurs :
La !aleur d'une !ariable enti"re est un entier : int a$e : H /

La !aleur d'une !ariable de tGpe rel est un rel : float %oids : T .J / La !aleur d'un pointeur est une adresse.

Pre)ier e#e)ple d!illustration des pointeurs :


'oit le pro$ramme sui!ant : 01 <ic+ier %ointer1.&QA (introduction au, pointeurs) 10 Rinclude 9stdio.+E int int float float a 1% , 1b : : : : 1A, b : H 8b, 1' : 8a 1 H.O 8, / / 01 pointeurs !ers le tGpe int 10 / / 01 b, pointeur !ers le tGpe float 10

!oid #ontinuer() 3 printf(45n5n&ppuGe6 sur (ntre 4)/ fflus+(stdin)/ $etc+ar()/ @

Chapitre 2 : Boucles de rptitions et fonctions

Page $7

!oid Xemo1() 3 printf(4%remi"re dmonstration:5n5n4)/ printf(42om printf(4>>> printf(4 b printf(4 % SGpe >>>>>>> 2b. octets >>>>>>>>>> &dresse >>>>>>>>>>> 7u 7u !aleur5n4)/ >>>>>>>>5n4)/ 7d5n4, 7u5n5n4,

int 7d si6eof(b), 8b, b)/ int 1 7d si6eof(%), 8%, %)/ float 7d si6eof(,), 8,, ,)/ float 1 7d si6eof(b), 8b, b)/

printf(4 , printf(4 b

7u 7u

7T. f5n4, 7u5n4,

printf(45constatations :5n5n4)/ printf(4 printf(4 printf(4 printf(4 printf(4 printf(4 printf(4 printf(4 @ 1. !aleur d'un pointeur est une adresse :5n4)/ > !aleur du pointeur % (7u) est l'adresse de b (7u)5n4, %, 8b)/ > !aleur du pointeur b (7u) est l'adresse de , (7u)5n5n4, b, 8,)/ . %lusieurs mani"res pour les !aleurs de 1% et de 1b :5n5n4)/ 1% : Le contenu l'adresse 7u : 7d5n4, %, 1%)/ 1b : Le contenu l'adresse 7u : 7T. f5n4, b, 1b)/ 1% : 7Td 1(8b) : 7Td b : 7Td5n4, 1%, 1(8b), b)/ 1b : 7T. f 1(8,) : 7T. f , : 7T. f5n4, 1b, 1(8,), ,)/

#ontinuer()/

!oid main() 3 Xemo1()/ @

+#cution :
L'e,cution du pro$ramme a!ec S`ML) #KK sur un DLB %'0 ce qui suit : %remi"re dmonstration: 2om >>> b % , b SGpe >>>>>>> int int 1 float float 1 2b. octets >>>>>>>>>> &dresse >>>>>>>>>>> 1P 1PO 1P; 1; !aleur >>>>>>>> H 1P 1 H.OJ 1P; Page $8 donne

Chapitre 2 : Boucles de rptitions et fonctions

#onstatations : 1. !aleur d'un pointeur est une adresse : > !aleur du pointeur % (1P ) est l'adresse de b (1P ) > !aleur du pointeur b (1P;) est l'adresse de , (1P;) . %lusieurs mani"res pour les !aleurs de 1% et de 1b : 1% 1b 1% 1b : Le contenu : Le contenu : H 1(8b) : 1 H.OJ 1(8,) l'adresse l'adresse : H : 1 H.OJ 1P : H 1P; : 1 H.OJ b : H , : 1 H.OJ

&ppuGe6 sur (ntre

"otes :
%our le bon droulement du cours, on se limite au, e,plications sui!antes concernant un pointeur : 'oit S le nom d'un tGpe (e,emple int, c+ar, float, ...) 1. Xclaration : . #onsquences: S 1 p /

p est un pointeur !ers une !ariable de tGpe S. 1p est une !ariable de tGpe S. !aleur de p est une adresse (e,emple GGGG) !aleur de 1p est la !aleur qui se trou!e l'adresse GGGG.

#es e,plications nous permettent de comprendre la transmission des param"tres par pointeurs et les appels des sous>pro$rammes a!ec des adresses. &u, proc+aines c+apitres, on e,pliquera autres caractristiques des pointeurs (pointeur 2`LL, allocation dGnamique, affectation, etc ...)

C) Les fonctions en C :
(n #, il n'e,iste qu'une seule sorte de sous>pro$ramme : la fonction.

1) #onction $naturelle$ qui retourne un seul rsultat a%ec return :


#e $enre de fonction est semblable 4<`2#SD)24 en %&'#&L.

Chapitre 2 : Boucles de rptitions et fonctions

Page $9

1.a) Syntaxe :
tGpe du rsultat de retour nom de la fonction( liste de paramtre(s)) 3 dclarations locales si ncessaire calcule et retourne (avec return) le rsultat calcul @ (,emple d'illustration de la sGnta,e :

La fonction sui!ante permet de calculer et de retourner la plus $rande !aleur parmi deu, rels. float plus\rand ( float ,, float G ) 3 if ( , E G ) return , / else return G / @

1.b) 'e!ar(ues :
1. Le nom de la fonction ne contient pas de rsultat de retour comme le %&'#&L. . Dl faut utiliser le rsultat retourn dans un bon conte,te (affic+a$e, affectation, comparaison, ...). H. L'instruction 4return4 pro!oque la fin de la fonction, on re!ient la place qui appelle la fonction. O. 'ur l'en>tte, on ne peut pas $rouper les param"tres de mme tGpe : float plus\rand ( float ,, G ) 01 erronF 10

A. 2e pas terminer l'en>tte par le point !ir$ule : float plus\rand ( float ,, float G ) / 01 erronF 10

1.c) $xe!ples :
(,emple 1 (fonction qui retourne un entier comme rsultat) : crire un pro$ramme permettant de saisir un entier 2 suprieur 6ro. Le pro$ramme calcule (par les fonctions) et affic+e l'cran : > la somme des c+iffres du nombre n > l'en!ers du nombre n

Chapitre 2 : Boucles de rptitions et fonctions

Page &0

'olution : 01 <ic+ier : <onct1.&QA 10 Rinclude 9stdio.+E int somme#+iffre ( int n ) 3 int somme : J / *+ile (n) 3 somme K: n 7 1J / n 0: 1J / @ return somme / @ int en!ers ( int n ) 3 int ^ : J / *+ile (n) 3 ^ : ^ 1 1J K n 7 1J / n 0: 1J/ @ return ^ / @ !oid main() 3 int nombre / printf(4(ntre6 un entier E J scanf(47d4, 8nombre)/ 4)/

printf(4La somme des c+iffres de 7d est 7d5n5n4, nombre, somme#+iffre (nombre) )/ printf(4L'en!ers du nombre 7d est 7d5n5n4, nombre, en!ers(nombre))/ printf(4&ppuGe6 sur (ntre 4)/ fflus+(stdin)/ $etc+ar()/

(,cution: (ntre6 un entier E J ;PA La somme des c+iffres de ;PA est L'en!ers du nombre ;PA est AP; &ppuGe6 sur (ntre (,emple (fonction qui retourne un rel comme rsultat) : J

crire une fonction permettant de calculer le bonus dpendant du poste de tra!ail : poste '&' (analGste) : HO.A poste '%' (pro$rammeur) : 1J.Q poste ')' (oprateur) : 1;Q.J crire quelques appels (utilisations) Chapitre 2 : Boucles de rptitions et fonctions j de bonus j de bonus j de bonus !alides de cette fonction. Page &1

'olution : float bonus ( c+ar poste ) 3 float boni / s*itc+ ( toupper(poste) ) 3 case '&' : boni : HO.A / bread / case '%' : boni : @ @ return boni / 1J.Q / bread /

case ')' : boni : 1;Q.J /

_uelques utilisations !alides : 1. dans l'affic+a$e (plus courant) printf(4Lonus d'un analGste : 7T. f5n4, bonus('&') )/ . dans une affectation : float salaireZebdo, salaireSotal / c+ar poste / ....... salaireSotal : salaireZebdo K Lonus(poste)/ H. dans une comparaison : if ( Lonus (poste) E JJ.J ) printf(4%as si mal5n4)/ float salaireZebdo, salaireSotal / c+ar poste / ....... salaireSotal : salaireZebdo K bonus(poste)/ (,emple H (fonction qui retourne un caract"re comme rsultat) : crire une fonction permettant de .ouer le mme rle que 4toupper4 (con!ersion en B&]`'#`L(). crire une utilisation !alide de cette fonction.

Chapitre 2 : Boucles de rptitions et fonctions

Page &2

'olution : c+ar ma.uscule ( c+ar c ) 3 if ( c E: 'a' 88 c 9: '6' ) 01 lette minuscule 10 return c K '&' > 'a' / 01 code &'#DD else @ `ne utilisation !alide : printf(4Le caract"re 7c en ma.uscule est 7c5n4, 'e', ma.uscule ('e') )/ return c / 10

(,emple O (fonction qui retourne !rai ou fau, comme rsultat) : crire une fonction permettant de retourner !rai (1) ou fau, (J) selon qu'un caract"re est une !oGelle ou non. crire une instruction utilisant cette fonction pour affic+er les J consonnes en ma.uscules l'cran. 'olution : int !oGelle ( c+ar lettre ) 3 int reponse / s*itc+ ( 3 case case case case case case @ return reponse / @ L'affic+a$e des J consonnes en ma.uscules l'cran se fait comme suit : c+ar lettre / for ( lettre : '&' / lettre 9: 'b' / lettreKK ) if ( F!oGelle(lettre) ) printf(47c4, lettre) / printf(45n5n4)/ Chapitre 2 : Boucles de rptitions et fonctions Page &3 toupper(lettre) ) '&' '(' 'D' ')' '`' 'a' : : : : : : reponse : 1 / 01 =M&D 10 bread / : reponse : J / 01 <au, 10

default

Memarque : %our la clart, on peut aussi utiliser les Rdefine dans le cas des fonctions boolennes. (,emple : crire une fonction qui retourne !rai ou fau, selon qu'un entier n E: est premier (a di!iseurs seulement : 1 et n) ou non. int %remier ( int n ) 3 Rdefine =M&D 1 Rdefine <&`C J int d / for ( d : / d 9: n 0 / dKK )

if ( n 7 d :: J ) return <&`C / return =M&D / @ 'imulation : 1. &!ec n : P par e,emple : d : d : H n 7 d !aut 1 n 7 d !aut 1

)n quitte la boucle for. )n rencontre : return =M&D. P est (=M&Dement) un nombre premier. . &!ec n : T par e,emple : d : n 7 d !aut J qui pro!oque 4return <&`C4 et on termine la fonction.

T n'est pas un nombre premier. 2ote : %lusieurs autres e,emples seront prsents a!ec les param"tres de tGpe tableau.

2) #onction de t&pe %oid (pas de return) :


#e $enre de fonction est semblable 4%M)#(X`M(4 en %&'#&L. (lle ralise une ou quelques t-c+es (trier, c+erc+er, compter>affic+er, calculer, etc). #ertains li!res prsentent la fonction principale comme fonction qui retourne un entier comme rsultat :

Chapitre 2 : Boucles de rptitions et fonctions

Page &$

int main() 3 ........ @ return 1 /

#ette mani"re permet d'!iter des a!ertissements (*arnin$) la compilation mais n'est pas tr"s compr+ensi!e. Dl est prfrable, d'utiliser une fonction de tGpe !oid :

void
3 @

!in() "# rien retourner #"


.......

2.a) Syntaxe :
!oid nom de la fonction ( liste de param"tre(s) ) 3 dclarations locales raliser l'action confie (s'il G a des rsultats de retour, ce sont des param"tres transmis par pointeurs ou par rfrence(plus loin)) @ ]e su$$"re d'utiliser le nom d'un !erbe qui rsume la t-c+e de la fonction pour nommer la fonction : !oid calculer( .... ) !oid trier ( .... ) etc ....

2.b) $xe!ples :
#as 1 :
_uand on utilise des rsultats l'intrieur du corps d'une fonction, on n'a que des param"tres transmis par !aleur. (,emple : crire une fonction permettant de compter et d'affic+er le nombre de di!iseurs d'un entier n positif donn. crire appels permettant d'affic+er le nombre de di!iseurs de P J et Q;O.

Chapitre 2 : Boucles de rptitions et fonctions

Page &&

'olution : !oid compter ( int n ) 3 int d : 1 , 01 n est un di!iseur de lui>mme 10 i / 01 boucle for 10 for ( i : 1 / i 9: n 0 / iKK )

if ( n 7 i :: J ) dKK / printf(4Le nombre de di!iseurs de 7d est 7d5n4, n, d)/ @ &ppels : compter(P J)/ compter(Q;O)/ (,ercice : `n nombre parfait est un nombre entier qui est $al la somme de ses di!iseurs propres (sauf lui>mme). (,emples: T et T : 1 K ; : 1 K K H K O K P K 1O

; sont deu, nombres parfaits.

crire un pro$ramme utilisant de sous>pro$rammes qui permet de dcou!rir tous les nombres parfaits entre et AJJ et d'affic+er les informations du $enre sui!ant l'cran : =oici les nombres parfaits entre 1) T : 1 K ) ; : 1 K etc ... 'olution : 01 <ic+ier : %arfait.(QA 10 Rinclude 9stdio.+E 01 n est>il parfait 10 int est%arfait (int n) 3 int sommeXi!%ropre : 1 , 01 le premier di!iseur est 1 10 d / 01 est>il un di!iseur de n 10 01 totaliser des di!iseurs propres : 10 for ( d : / d 9: n 0 / dKK ) if ( n 7 d :: J ) sommeXi!%ropre K: d / @ return n :: sommeXi!%ropre / K H K O K P K 1O et AJJ :

Chapitre 2 : Boucles de rptitions et fonctions

Page &(

01 &ffic+a$e selon les e,i$ences demandes : 10 !oid affic+er ( int nombre%arfait ) 3 int d / printf(47Od : 14)/ for ( d : / d 9: nombre%arfait 0 / dKK ) if ( nombre%arfait 7 d :: J ) printf(4 K 7Hd4, d)/ @ printf(45n4)/

!oid main() 3 const int L)M2(1 : , L)M2( : AJJ / int nombre, compteur : J / printf(4=oici les nombres parfaits entre 7d et 7d5n5n4, L)M2(1, L)M2( )/ for ( nombre : L)M2(1 / nombre 9: L)M2( if ( est%arfait (nombre) ) 3 printf(47Hd) 4, KKcompteur)/ @ affic+er (nombre) / / nombreKK )

printf(45n5n&ppuGe6 sur (ntre 4)/ $etc+ar()/

(,cution du pro$ramme : =oici les nombres parfaits entre 1) ) H) T : 1 K ; : 1 K OQT : 1 K K K K H O K O K P K ; K et AJJ 1O 1T K

H1 K

K 1 O K

O;

&ppuGe6 sur (ntre

$!s 2 :
La fonction calcule et retourne des rsultats tra!ers des param"tres transmis par pointeur.

Chapitre 2 : Boucles de rptitions et fonctions

Page &7

Ar)u!ents trans!is par pointeur :


%&en't(te : void Appel : no no ( ))))) * t+pe,rsult!t # -* ))))) ) . / / / v ( ))))) * 0v!ri!ble du t+pe,rsult!t* ))))) ) ;

'ur l'en>tte c'est un pointeur qui pointe !ers le tGpe du rsultat calcul. & l'appel c'est une adresse de la !ariable qui recoit le rsultat. Mappels : La !aleur d[un pointeur est une adresse : float , : A.TP / float 1 % / ::E % est un pointeur !ers le tGpe float % : 8, / ::E la !aleur de % est l'adresse de , 'c+mas d'illustration : T JJJ (par e,emple) (adresse de dbut de , en mmoire) fgggggggh i A.TP i kgggggggl , fgggggggggggh i T JJJ i kgggggggggggl %

1. % est un pointeur (il pointe !ers , qui est de tGpe float) : fgggggggh %>>>>>>>>>>E i A.TP i kgggggggl , . !aleur de % est T JJJ (adresse de ,). H. 1% est de tGpe float. 'a !aleur est le contenu l'adresse T JJJ, ici c'est A.TP )n re!iendra au, notions adresses et pointeurs au c+apitre H (les tableau, et les c+aInes de caract"res).

Chapitre 2 : Boucles de rptitions et fonctions

Page &8

(,emples d'illustration : 1. !oid calculer ( float a, 01 #alculer et retourner 3 if ( a 9 b ) 1% : a else 1% : b @ `tilisation : float ,, G , plus%etit / printf(4(ntre6 scanf(8,, 8G)/ rels 4)/ float b, float 1 % ) la plus petite !aleur 10 / /

calculer (,, G, 8plus%etit)/ printf(4La plus petite !aleur est 7;. f5n4, plus%etit)/ (,plications : 'upposons que , !aut A. , G !aut H.O et l'adresse de plus%etit est AJJJJ. &!ec l'appel : #alculer (,, G, 8plus%etit)/

)n transmet la fonction : !oid calculer ( float a, float b, float 1 % ) 1. la !aleur A. a . la !aleur H.O b H. la !aleur AJJJJ % : fgggggggh i A JJJ i kgggggggl % )n e,cute la fonction : if ( a 9 b ) 1% : a / else 1% : b / #omme a 9 b est fau,, on a : 1% : b / #'est>>dire : dposer l'adresse 4A JJJ4 la !aleur H.O. fgggggggh i H.O i kgggggggl plus%etit fgggggggh i ??? i kgggggggl plus%etit &dresse A JJJ

Chapitre 2 : Boucles de rptitions et fonctions

Page &9

#'est la fin de la fonction, on re!ient la fin d'appel. )n rencontre : printf(4La plus petite !aleur est 7;. f5n4, plus%etit)/ (lle fait affic+er la !aleur H.O l'cran. . !oid ec+an$er ( int 1 p, int 1 s ) 01 c+an$er le contenu de entiers 10 3 int temporaire / temporaire : 1p / 1p : 1s / 1s : temporaire /

`tilisation : int a, b / printf(4(ntre6 entiers 4)/ scanf(47d7d4,8a, 8b)/ printf(4&!ant l'c+an$e, a : 7Hd, b : 7Hd5n4, a, b)/ ec+an$er (8a, 8b ) / printf(4&pr"s l'c+an$e, a : 7Hd, b : 7Hd5n4, a, b)/ (,plications : 'upposons que a !aut 1A, b !aut P et l'adresse de a est O;JJJ et l'adresse de b est O;JJ . &!ec l'appel : ec+an$er (8a, 8b ) / !oid ec+an$er ( int 1 p, int 1 s ) (a!ec 1% !aut 1A) (a!ec 1' !aut P) fgggggggh i O;JJ i kgggggggl s

)n transmet la fonction : 1. la !aleur O;JJJ % . la !aleur O;JJ ' fgggggggh i O;JJJ i kgggggggl p )n e,cute la fonction :

temporaire : 1p / :::E temporaire !aut 1A 1p : 1s / :::E Le contenu l'adresse O;JJJ est celui l'adresse O;JJ &dresse fgggggggh O;JJJ i P i kgggggggl a Chapitre 2 : Boucles de rptitions et fonctions &dresse O;JJ fgggggggh i P i kgggggggl b Page (0

1s

: temporaire / ::E Le contenu l'adresse O;JJ !aut 1A : fgggggggh i 1A i kgggggggl b &dresse O;JJ

& la fin de la fonction, les !aleurs de a et b sont c+an$es. (,ercice : crire une fonction qui recoit deu, rels a et b comme param"tres d'entre. (lle calcule et retourne (par pointeurs) les rsultats sui!ants : > la plus $rande !aleur parmi a et b > la plus petite !aleur parmi a et b > la diffrence positi!e entre a et b (absolue de (a>b)).

2) #onctions prdfinies (implantes) dans les fichiers d en't(te :


#+aque fonction ralise sou!ent une t-c+e (e,emple : con!ersion une c+aIne de caract"res en entier), elle si$nale aussi le rsultat de la ralisation (faisable ou non) : (,emple : int c+ar d , !aleur / 1 c+aine / 01 une c+aIne des caract"res 10

c+aine : 4abcdef4 / !aleur : atoi(c+aine) / 01 alp+abetic to inte$er 10 printf(4!aleur : 7d5n4, !aleur) / 01 !aleur !aut 6ro, c+oueF 10 c+aine : 4APH4 / !aleur : atoi(c+aine) / 01 alp+abetic to inte$er 10 printf(4!aleur : 7d5n4, !aleur) / 01 !aleur !aut APH, correctF 10

Chapitre 2 : Boucles de rptitions et fonctions

Page (1

Das könnte Ihnen auch gefallen