exercices en langage c delannoy

Upload: fred7106

Post on 10-Jul-2015

3.712 views

Category:

Documents


11 download

TRANSCRIPT

Exercices en langage C C. Delannoy

2

Exe rcice s e n l angage C

PREM I ERE PARTI : E EXERCI CES D 'APPLCATI N I O

Ce t e pre m i re part v propose des exercices, r s oudre , de prf re nce , pe ndant l ph ase d't t ie ous a ude du l angage C l ui1, sous l form e de 7 ch apit s : t m m e . El pous e l st ure d'un cours "cl l e a ruct assique" a re ypes de bas e , op rat urs e t e e xpre s s ions ; nt e s -sort s conv rsat e r ie e ionne l s ; ruct l inst ions de cont e ;e s fonct e rl l ions ;e s t e aux e t ls point urs ; l abl e e ls ch a de caract re s ;e s s t ure s . e nes l ruct Ch aq ue ch apit com port : re e - des exe rcices d'appl ion im m diat dest s facil e r l icat e in it 'assim il ion du cours corre s pondant at , - des exe rcice s , sans grande difficul al h m iq ue m e t ant e n oe uv l diff re nt s not t gorit t re es e ions acq uis e s au cours des pr cdent ch apit s . s re Not z q ue l il ion de s fich ie rs, ainsi que l ge s t dynam iq ue ne s ont pas abords dans ce t e pre m i re part ; s e 'ut isat a ion t ie ce deux point fe ront ch acun l e t d'un ch apit appropri dans l s e conde part de l rage . s 'obj re a ie 'ouv

1 Un t cours v el ous e s t propos, par exem pl dans "Apprendre program m er en Turbo C" ou dans "C norm e ANSI - Guide com pl de e, et

program m at ion" du m m e aut eur, gal ent aux dit em ions Eyrol l es.

I : TYPES D E BASE, O PERA TEURS ET EXPRESSI NS O

Exe rcice I .1___________________________________________________________________________

EnoncEl ine r ls pare nt s e s s upe rfl dans ls e xpre s s ions suiv e s : im e h ues e anta = (x+5) a = (x=y) + 2 a = (x==y) (a int (ce q ui about l v e ur 1), av d' t aj l a e iq it a al ant re out a v e ur 1 (int L r s ul 2 e s t de t al ). e t at ype int .

I. Types de base, oprat urs e t e xpre s s ions e 5 3) p e s t d'abord soum is l conv rsion syst m at ue sh ort -> int t a e iq , andis q ue c e s t soum is l conv rsion syst m at ue a e iq ch ar -> int ;e s r s ul s sont al addit l t at ors ionn s pour about l v e ur 11 de t ir a al ype int . 4) p e t c sont d'abord aux m m e s conv rsions syst m at ue s q ue ci-de s s us ;e r s ul 35 e s t de t e iq l t at ype int .

Exe rcice I .3___________________________________________________________________________

EnoncSoie nt l dcl ions : es aratchar c = '\x05' ; int n = 5 ; long p = 1000 ; float x = 1.25 ; double z = 5.5 ;

Quel sont l t s e ype e t l v e ur de ch acune d e s e xpre s s ions suiv e s : a al antn + c + p 2 * x + c (char) n + c (float) z + n / 2 /* /* /* /* 1 2 3 4 */ */ */ */

___________________________________________________________________________

Sol ion ut1) c e s t t d'abord conv rt e n int av d' t aj n. L r s ul (10), de t out e i , ant re out e t at ype int e s t al conv rt e n l , ors e i ong, av ant d' t aj p. O n obt nt finalm e nt l v e ur 1010, de t re out ie e a al ype l ong. 2) O n v ue d'abord l v e ur de 2* e n conv rt al a al x, e issant 2 (int e n f oat ce q ui fournit l v e ur 2.5 (de t ) l , a al ype f oat Par l ). ail urs, c e s t conv rt e n int (conv rsion syst m at ue ). O n v ue e nsuit l v e ur de 2* e n conv rt l e e i e iq al e a al x, e issant 2 (int e n ) f oat ce q ui fournit l v e ur 2.5 (de t l , a al ype f oat Pour e ffe ct r l l ). ue 'addit ion, on conv rt al l v e ur e nt re 5 (c) e n e it ors a al i f oat av de l out r au r s ul pr cdent O n obt nt finalm e nt l v e ur 7.75, de t l , ant 'aj e t at . ie e a al ype f oat l .

6 Exe rcice s e n l angage C 3) n e s t t out d'abord conv rt e n ch ar ( cause de l rat ur de "cast t e i 'op e "), andis q ue c e s t conv rt (conv rsion e i e syst m at ue ) e n int Puis, pour procder l iq . 'addit ion, ile s t n ce s s aire de re conv rt l v e ur de (ch ar) n e n int e ir a al . Finalm e nt on obt nt l v e ur 10, de t e , ie a al ype int . 4) z e s t d'abord conv rt e n f oat ce q ui fournit l v e ur 5.5 (approxim at e , car, e n fait on obt nt une v e ur un pe u e i l , a al iv , ie al m oins prcise que ne l s e rait 5.5 e xprim e n doubl). Par ail urs, on proc de l div e e l e a ision e nt re de n par 2, ce q ui i fournit l v e ur e nt re 2. Ce t e derni re e s t e nsuit conv rt e n f oat av d' t aj e 5.5, ce q ui fournit l a al i t e e ie l , ant re out e r s ul 7.5, de t t at ype f oat l . R e m arque : D ans l pre m i re dfinit a ion de K e rnigh an e t R it ie , ls v e urs de t ch e al ype f oat t nt e l s aussi, soum ises une l aie , l e conv rsion syst m at ue e n doubl. Dans ce cas, ls e xpre s s ions 3 et 4 t nt al de t e iq e e aie ors ype doubl. e

Exe rcice I .4___________________________________________________________________________

EnoncSoie nt l dcl ions suiv e s : es arat antint n = 5, p = 9 ; int q ; float x ;

