Exercices en langage C PDF

Title Exercices en langage C
Author Hicham Ahmed
Pages 245
File Size 907.1 KB
File Type PDF
Total Downloads 520
Total Views 643

Summary

E xercices en langage C C. Delannoy 2 Exercices en langage C PREM IERE PARTIE : EXERCICES D' APPLICATION Cette première partie vous propose des exerc ic es, à résoudre, de préférence, pendant la phase d' étude du langage C lui- même. Elle épouse la structure d' un cours " classique&...


Description

Exercices en langage C C. Delannoy

2

Exe rcice s e n langage C

PREM IERE PARTIE : EXERCICES D 'APPLICATIO N

Ce tte pre m iè re partie vous propose des exercices, à ré s oudre , de préfé re nce , pe ndant la ph ase d'étude du langage C luim ê m e . Elle é pous e la structure d'un cours "classique"1, sous la form e de 7 ch apitre s : types de bas e , opé rate urs e t e xpre s s ions ;e ntré e s -sortie s conve rsationne lles ;instructions de contrôle ;les fonctions ;les tableaux e t les pointe urs ; les ch aî nes de caractè re s ;les s tructure s . Ch aq ue ch apitre com porte : - des exe rcices d'application im m édiate destiné s à facilite r l'assim ilation du cours corre s pondant, - des exe rcice s , sans grande difficulté algorith m iq ue m e ttant e n oe uvre les diffé re nte s notions acq uis e s au cours des pré cédents ch apitre s . Note z q ue l'utilisation de s fich ie rs, ainsi que la ge s tion dynam iq ue ne s ont pas abordés dans ce tte pre m iè re partie ;ce s deux points fe ront ch acun l'obje t d'un ch apitre approprié dans la s e conde partie de l'ouvrage .

1 Un telcours vous e s t proposé, par exem pl e, dans "Apprendre à program m er en Turbo C" ou dans "C norm e ANSI - Guide com plet de

program m ation" du m ê m e auteur, égalem ent aux éditions Eyrolles.

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

Exe rcice I.1 ___________________________________________________________________________

Enoncé Elim ine r les pare nth è s e s s upe rflues dans les e xpre s s ions suivante s : a = (x+5) a = (x=y) + 2 a = (x==y) (a int (ce q ui aboutit à la valeur 1), avant d'ê tre ajouté à la valeur 1 (int). Le ré s ultat 2 e s t de type int.

I. Types de base, opérate urs e t e xpre s s ions 5 3) p e s t d'abord soum is à la conve rsion systé m atiq ue sh ort -> int, tandis q ue c e s t soum is à la conve rsion systé m atiq ue ch ar -> int ;les ré s ultats sont alors additionné s pour aboutir à la valeur 11 de type int. 4) p e t c sont d'abord aux m ê m e s conve rsions systé m atiq ue s q ue ci-de s s us ;le ré s ultat 35 e s t de type int.

Exe rcice I.3 ___________________________________________________________________________

Enoncé Soie nt les déclarations : char c = '\x05' ; int n = 5 ; long p = 1000 ; float x = 1.25 ; double z = 5.5 ;

Quels sont le type e t la valeur de ch acune d e s e xpre s s ions suivante s : n + c + p 2 * x + c (char) n + c (float) z + n / 2

/* /* /* /*

1 2 3 4

*/ */ */ */

___________________________________________________________________________

Sol ution 1) c e s t tout d'abord conve rti e n int, avant d'ê tre ajouté à n. Le ré s ultat (10), de type int, e s t alors conve rti e n long, avant d'ê tre ajouté à p. O n obtie nt finalem e nt la valeur 1010, de type long. 2) O n é value d'abord la valeur de 2*x, e n conve rtissant 2 (int) e n float, ce q ui fournit la valeur 2.5 (de type float). Par ailleurs, c e s t conve rti e n int (conve rsion systé m atiq ue ). O n é value e nsuite la valeur de 2*x, e n conve rtissant 2 (int) e n float, ce q ui fournit la valeur 2.5 (de type float). Pour e ffe ctue r l'addition, on conve rtit alors la valeur e ntiè re 5 (c) e n float, avant de l'ajoute r au ré s ultat pré cédent. O n obtie nt finalem e nt la valeur 7.75, de type float.

