Beruflich Dokumente
Kultur Dokumente
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.
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
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()/
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
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)/
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
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)/
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 )
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
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
Page 3&
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()/ @
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
Page 37
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
Page 38
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
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
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
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 :
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)/ @ @
Page $3
O. les c+aInes de caract"res / A. les structures de donnes a!ances (liste linaire c+aIne, arbre binaire, ...) etc .....
'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)
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 :
SGpe >>>>>>>
&dresse >>>>>>>>>>> 7u 7u 7u 7u 7u
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()/ @
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
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
Page $(
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.
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
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()/
+#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
#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
"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.
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
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 /
_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.
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.
Page &$
#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 @
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.
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
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 :
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 )
H1 K
K 1 O K
O;
$!s 2 :
La fonction calcule et retourne des rsultats tra!ers des param"tres transmis par pointeur.
Page &7
'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).
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
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)).
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
Page (1