Quel e s t l v e ur affe ct e aux diff re nt s v l e a al e ariabls conce rn e s par ch acune des inst ions suiv e s : e ruct antq q q x x x x q q = = = = = = = = = n < p ; n == p ; p % n + p > n ; p / n ; (float) p / n ; (p + 0.5) / n ; (int) (p + 0.5) / n ; n * (p > n ? n : p) ; n * (p < n ? n : p) ; /* /* /* /* /* /* /* /* /* 1 2 3 4 5 6 7 8 9 */ */ */ */ */ */ */ */ *:

___________________________________________________________________________

I. Types de base, oprat urs e t e xpre s s ions e

7

Sol ion ut1) 1 2) 0 3) 5 (p%n v 4, t aut andis q ue p> n v 1) aut 4) 1 (p/n e s t d'abord v u e n int ce q ui fournit 1 ; al , puis l r s ul e s t conv rt e n f oat av d' t affe ct x). e t at e i l , ant re 5) 1.8 (p e s t conv rt e n f oat av d' t div par l r s ul de l conv rsion de n en f oat e i l , ant re is e t at a e l ). 6) 1.9 (p e s t conv rt e n f oat av d' t aj 0.5 ;e r s ul e s t div par l r s ul de l conv rsion de n en e i l , ant re out l t at is e t at a e f oat l ). 7) 1 (p e s t conv rt e n f oat av d' t aj 0.5 ;e r s ul (5.5) e s t al conv rt e n int av d' t div par n). e i l , ant re out l t at ors e i ant re is 8) 25 9 ) 45

Exe rcice I .5___________________________________________________________________________

EnoncQuel r s ul s fournit l program m e s uiv : s t at e ant#include main () { int i, j, n ; i = 0 ; n = i++ ; printf ("A : i = %d i = 10 ; n = ++ i ; printf ("B : i = %d

n = %d \n", i, n ) ;

n = %d \n", i, n ) ;

8

Exe rcice s e n l angage Ci = 20 ; j = 5 ; n = i++ * ++ j ; printf ("C : i = %d j = %d n = %d \n", i, j, n ) ; i = 15 ; n = i += 3 ; printf ("D : i = %d n = %d \n", i, n) ; i = 3 ; j = 5 ; n = i *= --j ; printf ("E : i = %d j = %d n = %d \n", i, n) ; }

___________________________________________________________________________

Sol ion ut

A B C D E

: : : : :

i i i i i

= = = = =

1 n = 0 11 n = 11 21 j = 6 n = 120 18 n = 18 12 j = 12 n = 6

Exe rcice I .6___________________________________________________________________________

EnoncQuel r s ul s fournira ce program m e : s t at#include main() { int n=10, p=5, q=10, r ; r = n == (p = q) ; printf ("A : n = %d n = p = q = 5 ; n += p += q ; printf ("B : n = %d

p = %d

q = %d

r = %d\n", n, p, q, r) ;

p = %d

q = %d\n", n, p, q) ;

I. Types de base, oprat urs e t e xpre s s ions eq = n < p ? n++ : p++ ; printf ("C : n = %d p = %d q = n > p ? n++ : p++ ; printf ("D : n = %d p = %d }

9

q = %d\n", n, p, q) ;

q = %d\n", n, p, q) ;

___________________________________________________________________________

Sol ion ut

A B C D

: : : :

n n n n

= = = =

10 15 15 16

p p p p

= = = =

10 10 11 11

q q q q

= = = =

10 5 10 15

r = 1

Exe rcice I .7___________________________________________________________________________

EnoncQuel r s ul s fournira ce program m e : s t at#include main() { int n, p, q ; n = 5 ; p = 2 ; q = n++ >p || p++ != 3 ; printf ("A : n = %d p = %d n = 5 ; p = 2 ; q = n++0 "), scanf ("%d", &n), n0 ") ; while (scanf ("%d", &n), n0) printf ("sa racine carre est : %le\n", sqrt (x) ) ; if (x==0) break ; } while (1) ; }

R e m arque : Ilne faut surt pas oubl r #incl < m at .h > car, sinon, l com pil e ur consid re (e n l out ie ude h e at 'absce nce du prot ype ) ot q ue s q rt fournit un r s ul de t t at ype int .

III. L s inst ions de cont e e ruct rl

29

Exe rcice II I.11___________________________________________________________________________

EnoncCal e r l som m e des n pre m ie rs t rm es de l "s rie h arm oniq ue ", c'e s t -dire l som m e : cul a e a - a 1 + 1/2 + 1/3 + 1/4 + ..... + 1/n L v e ur de n s e ra l e n donn e . a al ue ___________________________________________________________________________

Sol ion ut

#include main() { int nt ; float som ; int i ; do

/* nombre de termes de la srie harmonique */ /* pour la somme de la srie */

{ printf ("combien de termes : ") ; scanf ("%d", &nt) ; } while (nt 2 */

/* autre formulation possible : /* for (i=3 ; i=0 */ min = 21 ; /* initialisation min (possible car toutes notes < 21) */ while (printf ("donnez une note (-1 pour finir) : "), scanf ("%d", &note), note >=0) { if (note == max) nmax++ ; if (note > max) { max = note ; nmax = 1 ; } if (note == min) nmin++ ; if (note < min) { min = note ; nmin = 1 ; } } /* attention, si aucune note (cad si max= 0) { printf ("\nnote maximale : %d attribue %d fois\n", max, nmax) ;

36

Exe rcice s e n l angage Cprintf } } ("note minimale : %d attribue %d fois\n", min, nmin) ;

Exe rcice II I.16___________________________________________________________________________

EnoncEcrire un program m e q ui affich e l "t e de m ul icat a abl t ipl ion" de s nom bres de 1 10, sous l form e s uiv e : a antI 1 2 3 4 5 6 7 8 9 10 ----------------------------------------------1 I 1 2 3 4 5 6 7 8 9 10 2 I 2 4 6 8 10 12 14 16 18 20 3 I 3 6 9 12 15 18 21 24 27 30 4 I 4 8 12 16 20 24 28 32 36 40 5 I 5 10 15 20 25 30 35 40 45 50 6 I 6 12 18 24 30 36 42 48 54 60 7 I 7 14 21 28 35 42 49 56 63 70 8 I 8 16 24 32 40 48 56 64 72 80 9 I 9 18 27 36 45 54 63 72 81 90 10 I 10 20 30 40 50 60 70 80 90 100

_______________________________________________________________

Sol ion ut#include #define NMAX 10 main() { int i, j ; /* affichage ligne en-tte */ printf (" I") ; for (j=1 ; jc, adp->x, adp->y) ; }