6 Exe rcice s e n langage C 3) n e s t tout d'abord conve rti e n ch ar (à cause de l'opé rate ur de "cast"), tandis q ue c e s t conve rti (conve rsion systé m atiq ue ) e n int. Puis, pour procéder à l'addition, ile s t né ce s s aire de re conve rtir la valeur de (ch ar) n e n int. Finalem e nt, on obtie nt la valeur 10, de type int. 4) z e s t d'abord conve rti e n float, ce q ui fournit la valeur 5.5 (approxim ative , car, e n fait, on obtie nt une valeur un pe u m oins précise que ne le s e rait 5.5 e xprim é e n double). Par ailleurs, on procè de à la division e ntiè re de n par 2, ce q ui fournit la valeur e ntiè re 2. Ce tte derniè re e s t e nsuite conve rtie e n float, avant d'ê tre ajouté e à 5.5, ce q ui fournit le ré s ultat 7.5, de type float. R e m arque : D ans la pre m iè re définition de K e rnigh an e t R itch ie , les valeurs de type float é taie nt, e lles aussi, soum ises à une conve rsion systé m atiq ue e n double. Dans ce cas, les e xpre s s ions 3 et 4 é taie nt alors de type double.

Exe rcice I.4 ___________________________________________________________________________

Enoncé Soie nt les déclarations suivante s : int n = 5, p = 9 ; int q ; float x ;

Quelle e s t la valeur affe cté e aux diffé re nte s variables conce rné e s par ch acune des instructions suivante s : q 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, opérate urs e t e xpre s s ions

7

Sol ution 1) 1 2) 0 3) 5 (p%n vaut 4, tandis q ue p> n vaut 1) 4) 1 (p/n e s t d'abord é valué e n int, ce q ui fournit 1 ;puis le ré s ultat e s t conve rti e n float, avant d'ê tre affe cté à x). 5) 1.8 (p e s t conve rti e n float, avant d'ê tre divisé par le ré s ultat de la conve rsion de n en float). 6) 1.9 (p e s t conve rti e n float, avant d'ê tre ajouté à 0.5 ;le ré s ultat e s t divisé par le ré s ultat de la conve rsion de n en float). 7) 1 (p e s t conve rti e n float, avant d'ê tre ajouté à 0.5 ;le ré s ultat (5.5) e s t alors conve rti e n int avant d'ê tre divisé par n). 8) 25 9 ) 45

Exe rcice I.5 ___________________________________________________________________________

Enoncé Quels ré s ultats fournit le program m e s uivant : #include main () { int i, j, n ; i = 0 ; n = i++ ; printf ("A : i = %d

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

i = 10 ; n = ++ i ; printf ("B : i = %d

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

8

Exe rcice s e n langage C i = 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 ution

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 ___________________________________________________________________________

Enoncé Quels ré s ultats fournira ce program m e : #include main() { int n=10, p=5, q=10, r ; r = n == (p = q) ; printf ("A : n = %d

p = %d

q = %d

n = p = q = 5 ; n += p += q ; printf ("B : n = %d

p = %d

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

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

I. Types de base, opérate urs e t e xpre s s ions q = n < p ? n++ : p++ ; printf ("C : n = %d p = %d

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

q = n > p ? n++ : p++ ; printf ("D : n = %d p = %d

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

}

___________________________________________________________________________

Sol ution

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 ___________________________________________________________________________

Enoncé Quels ré s ultats fournira ce program m e : #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) printf ("sa racine carrée est : %le\n", sqrt (x) ) ; if (x==0) break ; } while (1) ; }

R e m arque : Ilne faut surtout pas oublie r #include < m ath .h > car, sinon, le com pilate ur considè re (e n l'absce nce du prototype ) q ue s q rt fournit un ré s ultat de type int.

III. Le s instructions de contrôle

Exe rcice III.11 ___________________________________________________________________________

Enoncé Calculer la som m e des n pre m ie rs te rm es de la "s é rie h arm oniq ue ", c'e s t-à -dire la som m e : 1 + 1/2 + 1/3 + 1/4 + ..... + 1/n La valeur de n s e ra lue e n donné e . ___________________________________________________________________________

Sol ution

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

/* nombre de termes de la série harmonique */ /* pour la somme de la série */

do { printf ("combien de termes : ") ; scanf ("%d", &nt) ; } while (ntc, adp->x, adp->y) ; }

Note z q ue l'on doit, ce tte fois, faire appe là l'opé rate ur -> , à la place de l'opé rate ur point (.), puis q ue l'on "travaille" sur un pointe ur sur une s tructure , e t non plus sur la valeur de la structure e lle-m ê m e . Toute fois l'usage de -> n'e s t pas totalem e nt indispensable, dans la m e s ure où, par e xe m ple, adp-> x e s t é q uivalent à (*adp).x. Voici l'adaptation du program m e d'essai pré cédent : main() {

VII. Le s s tructure s

75

void affiche (struct s_point *) ; struct s_point s ; s.c = 'A' ; s.x = 10 ; s.y = 12 ; affiche (&s) ; }

R e m arque : Au lie u d'affe cte r de s valeurs aux ch am ps c, x e t y de notre s tructure s (dans les deux program m es d'essai), nous pourrions (ici) utiliser les possibilité s d'initial isation offe rte s par le langage C, e n é crivant : struct s_point s = {'A', 10, 12} ;

Exe rcice VII.2 ___________________________________________________________________________

Enoncé Ecrire une fonction q ui "m e t à zé ro" les diffé re nts ch am ps d'une structure du type s_point (défini dans l'e xe rcice pré cédent) q ui lui e s t transm ise en argum e nt. La fonction ne com porte ra pas de valeur de re tour. _______________________________________________________________

Sol ution Ici, bie n q ue l'é noncé ne le pré cis e pas, ile s t né ce s s aire de transm e ttre à la fonction conce rné e , non pas la valeur, m ais l'adresse de la structure à "re m e ttre à zé ro". Voici la fonction de m andé e (ici, nous avons re produit la déclaration de s_point) : #include struct s_point { char c ; int x, y ; } ; void raz (struct s_point * adr)

76

Exe rcice s e n langage C {

adr->c = 0 ; adr->x = 0 ; adr->y = 0 ;

}

Voici, à titre indicatif, un pe tit program m e d'essai (sa com pilation né ce s s ite la déclaration de s_point, ainsi que le fich ie r stdio.h ) : main() { struct s_point p ; void raz (struct s_point *) ; // déclaration de raz raz (&p) ; /* on écrit c en %d pour voir son code */ printf ("après : %d %d %d", p.c, p.x, p.y) ; }

Exe rcice VII.3 ___________________________________________________________________________

Enoncé Ecrire une fonction q ui re çoit e n argum e nt l'adresse d'une s tructure du type s_point (défini dans l'e xe rcice VII.1) e t q ui re nvoie e n ré s ultat une s tructure de m ê m e type corre s pondant à un point de m ê m e nom (c) e t de coordonné e s oppos é e s . Ecrire un pe tit program m e d'essai. _______________________________________________________________

Sol ution Bie n q ue l'é noncé ne pré cis e rie n, le ré s ultat de notre fonction ne pe ut ê tre transm is que par valeur. En e ffe t, ce ré s ultat doit ê tre cré é au s e in de la fonction e lle-m ê m e ;ce la signifie q u'ils e ra dé truit dè s la sortie de la fonction ;e n transm e ttre l'adre s s e re vie ndrait à re nvoye r l'adre s s e d e q ue lque ch ose destiné à disparaî tre ... Voici ce q ue pourrait ê tre notre fonction (ici, e ncore , nous avons re produit la déclaration de s_point) : #include struct s_point { char c ;

VII. Le s s tructure s

77

int 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 ; }