Not z q ue l doit ce t e fois, faire appe l l rat ur -> , l pl de l rat ur point (.), puis q ue l "t ail " e 'on , t 'op e a ace 'op e 'on rav l e sur un point ur sur une s t ure , e t non pl sur l v e ur de l st ure e l -m m e . Tout fois l e ruct us a al a ruct l e e 'usage de -> n'e s t pas t alm e nt indispensabl, dans l m e s ure o, par e xe m pl, adp-> x e s t q uiv e nt (* ot e e a e al adp).x. V oici l 'adapt ion du program m e d'essai pr cdent : atmain() {

V L s s t ure s II. e ructvoid affiche (struct s_point *) ; struct s_point s ; s.c = 'A' ; s.x = 10 ; s.y = 12 ; affiche (&s) ; }

75

R e m arque : Au l u d'affe ct r de s v e urs aux ch am ps c, x e t y de not s t ure s (dans l deux program m es d'essai), nous ie e al re ruct es pourrions (ici) ut iser ls possibil s d'init isat offe rt s par l l il e it ial ion e e angage C, e n criv : antstruct s_point s = {'A', 10, 12} ;

Exe rcice VI I.2___________________________________________________________________________

EnoncEcrire une fonct ion q ui "m e t z ro" l diff re nt ch am ps d'une st ure du t es s ruct ype s_point (dfini dans l xe rcice 'e pr cdent) q ui l e s t t ui ransm ise en argum e nt L fonct ne com port ra pas de v e ur de re t . a ion e al our. _______________________________________________________________

Sol ion utIci, bie n q ue l nonc ne l pr cis e pas, ile s t n ce s s aire de t ' e ransm e t re l fonct conce rn e , non pas l v e ur, m ais t a ion a al l 'adresse de l st ure "re m e t re z ro". V a ruct t oici l fonct a ion de m and e (ici, nous av ons re produit l dcl ion de a arat s_point : )#include struct s_point { char c ; int x, y ; } ; void raz (struct s_point * adr)

76{

Exe rcice s e n l angage Cadr->c = 0 ; adr->x = 0 ; adr->y = 0 ;

}

V oici, t re indicat un pe t program m e d'essai (sa com pil ion n ce s s it l dcl ion de s_point ainsi que l fich ie r it if, it at e a arat , e st dio.h ) :main() { struct s_point p ; void raz (struct s_point *) ; // dclaration de raz raz (&p) ; /* on crit c en %d pour voir son code */ printf ("aprs : %d %d %d", p.c, p.x, p.y) ; }

Exe rcice VI I.3___________________________________________________________________________

EnoncEcrire une fonct q ui re e n argum e nt l ion oit 'adresse d'une s t ure du t ruct ype s_point (dfini dans l xe rcice V 'e II.1) e t q ui re nv e n r s ul une s t ure de m m e t oie t at ruct ype corre s pondant un point de m m e nom (c) e t de coordonn e s oppos e s . Ecrire un pe t program m e d'essai. it _______________________________________________________________

Sol ion utBie n q ue l nonc ne pr cis e rie n, l r s ul de not fonct ne pe ut t t ' e t at re ion re ransm is que par v e ur. En e ffe t ce r s ul al , t at doit t cr au s e in de l fonct e l -m m e ; l signifie q u'il e ra d t re a ion l e ce a s ruit d s l sort de l fonct ; n t a ie a ion e ransm e t re t l 'adre s s e re v ndrait re nv r l ie oye 'adre s s e d e q ue lue ch ose dest dispara ... q in t re V oici ce q ue pourrait t not fonct (ici, e ncore , nous av re produit l dcl ion de s_point : re re ion ons a arat )#include struct s_point { char c ;

V L s s t ure s II. e ructint x, y ; } ; struct s_point sym (struct s_point * adr) { struct s_point res ; res.c = adr->c ; res.x = - adr->x ; res.y = - adr->y ; return res ; }

77

Not z l "dissym t " d'inst ions t l s q ue re s .c = adr-> c ; y fait appe l l rat ur . gauch e e t l rat ur e a rie ruct e l e on 'op e 'op e -> droit (on pourrait ce pe ndant crire re s .c = (* e adr).c. V oici un e xe m pl d'essai de not fonct (ici, nous av e re ion ons ut is ls possibil s d'init isat d'une s t ure pour il e it ial ion ruct donne r de s v e urs p1) : almain() { struct s_point sym (struct s_point *) ; struct s_point p1 = {'P', 5, 8} ; struct s_point p2 ; p2 = sym (&p1) ; printf ("p1 = %c %d %d\n", p1.c, p1.x, p1.y) ; printf ("p2 = %c %d %d\n", p2.c, p2.x, p2.y) ; }

Exe rcice VI I.4___________________________________________________________________________

EnoncSoit l st ure s uiv e , re pr s e nt un point d'un pl : a ruct ant ant anstruct s_point { char c ; int x, y ; } ;

1) Ecrire l dcl ion d'un t e au (nom m courbe ) de NP point (NP suppos dfini par une inst ion #de f ) a arat abl s ruct ine 2) Ecrire une fonct (nom m e af ich e ) q ui affich e ls v e urs des diff re nt "point du t e au courbe , t ion f e al s s" abl ransm is en argum e nt sous l form e : , a

78

Exe rcice s e n l angage Cpoint D de coordonnes 10 2

3) Ecrire un program m e q ui : - l e n donnes des v e urs pour l t e au courbe ;on ut isera de prf re nce ls fonct it al e abl il e ions ge t e t sscanf de s , pr f re nce scanf (v v nt l m e nt l xe rcice V oir e ue l e 'e I.5) ; supposera q u'une l on igne de donne ne peut pas dpas s e r 128 caract re s , - fait appe l l fonct pr cdent pour ls affich e r. a ion e e _______________________________________________________________

Sol ion ut1) Il suffit de dcl r un t e au de s t ure s : are abl ructstruct s_point courbe [NP] ;