Note z la "dissym é trie " d'instructions te lles q ue re s .c = adr-> c ;on y fait appe là l'opé rate ur . à gauch e e t à l'opé rate ur -> à droite (on pourrait ce pe ndant é crire re s .c = (*adr).c. Voici un e xe m ple d'essai de notre fonction (ici, nous avons utilisé les possibilités d'initialisation d'une s tructure pour donne r de s valeurs à p1) : main() { 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 VII.4 ___________________________________________________________________________

Enoncé Soit la structure s uivante , re pré s e ntant un point d'un plan : struct s_point { char c ; int x, y ; } ;

1) Ecrire la déclaration d'un tableau (nom m é courbe ) de NP points (NP supposé défini par une instruction #de fine ) 2) Ecrire une fonction (nom m é e affich e ) q ui affich e les valeurs des diffé re nts "points" du tableau courbe , transm is en argum e nt, sous la form e :

78

Exe rcice s e n langage C point D de coordonnées 10 2

3) Ecrire un program m e q ui : - lit e n données des valeurs pour le tableau courbe ;on utilisera de préfé re nce les fonctions ge ts e t sscanf, de pré fé re nce à scanf (voir é ve ntue llem e nt l'e xe rcice VI.5) ;on supposera q u'une ligne de donnée ne peut pas dépas s e r 128 caractè re s , - fait appe là la fonction pré cédente pour les affich e r. _______________________________________________________________

Sol ution 1) Ilsuffit de déclare r un tableau de s tructure s : struct s_point courbe [NP] ;

2) Com m e courbe e s t un tableau, on ne pe ut q u'e n transm e ttre l'adre s s e e n argum e nt de affich e . Ile s t pré fé rable de pré voir é galem e nt e n argum e nt le nom bre de points. Voici ce q ue pourrait ê tre notre fonction : void affiche (struct s_point courbe [], int np) /* courbe : adresse de la première 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 ; i=0 && numl < 26) compte[numl]++ ; else nautres++ ; ntot++ ; }

Program m e bas é s ur l a ré pé tition du traite m e nt d'une l igne #include #include main() { char ligne[128] ; int compte[26] ; int numl, ntot, nautres, i ;

/* /* /* /* /*

pour lire une ligne frappée au clavier */ pour compter les différentes lettres */ rang lettre courante dans l'alphabet */ nombre de caractères du texte */ nombre de caractères autres qu'une lettre minuscule */