2) Com m e courbe e s t un t e au, on ne pe ut q u'e n t abl ransm e t re l t 'adre s s e e n argum e nt de af ich e . Ile s t pr f rabl de f e pr v galm e nt e n argum e nt l nom bre de point V oir e e s. oici ce q ue pourrait t not fonct : re re ionvoid affiche (struct s_point courbe [], int np) /* courbe : adresse de la premire structure du tableau */ /* (on pourrait crire struct s_point * courbe) */ /* np : nombre de points de la courbe */ { int i ; for (i=0 ; i NMAX) nl = NMAX ; printf ("\n\n p ") ; for (i=0 ; inom, debut->age) ; debut = debut->suivant ; } }

19 0

Exe rcice s e n l angage C

Com m e nt s aire*Nous av ici ch oisi de dcl r not s t ure un niv au gl ons are re ruct e obale t de faire appe l t de f Ce t e dcl ion un ype . t arat niv au gl e obal v e de dev d crire l m m e s t ure e n diff re nt e ndroit ce q ui s e rait non s e ulm e nt l it oir a ruct s s, , e aborie ux m ais, de surcro source d'erreurs. Par cont , l re cours t de f n'apport q u'une s im pl t , re e ype e ificat des dcl ions des ion arat lm e nt de ce t s ype (dans l cas cont e raire , il suffirait de re m pl r t l m e nt par st ace _e e ruct e l m e nt e ). Not z bie n, par cont , q u'il s t pas possibl de re m pl r, au s e in de l dfinit de not s t ure , l crit : e re n'e e ace a ion re ruct ' urestruct element * suivant

par :t_element * suivant

*L fonct de cr at re e n argum e nt l a ion ion oit 'adresse du point ur de but car e l doit pouv l at ribue r une v e ur. e , l e oir ui t al L fonct a ion de l e , q uant e l , s e cont nt de l v eur de ce m m e point ur. Ce t e diff re nce s e r pe rcut ist l e e e a al e t e nat l m e nt sur l m ani re d'ut iser cet argum e nt dans ch acune des deux fonct ure l e a il ions. Not z d'ail urs q ue nous av pu nous pe rm e t re , dans l fonct de l e , de m odifie r l v e ur ainsi re (l point ur e l e ons t a ion ist a al ue e e de but y dcrit succe s s iv m e nt l diff re nt lm e nt de l l e ). e es s s a ist *L e ncore , ls lct s au cl ie r ont t r al e e ure av ises par scanf e t ge t donc sans prot ct s, e ions part i re s . Com m e nous icul l ons dj signal dans l pr cdent e xe rcice , l il ion conj e de ces deux fonct 'av e 'ut isat oint ions pose un problm e l au fait i q ue , apr s une lct e ure par scanf l point ur re s t posit , e e e ionn s ur l dernie r caract re non e ncore ut is, sav e il oir (g n ralm e nt) \n. C'e s t ce q ui j ifie l roduct d'une inst ion ge t ar pour absorber ce caract re int m pe s t e ust 'int ion ruct ch e if.

V : RECURSI I I VTE

L r cursiv e s t une not d l e m ais q ui a l ant de conduire s ouv nt des program m e s s im pls . a it ion icat 'av age e e Ls t e rois prem ie rs e xe rcices de ce ch apit s ont pl t des "e xe rcices d'col" dest s v re ut e in ous faire e xpl r diff re nt s ore e sit ions e n v for crire une fonct r cursiv , l o, e n prat ue , on ne s e rait pas am e n l faire . uat ous ant ion e iq e

V-1 lcture r curs iv (1) I e e________________________________________________________________________________________

EnoncEcrire une fonct r cursiv de lct d'une v e ur e nt re au cl ie r. L fonct de v s'appe lr e l -m m e dans l ion e e ure al i av a ion ra e l e e cas o l 'inform at fournie e s t incorre ct (non num riq ue ). ion e O n pr v oira une fonct un argum ent (l ion 'adresse de l v a ariabl pour l ue l on v ut l une v e ur) e t sans v eur de e aq l e e ire al al ret our. O n pourra faire appe l fge t e t sscanf pour d t ct r conv nablm e nt ls r pons e s incorre ct s . s e e e e e e

Re m arq ueNous v ous cons e il de com pare r ce t e xe rcice au suiv dans lq ue ll m m e problm e e s t r s ol par l m pl d'une l ons ant e e u 'e oi fonct r cursiv s ans argum e nt e t av c v e ur de re t ion e e al our.

Exe m pl e

19 2

Exe rcice s e n l angage C

donnez un nombre entier : un ** rponse incorrecte - redonnez-la : ' ** rponse incorrecte - redonnez-la : 40 -- merci pour 40 ________________________________________________________________________________________

ANAL YSEAu sein de l fonct (q ue nous nom m e rons lct ), nous l a ion e ure irons l v e ur at e ndue l a al t 'aide de f t (..., st ge s din), associ sscanf com m e nous l ons dj fait dans ce rt , 'av ains des exe rcice s pr cdent s. Nous consid re rons l r ponse de l il e ur com m e corre ct l q ue l code de re t a 'ut isat e ors e our de sscanf s e ra gal 1. Si t l e n'e s t pas l cas, nous fe rons nouv au appe l l m m e fonct lct . e e a ion e ure

Program m e#include #define LG_LIG 20 main() { void lecture (int *) ; int n ; /* longueur maxi information lue au clavier */

/* prototype fonction (rcursive) de lecture */ /* entier lire */

printf ("donnez un nombre entier : ") ; lecture (&n) ; printf ("-- merci pour %d", n) ; } void lecture (int *p) { int compte ; char ligne[LG_LIG+1] ;

/* compteur du nb de valeurs OK */ /* pour lire une ligne au clavier par fgets */ /* +1 pour tenir compte du \0 de fin */

fgets (ligne, LG_LIG, stdin) ; compte = sscanf (ligne, "%d", p) ; if (!compte) { printf ("** rponse incorrecte - redonnez la : ") ; lecture (p) ;

V R cursiv I. it} }

19 3

Com m e nt s aire*Not z bie n q u'au s e in de l fonct lct , au niv au de l e a ion e ure e 'appe lde sscanf nous v , oyons appara p e t non & p, t re puis q ue ici p e s t dj un point ur sur l v e a ariabl dont on v ut l l v e ur. e e ire a al *Si nous av ions ut is sim plm e nt ge t (com m e dans l xe rcice V de l pre m i re part ) au l u de f t (..., st il e s 'e I.5 a ie ie ge s din), nous aurions pu galm e nt nous prot ge r de m auv e s r ponses de l il e ur, m ais nous aurions d dfinir une t l e ais 'ut isat ail e m axim al pour l ch a l au cl ie r ;nous aurions couru l ris q ue de "dbordem e nt m m oire ", dans l cas o e a ne ue av e e l il e ur aurait fourni une r pons e t l 'ut isat rop ongue .

DI SCUSSI N OCh aq ue nouv l e appe l lct e nt ne l l ion aut at ue , sur l pil, d'e m pl m e nt pour : de e ure ra 'al ocat om iq a e ace s -l 'argum e nt p, - ls obj t l e e s ocaux : com pt e t l . e igne O r, e n fait ne s ont n ce s s aire s q ue ls v e urs corre s pondant au de rnie r appe lde lct , e al e ure (ce l o l lct ui a e ure s 'e s t conv nablm e nt droule ) ; e e dans ce s condit ions, l m pilm e nt des diff re nt e m pl m e nt al s au t e au l 'e e s ace s l ou abl igne e s t superfl Si l souh ait faire q ue lue s conom ies d'espace m m oire ce niv au, on pe ut s'arrange r pour q ue ce t u. 'on e q e e m pl m e nt ne s oit r s e rv q u'une s e ul fois : ace e - soit dans l program m e appe l (ici l program m e principal ; e ant e ) dans ce cas, ilfaudra e n t ransm e t re l t 'adre s s e e n argum e nt ce q ui e nt ne l m pilm e nt d'une v , ra 'e e ariabl s upplm e nt . e aire - soit e n cl s e gl e ; as obal dans ce cas, on pe ut galm e nt t e r de l sort com pt e t p (c'e s t -dire , e n fait n), ce q ui e rait a e e - , supprim e du m m e coup t ls argum e nt e t ls obj t l ous e s e e s ocaux de lct . Not z q u'ilre s t ra q uand m m e , ch aq ue e ure e e appe l une al ion aut at ue d'espace pour l , l ocat om iq 'adre s s e d e re t our. - soit e n cl s e s t iq ue (st ic) au s e in de l fonct as at at a ion. L e ncore , nous pouv t e r de l m m e m ani re l v ons rait a a ariabl e com pt , l v e a ariabl p, q uant e l , re s t soum ise aux e m pilm e nt e l e ant e s.

19 4

Exe rcice s e n l angage C

V-2 L cture r curs iv (2) I e e________________________________________________________________________________________

EnoncEcrire une fonct r cursiv de lct d'une v e ur e nt re au cl ie r. L fonct de v s'appe lr e l -m m e dans l ion e e ure al i av a ion ra e l e e cas o l 'inform at fournie e s t incorre ct (non num riq ue ). ion e O n pr v oira ce t e fois une fonct dans l ue l l v e ur de re t e s t l v e ur l (il aura donc pas d'argum e nt t ion aq l a al e our a al ue n'y s). L e ncore , on pourra faire appe l f t (..., st ge s din) e t sscanf pour d t ct r conv nablm e nt ls r pons e s incorre ct s . e e e e e e

Re m arq ueCe t e xe rcice e s t surt dest t com par au pr cdent dans lq ue ll m m e problm e e s t r s ol par l m pl d'une out in re e e u 'e oi fonct av c argum e nt e t sans v e ur de re t ion e al our.

Exe m pl edonnez un nombre entier : un ** rponse incorrecte - redonnez la : ' ** rponse incorrecte - redonnez la : 40 -- merci pour 40 ________________________________________________________________________________________

ANAL YSECom m e pr cdem m e nt au s e in de not fonct , re ion (nom m e lct ), nous l e ure irons l v e ur at e ndue l a al t 'aide de f t ge s associ sscanf Nous consid re rons l r ponse de l il e ur com m e corre ct l q ue l code de re t . a 'ut isat e ors e our de sscanf s e ra gal 1. Si ce l n'e s t pas l cas, nous fe rons de nouv au appe l l m m e fonct lct . a e e a ion e ure

V R cursiv I. it

19 5

Program m e

#include #define LG_LIG 20 main() { int lecture (void) ; int n ; /* longueur maxi information lue au clavier */

/* fonction (rcursive) de lecture */ /* entier lire */

printf ("donnez un nombre entier : ") ; n = lecture() ; printf ("-- merci pour %d", n) ; } int lecture (void) { int compte, p ; char ligne[LG_LIG+1] ;

/* compteur du nb de valeurs OK */ /* entier lire */ /* pour lire une ligne au clavier par fgets */

fgets (ligne, LG_LIG, stdin) ; compte = sscanf (ligne, "%d", &p) ; if (!compte) { printf ("** rponse incorrecte - redonnez-la : ") ; p = lecture() ; } return(p) ; }

Com m e nt s aire*Ce t e fois, on not ra q ue p d s igne une v t e ariabl l e de t e ocal ype int dont l m pl m e nt e s t al , 'e ace l aut at ue m e nt ou om iq ch aq ue appe lde l fonct lct , de l m m e m ani re q ue pour ls aut s obj t l a ion e ure a e re e s ocaux com pt e t l . Par ail urs, e igne l e si aucun e m pl m e nt n'e s t al ace l ici pour un q ue l ue argum e nt ilfaut e n pr v un pour l v e ur de re t ou conq , oir a al our. O n re m arq ue d'ail urs q u'ici ce t e v e ur s e t l e t al rouv "propag e " de proch e e n proch e , l du "dpilm e nt des appe l e ors e " s. *Pre ne z garde ne pas crire :

19 6

Exe rcice s e n l angage Cif (!compte) { printf ("** rponse incorrecte - redonnez-la : ") ; p = lecture() ; } else return (p) ;