/* initialisations */ ntot = 0 ; nautres = 0 ; for (i=0 ; i m . - R e ch e rch e r, de puis la fin du tableau, le pre m ie r é lém e nt t(j) te lq ue t(j)< m . - Pe rm ute r t(i) e t t(j). - Poursuivre ce "parcours" du tableau jus q u'à ce q ue i e t j s e re ncontre nt. Le tri propre m e nt dit s'e ffe ctue e n appliq uant à nouve au l'opé ration de s e gm e ntation à ch aq ue s e gm e nt obte nu, puis aux s e gm e nts obte nus par segm e ntation de ce s s e gm e nts,... e t ainsi de suite jus q u'à ce q ue ch aq ue s e gm e nt ne contie nne plus q u'un s e ulé lém e nt. Note z q u'une te lle m é th ode s e prê te particuliè re m e nt bien à une program m ation ré cursive .

IV-3 Tri d'un tabl e au de ch aî ne s ________________________________________________________________________________________

Enoncé Ecrire une fonction utilisant la m é th ode de tri par e xtraction sim ple (décrite dans l'e xe rcice IV-1) pour trie r un tableau de ch aî ne s , par ordre alph abétiq ue (sans distinction e ntre m ajuscules e t m inuscules ). Ce tte fonction re ce vra, e n argum e nt : - l'adresse d'un tableau de pointe urs sur les ch aî ne s conce rné e s , - le nom bre de ch aî ne s à trie r. Le tri propre m e nt dit porte ra, non sur les valeurs des ch aî ne s e lles -m ê m e s , m ais uniq ue m e nt sur le tableau de pointe urs. O n te s te ra ce tte fonction à l'aide d'un program m e principalcré ant un sim ple tableau de ch aî ne s (ayant donc ch acune une longue ur m axim ale donnée).

IV. Tris, fusions e t re ch e rch e e n table

163

Exe m pl e combien de chaînes à trier ? 7 donnez vos 7 chaînes (validez chacune par 'return') C Turbo C Basic Pascal Turbo Pascal Fortran ADA

voici vos chaînes triées ADA Basic C Fortran Pascal Turbo C Turbo Pascal ________________________________________________________________________________________

ANALYSE La m é th ode de tri a é té décrite dans l'e xe rcice IV-1. Il e s t ce pe ndant né ce s s aire de procéder à d'adaptations :

plusieurs sorte s

- ilfaut e n faire une fonction, - la re lation d'ordre q ui s e rt au tri ne porte plus sur de s e ntie rs, m ais sur de s ch aî nes de caractè re s ;ce la im pliq ue de re courir à la fonction stricm p (e t non strcm p, puis q ue l'on souh aite ne pas distingue r les m ajuscules des m inuscules ), - les é lém e nts à pe rm ute r s e ront des pointe urs e t non plus des entie rs.

164

Exe rcice s e n langage C

Program m e #include #include #define NCHMAX 100 /* nombre maximal de chaînes à traiter */ #define LGMAX 25 /* longueur maximale d'une chaîne (sans \0) */ main() { void trichaines (char * *, int ) ; /* prototype fonction de tri */ char chaines [NCHMAX] [LGMAX+1] ; /* tableau des chaînes */ char * adr [NCHMAX] ; /* tableau pointeurs sur les chaînes */ int nch, /* nombre de chaîne à trier */ i ; /* lecture des chaînes et préparation du tableau de pointeurs */ printf ("combien de chaînes à trier ? ") ; scanf ("%d", &nch) ; if (nch > NCHMAX) nch = NCHMAX ; getchar() ; /* pour forcer la lecture de fin de ligne */ printf ("donnez vos %d chaînes (validez chacune par 'return')\n", nch) ; for (i=0 ; ii ; j--) if ( t[j] > t[j+1]) { permut = 1 ; tempo = t[j] ; t[j] = t[j+1] ; t[j+1] = tempo ; } i++ ; } }

Com m e ntaire s *Pour e ffe ctue r le tri pré alable des deux tableaux fournis e n donné e , nous avons re pris la fonction bulle ré alisée dans l'e xe rcice IV-2. Nous en avons toute fois supprim é les instructions perm e ttant d'affich e r, sur dem ande , les im pre s s ions inte rm édiaire s .

IV. Tris, fusions e t re ch e rch e e n table

171

IV-5 Re ch e rch e dich otom iq ue L'e xe rcice II-4 de facturation par code faisait inte rve nir un algorith m e s é q ue ntie lde re ch e rch e e n table. Nous vous proposons ici de réaliser un algorith m e plus perform ant de re ch e rch e par "dich otom ie ". ________________________________________________________________________________________

Enoncé Ecrire un program m e q ui re ch e rch e , à partir d'un code d'article (num é riq ue ), l'inform ation q ui lui e s t associé e , à savoir un libellé (ch aî ne ) e t un prix unitaire (ré e l). Com m e dans l'e xe rcice II-4, le program m e utilisera un tableau de s tructure s , déclaré à un nive au global, pour cons e rve r les inform ations re q uis e s . Ce tte fois, par contre , ces derniè re s s e ront rangé e s par ordre croissant du num é ro de code . La localisation d'un num é ro de code donné se fe ra par une re ch e rch e dich otom iq ue . Ce lle-ci consiste à profite r de l'ordre du tableau pour accé lére r la re ch e rch e e n procédant com m e s uit : - O n considè re l'é lém e nt figurant au "m ilie u" du tableau. Si le code ch e rch é lui e s t é gal, la re ch e rch e e s t te rm ...


Similar Free PDFs