car l fonct ne re nv rrait une v e ur q ue l q ue l lct s e s e rait droule conv nablm e nt Not z d'ail urs q ue a ion e al ors a e ure e e . e l e dans ce cas, bon nom bre de com pil e urs v prv ndrait par un m e s s age d'av rt at ous ie e issem e nt ("w arning"). Par cont , il e rait t fait corre ct (e t q uiv e nt) d'crire : re s out alif (!compte) { printf ("** rponse incorrecte - redonnez la : ") ; return (lecture()) ; } else return (p) ;

DI SCUSSI N OL s re m arq ue s fait dans l pr cdent e xe rcice e es e s'appl ue nt e ncore ici. iq propos des em pilm e nt de l e s igne (e t v nt l m e nt com pt ) e ue l e e

V-3 L cture r curs iv (3) I e e________________________________________________________________________________________

EnoncEcrire une fonct r cursiv de lct d'un ent r au cl ie r. L fonct ion e e ure ie av a ion de v s'appe lr e l -m m e dans l cas o ra e l e e l 'inform at fournie e s t incorre ct . ion e Ce t e fois, l fonct possdera 3 argum e nt : t a ion s - l m e s s age q u'e l doit im prim e r av e l e ant de l une v e ur (l m e s s age "donne z un nom bre e nt r :" ne s e ra donc ire al e ie pl affich par l program m e principal us e ), -l 'adresse de l v a ariabl dans l ue l on doit l une v e ur, e aq l e ire al - l nom bre m axim al e d'essais aut s . oris

V R cursiv I. it

19 7

El fournira un code de re t gal 0 si l lct a fini par about e t -1 l q ue l lct n'a pas pu about dans l l e our a e ure ir ors a e ure ir e nom bre d'essais im part is. Com m e dans l deux pr cdent e xe rcice s , on fe ra appe l f t associ e sscanf es s ge s .

Exe m pls edonnez un nombre entier : huit ** rponse incorrecte - redonnez-la : 8 -- merci pour 8 ____________________ donnez un nombre entier : un ** rponse incorrecte - redonnez-la ** rponse incorrecte - redonnez-la ** rponse incorrecte - redonnez-la ** rponse incorrecte - redonnez-la -- nombre d'essais dpass

: : : :

deux trois quatre cinq

________________________________________________________________________________________

ANAL YSEL m e s s age im prim e r s e ra t e ransm is sous form e de l 'adresse d'une ch a . L fonct affich e ra ce m e s s age d s son ne a ion appe l Son cont nu de v donc t : . e ra re donne z un nom bre e nt r : ie dans l 'appe l ial l fonct (r al dans l program m e principal e t : init de a ion is e ), * r pons e incorre ct - re donne z -a : * e dans l 'appe l l fonct par e l -m m e e n cas de r pons e incorre ct . de a ion l e e En ce q ui conce rne l nom bre m axim ald'appe l on l t e s, e ransm e t ra par v e ur e t on s'arrange ra pour faire dcro s a t al t re v e ur de 1 ch aq ue appe l al . L r cursiv des appe l ce s s e ra l q ue l a it s ors 'une des deux condit ions suiv e s s e ra sat ant isfait : e - v e ur l corre ct - on fournira al 0 com m e v e ur de re t al ue e ors al our,

19 8 Exe rcice s e n l angage C - nom bre m axim al d'appe l dpas s - on fournira al -1 com m e v e ur de re t s ors al our.

Program m e#include #define LG_LIG 20 /* longueur maxi information lue au clavier */ main() { int lecture (char *, int *, int) ; /* proto fonction (rcursive) de lecture */ int n ; /* entier lire */ const nessais = 5 ; /* nombre d'essais autoriss */ if ( lecture ("donnez un nombre entier : ", &n, nessais) != -1) printf ("-- merci pour %d", n) ; else printf ("-- nombre d'essais dpasss") ; } int lecture (char * mes, int * p, int nmax) /* mes : adresse message afficher avant lecture */ /* p : adresse de la valeur lire */ /* nmax : nombre d'essais autoriss */ { int compte ; /* compteur du nb de valeurs OK */ char ligne [LG_LIG] ; /* pour lire une ligne au clavier par fgets */ printf ("%s", mes) ; fgets (ligne, LG_LIG, stdin) ; compte = sscanf (ligne, "%d", p) ; if (!compte) if (--nmax) return (lecture ("** rponse incorrecte - redonnez la : ", p, nmax) ) ; else return (-1) ; else return (0) ; }

Com m e nt s aire*Nous av ch oisi ici de faire affich e r l m e s s age : ons e nom bre d'e s s ais dpass

V R cursiv I. it

19 9

dans l program m e principal Il e . s'agit l d'un ch oix arbit raire puis q ue nous aurions t aussi bien pu l faire affich e r par out e l fonct e l -m m e . a ion l e

V-4 Puis s ance e nti re I________________________________________________________________________________________

EnoncEcrire une fonct r cursiv pe rm e t ant de cal e r l v e ur de x pour x r e lq ue l ue e t k e nt r re l if q ue l ue . ion e t cul a al conq ie at conq O n e xpl e ra ls propri t s s uiv e s : oit e ant x = 1, x =x-k k k 0 k

pour k = 1,k

x = 1 /x x = (x x = (xk k -1

pour k posit if, pour k posit im pair, if pour k posit pair. if

)x )x

k /2

O n t s t ra ce t e fonct l e e t ion 'aide d'un program m e principalpe rm e t ant l il e ur de fournir e n donn e s ls v e urs de t 'ut isat e al x e t de k .

Exe m pls edonnez une valeur relle : 4 donnez une puissance entire : -2 4.000000e+000 la puissance -2 = 6.250000e-002 _______________________

donnez une valeur relle : 5.2

200

Exe rcice s e n l angage C

donnez une puissance entire : 3 5.200000e+000 la puissance 3 = 1.406080e+002 ________________________________________________________________________________________

ANAL YSEL nonc fournit ls "dfinit ' e ions r cursiv s " e m pl r. e oye

Program m e

#include main() { double puissance(double, int) ; double x ; int n ;

/* proto fonction d'lvation la puissance */ /* valeur dont on cherche la puissance neme */ /* puissance laquelle on veut lever x */

printf ("donnez une valeur relle : ") ; scanf ("%le", &x) ; printf ("donnez une puissance entire : ") ; scanf ("%d", &n) ; printf ("%le la puissance %d = %le", x, n, puissance (x, n) ) ; } double puissance (double x, int n) { double z ; if (n < 0) return (puissance (1.0/x, -n) ) ; else if (n == 0) return (1) ; else if (n == 1) return (x) ; else if (n%2 == 0) { z = puissance (x, n/2) ; return (z*z) ; } else return (x * puissance (x, n-1) ) ; /* puissance ngative */ /* x puissance 0 gale 1 */ /* x puissance 1 gale x */ /* puissance paire */

/* puissance impaire */

V R cursiv I. it}

201

Com m e nt s aireIl s t pr f rabl d'crire : e ez = puissance (x, n/2) ; return (z*z) ;

pl t q ue : utreturn (puissance (x,n/2) * puissance (x,n/2) ) ;

q ui produirait deux fois pl d'appe l de l fonct puissance . us s a ion

V-5 Fonction d'A ck e rm ann I________________________________________________________________________________________

EnoncEcrire une fonct r cursiv cal ant l v e ur de l fonct ion e cul a al a ion d'Ack e rm ann, d finie pour m e t n, e nt rs posit ou ie ifs nul par : s, A(m ,n) = A(m -1, A(m ,n-1) ) pour m > 0 e t n> 0, A(0,n) = n+ 1 pour n> 0, A(m ,0) = A(m -1,1) pour m > 0. Ce t e fonct possdera e n argum e nt ls v e urs de m e t de n et fournira e n r s ul l v e ur de A corre s pondant . t ion e al t a al at e On v isual isera l m pilm e nt des appe l e t lur d pilm e nt e n affich ant un m e s s age accom pagn de l v e ur des deux 'e e s e e a al argum e nt l de ch aq ue e nt dans l fonct s ors re a ion ainsi que j e av ust ant sa sort (dans ce dernie r cas, on affich e ra ie galm e nt l v e ur q ue l fonct s'appr t re t e a al a ion e ourne r). O n t s t ra ce t e fonct l e e t ion 'aide d'un program m e principal ue l fournira e n donn e s ls v e urs de m e t de n. auq on e al

202

Exe rcice s e n l angage C

Exe m pl evaleurs de m et ** entre Acker ** entre Acker ** entre Acker -- sortie Acker -- sortie Acker ** entre Acker -- sortie Acker -- sortie Acker n ? (1, (1, (0, (0, (1, (0, (0, (1, : 1 1 1) 0) 1) 1) = 2 0) = 2 2) 2) = 3 1) = 3

Acker (1, 1) = 3 ________________________________________________________________________________________

Program m e#include main() { int m, n, a ; int acker (int, int) ;

/* prototype fonction de calcul fonction d'Ackermann */

printf ("valeurs de m et n ? : ") ; scanf ("%d %d", &m, &n) ; a = acker (m, n) ; printf ("\n\nAcker (%d, %d) = %d", m, n, a) ; } /***********************************************************/ /* fonction rcursive de calcul de la fonction d'Ackermann */ /***********************************************************/ int acker (int m, int n) { int a ; /* valeur de la fonction */ printf ("** entre Acker (%d, %d)\n", m, n) ;

V R cursiv I. itif (m (com m e dans x'op e >re e l car x d s igne al l ) ors 'adresse d'une s t ure . O n pe ut t e fois v e r l m pl de ce t op rat ur, e n re m arq uant ruct out it 'e oi e q ue x-> re e le s t q uiv e nt (* al x).re e l . *En t e rigue ur, d'apr s l norm e ANSI, ile s t possibl de t out a e ransm e t re , e n argum e nt d'une fonct t ion, l v e ur d'une a al st ure . Aussi, aurions-nous pu pr v q ue som m e e t produit re e nt ls v e urs des com plxe s s ur ls q ue l port ruct oir oiv e al e e s e l rat 'op ion. En re v anch e , l r s ul dev e t at rait t ours t t ouj re ransm is par v e ur puis q ue dt rm in par l fonct al e a ion e l l e m m e . Par e xe m pl, l dfinit de som m e aurait pu t : e a ion revoid somme (complexe x, complexe y, complexe * som) { prod->reel = x.reel + y.reel ; prod->imag = x.imag + y.imag ; }

V Anal s e num riq u e III. y

237

DI SCUSSI N OD ans l prat ue , ls fonct a iq e ions som m e e t produit s e raie nt com pile s s par m e nt des fonct ions ls ut isant Pour ce faire , e il . ile s t n ce s s aire q u'e l disposent de l descript de l st ure com plxe . O n v q u'on ris q ue al d' t am e n l es a ion a ruct e oit ors re dcrire une m m e s t ure diff re nt s re pris e s . Ce rt s , ici l ch os e n'e s t pas bien grav , dans l m e s ure o ce t e ruct e e a e a t dfinit e s t sim pl. D'une m ani re g n ral, t e fois, on a t int r t r glr ce t ion e e out out e ype de problm e e n pl ant une fois a pour t e s une t l dfinit dans un fich ie r (d'e xt nsion h , par e xe m pl) q u'on incorpore par #incl dans t out e l e ion e e ude ous ls e program m e s e n ayant besoin.

VI-3 Produit de m atrice s com plxe s II e________________________________________________________________________________________

EnoncEcrire une fonct cal ant l produit de deux m at s com plxe s . Ch aq ue m at ion cul e rice e rice s e ra d finie com m e un t e au abl deux dim e nsions dans lq ue lch aq ue lm e nt s e ra une s t ure re pr s e nt un nom bre com plxe ; t e s t ure s e ra e ruct ant e ce t ruct const ue de deux lm e nt de t it s ype doubl corre s pondant l part r e l e t l part im aginaire du nom bre . O n e a ie l e a ie supposera q ue l pre m ie r indice du t e au re pr s e nt une m at e abl ant rice corre s pond une l . igne O n pr v oira e n argum e nt : s - ls adresses des deux m at s m ul ie r, e rice t ipl -l 'adresse de l m at a rice produit , - l nom bre de l s e t de col e igne onnes de l pre m i re m at , a rice - l nom bre de col e onnes de l deuxi m e m at a rice (son nom bre de l s t obl oire m e nt galau nom bre de igne ant igat col onnes de l pre m i re ). a O n r al isera un program m e principal rm e t ant de t s t r ce t e fonct pe t e e t ion. O n pourra v nt l m e nt faire appe laux fonct e ue l e ions som m e e t produit r al ises dans l xe rcice V 'e III-2 pour cal e r l cul a som m e e t l produit de deux nom bre s com plxe s . e e

Exe m pl eMATRICE A 0+ 0i

1+

2i

2+

4i

3+

6i

2381+ 2+ 3+ 4+

Exe rcice s e n l angage C1i 2i 3i 4i 2+ 3+ 4+ 5+ 3i 4i 5i 6i 3+ 4+ 5+ 6+ 5i 6i 7i 8i 4+ 5+ 6+ 7+ 7i 8i 9i 10i

MATRICE B 0+ 0i 1+ 1i 2+ 2i 3+ 3i

1+ 2+ 3+ 4+

2i 3i 4i 5i

2+ 3+ 4+ 5+

4i 5i 6i 7i

PRODUIT A x B -14+ 42i -32+ 66i -14+ 54i -36+ 90i -14+ 66i -40+ 114i -14+ 78i -44+ 138i -14+ 90i -48+ 162i

-50+ -58+ -66+ -74+ -82+

90i 126i 162i 198i 234i

________________________________________________________________________________________

ANAL YSEL s form ul de dfinit du produit de m at s com plxe s re s t nt ce l s proposes dans l e es ion rice e e l e 'anal de l xe rcice V yse 'e III-1 pour ls m at s r e l s ; suffit d'y re m pl r ls op rat e rice l il e ace e ions + e t x port sur des rel par ls op rat ant s e ions som m e e t produit de deux com plxe s (ls r gl de ces deux op rat e e es ions ont t e xposes dans l 'anal de l xe rcice V yse 'e III-2).

Program m e

#define N 5 #define P 4 #define Q 3 typedef struct { double reel ; double imag ; } complexe ;

V Anal s e num riq u e III. ymain() { void prod_mat (complexe *, complexe *, complexe *, int, int, int) ; complexe a[N][P], b[P][Q], c[N][Q] ; int i, j ;

239

/* initialisation matrice a */ for (i=0 ; i= 0 || a >= b) return (-1) ;

/* intervalle incorrect */

while (b-a > eps) { m = (b+a) / 2.0 ;

244

Exe rcice s e n l angage Cfm = (*f)(m) ; if (fm == 0) break ; if (fa*fm < 0) { b fb } else { a fa } } * zero = m ; return (0) ; /* zro atteint */ = m ; = fm ; = m ; = fm ;

}

Com m e nt s aire*Not z, dans l fonct dich ot : e a ion o - l dcl ion de l a arat 'argum e nt corre s pondant l 'adresse de l fonct dont on ch e rch e l z ro : a ion e doubl (* e f)(doubl) e Ce l -ci s'int rpr t com m e s uit : l e e e (* e s t une fonct re ce v un argum e nt de t f) ion ant ype doubl e t fournissant un r s ul de t e t at ype doubl, e * e s t donc une fonct re ce v un argum e nt de t f ion ant ype doubl e t fournissant un r s ul de t e t at ype doubl, e f e s t donc un point ur sur une fonct re ce v un argum e nt de t e ion ant ype doubl e t fournissant un r s ul de t e t at ype doubl. e - l il ion du sym bol f ; 'ut isat e ainsi (* f)(a) re pr s e nt l v e ur de l fonct (* (fonct d'adre s s e f), l ue l on e a al a ion f) ion aq l e fournit l 'argum e nt a. L s m m e s r flxions s'appl ue nt au prot ype s e rv dcl r dich ot e e iq ot ant are o. *L fonct dich ot re ce v e n argum e nt ls v eurs des argum e nt a e t b (et non de s adresses), nous pouv nous a ion o ant e al s ons pe rm e t re de ls m odifie r au s e in de l fonct t e a ion, sans q ue ce l ait d'incide nce s ur ls v e urs e ffe ct es des borne s a e al iv dfinies dans l program m e principal e . *V z com m e nt dans l program m e principal un sym bol com m e sin e s t int rpr t par l com pil e ur com m e oye , e , e e e at l 'adresse d'une fonct prdfinie ; e s t t e fois nce s s aire d'av incorpor s on prot ype (sit dans m at .h ) ; n ion il out oir ot u h e

V Anal s e num riq u e III. y

245

l e nce de l ruct #incl corre s pondant , l com pil e ur d t ct rait un e rre ur puis q ue al l sym bol sin ne 'abs 'inst ion ude e e at e e ors e e s e rait pas dfini.

DI SCUSSI N OEn t orie , l m t ode de dich ot ie conduit t ours une s ol ion, av c une pr cision aussi grande q u'on l dsire , h a h om ouj ut e e part du m om e nt o l fonct ch ange e ffe ct e m e nt de signe sur l e rv l de dpart En prat ue , t e fois, ls ir a ion iv 'int al e . iq out e ch os e s ne s ont pas t ours aussi idyl ue s , com pt t nu de l l it ion de l pr cision des cal s. ouj l iq e e a im at a cul Tout d'abord, si on im pos e une pr cision t faibl par rapport l pr cision de l rop e a 'ordinat ur, on pe ut about ce q ue : e irm = (a+b)/2

soit gal l des deux bornes a ou b. Il s t al facil de m ont r q ue l gorit m e pe ut bouclr ind finim e nt 'une e ors e re 'al h e . D 'aut part ls v e urs de f(a) e t de f(b) sont n ce s s aire m e nt v u e s d e m ani re approch e . Dans l cas de form uls re , e al al e e q ue lue pe u com plxe s , on pe ut t s bien about une s it ion dans l ue l f(a).f(b) e s t posit q e r ir uat aq l e if. L pre m i re s it ion e s t as s e z facil v e r : ilsuffit de ch oisir une pr cision re l iv (at e nt a uat e it at e t ion, ici, not fonct re ion t ail av c une pr cision absol ) inf rie ure ce l de l rav l e e ue l e 'ordinat ur. Iln'e n v pas de m m e pour l s e conde dans l e a a a m e s ure o il s t pas t ours possibl de m a e r l pr cision des cal s des v e urs de f. n'e ouj e t ris a cul al