Você está na página 1de 247

5/10/2018 Exercicesen LangageCDelannoy-slidepdf.

com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 1/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

Exercices en langage C

C. Delannoy

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 2/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

2 E x e r c i c e s e n la n g a g e C

P R EM IE R E P A R T IE :

E X E R C I C E S D ' A P PL IC A T I O N

C e t te p r e m i è r e p a r ti e v o u s p r o p o s e d e s e x e r c i c e s, à r é s o u d r e , d e p r é f é re n c e , p e n d a n t l a p h a s e d ' é tu d e d u l a n g a g e C l u i-
m ê m e . E l l e é p o u s e la s tr u c t u r e d ' u n c o u r s " c l a ss i q u e " 1 , s o u s la f o r m e d e 7 c h a p i t re s : t y p e s d e b a s e , o p é r a t e u r s e t
e x p r e s s i o n s ; e n t r é e s - so r t ie s c o n v e r s a t io n n e l l e s ; i n s t r u c t i o n s d e c o n t r ô l e ; l e s f o n c t io n s ; l e s t a b l e a u x e t l e s p o i n t e u r s ;
les chaînes de ca ractères ; les structures.

C h a q u e c h a p i tr e c o m p o r te :
- d e s e x e r c i c e s d ' a p p l ic a t i o n i m m é d i a t e d e s t in é s à f a c il it e r l' a s s i m i la t io n d u c o u r s c o r r e s p o n d a n t ,
- d e s e x e r c ic e s , s a n s g r a n d e d i f fi c u lt é a l g o r it h m i q u e m e t ta n t e n o e u v r e l es d i f f é r e n te s n o t io n s a c q u i s e s a u c o u r s d e s
p r é c é d e n t s c h a p i t re s .
N o t e z q u e l ' u t il i sa t io n d e s f ic h i e r s , a i n si q u e l a g e s t i o n d y n a m i q u e n e s o n t p a s a b o r d é s d a n s c e t te p r e m i è r e p a r t ie ; c e s
d eu x p o i n t s f e r o n t c h a c u n l ' o b j e t d ' u n c h a p i t re a p p r o p r i é d a n s l a s e c o n d e p a r t ie d e l ' o u v r a g e .

1 U n t e l c o u r s v o u s e s t p r o p o s é, p a r ex e m p l e, d a n s " A p p r e n d r e à p r o g ra m m e r en T u r b o C " o u d a n s " C n o r m e A N S I - G u i de c o m p l e t d e


p r o g r a m m a t io n " d u m ê m e a u t eu r , ég a l e m e n t a u x é d i ti o n s E y r o l l es .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 3/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I : T Y P ES D E B A S E ,
OPERATEURS
ET EX P R ES S I O N S

E x e r c ic e I. 1

___________________________________________________________________________

Enoncé

E l i m i n e r l e s p a r e n t h è s e s s u p e r f lu e s d a n s l e s e x p r e s s io n s s u i v a n t e s :

a = (x+5) /* expression 1 */
a = (x=y) + 2 /* expression 2 */
a = (x==y) /* expression 3 */
(a<b) && (c<d) /* expression 4 */
(i++) * (n+p) /* expression 5 */

___________________________________________________________________________

Solution

a = x+5 /* expression 1 */

L ' o p é r a te u r + e s t p r i o r it a ir e s u r l ' o p é r a te u r d ' a f f e c t a ti o n = .

a = (x=y) + 2 /* expression 2 */

I c i , l' o p é r a t e u r + é t a n t p r io r i ta i r e s u r = , l e s p a r e n t h è s e s s o n t i n d i sp e n s a b l e s .

a = x==y /* expression 3 */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 4/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

4 E x e r c i c e s e n la n g a g e C

L ' o p é r a te u r = = e s t p r io r it a ir e su r = .

a<b && c<d /* expression 4 */

L ' o p é r a te u r & & e s t p r io r it a ir e s u r l' o p é r a t e u r < .

i++ * (n+p) /* expression 5 */

L ' o p é r a t e u r + + e s t p r i o r it a ir e su r * ; e n r e v a n c h e , * e s t p r io r i ta i r e s u r + ; d e s o r t e q u ' o n n e p e u t é l im i n e r le s d e r n i è r es
parenthèses.

E x e r c ic e I. 2

___________________________________________________________________________

Enoncé

S o i e n t le s d é c l a r a t io n s :

char c = '\x01' ;
short int p = 10 ;

Q u e l s s o n t le t y p e e t l a v a l e u r d e c h a c u n e d e s e x p r e s s i o n s s u i v a n te s :

p + 3 /* 1 */
c + 1 /* 2 */
p + c /* 3 */
3 * p + 5 * c /* 4 */

___________________________________________________________________________

Solution

1 ) p e s t d ' a b o r d so u m i s à l a c o n v e r si o n " sy st é m a t iq u e " s h o r t - > i n t , a v a n t d ' ê t r e a j o u té à l a v a l e u r 3 ( in t ) . L e r é s u l t a t 1 3


e s t d e t y p e in t .

2 ) c e s t d ' a b o r d so u m i s à l a c o n v e r si o n " sy st é m a t iq u e " c h a r - > in t ( c e q u i a b o u t it à la v a l e u r 1 ) , a v a n t d ' ê t r e a j o u t é à l a


v a l e u r 1 ( in t ) . L e r é s u l t a t 2 e s t d e t y p e in t .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 5/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I . T y p e s d e b a s e, o p é r a t e u r s e t e x p r e s s io n s 5
3 ) p e s t d ' a b o r d so u m i s à l a c o n v e r s io n sy s té m a t iq u e s h o r t - > in t , t a n d i s q u e c e s t so u m i s à la c o n v e r si o n s y st é m a t iq u e
c h a r - > in t ; l e s r é s u l ta t s s o n t a l o r s a d d i t io n n é s p o u r a b o u t ir à l a v a l e u r 1 1 d e t y p e i n t .

4 ) p e t c so n t d ' a b o r d a u x m ê m e s c o n v e r s i o n s sy s té m a t iq u e s q u e c i -d e s s u s ; le r é s u l ta t 3 5 e s t d e ty p e in t .

E x e r c ic e I. 3

___________________________________________________________________________

Enoncé

S o i e n t le s d é c l a r a t io n s :

char c = '\x05' ;
int n = 5 ;
long p = 1000 ;
float x = 1.25 ;
double z = 5.5 ;

Q u e l s s o n t le t y p e e t l a v a l e u r d e c h a c u n e d e s e x p r e s s i o n s s u i v a n te s :

n + c + p /* 1 */
2 * x + c /* 2 */
(char) n + c /* 3 */
(float) z + n / 2 /* 4 */

___________________________________________________________________________

Solution

1 ) c e s t to u t d ' a b o r d c o n v e r t i e n in t , a v a n t d ' ê t r e a j o u té à n . L e r é s u l ta t ( 1 0 ), d e t yp e i n t , e s t a l o r s c o n v e r t i e n l o n g , a v a n t
d ' ê t r e a jo u t é à p . O n o b t i e n t fi n a le m e n t la v a l e u r 1 0 1 0 , d e t y p e l o n g .

2 ) O n é v a l u e d ' a b o r d l a v a l e u r d e 2 * x , e n c o n v e r t i ss a n t 2 ( in t ) e n flo a t , c e q u i f o u r n i t l a v a l e u r 2 . 5 ( d e t yp e flo a t ) . P a r


a i l l e u r s , c e s t c o n v e r t i e n in t ( c o n v e r s io n s y st é m a t iq u e ) . O n é v a l u e e n su i t e l a v a l e u r d e 2 * x , e n c o n v e r t i ss a n t 2 ( in t ) e n
flo a t , c e q u i f o u r n i t l a v a l e u r 2 . 5 ( d e ty p e flo a t ) . P o u r e f f e c t u e r l ' a d d i t i o n , o n c o n v e r t i t a l o r s l a v a l e u r e n t i è r e 5 ( c ) e n
flo a t , a v a n t d e l ' a j o u t e r a u r é s u lt a t p r é c é d e n t . O n o b t ie n t f in a l e m e n t l a v a l e u r 7 . 7 5 , d e t y p e flo a t .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 6/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

6 E x e r c i c e s e n la n g a g e C
3) n est tout d'abord converti en char (à cause de l'opérateur de "cast"), tandis que c est converti (conversion
s y s té m a t iq u e ) e n in t . P u i s , p o u r p r o c é d e r à l ' a d d i t i o n , i l e s t n é c e s s a i r e d e r e c o n v e r t i r l a v a l e u r d e ( c h a r ) n e n in t .
F i n a le m e n t , o n o b t i e n t l a v a l e u r 1 0 , d e t y p e in t .

4 ) z e s t d' a b o r d c o n v e r t i e n flo a t , c e q u i fo u r n i t la v a l e u r 5 . 5 ( a p p r o x i m a t iv e , c a r , e n f a i t, o n o b t ie n t u n e v a l e u r u n p e u
m o i n s p r é c i s e q u e n e le s e r a it 5 . 5 e x p r i m é e n d o u b l e ) . P a r a il le u r s , o n p r o c è d e à l a d iv i si o n e n t i è r e d e n p a r 2 , c e q u i
f o u r n i t la v a l e u r e n t i è r e 2 . C e t t e d e r n i è r e e s t e n su i t e c o n v e r t i e e n flo a t , a v a n t d ' ê t r e a j o u t é e à 5 . 5 , c e q u i f o u r n i t l e
r é s u l t a t 7 . 5 , d e t y p e flo a t .

Remarque :

D a n s l a p r e m i è r e d é f in i ti o n d e K e r n i g h a n e t R i tc h i e , l e s v a l e u r s d e t y p e flo a t é t a ie n t , e l le s a u s si , so u m i s e s à u n e
c o n v e r s i o n s y st é m a t iq u e e n d o u b l e . D a n s c e c a s, l e s e x p r e s s i o n s 3 e t 4 é t a ie n t a l o r s d e t y p e d o u b l e .

E x e r c ic e I. 4

___________________________________________________________________________

Enoncé

S oient les d éclarations suivantes :

int n = 5, p = 9 ;
int q ;
float x ;

Q u e l le e s t l a v a l e u r a f f e c t é e a u x d if fé r e n t e s v a r i a b le s c o n c e r n é e s p a r c h a c u n e d e s i n s t r u c ti o n s s u i v a n t es :

q = n < p ; /* 1 */
q = n == p ; /* 2 */
q = p % n + p > n ; /* 3 */
x = p / n ; /* 4 */
x = (float) p / n ; /* 5 */
x = (p + 0.5) / n ; /* 6 */
x = (int) (p + 0.5) / n ; /* 7 */
q = n * (p > n ? n : p) ; /* 8 */
q = n * (p < n ? n : p) ; /* 9 *:

___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 7/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I . T y p e s d e b a s e, o p é r a t e u r s e t e x p r e s s io n s 7

Solution

1) 1

2) 0

3 ) 5 ( p % n v a u t 4 , ta n d is q u e p > n v a u t 1 )

4 ) 1 ( p / n e s t d' a b o r d é v a l u é e n in t , c e q u i f o u r n i t 1 ; p u i s le r é s u l t a t e s t c o n v e r t i e n flo a t , a v a n t d ' ê t r e a f f e c té à x ) .

5 ) 1 . 8 ( p e s t c o n v e r t i e n flo a t , a v a n t d ' ê t r e d i v i sé p a r l e r é s u lt a t d e l a c o n v e r s i o n d e n e n flo a t ) .

6 ) 1 . 9 ( p e s t c o n v e r t i e n flo a t , a v a n t d ' ê t r e a j o u t é à 0 . 5 ; le r é s u l t a t e s t d i v i sé p a r l e r é s u l t a t d e l a c o n v e r s i o n d e n e n
flo a t ) .

7 ) 1 ( p e s t c o n v e r t i e n flo a t , a v a n t d ' ê t r e a j o u t é à 0 . 5 ; l e r é s u l t a t (5 . 5 ) e s t a l o r s c o n v e r t i e n i n t a v a n t d ' ê t r e d i v i sé p a r n ) .

8) 25

9) 45

E x e r c ic e I. 5

___________________________________________________________________________

Enoncé

Q u e l s r é su l ta t s fo u r n i t le p r o g r a m m e s u i v a n t :

#include <stdio.h>
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 ) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 8/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

8 E x e r c i c e s e n la n g a g e 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) ;

}
___________________________________________________________________________

Solution

A : i = 1 n = 0
B : i = 11 n = 11
C : i = 21 j = 6 n = 120
D : i = 18 n = 18
E : i = 12 j = 12 n = 6

E x e r c ic e I. 6

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
main()
{
int n=10, p=5, q=10, r ;

r = n == (p = q) ;
printf ("A : n = %d p = %d q = %d r = %d\n", n, p, q, r) ;

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

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 9/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I . T y p e s d e b a s e, o p é r a t e u r s e t e x p r e s s io n s 9

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) ;
}
___________________________________________________________________________

Solution

A : n = 10 p = 10 q = 10 r = 1
B : n = 15 p = 10 q = 5
C : n = 15 p = 11 q = 10
D : n = 16 p = 11 q = 15

E x e r c ic e I. 7

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
main()
{
int n, p, q ;

n = 5 ; p = 2 ; /* cas 1 */
q = n++ >p || p++ != 3 ;
printf ("A : n = %d p = %d q = %d\n", n, p, q) ;

n = 5 ; p = 2 ; /* cas 2 */
q = n++<p || p++ != 3 ;
printf ("B : n = %d p = %d q = %d\n", n, p, q) ;

n = 5 ; p = 2 ; /* cas 3 */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 10/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

10 Exercices en langage C
q = ++n == 3 && ++p == 3 ;
printf ("C : n = %d p = %d q = %d\n", n, p, q) ;

n = 5 ; p = 2 ; /* cas 4 */
q = ++n == 6 && ++p == 3 ;
printf ("D : n = %d p = %d q = %d\n", n, p, q) ;
}
___________________________________________________________________________

Solution

IAl i nn sie , f iacuit, pi la sn ' oe us tb lpiea sr éqvuael ul ée sd ao np sé rl ae tse cu ar ss 1& &e t 3e .t V| |o i cn i' élev sa lrué es nu tl talet us rfoduer un xi si èpma re l oe ppérroa gn rdaem qmu ee :l o r s qu e c e l a e s t n é c e s s a ir e .

A : n = 6 p = 2 q = 1
B : n = 6 p = 3 q = 1
C : n = 6 p = 2 q = 0
D : n = 6 p = 3 q = 1

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 11/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I : L ES E N T R EES - S O R T IE S
CONVERSATIONNELLES

E x e r c i c e I I. 1
___________________________________________________________________________

Enoncé

Q u e l s s e r o n t l e s r é su l ta t s fo u r n i s p a r c e p r o g r a m m e :

#include <stdio.h>
main ()
{ int n = 543 ;
int p = 5 ;

float x = 34.5678;
printf ("A : %d %f\n", n, x) ;
printf ("B : %4d %10f\n", n, x) ;
printf ("C : %2d %3f\n", n, x) ;
printf ("D : %10.3f %10.3e\n", x, x) ;
printf ("E : %-5d %f\n", n, x) ;
printf ("F : %*d\n", p, n) ;
printf ("G : %*.*f\n", 12, 5, x) ;
printf ("H : %x : %8x :\n", n, n) ;
printf ("I : %o : %8o :\n", n, n) ;
}
_______________________________________________________________

Solution

A : 543 34.567799
B : 543 34.567799

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 12/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

12 Exercices en langage C
C : 543 34.567799
D : 34.568 3.457e+01
E : 543 34.567799
F : 543
G : 34.56780
H : 21f : 21f :
I : 1037 : 1037 :

E x e r c i c e I I. 2

___________________________________________________________________________

Enoncé

Q u e l s s e r o n t l e s r é su l ta t s fo u r n i s p a r c e p r o g r a m m e :

#include <stdio.h>
main()
{ char c ;
int n ;
c = 'S' ;
printf ("A : %c\n", c) ;

n = c ;
printf ("B : %c\n", n) ;
printf ("C : %d %d\n", c, n) ;
printf ("D : %x %x\n", c, n) ;
}
_______________________________________________________________

Solution

A : S
B : S
C : 83 83
D : 53 53

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 13/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

II. Les entrées-sorties conversationnelles 13


E x e r c i c e I I. 3

___________________________________________________________________________

Enoncé

Q u e ll e s s e r o n t le s v a l e u r s l u e s d a n s l e s v a r i a b l e s n e t p ( d e t y p e in t ) , p a r l ' i n s t r u c t i o n s u i v a n t e :

scanf ("%d %d", &n, &p) ;

l o r s q u ' o n l u i fo u r n i t le s d o n n é es su i v a n t e s ( le s y m b o l e ^ r e p r é s e n t e u n e s p a c e e t l e sy m b o l e @ r e p r é s e n t e u n e f i n d e
ligne, c'est-à-dire une "validation") :
a)
253^45@
b)
^253^@
^^ 4 ^ 5 @
_______________________________________________________________

Solution

a) n = 243, p = 45

b ) n = 2 5 3 , p = 4 ( le s d e r n i e rs c a r a c t è re s d e l a d e u x i è m e l ig n e p o u r r o n t é v e n t u e l le m e n t ê t re u t i li s és p a r u n e i n s tr u c t io n
d e l e c t u r e u l té r i e u r e ) .

E x e r c i c e I I. 4

___________________________________________________________________________

Enoncé

Q u e ll e s s e r o n t le s v a l e u r s l u e s d a n s l e s v a r i a b l e s n e t p ( d e t y p e in t ) , p a r l ' i n s t r u c t i o n s u i v a n t e :

scanf ("%4d %2d", &n, &p) ;

l o r s q u ' o n l u i fo u r n i t le s d o n n é es su i v a n t e s ( le s y m b o l e ^ r e p r é s e n t e u n e s p a c e e t l e sy m b o l e @ r e p r é s e n t e u n e f i n d e
ligne, c'est-à-dire une "validation") :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 14/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

14 Exercices en langage C
a)
12^45@
b)
123456@
c)
123456^7@
d)
1^458@
e)
^^^4567^^8912@

_______________________________________________________________

Solution

R a p p e l o n s q u e l o r s q u ' u n e i n di c a t i o n d e l o n g u e u r e s t p r é s e n te d a n s l e c o d e f o r m a t fo u r n i à s c a n f ( c o m m e , p a r e x e m p l e , l e
4 d e % 4 d ) , s c a n f i n te r r o m p t so n ex p l o ra t io n s i l e n o m b r e c o r r e s p o n d a n t d e c a r a c t è re s a é t é e x p l o r é , s a n s q u ' u n
s é p a r a t e u r (o u " e s p a c e b l a n c " ) n ' a i t é t é tr o u v é . N o t e z b i e n , c e p e n d a n t , q u e l e s é v e n t u e l s c a ra c t è r e s s é p a r a t e u r s " s a u t é s"
a u p a r a v a n t n e s o n t p a s c o n s i d é r é s d a n s c e c o m p t e . V o i c i le s r é s u l ta t s o b t e n u s :

a) n= 12, p= 45
b) n= 1234, p= 5 6
c) n= 1234, p= 5 6
d) n= 1, p= 45
e) n= 4567, p= 8 9
E n a , o n o b t i e n dr a i t e x a c t e m e n t l e s m ê m e s r é s u l ta t s s a n s i n d ic a t io n d e l o n g u e u r ( c ' e s t - à - di r e a v e c % d % d ) . E n b , e n
r e v a n c h e , s a n s l ' i n di c a t i o n d e l o n g u e u r 4 , l e s r é s u lt a ts s e r a i e n t d if fé r e n t s ( n v a u d r a i t 1 2 3 4 5 6 , t a n d i s q u ' i l m a n q u e r a i t d e s
i n f o rm a t io n s p o u r p ) . E n c , l e s in f o r m a t io n s ^ e t 7 n e s o n t p a s p r i s es e n c o m p t e p a r s c a n f ( e ll e s l e s e r o n t é v e n t u e l l e m e n t
p a r u n e p r o c h a i n e l e c t u r e !) ; s a n s l a p r e m i è r e in d ic a t io n d e l o n g u e u r , l e s r é s u lt a ts s e r a i e n t d if fé r e n t s : 1 2 3 4 5 6 p o u r n ( e n
su p p o s a n t q u e c e l a n e c o n d u i s e p a s à u n e v a l e u r n o n r e p r é s e n t a b l e d a n s l e ty p e in t ) e t 7 p o u r p . E n d , c e t te f o i s, c ' e s t
l ' i n di c a t i o n d e lo n g u e u r 2 q u i a d e l ' i m p o r t a n c e ; e n s o n a b sc en c e, n v a u d r a i t e ff e c ti v e m e n t 1 , m a i s p v a u d r a i t 4 5 8 .
E n f in , e n e , l e s d e u x i n di c a t i o n s d e l o n g u e u r so n t i m p o r t a n te s ; n o t e z b i e n q u e l e s tr o i s e s p a c e s p l a c é s a v a n t l e s
c a r a c t è r e s p r is e n c o m p t e p o u r n , a i n s i q u e l e s 2 e s p a c e s p l a c é s a v a n t le s c a r a c t è r e s p r is e n c o m p t e p o u r p n e s o n t p a s
c o m p t a b i li s é s d a n s l a lo n g u e u r i m p o s é e .

E x e r c i c e I I. 5

___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 15/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

II. Les entrées-sorties conversationnelles 15


Enoncé

S o it l e p ro g r a m m e s u i v a n t :

#include <stdio.h>
main()
{
int n, p ;

do
{ printf ("donnez 2 entiers (0 pour finir) : ") ;
scanf("%4d%2d", &n, &p) ;
printf ("merci pour : %d %d\n", n, p) ;
}
while (n) ;
}

Q u e l s r é s u lt a ts f o u r n ir a - t- il , e n s u p p o sa n t q u ' o n l u i e n t r e l es d o n n é es su i v a n t e s ( a t te n t i o n , o n su p p o ser a q u e l es d o n n é es
so n t f ra p p é e s a u c l a v i e r e t le s r é s u l ta t s a f fi c h é s à l ' é c r a n , c e q u i s ig n i f i e q u ' i l y a u r a " m i x a g e " e n t r e c e s d e u x s o r t e s
d ' i n f o r m a t io n s ) :

1 2
3
4
123456

78901234 5
6 7 8 9 10
0
0
12
_______________________________________________________________

Solution

I c i , o n r e t r o u v e le m é c a n is m e l ié à l' i n d ic a t io n d ' u n e l o n g u e u r m a x i m a l e d a n s le c o d e f o r m a t , c o m m e d a n s l ' e x e r c i c e


p r é c é d e n t . D e p l u s , o n e x p l o i te l e fa i t q u e l e s i n fo r m a t io n s d ' u n e l ig n e q u i n ' o n t p a s é t é p r is e s e n c o m p t e l o rs d ' u n e
l e c t u r e r e s t e n t d i s p o n i b l e s p o u r l a l e c t u r e s u i v a n t e . E n f i n , r a p p e l o n s q u e , t a n t q u e s c a n f n ' a p a s r e ç u s u f fi sa m m e n t
d ' i n f o r m a t io n , c o m p t e t e n u d e s d i f f é r e n ts c o d e s f o r m a t sp é c if ié s ( e t n o n p a s d e s v a r i a b le s i n d i q u é e s ) , e ll e e n a t t e n d d e
n o u v e l le s . V o i c i f in a l e m e n t l e s r é s u l ta t s o b t e n u s :

donnez 2 entiers (0 pour finir)


1 2
merci pour : 1 2

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 16/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

16 Exercices en langage C
donnez 2 entiers (0 pour finir)
3
4
merci pour : 3 4
donnez 2 entiers (0 pour finir)
123456
merci pour : 1234 56
donnez 2 entiers (0 pour finir)
78901234 5
merci pour : 7890 12
donnez 2 entiers (0 pour finir)
merci pour : 34 5
donnez 2 entiers (0 pour finir)
6 7 8 9 10
merci pour : 6 7
donnez 2 entiers (0 pour finir)
merci pour : 8 9
donnez 2 entiers (0 pour finir)
0
merci pour : 10 0
donnez 2 entiers (0 pour finir)
0
12
merci pour : 0 12

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 17/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III : L ES I N S T R U C T IO N S
D E C O N T RO L E

E x e r c i c e I II . 1

___________________________________________________________________________

Enoncé

Q u e l le s e r r e u r s o n t é té c o m m i s e s d a n s c h a c u n d e s g r o u p e s d ' i n s tr u c t io n s s u i v a n t s :

1)
if (a<b) printf ("ascendant")
else printf ("non ascendant") ;

2)
int n ;
...
switch (2*n+1)
{ case 1 : printf ("petit") ;
case n : printf ("moyen") ;
}
3)
#define LIMITE 100
int n ;
...
switch (n)
{ case LIMITE-1 : printf ("un peu moins") ;
case LIMITE : printf ("juste") ;
case LIMITE+1 : printf ("un peu plus") ;
}
4)
const int LIMITE=100
int n ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 18/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

18 Exercices en langage C
...
switch (n)
{ case LIMITE-1 : printf ("un peu moins") ;
case LIMITE : printf ("juste") ;
case LIMITE+1 : printf ("un peu plus") ;
}

_______________________________________________________________

Solution

1 ) I l m a n q u e u n p o i n t- v ir g u l e à l a f in d u p r e m i e r p r i n t f :
if (a<b) printf ("ascendant") ;
else printf ("non ascendant") ;

2 ) L e s v a l e u r s s u i v a n t le m o t c a s e d o i v e n t o b l ig a t o i r e m e n t ê t r e d e s " e x p r e s s io n s c o n s ta n t e s " , c ' e s t -à - d ir e d e s e x p r e s s i o n s


c a l c u l a b le s p a r le c o m p i la t e u r lu i -m ê m e . C e n ' e s t p a s l e c a s d e n .

3 ) A u c u n e e r r e u r , l e s e x p r e s s io n s t e l le s q u e L I M I T E - 1 é t a n t b i e n d e s e x p r e s s i o n s c o n s t a n t e s .

4 ) I c i , l e s e x p r e s s i o n s s u i v a n t l e m o t c a s e n e s o n t p l u s d e s e x p r e s s i o n s c o n s ta n t e s , c a r l e sy m b o l e L I M I T E a é t é d é f i n i
so u s fo r m e d ' u n e " c o n st a n te s y m b o l iq u e " ( e n C + + , c e p e n d a n t , c e s i n st ru c t io n s s e r o n t c o r r e c t e s ) .

E x e r c i c e I II . 2

___________________________________________________________________________

Enoncé

S o it l e p ro g r a m m e s u i v a n t :

#include <stdio.h>
main()
{ int n ;
scanf ("%d", &n) ;
switch (n)
{ case 0 : printf ("Nul\n") ;
case 1 :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 19/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 19


case 2 : printf ("Petit\n") ;
break ;
case 3 :
case 4 :
case 5 : printf ("Moyen\n") ;
default : printf ("Grand\n") ;
}
}

Q u e ls r é s u l t a t s a f f ic h e - t -i l l o r s q u ' o n l u i f o u r n i t e n d o n n é e :

a) 0

b) 1
c) 4
d) 10
e) -5
___________________________________________________________________________

Solution

a)
Nul
Petit
b)
Petit
c)
Moyen
Grand
d)
Grand
e)
Grand

E x e r c i c e I II . 3

___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 20/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

20 Exercices en langage C
Enoncé

Q u e l le s e r r e u r s o n t é té c o m m i s e s d a n s c h a c u n e d e s i n s tr u c t io n s s u i v a n t e s :

a)
do c = getchar() while (c != '\n') ;
b)
do while ( (c = getchar()) != '\n') ;
c)
do {} while (1) ;

___________________________________________________________________________

Solution

a ) I l m a n q u e u n p o i n t- v ir g u l e :

do c = getchar() ; while (c != '\n') ;

b ) I l m a n q u e u n e i n s tr u c t io n ( é v e n t u e l le m e n t " v i d e " ) a p r è s l e m o t d o . O n p o u r r a i t é c r i re , p a r e x e m p l e :

do {} while ( (c = getchar()) != '\n') ;

ou :

do ; while ( (c = getchar()) != '\n') ;

c ) I l n ' y a u r a p a s d ' e r r e u r d e c o m p i la t io n ; t o u t e f o is , i l s ' a g i t d ' u n e " b o u c l e in f in i e " .

E x e r c i c e I II . 4

___________________________________________________________________________

Enoncé

E c r i r e p l u s l i si b l e m e n t :

do {} while (printf("donnez un nombre >0 "), scanf ("%d", &n), n<=0) ;


___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 21/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 21

Solution

Plusieurs possibilités existent, puisqu'il "suffit" de reporter, dans le corps de la boucle, des instructions figurant
" a r t i fi c ie l le m e n t " s o u s fo r m e d ' e x p r e ssi o n s d a n s la c o n d i ti o n d e p o u r s u i te :

do
printf("donnez un nombre >0 ") ;
while (scanf ("%d", &n), n<=0) ;

ou, m ieux :

do
{ printf("donnez un nombre >0 ") ;
scanf ("%d", &n) ;
}
while (n<=0) ;

E x e r c i c e I II . 5

___________________________________________________________________________
Enoncé

S o it le p e t i t p r o g r a m m e s u i v a n t :

#include <stdio.h>
main()
{ int i, n, som ;
som = 0 ;
for (i=0 ; i<4 ; i++)
{ printf ("donnez un entier ") ;
scanf ("%d", &n) ;

som += n ;
}
printf ("Somme : %d\n", som) ;
}

E c r ir e u n p r o g r a m m e r é a l i sa n t e x a c t e m e n t la m ê m e c h o s e , e n e m p l o y a n t , à la p l a c e d e l ' i n s tr u c t io n for :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 22/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

22 Exercices en langage C
a ) une instruction while,

b ) u n e i n s t r u c t i o n d o . . . w h i le .

___________________________________________________________________________

Solution

a)

#include <stdio.h>
main()
{ int i, n, som ;
som = 0 ;
i = 0 ; /* ne pas oublier cette "initialisation" */
while (i<4)
{ printf ("donnez un entier ") ;
scanf ("%d", &n) ;
som += n ;
i++ ; /* ni cette "incrémentation" */
}
printf ("Somme : %d\n", som) ;
}

b)

#include <stdio.h>
main()
{ int i, n, som ;
som = 0 ;
i = 0 ; /* ne pas oublier cette "initialisation" */
do
{ printf ("donnez un entier ") ;
scanf ("%d", &n) ;
som += n ;
i++ ; /* ni cette "incrémentation" */
}
while (i<4) ; /* attention, ici, toujours <4 */
printf ("Somme : %d\n", som) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 23/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 23


E x e r c i c e I II . 6

___________________________________________________________________________

Enoncé

Q u e l s r é su l ta t s fo u r n i t le p r o g r a m m e s u i v a n t :

#include <stdio.h>
main()
{ int n=0 ;

do
{ if (n%2==0) { printf ("%d est pair\n", n) ;
n += 3 ;
continue ;
}
if (n%3==0) { printf ("%d est multiple de 3\n", n) ;
n += 5 ;
}
if (n%5==0) { printf ("%d est multiple de 5\n", n) ;
break ;
}
n += 1 ;
}
while (1) ;
}
___________________________________________________________________________

Solution

0 est pair
3 est multiple de 3
9 est multiple de 3
15 est multiple de 3

20 est multiple de 5

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 24/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

24 Exercices en langage C

E x e r c i c e I II . 7

___________________________________________________________________________

Enoncé

Q u e l s r é su l ta t s fo u r n i t le p r o g r a m m e s u i v a n t :

#include <stdio.h>
main()
{ int n, p ;

n=0 ;
while (n<=5) n++ ;
printf ("A : n = %d\n", n) ;

n=p=0 ;
while (n<=8) n += p++ ;
printf ("B : n = %d\n", n) ;

n=p=0 ;
while (n<=8) n += ++p ;
printf ("C : n = %d\n", n) ;

n=p=0 ;
while (p<=5) n+= p++ ;
printf ("D : n = %d\n", n) ;

n=p=0 ;
while (p<=5) n+= ++p ;
printf ("D : n = %d\n", n) ;
}

___________________________________________________________________________

Solution

A : n = 6
B : n = 10
C : n = 10
D : n = 15

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 25/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 25


D : n = 21

E x e r c i c e I II . 8

___________________________________________________________________________

Enoncé

Q u e l s r é su l ta t s fo u r n i t le p r o g r a m m e s u i v a n t :
#include <stdio.h>
main()
{ int n, p ;

n=p=0 ;
while (n<5) n+=2 ; p++ ;
printf ("A : n = %d, p = %d \n", n, p) ;

n=p=0 ;
while (n<5) { n+=2 ; p++ ; }
printf ("B : n = %d, p = %d \n", n, p) ;
}

___________________________________________________________________________

Solution

A : n = 6, p = 1
B : n = 6, p = 3

E x e r c i c e I II . 9

___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 26/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

26 Exercices en langage C
Enoncé

Q u e l s r é su l ta t s fo u r n i t le p r o g r a m m e s u i v a n t :

#include <stdio.h>

main()
{ int i, n ;

for (i=0, n=0 ; i<5 ; i++) n++ ;


printf ("A : i = %d, n = %d\n", i, n) ;

for (i=0, n=0 ; i<5 ; i++, n++) {}


printf ("B : i = %d, n = %d\n", i, n) ;

for (i=0, n=50 ; n>10 ; i++, n-= i ) {}


printf ("C : i = %d, n = %d\n", i, n) ;

for (i=0, n=0 ; i<3 ; i++, n+=i, printf ("D : i = %d, n = %d\n", i, n) ) ;
printf ("E : i = %d, n = %d\n", i, n) ;
}

___________________________________________________________________________

Solution

A : i = 5, n = 5
B : i = 5, n = 5
C : i = 9, n = 5
D : i = 1, n = 1
D : i = 2, n = 3
D : i = 3, n = 6
E : i = 3, n = 6

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 27/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 27


E x e r c ic e III. 1 0

___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i c a l c u le l e s ra c i n e s c a r r é es d e n o m b r e s f o u r n is e n d o n n é e . I l s ' a r r ê te r a l o r q u ' o n l u i fo u r n i ra l a
v a l e u r 0 . I l r e fu s e r a l e s v a l e u r s n é g a t i v e s . S o n e x é c u t i o n s e p r é s e n t e r a a i n si :

donnez un nombre positif : 2


sa racine carrée est : 1.414214e+00

donnez un nombre positif : -1


svp positif
donnez un nombre positif : 5
sa racine carrée est : 2.236068e+00
donnez un nombre positif : 0

R a p p e l o n s q u e l a f o n c t io n s q r t f o u r n i t l a r a c i n e c a r r é e ( d o u b l e ) d e l a v a l e u r ( d o u b l e ) q u ' o n l u i f o u r n i t e n a r g u m e n t .

___________________________________________________________________________

Solution

I l e x is te b e a u c o u p d e " r é d a c t io n s p o s si b l e s " ; e n v o i c i 3 :
#include <stdio.h>
#include <math.h> /* indispensable pour sqrt (qui fourni un résultat */
/* de type double */
main()
{ double x ;
do
{ printf ("donnez un nombre positif : ") ;
scanf ("%le", &x) ;
if (x < 0) printf ("svp positif \n") ;
if (x <=0) continue ;
printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
}
while (x) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 28/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

28 Exercices en langage C
#include <stdio.h>
#include <math.h>
main()
{ double x ;
do
{ printf ("donnez un nombre positif : ") ;
scanf ("%le", &x) ;

if (x < 0) { printf ("svp positif \n") ;


continue ;
}
if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
}
while (x) ;
}

#include <stdio.h>
#include <math.h>
main()
{ double x ;
do
{ printf ("donnez un nombre positif : ") ;
scanf ("%le", &x) ;

if (x < 0) { printf ("svp positif \n") ;


continue ;
}
if (x>0) printf ("sa racine carrée est : %le\n", sqrt (x) ) ;
if (x==0) break ;
}
while (1) ;
}

Remar que :

I l n es qf ratu t s u r t o u t p a s o u b l i e r # in c lui nd te < m a th . h > c a r , si n o n , l e c o m p i la t e u r c o n si d è r e ( e n l ' a b s c e n c e d u p r o t o t y p e )


que fournit un résultat de type .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 29/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 29


E x e r c ic e III. 1 1

___________________________________________________________________________

Enoncé

C a l c u l e r l a so m m e d e s n p r e m i e rs te r m e s d e la " s é r ie h a r m o n i q u e " , c ' e s t- à -d ir e l a so m m e :

1 + 1 /2 + 1 /3 + 1 /4 + . . . . . + 1 /n

L a v a l e u r d e n s e r a lu e e n d o n n é e .

___________________________________________________________________________

Solution

#include <stdio.h>
main()
{
int nt ; /* nombre de termes de la série harmonique */
float som ; /* pour la somme de la série */
int i ;

do
{ printf ("combien de termes : ") ;
scanf ("%d", &nt) ;
}
while (nt<1) ;
for (i=1, som=0 ; i<=nt ; i++) som += (float)1/i ;
printf ("Somme des %d premiers termes = %f", nt, som) ;
}

Rem arques :

1 ) R a p p e lo n s q u e d a n s :
som += (float)1/i

l ' e x p r e s s i o n d e d r o i t e e s t é v a l u é e e n c o n v e r t i ss a n t d' a b o r d 1 e t i e n flo a t .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 30/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

30 Exercices en langage C
I l fa u t é v i t e r d ' é c r i r e :
som += 1/i

a u q u e l c a s , l e s v a l e u r s d e 1 / i ser a i en t t o u j o u r s n u l le s ( s a u f p o u r i = 1 ) p u i q u e l ' o p é r a t e u r / , l o r s q u ' i l p o r t e s u r d e s


e n t i e r s , c o r r e s p o n d à l a d i v i si o n e n t i è r e .
D e m ê m e , e n é c r iv a n t :
som += (float) (1/i)

l e r é s u l t a t n e s e r a i t p a s p l u s s a t i s fa i s a n t p u i s q u e l a c o n v e r s i o n e n f l o tt a n t n ' a u r a i t li e u q u ' a p r è s l a d i v i si o n ( e n e n t i e r ) .
E n r e v a n c h e , o n p o u r r a i t é c r ir e :

som += 1.0/i ;

2 ) S i l' o n c h e r c h a i t à e x é c u t e r c e p r o g r a m m e p o u r d e s v a l e u r s él e v é e s d e n ( e n p r é v o y a n t a l o r s u n e v a r i a b le d e t y p e
flo a t o u d o u b l e ) , o n c o n s t a te r a i t q u e l a v a l e u r d e la so m m e s e m b l e " c o n v e r g e r " v e r s u n e l im i te ( b i e n q u ' e n t h é o r ie l a
s é r ie h a r m o n i q u e " d i v e r g e " ) . C e l a p r o v i e n t t o u t si m p l e m e n t d e c e q u e , d è s q u e l a v a l e u r d e 1 / i e s t " p e t it e " d e v a n t
so m , l e r é s u l t a t d e l ' a d d i t i o n d e 1 / i e t d e so m e s t ex a c t e m e n t so m . O n p o u r r a i t t o u t e f o i s a m é l i o r e r le r é s u l t a t e n
e f fe c t u a n t la s o m m e " à l ' e n v e r s " ( e n e f fe t , d a n s c e c a s , l e r a p p o r t e n tr e l a v a le u r à a j o u t e r e t l a so m m e c o u r a n t e s e r a it
p l u s f a i b le q u e p r é c é d e m m e n t ). .

E x e r c ic e III. 1 2

___________________________________________________________________________

Enoncé

A f fic h e r u n t r ia n g l e i so c è l e f o r m é d ' é to i le s . L a h a u t e u r d u t r ia n g l e ( c ' e s t - à -d ir e l e n o m b r e d e l ig n e s ) s e r a f o u r n i e n


d o n n é e , c o m m e d a n s l' e x e m p l e c i -d e s s o u s . O n s ' a r r a n g e r a p o u r q u e l a d e r n iè r e l ig n e d u t r i a n g l e s' a f f ic h e s u r l e b o r d
gauche de l'écran.

combien de lignes ? 10
*
***
*****
*******
*********
***********
*************
***************

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 31/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 31


*****************
*******************

___________________________________________________________________________

Solution

#include <stdio.h>

#define car '*' /* caractère de remplissage */

main()
{ int nlignes ; /* nombre total de lignes */
int nl ; /* compteur de ligne */
int nesp ; /* nombre d'espaces précédent une étoile */
int j ;

printf ("combien de lignes ? ") ;


scanf ("%d", &nlignes) ;
for (nl=0 ; nl<nlignes ; nl++)
{ nesp = nlignes - nl - 1 ;
for (j=0 ; j<nesp ; j++) putchar (' ') ;
for (j=0 ; j<2*nl+1 ; j++) putchar (car) ;

putchar ('\n') ;
}
}

E x e r c ic e III. 1 3

___________________________________________________________________________

Enoncé
A f fic h e r t o u t e s le s m a n i è r e s p o ss i b l es d ' o b t e n ir u n f r a n c a v e c d e s p i è c e s d e 2 c e n t im e s , 5 c e n t i m e s e t 1 0 c e n t i m e s . D i r e
c o m b i e n d e p o s si b i l it é s o n t é t é a i n si t r o u v é e s . L e s r é s u l ta t s s e r o n t a f fic h é s c o m m e s u i t :

1 F = 50 X 2c

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 32/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

32 Exercices en langage C
1 F = 45 X 2c 2 X 5c
1 F = 40 X 2c 4 X 5c
1 F = 35 X 2c 6 X 5c
1 F = 30 X 2c 8 X 5c
1 F = 25 X 2c 10 X 5c
1 F = 20 X 2c 12 X 5c
1 F = 15 X 2c 14 X 5c
1 F = 10 X 2c 16 X 5c
1 F = 5 X 2c 18 X 5c
1 F = 20 X 5c
1 F = 45 X 2c 1 X 10c
1 F = 40 X 2c 2 X 5c 1 X 10c
1 F = 35 X 2c 4 X 5c 1 X 10c
1 F = 10 X 2c 2 X 5c 7 X 10c
1 F = 5 X 2c 4 X 5c 7 X 10c
1 F = 6 X 5c 7 X 10c
1 F = 10 X 2c 8 X 10c
1 F = 5 X 2c 2 X 5c 8 X 10c
1 F = 4 X 5c 8 X 10c
1 F = 5 X 2c 9 X 10c
1 F = 2 X 5c 9 X 10c
1 F = 10 X 10c

En tout, il y a 66 façons de faire 1 F

___________________________________________________________________________

Solution

#include <stdio.h>
main()
{
int nbf ; /* compteur du nombre de façons de faire 1 F */
int n10 ; /* nombre de pièces de 10 centimes */
int n5 ; /* nombre de pièces de 5 centimes */
int n2 ; /* nombre de pièces de 2 centimes */

nbf = 0 ;
for (n10=0 ; n10<=10 ; n10++)
for (n5=0 ; n5<=20 ; n5++)
for (n2=0 ; n2<=50 ; n2++)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 33/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 33


if ( 2*n2 + 5*n5 + 10*n10 == 100)
{ nbf ++ ;
printf ("1 F = ") ;
if (n2) printf ("%2d X 2c ", n2 ) ;
if (n5) printf ("%2d X 5c ", n5 ) ;
if (n10) printf ("%2d X 10c", n10) ;
printf ("\n") ;
}

printf ("\nEn tout, il y a %d façons de faire 1 F\n", nbf) ;


}

E x e r c ic e III. 1 4

___________________________________________________________________________

Enoncé

E c r i r e u n p r o g r a m m e q u i d é te r m i n e la n i e m e v a l e u r u n ( n é t a n t f o u r n i e n d o n n é e ) d e l a " s u i t e d e F i b o n a c c i " d é f i n i e
c o m m e s u it :

u1 = 1
u2 = 1
u n = u n -1 + u n -2 p ou r n > 2

_______________________________________________________________

Solution

#include <stdio.h>

main()
{
int u1, u2, u3 ; /* pour "parcourir" la suite */
int n ; /* rang du terme demandé */
int i ; /* compteur */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 34/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

34 Exercices en langage C

do
{ printf ("rang du terme demandé (au moins 3) ? ") ;
scanf ("%d", &n) ;
}
while (n<3) ;

u2 = u1 = 1 ; /* les deux premiers termes */


i = 2 ;
while (i++ < n) /* attention, l'algorithme ne fonctionne */
{ u3 = u1 + u2 ; /* que pour n > 2 */
u1 = u2 ;
u2 = u3 ;
}

/* autre formulation possible : */


/* for (i=3 ; i<=n ; i++, u1=u2, u2=u3) u3 = u1 + u2 ; */

printf ("Valeur du terme de rang %d : %d", n, u3) ;


}

N o t e z q u e , c o m m e à l ' a c c o u t u m é e e n C , b e a u c o u p d e f o r m u l a ti o n s so n t p o ss i b le s . N o u s e n a v o n s d ' a i ll e u r s p la c é u n e
s e c o n d e e n c o m m e n t a ir e d e n o tr e p r o g r a m m e .

E x e r c ic e III. 1 5

___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i tr o u v e l a p l u s g r a n d e e t l a p l u s p e ti te v a l e u r d ' u n e s u c c e s s i o n d e n o t e s (n o m b r e s e n t ie r s e n t r e 0
e t 2 0 ) f o u r n i e s e n d o n n é e s , a i n s i qu e l e n o m b r e d e f o is o ù c e m a x i m u m e t c e m i n im u m o n t é t é a tt r ib u é s . O n su p p o ser a
q u e l e s n o t e s , e n n o m b r e n o n c o n n u à l ' a v a n c e , s e r o n t t e r m i n é e s p a r u n e v a l e u r n é g a t iv e . O n s ' a s t r e in d r a à n e p a s u t il i se r
d e " t a b l e a u " . L ' e x é c u t io n d u p r o g r a m m e p o u r r a s e p r é s e n te r a i n si :
donnez une note (-1 pour finir) : 12
donnez une note (-1 pour finir) : 8
donnez une note (-1 pour finir) : 13
donnez une note (-1 pour finir) : 7

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 35/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 35


donnez une note (-1 pour finir) : 11
donnez une note (-1 pour finir) : 12
donnez une note (-1 pour finir) : 7
donnez une note (-1 pour finir) : 9
donnez une note (-1 pour finir) : -1

note maximale : 13 attribuée 1 fois


note minimale : 7 attribuée 2 fois

_______________________________________________________________

Solution

#include <stdio.h>

main()
{
int note ; /* note "courante" */
int max ; /* note maxi */
int min ; /* note mini */
int nmax ; /* nombre de fois où la note maxi a été trouvée */
int nmin ; /* nombre de fois où la note mini a été trouvée */

max = -1 ; /* initialisation max (possible car toutes notes >=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) */


/* les résultats sont sans signification */
if (max >= 0)
{ printf ("\nnote maximale : %d attribuée %d fois\n", max, nmax) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 36/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

36 Exercices en langage C
printf ("note minimale : %d attribuée %d fois\n", min, nmin) ;
}
}

E x e r c ic e III. 1 6

___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i a f fi c h e la " t a b l e d e m u l ti p lic a t i o n " d e s n o m b r e s d e 1 à 1 0 , s o u s l a fo r m e s u i v a n t e :

I 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

_______________________________________________________________

Solution

#include <stdio.h>
#define NMAX 10 /* nombre de valeurs */

main()
{ int i, j ;

/* affichage ligne en-tête */


printf (" I") ;
for (j=1 ; j<=NMAX ; j++) printf ("%4d", j) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 37/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Les instructions d e c ontrôle 37


printf ("\n") ;
printf ("-------") ;
for (j=1 ; j<=NMAX ; j++) printf ("----") ;
printf ("\n") ;

/* affichage des différentes lignes */


for (i=1 ; i<=NMAX ; i++)
{ printf ("%4d I", i) ;
for (j=1 ; j<=NMAX ; j++)
printf ("%4d", i*j) ;
printf ("\n") ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 38/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 39/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV : L ES F O N C T IO N S

N . B . I c i , o n n e t r o u v e r a a u c u n e x e r c ic e f a i s a n t in t e r v e n i r d e s p o i n te u r s , e t p a r c o n s é q u e n t a u c u n e x e r c i c e m e t ta n t e n
o e u v r e u n e t r a n s m i ssi o n d ' a r g u m e n t s p a r a d r e s s e . D e t e ls e x e r c i c e s a p p a r a î tr o n t d a n s l e c h a p i t re s u i v a n t .

E x e r c ic e IV . 1

___________________________________________________________________________

Enoncé
a ) Q u e f o u r n i t l e p ro g r a m m e s u iv a n t :

#include <stdio.h>
main()
{
int n, p=5 ;
n = fct (p) ;
printf ("p = %d, n = %d\n", p, n) ;
}
int fct (int r)
{ return 2*r ;
}

b ) A j o u t e r u n e d é c l a r a ti o n c o n v e n a b le d e l a f o n c t i o n fct :

- so u s la f o r m e l a p l u s b r è v e p o s si b l e ( su i v a n t la n o r m e A N S I ),

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 40/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

40 Exercices en langage C
- so u s fo r m e d ' u n " p r o t o ty p e " .
_______________________________________________________________

Solution

a ) B i e n q u ' i l n e p o s s è d e p a s d e d é c l a r a t io n d e l a f o n c t io n fct , l e p r o g r a m m e m a i n e s t c o rr e c t. E n e f f e t , la n o r m e A N S I
a u t o r is e q u ' u n e f o n c t i o n n e s o i t p a s d é c l a r é e , a u q u e l c a s e l le e s t c o n s i d é r é e c o m m e f o u r n i s s a n t u n r é s u lt a t d e t y p e in t .
C e t te f a c i li té e s t to u t e f o is f o r te m e n t d é c o n s e i l lé e ( e t e ll e n e s e r a p l u s a c c e p t é e d e C + + ) . V o i c i le s r é s u l ta t s fo u r n i s p a r
l e pr o gr a m m e :

p = 5, n = 10

b ) L a d é c l a r a ti o n l a p l u s b r è v e s e r a :

int fct () ;

L a d é c l a r a t io n ( v i v e m e n t c o n s e i ll é e ), s o u s fo r m e d e p r o t o ty p e s e r a :

int fct (int) ;

o u , é v e n t u e ll e m e n t , s o u s f o rm e d ' u n p r o t o ty p e " c o m p l e t" :

int fct (int r) ;

D a n s c e d e r n i e r c a s , le n o m r n ' a a u c u n e s i g n if ic a t i o n : o n u t i li s e s o u v e n t l e m ê m e n o m ( lo r s q u ' o n l e c o n n a î t !) q u e d a n s
l ' e n - t ê te d e l a f o n c t i o n , m a i s i l p o u r r a i t s ' a g i r d e n ' i m p o r t e q u e l a u t r e n o m d e v a r i a bl e ).

E x e r c ic e IV . 2

___________________________________________________________________________

Enoncé

E c r ir e :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 41/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV. Les fonctions 41


- u n e f o nc t io n , n o m m é e f 1 , s e c o n t e n t a n t d' a f fic h e r " b o n j o u r " ( e ll e n e p o s s é d e r a a u c u n a r g u m e n t , n i v a l e u r d e
retour),
- u n e f o n c t io n , n o m m é e f2 , q u i a f fic h e " b o n j o u r " u n n o m b r e d e f o i s é ga l à l a v a le u r r e ç u e e n a r g u m e n t ( in t ) e t q u i n e
renvoie aucune valeur,
- u n e f o n c t io n , n o m m é e f3 , q u i f a it la m ê m e c h o s e q u e f2 , m a i s q u i , d e p lu s , r e n v o i e l a v a l e u r ( i n t ) 0 .
E c r ir e u n p e t i t p r o g r a m m e a p p e l a n t su c c e s s iv e m e n t c h a c u n e d e c e s 3 f o n c t io n s , a p r è s l e s a v o i r c o n v e n a b le m e n t d é c l a r é e s
s o u s fo r m e d ' u n p r o t o ty p e .

_______________________________________________________________

Solution

#include <stdio.h>

void f1 (void)
{
printf ("bonjour\n") ;
}

void f2 (int n)
{
int i ;
for (i=0 ; i<n ; i++)

printf ("bonjour\n") ;
}

int f3 (int n)
{
int i ;
for (i=0 ; i<n ; i++)
printf ("bonjour\n") ;
return 0 ;
}

main()
{
void f1 (void) ;
void f2 (int) ;
int f3 (int) ;
f1 () ;
f2 (3) ;
f3 (3) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 42/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

42 Exercices en langage C
}

E x e r c ic e IV . 3

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
int n=10, q=2 ;

main()
{
int fct (int) ;
void f (void) ;
int n=0, p=5 ;
n = fct(p) ;
printf ("A : dans main, n = %d, p = %d, q = %d\n", n, p, q) ;

f() ;
}

int fct (int p)


{
int q ;
q = 2 * p + n ;
printf ("B : dans fct, n = %d, p = %d, q = %d\n", n, p, q) ;
return q ;
}

void f (void)
{
int p = q * n ;
printf ("C : dans f, n = %d, p = %d, q = %d\n", n, p, q) ;
}

_______________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 43/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV. Les fonctions 43

Solution

B : dans fct, n = 10, p = 5, q = 20


A : dans main, n = 20, p = 5, q = 2
C : dans f, n = 10, p = 20, q = 2

E x e r c ic e IV . 4
___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n q u i r e ç o i t e n a r g u m e n t s 2 n o m b r e s f l o tt a n ts e t u n c a r a c t è r e e t q u i f o u r n it u n r é s u l t a t c o r re s p o n d a n t à
l ' u n e d e s 4 o p é r a t io n s a p p l i q u é e s à s e s d e u x p r e m i e r s a r g u m e n t s , e n f o n c t i o n d e l a v a l e u r d u d e r n i e r , à s a v o i r : a d d it io n
p o u r l e c a r a c t è r e + , s o u s tr a c t io n p o u r - , m u l ti p lic a t i o n p o u r * e t d i v isi o n p o u r / ( t o u t a u t r e c a r a c t è re q u e l ' u n d e s 4 c i t é s
s e r a i n te r p r é t é c o m m e u n e a d d i t i o n ) . O n n e t ie n d r a p a s c o m p t e d e s r is q u e s d e d i v i si o n p a r z é r o .

E c r i r e u n p e t it p r o g r a m m e ( m a i n ) u t il i sa n t c e t t e fo n c t io n p o u r e f f e c t u e r l e s 4 o p é r a t i o n s s u r d e u x n o m b r e s f o u r n i s e n
donnée.
_______________________________________________________________

Solution

#include <stdio.h>

float oper (float v1, float v2, char op)


{ float res ;
switch (op)

{ case '+' : res = v1 + v2 ;


break ;
case '-' : res = v1 - v2 ;
break ;
case '*' : res = v1 * v2 ;
break ;
case '/' : res = v1 / v2 ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 44/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

44 Exercices en langage C
break ;
default : res = v1 + v2 ;
}
return res ;
}

main()
{
float oper (float, float, char) ; /* prototype de oper */
float x, y ;

printf ("donnez deux nombres réels : ") ;


scanf ("%e %e", &x, &y) ;

printf ("leur somme est : %e\n", oper (x, y, '+') ) ;


printf ("leur différence est : %e\n", oper (x, y, '-') ) ;
printf ("leur produit est : %e\n", oper (x, y, '*') ) ;
printf ("leur quotient est : %e\n", oper (x, y, '/') ) ;
}

E x e r c ic e IV . 5
___________________________________________________________________________

Enoncé

T r a n s f o r m e r l e p r o g ra m m e ( f o n c t io n + m a i n ) é c r it da n s l ' e x e r c ic e p r é c é d e n t d e m a n i è r e à c e q u e l a f o n c t i o n n e d i s p o s e
p l u s q u e d e 2 a r g u m e n t s , le c a r a c t è r e i n d i q u a n t la n a t u r e d e l ' o p é r a t io n à e f fe c t u e r é t a n t p r é c is é , c e t t e f o is , à l ' a i de d ' u n e
variable globale.

_______________________________________________________________

Solution

#include <stdio.h>

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 45/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV. Les fonctions 45


char op ; /* variable globale pour la nature de l'opération */
/* attention : doit être déclarée avant d'être utilisée */

float oper (float v1, float v2)


{ float res ;
switch (op)
{ case '+' : res = v1 + v2 ;
break ;
case '-' : res = v1 - v2 ;
break ;
case '*' : res = v1 * v2 ;
break ;
case '/' : res = v1 / v2 ;
break ;
default : res = v1 + v2 ;
}
return res ;
}

main()
{
float oper (float, float) ; /* prototype de oper */
float x, y ;
printf ("donnez deux nombres réels : ") ;

scanf ("%e %e", &x, &y) ;


op = '+' ;
printf ("leur somme est : %e\n", oper (x, y) ) ;
op = '-' ;
printf ("leur différence est : %e\n", oper (x, y) ) ;
op = '*' ;
printf ("leur produit est : %e\n", oper (x, y) ) ;
op = '/' ;
printf ("leur quotient est : %e\n", oper (x, y) ) ;
}

Remar que :

I l s' a g i ss a i t i c i d ' u n e x e r c i c e d ' " é c o l e " d e s t in é à f o rc e r l ' u t i li s a ti o n d ' u n e v a r i a b le g l o b a l e . D a n s l a p r a t iq u e , o n


é v i te r a l e p l u s p o s si b l e c e g e n r e d e p r o g r a m m a t io n q u i fa v o r i s e tr o p l a r g e m e n t l e s r is q u e s d ' " e f f e ts d e b o r d " .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 46/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

46 Exercices en langage C

E x e r c ic e IV . 6

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n , s a n s a r g u m e n t n i v a le u r d e r e t o u r , q u i s e c o n t e n te d ' a f fi c h e r , à c h a q u e a p p e l , l e n o m b r e t o t a l d e f o i s
où elle a été appelée sous la forme :

appel numéro 3

_______________________________________________________________

Solution

L a m e i ll e u r e s o l u ti o n c o n s i s te à p r é v o i r , a u s e i n d e l a f o n c t i o n e n q u e s t io n , u n e v a r i a b le d e c l a s s e s ta t iq u e . E l l e s e r a
i n it ia l i s ée u n e s eu l e f o is à z é r o ( o u à t o u t e a u t r e v a l e u r é v e n t u e l le m e n t e x p l ic i té e ) a u d éb u t d e l ' e x é c u t io n d u p r o g r a m m e .
I c i , n o u s a v o n s , d e p l u s , p r é v u u n p e t it p ro g r a m m e d ' e s sa i .

#include <stdio.h>

void fcompte (void)


{
static int i ; /* il est inutile, mais pas défendu, d'écrire i=0 */
i++ ;
printf ("appel numéro %d\n", i) ;
}

/* petit programme d'essai de fcompte */


main()
{ void fcompte (void) ;
int i ;
for (i=0 ; i<3 ; i++) fcompte () ;
}

L à e n c o r e , l a d é m a r c h e c o n s i s ta n t à u ti li ser c o m m e c o m p t e u r d ' a p p e l s u n e v a r i a b le g l o b a l e ( q u i d e v r a it a lo r s ê t re c o n n u e
d u p r o g r a m m e u t i li s a te u r ) e s t à p r o s c r ir e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 47/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV. Les fonctions 47


E x e r c ic e IV . 7

___________________________________________________________________________

Enoncé

E c r ir e 2 f o n c t i o n s à u n a r g u m e n t e n t ie r e t u n e v a l e u r d e r e t o u r e n t iè r e p e r m e t ta n t d e p r é c i s er s i l' a r g u m e n t r e ç u e s t
m u l ti p le d e 2 ( p o u r l a p r e m i è r e fo n c t i o n ) o u m u l ti p le d e 3 ( p o u r l a s e c o n d e f o n c t i o n ).

U t il i se r c e s d e u x f o n c t io n s d a n s u n p e t i t p r o g r a m m e q u i l i t u n n o m b r e e n t i e r e t q u i p r é c i se s ' i l e s t p a i r, m u l ti p le d e 3
e t / o u m u l ti p le d e 6 , c o m m e d a n s c e t e x e m p l e (i l y a d e u x e x é c u t io n s ) :

donnez un entier : 9
il est multiple de 3
_______________

donnez un entier : 12
il est pair
il est multiple de 3
il est divisible par 6
_______________________________________________________________

Solution

#include <stdio.h>

int mul2 (int n)


{
if (n%2) return 0 ;
else return 1 ;
}

int mul3 (int n)


{
if (n%3) return 0 ;
else return 1 ;
}

main()
{
int mul2 (int) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 48/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

48 Exercices en langage C
int mul3 (int) ;
int n ;
printf ("donnez un entier : ") ;
scanf ("%d", &n) ;
if (mul2(n)) printf ("il est pair\n") ;
if (mul3(n)) printf ("il est multiple de 3\n") ;
if (mul2(n) && mul3(n)) printf ("il est divisible par 6\n") ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 49/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V : T A B L EA U X ET
POINTEURS

Ex e rc ic e V . 1

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>

main()
{
int t [3] ;
int i, j ;
int * adt ;

for (i=0, j=0 ; i<3 ; i++) t[i] = j++ + i ; /* 1 */

for (i=0 ; i<3 ; i++) printf ("%d ", t[i]) ; /* 2 */


printf ("\n") ;

for (i=0 ; i<3 ; i++) printf ("%d ", *(t+i)) ; /* 3 */


printf ("\n") ;

for (adt = t ; adt < t+3 ; adt++) printf ("%d ", *adt) ; /* 4 */
printf ("\n") ;

for (adt = t+2 ; adt>=t ; adt--) printf ("%d ", *adt) ; /* 5 */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 50/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

50 Exercices en langage C
printf ("\n") ;
}

_______________________________________________________________

Solution

/ * 1 * / r e m p l it le t a b le a u a v e c l e s v a le u r s 0 ( 0 + 0 ) , 2 ( 1 + 1 ) e t 4 ( 2 + 2 ) ; o n o b ti e n dr a i t p lu s si m p l e m e n t l e m ê m e r é s u lt a t
a v e c l ' e x p r e s s io n 2 * i .

/ * 2 * / a f f ic h e " c l a s si q u e m e n t " l e s v a l e u r s d u t a b l e a u t , d a n s l ' o r d r e " n a t u r e l " .

/ * 3 * / f a i t l a m ê m e c h o s e , e n u t il i sa n t le f o r m a l i sm e p o i n t e u r a u li e u d u f o r m a l i sm e t a b l e a u . A i n s i , * ( t + i ) e s t
p a r f a i t e m e n t é q u i v a l e n t à t[ i ].

/ * 4 * / f a i t l a m ê m e c h o s e , e n u t il i sa n t l a " l v a l u e " a d t ( à l a q u e l l e o n a a f f e c t é i n i ti a l e m e n t l ' a d r e s s e t d u t a b l e a u ) e t e n


" l ' i n c r é m e n t a n t " p o u r p a r c o u r ir l es d i f fé r e n t e s a d r e s se s d e s 4 é l é m e n t s d u t a b le a u .

/ * 5 * / a f f ic h e l e s v a l e u r s d e t , à l ' e n v e r s , e n u t i li sa n t l e m ê m e f o r m a l i sm e p o i n t e u r q u e d a n s 4 . O n a u r a i t p u é c r i re , d e
f a ç o n é q u i v a le n t e :

for (i=2 ; i>=0 ; i--) printf ("%d ", t[i]) ;

V o i c i l e s ré s u l ta t s fo u r n i s p a r c e p r o g r a m m e :

0 2 4
0 2 4
0 2 4
4 2 0

Ex e rc ic e V . 2

___________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 51/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . T a b l e a u x e t p o i n te u r s 51
Enoncé

E c r ir e , d e d eu x f a ç o n s d i ff é r e n te s , u n p r o g r a m m e q u i l it 1 0 n o m b r e s e n t ie r s d a n s u n t a b le a u a v a n t d ' e n r e c h e r c h e r l e p l u s
gra nd et le plus petit :

a ) e n u t i li s a n t u n i q u e m e n t l e " f o r m a l i sm e t a b l e a u " ,
b ) e n u t i li sa n t l e " f o r m a l i sm e p o i n t e u r " , à c h a q u e f o i s q u e c e l a e s t p o s si b l e
_______________________________________________________________

Solution

a ) L a p r o g r a m m a t io n e s t, ic i , " c l a ss i q u e " . N o u s a v o n s s i m p l e m e n t d é fi n i u n s y m b o l e N V A L d e s t in é à c o n t e n ir l e n o m b r e
de valeurs du tableau. Notez bien que la déclaration int t[NVAL] est acceptée puisque NVAL est une "expression
c o n s t a n t e " . E n r e v a n c h e , e l le n e l ' a u r a i t pa s é t é s i n o u s a v i o n s d é f in i c e s y m b o l e N V A L p a r u n e " c o n s t a n t e s y m b o l i q u e "
( c o n st in t N V A L = 1 0 ) .

#include <stdio.h>
#define NVAL 10 /* nombre de valeurs du tableau */
main()
{ int i, min, max ;
int t[NVAL] ;

printf ("donnez %d valeurs\n", NVAL) ;

for (i=0 ; i<NVAL ; i++) scanf ("%d", &t[i]) ;

max = min = t[0] ;


for (i=1 ; i<NVAL ; i++)
{ if (t[i] > max) max = t[i] ; /* ou max = t[i]>max ? t[i] : max */
if (t[i] < min) min = t[i] ; /* ou min = t[i]<min ? t[i] : min */
}

printf ("valeur max : %d\n", max) ;


printf ("valeur min : %d\n", min) ;
}

b ) O n p e u t r e m p l a c e r s y s té m a t iq u e m e n t , t[i] p a r * (t+ i) . / D e p l u s, d a n s s c a n f , o n p e u t r e m p l a c e r & t [i ] p a r t+ i . V o i c i


f in a l e m e n t l e p r o g r a m m e o b t e n u :

#include <stdio.h>
#define NVAL 10 /* nombre de valeurs du tableau */
main()
{ int i, min, max ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 52/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

52 Exercices en langage C
int t[NVAL] ;

printf ("donnez %d valeurs\n", NVAL) ;


for (i=0 ; i<NVAL ; i++) scanf ("%d", t+i) ; /* attention t+i et non *(t+i) */

max = min = *t ;
for (i=1 ; i<NVAL ; i++)
{ if (*(t+i) > max) max = *(t+i) ;
if (*(t+i) < min) min = *(t+i) ;
}

printf ("valeur max : %d\n", max) ;


printf ("valeur min : %d\n", min) ;
}

Ex e rc ic e V . 3

___________________________________________________________________________

Enoncé

S oient deux tableaux t1 et t2 déclarés ainsi :

float t1[10], t2[10] ;

E c r ir e l e s i n st r uc t i o n s p e r m e t ta n t d e r e c o p i e r , d a n s t 1 , t o u s l e s é lé m e n t s p o s i ti fs d e t 2 , e n c o m p l é ta n t é v e n t u e l l e m e n t t 1
p a r d e s z é r o s . I c i , o n n e c h e r c h e r a p a s à f o u r n i r u n p r o g r a m m e c o m p l e t e t o n u t il i se r a s y st é m a t iq u e m e n t le f o r m a l i sm e
tableau.

_______________________________________________________________

Solution

O n p e u t c o m m e n c e r p a r r e m p l ir t 1 d e z é r o s , a v a n t d ' y r e c o p i e r l e s é lé m e n t s p o si t if s d e t 2 :

int i, j ;
for (i=0 ; i<10 ; i++) t1[i] = 0 ;
/* i sert à pointer dans t1 et j dans t2 */
for (i=0, j=0 ; j<10 ; j++)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 53/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . T a b l e a u x e t p o i n te u r s 53
if (t2[j] > 0) t1[i++] = t2[j] ;

M a i s , o n p e u t r e c o p i e r d ' a b o r d d a n s t1 l e s é lé m e n t s p o si t if s d e t 2 , a v a n t d e c o m p l é te r é v e n t u e l le m e n t p a r d e s z é r o s .
C e t te d e u x i è m e f o r m u l a t io n , m o i n s si m p l e q u e l a p r é c é d e n t e , s e r é v é l e r a it to u t e f o is p l u s e f fic a c e s u r d e g r a n d s ta b l e a u x :

int i, j ;
for (i=0, j=0 ; j<10 ; j++)
if (t2[j] > 0) t1[i++] = t2[j] ;
for (j=i ; j<10 ; j++) t1[j] = 0 ;

Ex e rc ic e V . 4

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
main()
{ int t[4] = {10, 20, 30, 40} ;

int * ad [4] ;
int i ;
for (i=0 ; i<4 ; i++) ad[i] = t+i ; /* 1 */
for (i=0 ; i<4 ; i++) printf ("%d ", * ad[i]) ; /* 2 */
printf ("\n") ;
printf ("%d %d \n", * (ad[1] + 1), * ad[1] + 1) ; /* 3 */
}

_______________________________________________________________

Solution

L e t a b l e a u a d e s t u n t a b le a u d e 4 é l é m e n t s ; c h a c u n d e c e s é l é m e n t s e s t u n p o i n te u r su r u n in t . L ' i n s t r u c t i o n / * 1 * /
r e m p l it l e t a b l e a u a d a v e c l e s a d r e s s es d e s 4 é l é m e n t s d u t a b le a u t . L ' i n s t ru c t io n / * 2 * / a f fic h e f in a l e m e n t l e s 4 é l é m e n t s
d u t a b l e a u t ; e n e f f e t , * a d [ i ] r e p r é s e n t e la v a l e u r s i tu é e à l ' a d r e s s e a d [ i ] . / * 2 * / e s t é q u i v a le n t e i c i à :

for (i=0 ; i<4 ; i++) printf ("%d", t[i]) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 54/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

54 Exercices en langage C
E n f in , d a n s l ' i n s tr u c t io n / * 3 * / , * ( a d [1 ] + 1 ) r e p r é s e n t e l a v a l e u r s i t u é e à l ' e n t i e r s u i v a n t c e l u i d ' a d r e s s e a d [ 1 ] ; i l s ' a g i t
d o n c d e t [2 ] . E n r e v a n c h e , * a d [1 ] + 1 r e p r é s e n t e l a v a l e u r s i tu é e à l ' a d r e s s e a d [ 1 ] a u g m e n t é e d e 1 , a u tr e m e n t d it t[ 1 ] +
1.

V o i c i, e n d é f in i ti v e , l e s r é s u lt a ts f o u r n i s p a r c e p r o g r a m m e :

10 20 30 40
30 21

Ex e rc ic e V . 5

___________________________________________________________________________

Enoncé

S oit le tableau t déc laré ainsi :

float t[3] [4] ;

E c r ir e l e s (s e u l e s ) i n s tr u c t io n s p e r m e t ta n t d e c a l c u l e r , d a n s u n e v a r i a b le n o m m é e so m , l a so m m e d e s é lé m e n t s d e t :

a ) e n u t i li s a n t le " f o r m a l i sm e u s u e l d e s ta b l e a u x à d eu x i n d i c e s " ,
b ) e n u t il i sa n t l e " f o r m a l i sm e p o i n te u r " .
_______________________________________________________________

Solution

a ) L a p r e m i è r e s o lu t io n n e p o s e a u c u n p r o b l è m e p a r t ic u l i e r :

int i, j ;
som = 0 ;
for (i=0 ; i<3 ; i++)
for (j=0 ; j<4 ; j++)
som += t[i] [j] ;

b ) L e f o r m a l i sm e p o i n t e u r e s t i c i m o i n s fa c i le à a p p l i q u e r q u e d a n s le c a s d e s t a b l e a u x à u n i n d i c e . E n e f f e t, a v e c , p a r
e x e m p l e , f l o a t t [ 4 ], t e s t d e t y p e int * e t il c o r r e s p o n d à u n p o i n t e u r su r l e p r e m i e r é l é m e n t d u t a b le a u . I l s u f f it d o n c
d ' i n c r é m e n t e r c o n v e n a b le m e n t t p o u r p a r c o u r i r to u s l e s é l é m e n t s d u t a b l e a u .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 55/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . T a b l e a u x e t p o i n te u r s 55
E n r e v a n c h e , a v e c n o t r e ta b l e a u flo a t t [ 3 ] [ 4 ] , t e s t d u t y p e p o i n t e u r su r d e s t a b l e a u x d e 4 f l ot t a n t s ( t y p e : flo a t[ 4 ] * ) . L a
n o t a t i o n * (t+ i ) e s t g é n é r a le m e n t i n u ti li s a b le s o u s c e t t e fo r m e p u i s q u e , d ' u n e p a r t , e ll e c o r r e s p o n d à d e s v a l e u r s d e
t a b l e a u x d e 4 f lo t ta n t s e t q u e , d ' a u t r e p a r t , l' i n c r é m e n t i p o r te , n o n p l u s s u r d e s f l o tt a n ts , m a i s s u r d e s b l o c s d e 4
f lo t ta n t s ; p a r e x e m p l e , t+ 2 r e p r é s e n t e l' a d r e s se d u h u i t iè m e f l o tt a n t, c o m p t é à p a r t i r d e c e l u i d ' a d r e s s e t .

U n e s o l u t io n c o n s i s t e à " c o n v e r ti r" l a v a l e u r d e t e n u n p o i n t e u r d e t y p e float * . O n p o u r r a i t s e c o n t e n t e r d e p r o c é d e r


ainsi :

float * adt ;
.....
adt = t ;

En effet, dans ce cas, l'affectation entraîne une conversion forcée de t en float *, c e q u i n e c h a n g e p a s l ' a d r e s s e
c o r r e s p o n d a n t e 1 ( s e u le l a n a t u r e du p o i n t e u r a c h a n g é ) .

G é n é r a l e m e n t , o n y g a g n e r a e n l i si b i li té e n e x p l ic i t a n t l a c o n v e r si o n m i s e e n o e u v r e à l ' a i d e d e l ' o p é r a t e u r d e " c a s t " .


N o t e z q u e , d ' u n e p a r t , c e l a p e u t é v i te r c e r t a in s m e s s a g e s d ' a v e r t i s se m e n t (" w a r n i n g s " ) d e la p a r t du c o m p i la t e u r .

V o i c i fi n a le m e n t c e q u e p o u r r a i e n t ê tr e l e s in s t ru c t io n s d e m a n d é e s :

int i ;
int * adt ;
som = 0 ;
adt = (float *) t ;
for (i=0 ; i<12 ; i++)
som += * (adt+i);

Ex e rc ic e V . 6

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n q u i f o u r n it e n v a l e u r d e r e t o u r l a so m m e d e s é l é m e n t s d ' u n t a b l e a u d e f lo t ta n t s tr a n s m i s, a i n si q u e s a

d i m e n s io n , e n a r g u m e n t .
E c r ir e u n p e t it p r o g r a m m e d ' e s sa i .

1 A t t en t i o n , c el a n ' e s t v r a i q u e p a r c e q u e l ' o n p a s s e d e p o i n t e u r s su r d e s g r o u p e s d ' é l é m e n t s à u n p o i n te u r s u r c e s é lé m e n t s . A u t r e m e n t d i t, a u c u n e


" c o n t r a in t e d ' a l ig n e m e n t " n e r i squ e d e n u i r e i c i . I l n ' e n i r a i t pa s d e m ê m e , p a r ex e m p l e, p o u r d es c o n v e r s i o n s d e c h a r * e n i n t * .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 56/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

56 Exercices en langage C
_______________________________________________________________

Solution

E n c e q u i c o n c e r n e l e ta b l e a u d e f l o tt a n ts r e ç u e n a r g u m e n t , i l n e p e u t ê tr e t r a n s m i s qu e p a r a d r e sse . Q u a n t a u n o m b r e
d ' é l é m e n t ( d e t y p e i n t ) , n o u s l e t r a n s m e t t r o n s c l a ss i qu e m e n t p a r v a l e u r . L ' e n - t ê t e d e n o t r e f o n c t io n p o u r r a s e p r é s e n t e r
s o u s l ' u n e d e s fo r m e s s u iv a n t e s :

float somme (float t[], int n)


float somme (float * t, int n)
float somme (float t[5], int n) /* déconseillé car laisse croire que t */
/* est de dimension fixe 5 */

E n e f fe t , l a d i m e n si o n r é e l le d e t n ' a a u c u n e i n c i de n c e s u r l e s i n s tr u c t io n s d e l a f o n c t io n e l l e - m ê m e ( e l le n ' i n t e r v ie n t p a s
d a n s l e c a l c u l d e l ' a d r e s s e d ' u n é l é m e n t d u t a b le a u 2 e t e ll e n e s e r t pa s à " a l lo u e r " u n e m p l a c e m e n t p u i s q u e l e ta b l e a u e n
q u e s t io n a u r a é t é a l lo u é d a n s l a f o n c t io n a p p e l a n t s o m m e ) .

V o ic i c e q u e p o u r r a i t ê t r e la f o n c t io n d e m a n d é e :

float somme (float t[], int n) /* on pourrait écrire somme (float * t, ... */
/* ou encore somme (float t[4], ... */
/* mais pas somme (float t[n], ... */
{ int i ;
float s = 0 ;
for (i=0 ; i<n ; i++)
s += t[i] ; /* on pourrait écrire s += * (t+i) ; */
return s ;
}

P o u r c e q u i e s t du p r o g r a m m e d ' u t il i sa t io n d e l a f o n c t i o n s o m m e , o n p e u t , l à e n c o r e , é c r i r e l e " p r o t o t y p e " s o u s


d i f f é r e n t e s fo r m e s :

float somme (float [], int ) ;


float somme (float * , int ) ;
float somme (float [5], int ) ; /* déconseillé car laisse croire que t */
/* est de dimension fixe 5 */

V o ic i u n e x e m p l e d ' u n t e l p r o g ra m m e :

#include <stdio.h>
main()

2 I l n ' e n i r a i t p a s d e m ê m e p o u r d e s ta b l e a u x à p l u si e u r s i n d i c e s.

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 57/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . T a b l e a u x e t p o i n te u r s 57
{
float somme (float *, int) ;
float t[4] = {3, 2.5, 5.1, 3.5} ;
printf ("somme de t : %f\n", somme (t, 4) ) ;
}

Ex e rc ic e V . 7

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t io n q u i n e r e n v o i e a u c u n e v a l e u r e t q u i dé t e r m i n e l a v a l e u r m a x i m a l e e t la v a l e u r m i n im a l e d ' u n t a b le a u
d ' e n t ie r s (à u n i n d ic e ) d e ta i ll e q u e l c o n q u e . I l fa u d r a d o n c p r é v o i r 4 a r g u m e n t s : le t a b l e a u , s a d i m e n si o n , l e m a x i m u m e t
l e m i n im u m .

E c r ir e u n p e t it p r o g r a m m e d ' e s sa i .

_______________________________________________________________

Solution

E n l a n g a g e C , u n t a b le a u n e p e u t ê tr e t r a n s m i s qu e p a r a d r e s se ( en t o u te r i g u e u r , C n ' a u t o r is e q u e l a t r a n s m i ssi o n p a r
v a l e u r m a i s , da n s l e c a s d ' u n t a b l e a u , o n t r a n s m e t u n e v a l e u r d e t y p e p o i n te u r q u i n ' e s t r i e n d ' a u t r e q u e l ' a d r e s s e d u
t a b l e a u! ) . E n c e q u i c o n c e r n e s o n n o m b r e d ' é lé m e n t s , o n p e u t in d i ff é r e m m e n t e n tr a n s m e t tr e l' a d r e s s e ( so u s f o r m e d ' u n
p o i n t e u r d e t y p e in t * ) , o u l a v a l e u r ; i c i, l a s e c o n d e s o l u ti o n e s t la p l u s n o r m a l e .

E n r e v a n c h e , e n c e q u i c o n c e r n e le m a x i m u m e t le m i n im u m , i ls n e p e u v e n t p a s ê t re t ra n s m i s p a r v a l e u r , p u i s q u ' i ls
d o i v e n t p r é c i s é m e n t ê t re d é t e rm i n é s p a r l a f o n c t io n . I l f a u t d o n c o b li g a to i r e m e n t p r é v o i r d e p a s s e r d e s p o i n te u r s s u r d e s
flo a t . L ' e n - tê t e d e n o t r e f o n c t io n p o u r r a d o n c s e p r é s e n t e r a i n si ( n o u s n e d o n n o n s p l u s t o u t e s l e s é c r it u r e s p o s si b l e s ) :

void maxmin (int t[], int n, int * admax, int * admin)

L ' a l g o r it h m e d e r e c h e r c h e d e m a x im u m e t d e m i n im u m p e u t ê tr e c a lq u é s u r c e lu i d e l' e x e r c ic e V . 2 , e n r e m p l a ç a n t m a x
p a r * a d m a x e t m i n p a r * a d m i n . C e l a n o u s c o n d u i t à l a f o n c t io n s u i v a n t e :

void maxmin (int t[], int n, int * admax, int * admin)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 58/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

58 Exercices en langage C
{
int i ;
*admax = t[1] ;
*admin = t[1] ;
for (i=1 ; i<n ; i++)
{ if (t[i] > *admax) *admax = t[i] ;
if (t[i] < *admin) *admin = t[i] ;
}
}

S i l ' o n s o u h a i te é v i t e r le s " i n di r e c ti o n s " q u i a p p a r a i ss e n t sy s t é m a t iq u e m e n t d a n s l e s i n s tr u c t io n s d e c o m p a r a i so n , o n p e u t


" t r a v a i ll e r" t e m p o r a i r e m e n t s u r d e s v a r i a b l es l o c a l e s à la f o n c t io n ( n o m m é e s i c i m a x e t m in ) . C e l a n o u s c o n d u i t à u n e

f o n c t io n d e l a f o rm e s u i v a n t e :
void maxmin (int t[], int n, int * admax, int * admin)
{
int i, max, min ;
max = t[1] ;
min = t[1] ;
for (i=1 ; i<n ; i++)
{ if (t[i] > max) max = t[i] ;
if (t[i] < min) min = t[i] ;
}
*admax = max ;
*admin = min ;

V o i c i u n p e ti t e x e m p l e d e p r o g r a m m e d ' u t il i sa t io n d e n o t re f o n c t io n :

#include <stdio.h>
main()
{
void maxmin (int [], int, int *, int *) ;
int t[8] = { 2, 5, 7, 2, 9, 3, 9, 4} ;
int max, min ;
maxmin (t, 8, &max, &min) ;
printf ("valeur maxi : %d\n", max) ;
printf ("valeur mini : %d\n", min) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 59/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . T a b l e a u x e t p o i n te u r s 59
Ex e rc ic e V . 8

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n q u i f o u r n it e n r e t o u r la s o m m e d e s v a l e u r s d ' u n t a b le a u d e f lo t ta n t s à d e u x i n d i c e s d o n t l es
d i m e n s i o n s so n t fo u r n i e s e n a r g u m e n t .

_______________________________________________________________

Solution

P a r a na l o g i e a v e c c e q u e n o u s a v i o n s fa i t d a n s l ' e x e r c i c e V . 6 , n o u s p o u r r i o n s so n g e r à d é c la r e r l e t a b le a u c o n c e r n é d a n s
l ' e n - t ê te d e l a f o n c ti o n s o u s l a f o r m e t[][]. M a i s , c e l a n ' e s t p lu s p o ss i b le c a r , c e t t e fo i s , p o u r d é t e r m i n e r l' a d r e ss e d ' u n
é l é m e n t t[i][j] d ' u n t e l ta b l e a u , l e c o m p i la t e u r d o i t e n c o n n a î tr e l a d eu x i è m e d i m e n si o n .

U n e s o l u t io n c o n s i st e à c o n s i d ér e r q u ' o n r e ç o i t u n p o i n te u r ( d e t y p e float* ) su r l e d é b u t d u t a b le a u e t d ' en p a r c o u r i r t o u s


l e s é lé m e n t s (a u n o m b r e d e n * p s i n e t p d é s ig n e n t l e s d i m e n s io n s d u t a b l e a u ) c o m m e s i l ' o n a v a it a f fa i r e à u n t a b l e a u à
u n e d i m e n si o n .

C e l a n o u s c o n d u i t à c e t t e fo n c t i o n :

float somme (float * adt, int n, int p)


{
int i ;
float s ;
for (i=0 ; i<n*p ; i++) s += adt[i] ; /* ou s += *(adt+i) */
return s ;
}

P o u r u t i l i se r u n e t e l le f o n c t i o n , l a s e u l e d i f f i c u l t é c o n s i s te à l u i tr a n s m e t t r e e f fe c t i v e m e n t l ' a d r e s se d e d é b u t d u t a b l e a u ,
s o u s l a fo r m e d ' u n p o i n t e u r d e ty p e int * . O r , a v e c , p a r e x e m p l e t[ 3 ] [ 4 ] , t , s ' i l c o r r r e s p o n d b i e n à l a b o n n e a d r e s s e , e s t
d u t y p e " p o i n te u r s u r d e s t a b le a u x d e 4 f l o tt a n t s" . A p r i o r i , t o u te f o i s, c o m p t e t e n u d e l a p r é s e n c e d u p r o t o ty p e , l a
c o n v e r s i o n v o u l u e s e ra m i s e e n o e u v r e a u t o m a t iq u e m e n t p a r l e c o m p i la t e u r . T o u t e f o is , c o m m e n o u s l ' a v o n s d é j à d i t d a n s
l ' e x e r c i c e V . 5 , o n y g a g n e r a e n l i si b i li té ( e t e n é v e n t u e l s m e s s a g e s d ' a v e r t i s se m e n t !) e n f a is a n t a p p e l à l ' o p é r a t e u r d e
"cast".

V o i c i f in a l e m e n t u n e x e m p l e d ' u n t e l p r o g r a m m e d ' u t i li s a ti o n d e n o t r e fo n c t i o n :

#include <stdio.h>
main()
{

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 60/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

60 Exercices en langage C
float somme (float *, int, int) ;
float t[3] [4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } ;
printf ("somme : %f\n", somme ((float *)t, 3, 4) ) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 61/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I: L ES C H A IN ES D E
CARACTERES

E x e r c ic e V I. 1

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
main()
{
char * ad1 ;
ad1 = "bonjour" ;
printf ("%s\n", ad1) ;
ad1 = "monsieur" ;
printf ("%s\n", ad1) ;
}

_______________________________________________________________

Solution
L ' i n s t r u c t i o n a d 1 = " b o n jo u r" p l a c e d a n s l a v a r i a b l e a d 1 l ' a d r e s s e d e l a c h a î n e c o n s t a n t e " b o n j o u r " . L ' i n s tr u c t io n p r i n t f
( " % s \ n " , a d1 ) s e c o n t e n t e d ' a f fi c h e r l a v a l e u r d e l a c h a î n e d o n t l ' a d r e s s e fi g u r e d a n s a d 1 , c ' e s t -à - d ir e , e n l ' o c c u r r e n c e
" b o n j o u r " . D e m a n i è re c o m p a r a b le , l ' i n s tr u c ti o n a d 1 = " m o n si e ur " p l a c e l ' a d r e s s e d e l a c h a î n e c o n s t a n t e " m o n s ieu r "

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 62/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

62 Exercices en langage C
d a n s a d 1 ; l ' i n s t r u c t i o n p r i n t f ( " % s \ n " , a d 1 ) a f fi c h e l a v a l e u r d e l a c h a î n e a y a n t m a i n te n a n t l ' a d r e s s e c o n t e n u e d a n s a d 1 ,
c ' e s t - à - di r e m a i n te n a n t " m o n s ieu r " .

F in a l e m e n t , c e p r o g r a m m e a f f ic h e t o u t si m p l e m e n t :

bonjour
monsieur

O n a u r a i t o b t e n u p l u s si m p l e m e n t le m ê m e r é s u lt a t e n é c r i v a n t :

printf ("bonjour\nmonsieur\n") ;

E x e r c ic e V I. 2

___________________________________________________________________________

Enoncé

Q u e l s ré s u l ta t s f o u r n ir a c e p r o g r a m m e :

#include <stdio.h>
main()
{
char * adr = "bonjour" ; /* 1 */
int i ;
for (i=0 ; i<3 ; i++) putchar (adr[i]) ; /* 2 */
printf ("\n") ;
i = 0 ;
while (adr[i]) putchar (adr[i++]) ; /* 3 */
}

_______________________________________________________________

Solution

L a d é c l a r a ti o n / * 1 * / p l a c e d a n s l a v a r ia b l e a d r , l ' a d r e s s e d e l a c h a î n e c o n s t a n t e b o n j o u r . L ' i n s t ru c t io n / * 2 * / a f fic h e


l e s c a r a c t è r e s a d r [ 0 ] , a d r [ 1 ] e t a d r [ 2 ] , c ' e s t -à - d ir e l e s 3 p r e m i e r s c a ra c t è r e s d e c e t t e c h a î n e . L ' i n s t ru c t i o n / * 3 * / a f f ic h e
t o u s l e s c a r a c t è r e s à p a r t i r d e c e l u i d ' a d r e s s e a d r , t a n t q u e l ' o n a p a s a f fa i r e à u n c a r a c t è r e n u l ; c o m m e n o t r e c h a î n e

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 63/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Les ch aînes de caractères 63


" b o n j o u r " e s t p r é c is é m e n t t e rm i n é e p a r u n t e l c a r a c tè r e n u l , c e t te i n s t ru c t io n a f fi c h e f in a l e m e n t , u n p a r u n , t o u s l e s
caractères de "bo njour".

E n d é f in i ti v e , l e p r o g r a m m e f o u r n i t si m p l e m e n t l e s r é s u lt a ts s u i v a n t s :

bon
bonjour

E x e r c ic e V I. 3

___________________________________________________________________________

Enoncé

E c r i r e l e p r o g r a m m e p r é c é d e n t ( E x e r c ic e V I . 2 ), s a n s u t i li s er l e " f o r m a l i sm e t a b l ea u " ( i l e x i s te p l u s i eu r s s o l u t io n s ) .

_______________________________________________________________

Solution

V o i c i d e u x s o l u t io n s p o s si b l e s :

a ) O n p e u t r e m p l a c e r sy s t é m a t iq u e m e n t la n o t a t io n a d r [ i ] p a r * ( a dr + i ) , c e q u i c o n d u it à c e p r o g r a m m e :

#include <stdio.h>
main()
{
char * adr = "bonjour" ;
int i ;
for (i=0 ; i<3 ; i++) putchar (*(adr+i)) ;
printf ("\n") ;
i = 0 ;
while (adr[i]) putchar (*(adr+i++)) ;
}

b ) O n p e u t é g a l e m e n t p a r c o u r i r n o tr e c h a î n e , n o n p l u s à l' a i de d ' u n " i n d i c e " i , m a i s e n i n c r é m e n t a n t u n p o i n te u r d e t y p e


c h a r * : i l p o u r ra i t s' a g i r to u t si m p l e m e n t d e a d r , m a i s g é n é r a l e m e n t , o n p r é f é r e r a n e p a s d é tr u i r e c e tt e in f o r m a t io n e t e n
e m p l o y e r u n e c o p ie :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 64/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

64 Exercices en langage C
#include <stdio.h>
main()
{
char * adr = "bonjour" ;
char * adb ;
for (adb=adr ; adb<adr+3 ; adb++) putchar (*adb) ;
printf ("\n") ;
adb = adr ;
while (*adb) putchar (*(adb++)) ;
}

N o t e z b ie n q u e s i n o u s i n c r é m e n t io n s d ir e c t e m e n t a d r d a n s l a p r e m i è r e in s t r uc t i o n d ' a f f ic h a g e , n o u s n e d i sp o se r i o n s p l u s

d e l a " b o n n e a d r e s s e " p o u r l a d e u x i è m e i n s tr u c t io n d ' a f fic h a g e .

E x e r c ic e V I. 4

___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i d e m a n d e à l ' u t il i sa t e u r d e l u i f o u r n i r u n n o m b r e e n t i e r e n t r e 1 e t 7 e t q u i a f fic h e l e n o m d u j o u r
d e l a s em a i n e a y a n t l e n u m é r o i n d iq u é ( lu n d i p o u r 1 , m a r d i p o u r 2 , . . . d im a n c h e p o u r 7 ) .

_______________________________________________________________

Solution

Une démarche consiste à créer un "tableau de 7 pointeurs sur des chaînes", correspondant chacune au nom d'un jour de
l a s e m a i n e . C o m m e c e s c h a î n e s s o n t ic i c o n s t a n te s , i l e s t p o ss i b l e d e c r é e r u n t e l ta b l e a u p a r u n e d é c l a ra t io n c o m p o r t a n t
u n e i n t i a l i sa t i o n d e l a f o r m e :

char * jour [7] = { "lundi", "mardi", ...

N ' o u b l i e z p a s a l o r s q u e j o u r [ 0 ] c o n t i e n dr a l ' a d r e s se d e l a p r e m i è r e c h a î n e , c ' e s t - à -d i r e l' a d r e ss e d e l a c h a î n e c o n s t a n t e


" l u n d i " ; j o u r [ 1 ] c o n t i e n dr a l ' a d r e s s e d e " m a r d i " , . . .

P o u r a f fic h e r l a v a l e u r d e l a c h a î n e d e r a n g i , i l su f f it d e r e m a r q u e r q u e s o n a d r e s s e e s t si m p l e m e n t j o u r [ i - 1 ].

D ' o ù le p ro g ra m m e d e m a n d é :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 65/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Les ch aînes de caractères 65


#include <stdio.h>
main()
{
char * jour [7] = { "lundi", "mardi", "mercredi", "jeudi",
"vendredi", "samedi", "dimanche"
} ;
int i ;
do
{ printf ("donnez un nombre entier entre 1 et 7 : ") ;
scanf ("%d", &i) ;
}
while ( i<=0 || i>7) ;
printf ("le jour numéro %d de la semaine est %s", i, jour[i-1]) ;
}

E x e r c ic e V I. 5

___________________________________________________________________________

Enoncé

E c r i r e u n p r o g r a m m e q u i l it d eu x n o m b r e s e n ti e rs f o u r n i s o b l ig a t o ir e m e n t su r u n e m ê m e l ig n e . L e p r o g r a m m e n e d e v r a
p a s " s e p l a n t e r " e n c a s d e r é p o n s e i n c o r r e c t e (c a r a c t è r e s i n v a l i d e s) c o m m e l e f e r a it s c a nf ( " % d % d " , . . . ) m a i s
s i m p l e m e n t a ff ic h e r u n m e s s a g e e t r e d e m a n d e r u n e a u t re r é p o n s e . I l d e v r a e n a ll e r d e m ê m e l o r s q u e la r é p o n s e f o u r n i e
n e c o m p o r t e p a s a s s e z d ' i n f o r m a t i o n s . E n r e v a n c h e , l o r s q u e l a r é p o n s e c o m p o r t e r a tr o p d ' i n f o r m a t io n s , l e s d e r n i è r e s
devront être ignorées.

L e t r a i te m e n t ( d e m a n d e d e 2 n o m b r e s e t a f fic h a g e ) d e v r a s e p o u r su i v r e j u s q u ' à c e q u e l e p r e m i e r n o m b r e f o u r n i so i t 0 .

V o ic i u n e x e m p l e d ' e x é c u ti o n d ' u n t e l p r o g ra m m e :

--- donnez deux entiers : é


réponse erronée - redonnez-la : 2 15
merci pour 2 15

--- donnez deux entiers : 5


réponse erronée - redonnez-la : 4 12
merci pour 4 12
--- donnez deux entiers : 4 8 6 9
merci pour 4 8
--- donnez deux entiers : 5 é3

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 66/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

66 Exercices en langage C
réponse erronée - redonnez-la : 5 23
merci pour 5 23
--- donnez deux entiers : 0 0
merci pour 0 0

R e m a r q u e : o n p e u t u t i l i se r l e s f o n c t i o n s g e t s e t s s c a n f .

_______________________________________________________________

Solution

C o m m e le s u g g è r e l a r e m a r q u e d e l ' é n o n c é , o n p e u t ré s o u d r e l e s p r o b l è m e s p o s é s e n e f fe c t u a n t e n d e u x te m p s l a le c t u r e
d ' u n c o u p l e d ' e n t ie r s :

- l e c tu r e d ' u n e c h a î n e d e c a r a c t è r e s ( c ' e s t - à -d i r e u n e s u i te d e c a r a c t è r e s a b s o l u m e n t q u e lc o n q u e s , v a l i d é e p a r
" r e t u r n " ) a v e c l a f o n c t io n g e t s ,
- " d é c o d a g e " d e c e t t e c h a î n e a v e c s s c a n f , s u i v a n t u n " f o r m a t " , d ' u n e m a n i è re c o m p a r a b le à c e q u e f e r a it s c a n f , à
p a r t ir d e s o n " t a m p o n d ' e n t r é e " .
R a p p e lo n s q u e s s c a n f , t o u t c om m e s c a n f , f o u r n i t e n r e t o u r l e n o m b r e d ' i n f o r m a t io n s c o r r e c t e m e n t l u e s , d e so r t e q u ' i l
s u f fi t d e r é p é t e r le s d e u x o p é r a t i o n s p r é c é d e n t e s ju s q u ' à c e q u e l a v a l e u r f o u r n i e p a r s s c a n f so i t é g a l e à 2 .

L ' é n o n c é n e f a it a u c u n e h y p o t h è s e s u r le n o m b r e m a x i m a l d e c a r a c tè r e s q u e l ' u t il i sa t e u r p o u r r a ê t re a m e n é à f o u r n i r . I c i ,
n o u s a v o n s s u p p o s é q u ' a u p l u s 1 2 8 c a r a c t è r e s s e r a i e n t fo u r n i s ; il s ' a g i t là d ' u n e h y p o t h è s e q u i , d a n s l a p r a t i q u e , s ' a v è r e
r é a l i st e , da n s l a m e s u r e o ù o n r i s q u e r a r e m e n t d e f r a p p e r d e s l ig n e s p l u s l o n g u e s ; d e su r c r o î t , i l s ' a g i t m ê m e d ' u n e
l im i ta t io n " n a t u r e l le " d e c e r t a in s e n v i r o n n e m e n t s ( D O S , e n p a r t ic u l i e r) .

V o ic i le p r o g r a m m e d e m a n d é :

#include <stdio.h>
#define LG 128 /* longueur maximale d'une ligne */
main()
{
int n1, n2 ; /* entiers à lire en donnée */
int compte ; /* pour la valeur de retour de sscanf */
char ligne [LG+1] ; /* pour lire une ligne (+1 pour \0) */

/* boucle de lecture des différents couples de valeurs */


do
{ /* boucle de lecture d'un couple de valeur jusqu'à OK */
printf ("--- donnez deux entiers : ") ;
do
{ gets (ligne) ;
compte = sscanf (ligne, "%d %d", &n1, &n2) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 67/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Les ch aînes de caractères 67


if (compte<2) printf ("réponse erronée - redonnez-la : ") ;
}
while (compte < 2) ;
printf ("merci pour %d %d\n", n1, n2) ;
}
while (n1) ;
}

Remarques

1 ) S i l ' u t il i sa t e u r f o u r n i t p l u s d e c a r a c t è r e s q u ' i l n ' e n f a u t p o u r f o r m e r 2 n o m b r e s e n t i e r s, c e s c a r a c t è r e s ( lu s d a n s


l i g n e ) n e s e r o n t p a s u t i l i s é s p a r s s c a n f ; m a l g r é t o u t, i l s n e s e r o n t p a s e x p l o i t é s u lt é r ie u r e m e n t p u i s q u e , l o r s q u e l ' o n
r e d e m a n d e r a 2 n o u v e a u x e n t i e r s , o n r e li ra u n e n o u v e l le c h a î n e p a r g e t s .
2 ) S i l ' o n s o u h a i te a b so l u m e n t p o u v o i r l im i te r l a l o n g u e u r d e l a c h a î n e l u e a u c l a v i e r , e n u t il i sa n t d e s i n s tr u c t io n s
" p o r t a b l e s " , i l f a u t s e t o u r n e r v e r s l a f o n c t i o n fg e ts 1 d e s t in é e à l ir e u n e c h a î n e d a n s u n f ic h i e r , e t l ' a p p l i q u e r à s t d i n .
O n r e m p l a c e r a l ' i n st r u c ti o n g e t s ( l i g n e ) p a r f g e t s ( l i g n e , L G , s t d i n ) q u i li m i te r a à L G l e n o m b r e d e c a r a c t è r e s p r is e n
c o m p t e . N o t e z t o u te f o is q u e , d a n s c e c a s , l e s c a r a c t è r e s e x c é d e n t a ir e s (e t d o n c n o n " v u s " p a r fg e ts ) r e s t e r o n t
disponibles pour une prochaine lecture (ce qui n'est pas pire que dans la situation actuelle où ces caractères
v i e n d r a i e n t é c r a s e r d e s e m p l a c e m e n t s m é m o i r e si tu é s a u - d e l à d u ta b l e a u l i g n e ! ) .
D a n s c e r t a in e s im p l é m e n t a ti o n s ( T u r bo / B o r la n d C / C + + e t Q u ic k C / C M ic r o so f t ), i l e x i st e u n e f o n c t io n ( n o n
p o r ta b l e , p u i s q u e n o n p r é v u e p a r la n o r m e A N S I ) n o m m é e c g e t s q u i , u t i l i s é e à l a p l a c e d e g e t s ( o u fg e ts ) p e rm e t d e
r é g l e r le p r o b l è m e é v o q u é . E n e f f e t , c g e t s p e r m e t d e l ir e u n e c h a î n e , e n l im i ta n t le n o m b r e d e c a r a c t è r e s
e f fe c t iv e m e n t f o u r n i s a u c l a v i e r : i l n ' e s t p a s p o s si b l e à l ' u t il i sa t e u r d ' e n f r a p p e r p l u s q u e p r é v u , d e s o r t e q u e l e r is q u e
d e c a r a c t è r e s e x c é d e n t a i r es n ' e x i s te p l u s !

E x e r c ic e V I. 6

___________________________________________________________________________

1 M a i s , s i v o u s r é a l is ez c e s e x er c i c e s e n a c c o m p a g n e m e n t d ' u n c o u r s d e l a n g a g e C , i l e s t p r o b a b l e q u e v o u s n ' a u r e z p a s e n c o r e é t u d i é l a f o n c ti o n
fgets ( en g é n ér a l , e l l e e s t in t r o d u i t e d a n s l e c h a p i t r e r e l a t if a u t r a it e m e n t d e s f i c h i e r s ) . C e r t a i n s e x e r c i c e s d e la s e c o n d e p a r t i e d e c e t o u v r a g e f er o n t
a p p e l à f g e t s, e t / o u à s s c a n f .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 68/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

68 Exercices en langage C
Enoncé

E c r ir e u n p r o g r a m m e d é t e r m i n a n t l e n o m b r e d e l e tt r e s e ( m i n u s c u l e ) c o n t e n u e s d a n s u n t e x te f o u r n i e n d o n n é e s o u s
f o r m e d ' u n e s eu l e l ig n e n e d é p a s s a n t pa s 1 2 8 c a r a c t è r e s. O n c h e r c h e r a , i c i, à n ' u t il i se r a u c u n e d es f o n c t io n s d e
t r a it e m e n t d e c h a î n e .

_______________________________________________________________

Solution

C o m p t e te n u d e s c o n t r a i n te s im p o s é e s p a r l ' é n o n c é , n o u s n e p o u v o n s p a s f a ir e a p p e l à l a f o n c t io n s t r l e n . P o u r " e x p l o r e r "


n o t r e c h a î n e , n o u s u t i li se r o n s le f a it q u ' e l l e e s t t e r m i n é e p a r u n c a r a c t è r e n u l (\ 0 ] . D ' o ù l e p r o g r a m m e p r o p o s é :
#define LG_LIG 128
#include <stdio.h>
main()
{
char ligne [LG_LIG+1] ; /* pour lire une ligne au clavier +1 pour \0 */
int i ; /* pour explorer les différents caractères de ligne */
int ne ; /* pour compter le nombre de 'e' */

printf ("donnez un texte de moins d'une ligne : \n") ;


gets (ligne) ;

ne = 0 ;
i = 0 ;
while (ligne[i]) if (ligne[i++] == 'e') ne++ ;

printf ("votre texte comporte %d lettres e", ne) ;


}

E x e r c ic e V I. 7

___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i li t, e n d o n n é e , u n v e r b e d u p r e m i e r g r o u p e e t q u i e n a f f ic h e l a c o n j u g a i so n a u p r é s e n t d e
l ' i n d i c a t i f , so u s l a fo r m e :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 69/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Les ch aînes de caractères 69


je chante
tu chantes
il chante
nous chantons
vous chantez
ils chantent

O n s ' a s s u r e r a q u e l e m o t fo u r n i s e te r m i n e b i en p a r " er " . O n su p p o ser a q u ' i l s ' a g i t d ' u n v e r b e r é g u l i e r ; a u t re m e n t d i t,


o n a d m e t tr a q u e l ' u t i li s a te u r n e f o u r n ir a p a s u n v e r b e t e l q u e m a n g e r ( l e p r o g ra m m e a f f ic h e r a i t a lo r s : n o u s m a n g o n s ! ) .

_______________________________________________________________

Solution

O n l ir a " c l a s si q u e m e n t " u n m o t , so u s fo r m e d ' u n e c h a î n e à l ' a i d e d e la f o n c t io n g e t s . P o u r v é r i f ie r s a t e r m i n a iso n p a r


" e r " , o n c o m p a r e r a a v e c l a c h a î n e c o n s ta n t e " e r " , la c h a î n e a y a n t c o m m e a d r e s se l ' a d r e ss e d e f in d u m o t , d i m i n u é e d e 2 .
L ' a d r e s s e d e f i n se d éd u i r a d e l' a d r e ss e d e d é b u t e t d e la l o n g u e u r d e l a c h a î n e ( o b te n u e p a r l a fo n c t i o n s t r l e n ) .

Q u a n t à l a c o m p a r a i so n v o u l u e , e l l e s e f e ra à l ' a i de d e l a f o n c t i o n s t r c m p ; r a p p e l o n s q u e c e t t e d e r n i è r e r e ç o i t e n
a r g u m e n t 2 p o i n t e u r s su r d e s c h a î n e s e t q u ' e l l e fo u r n i t e n r e to u r u n e v a l e u r n u l le l o r s q u e l e s d e u x c h a î n e s
c o r r e s p o n d a n t e s s o n t é g a l e s e t u n e v a l e u r n o n n u l le d a n s t o u s l e s a u tr e s c a s .

L e s d i f f é re n t e s p e r so n n e s d u v e r b e s ' o b t ie n n e n t e n r e m p l a ç a n t , da n s la c h a î n e e n q u e s t io n , l a t e r m i n a i so n " e r " p a r u n e


t e r m i n a i so n a p p r o p r i é e . O n p e u t , p o u r c e l a , u t i li se r l a f o n c t i o n s t r c p y q u i r e c o p i e u n e c h a î n e d o n n ée ( ic i l a t e r m i n a i so n )
à u n e a d r e s s e d o n n é e ( ic i , c e l l e d é j à u t i li s é e d a n s s t r c m p p o u r v é r i f ie r q u e l e v e r b e s e t e r m i n e b ien p a r " er " ) .

L e s d i f f é r e n t es t e r m i n a iso n s p o s si b l e s s e r o n t r a n g é e s d a n s u n t a b le a u d e c h a î n e s c o n s t a n t e s ( p lu s p r é c i s ém e n t , d a n s u n
t a b l e a u d e p o i n t e u r s s u r d e s c h a î n e s c o n s t a n t e s ). N o u s fe r o n s d e m ê m e p o u r l es d i f f é re n t s s u je t s (j e , t u . . . ) ; e n r e v a n c h e ,
i c i , n o u s n e c h e r c h e r o n s p a s à l e s " c o n c a t é n e r " a u v e r b e c o n j u g u é ; n o u s n o u s c o n t e n t o n s d e le s é c r i re , a u m o m e n t
opportun.

V o ic i fin a l e m e n t le p r o g ra m m e d e m a n d é :

#include <stdio.h>
#include <string.h>
#define LG_VERBE 30 /* longueur maximale du verbe fourni en donnée */
main()
{ char verbe [LG_VERBE+1] ; /* verbe à conjuguer +1 pour \0 */
char * sujet [6] = { "je", "tu", "il", "nous", "vous", "ils"} ; /* sujets */
char * term [6] = { "e", "es", "e", "ons", "ez", "ent" } ;/* terminaisons */
int i ;
char * adterm ; /* pointeur sur la terminaison du verbe */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 70/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

70 Exercices en langage C
do
{ printf ("donnez un verbe régulier du premier groupe : ") ;
gets (verbe) ;
adterm = verbe + strlen(verbe) - 2 ;
}
while (strcmp (adterm, "er") ) ;

printf ("conjugaison à l\'indicatif présent :\n") ;


for (i=0 ; i<6 ; i++)
{ strcpy (adterm, term[i]) ;
printf ("%s %s\n", sujet[i], verbe) ;
}
}

R e m a r q u e : r a p p e l o n s q u e s t r c p y r e c o p i e ( sa n s a u c u n c o n t r ô le ) la c h a î n e d o n t l' a d r e s s e e s t fo u r n i e e n p r e m i e r a r g u m e n t
( c ' e s t -à - d ir e , e n f a it , t o u s le s c a r a c t è r e s à p a r t ir d e c e t t e a d r e s s e , j u s q u ' à c e q u e l ' o n r e n c o n t r e u n \ 0 ) à l ' a d r e s s e f o u r n i e
e n s e c o n d a r g u m e n t ; d e p l u s , e l le c o m p l è te b i e n l e to u t a v e c u n c a r a c t è r e n u l d e f i n d e c h a î n e .

E x e r c ic e V I. 8
___________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i su p p r i m e t o u t e s l e s le t tr e s e (m i n u s c u le ) d ' u n t e x t e d e m o i n s d ' u n e li g n e ( n e d é p a s s a n t p a s 1 2 8
c a r a c t è r e s ) f o u r n i e n d o n n é e . O n s ' a r r a n g e r a p o u r q u e l e t e x te a i n si m o d i f ié s o i t c r é é e n m é m o i r e , à l a p l a c e d e
l'ancien .

N . B . o n p o u r r a u t il i se r l a f o n c t i o n s t r c h r .

_______________________________________________________________

Solution

L a f o n c t i o n s t r c h r p e r m e t d e tr o u v e r u n c a r a c t è r e d o n n é d a n s u n e c h a î n e . E l le e s t do n c t o u t à f a it a p p r o p r i é e p o u r
l o c a l i s er l e s ' e ' ; i l f a u t t o u t e f o i s n o t e r q u e , p o u r l o c a l i s er t o u s l e s ' e ' , i l e s t n é c e s s a i r e d e r é p é t e r l ' a p p e l d e c e t t e

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 71/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Les ch aînes de caractères 71


f o n c t io n , e n m o d i f ia n t à c h a q u e f o i s l ' a d r e ss e d e d é b u t d e l a c h a î n e c o n c e r n é e ( i l f a u t é v it e r d e b o u c l e r su r l a r e c h e r c h e
d u m ê m e c a r a c t è re ' e ' ) .

L a f o n c t io n s t r c h r f o u r n i t l ' a d r e s s e à l a q u e l l e o n a t r o u v é l e p r e m i e r c a r a c t è re i n d i q u é ( o u l a v a l e u r 0 s i c e c a r a c t è r e
n'existe pas). La suppression du 'e' trouvé peut se faire en recopiant le "reste" de la chaîne à l'adresse où l'on a
t r o u v é le ' e ' .
V o i c i u n e s o l u t io n p o s si b l e :

#include <stdio.h>
#include <string.h>

#define LG_LIG 128 /* longueur maximum d'une ligne de données */


#define CAR 'e' /* caractère à supprimer */

main()
{
char ligne [LG_LIG+1] ; /* pour lire une ligne +1 pour \0 */
char * adr ; /* pointeur à l'intérieur de la ligne */

printf ("donnez un texte de moins d'une ligne : \n") ;


gets (ligne) ;
adr = ligne ;

while (adr = strchr (adr,'e') ) strcpy (adr, adr+1) ;


printf ("voici votre texte, privé des caractères %c :\n") ;
puts (ligne) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 72/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 73/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V II : L E S S T R U C T U R ES

E x e r c ic e V II. 1
___________________________________________________________________________

Enoncé

S o it l e m o d è l e ( t y p e ) d e s t r u c tu r e s u i v a n t :

struct s_point
{ char c ;
int x, y ;
} ;

E c r ir e u n e f o n c t i o n q u i r e ç o i t e n a r g u m e n t u n e s t r u c tu r e d e t y p e s _ p o i n t e t q u i e n a f fi c h e l e c o n t e n u s o u s la f o r m e :

point B de coordonnées 10 12

a ) E n t r a n s m e t ta n t e n a r g u m e n t la v a l e u r d e l a s t r u c tu r e c o n c e r n é e ,

b ) E n t r a n s m e t ta n t e n a r g u m e n t l' a d r e s s e d e l a s t r u c tu r e c o n c e r n é e .

D a n s l e s d e u x c a s , o n é c r ir a u n p e t i t p ro g r a m m e d ' e s sa i d e l a f o n c t io n a i n si r é a l i s ée .

_______________________________________________________________

Solution

a ) V o i c i l a fo n c t i o n d e m a n d é e :

#include <stdio.h>

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 74/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

74 Exercices en langage C

void affiche (struct s_point p)


{ printf ("point %c de coordonnées %d %d\n", p.c, p.x, p.y) ;
}

N o t e z q u e s a c o m p i la t io n n é c e s s it e o b l ig a t o i r e m e n t la d é c l a ra t i o n d u t y p e s _ p o i n t , c ' e s t - à - d ir e l e s i n s t r u c t i o n s :

struct s_point
{ char c ;
int x, y ;
} ;

V o i c i u n p e t it p r o g r a m m e q u i a f f e c te le s v a le u r s ' A ' , 1 0 e t 1 2 a u x d i ff é r e n ts c h a m p s d ' u n e s tr u c t u r e n o m m é e s , a v a n t


d ' e n a f fi c h e r l e s v a l e u r s à l ' a i d e d e l a f o n c t io n p r é c é d e n t e :

main()
{ void affiche (struct s_point) ; // déclaration (prototype) de affiche
struct s_point s ;
s.c = 'A' ;
s.x = 10 ;
s.y = 12 ;
affiche (s) ;
}

N a t u r e l le m e n t , la r e m a r q u e p r é c é d e n t e s ' a p p l iq u e é g a l e m e n t ic i . E n p r a t iq u e , l a d é c la r a t io n d e l a s tr u c t u r e s _ p o i n t
f ig u r e r a d a n s u n f ic h i e r d ' e x t e n si o n h q u e l ' o n s e c o n t e n t e r a d ' i n c o r p o r e r p a r # i n c l u d e a u m o m e n t d e l a c o m p i la t io n . D e
m ê m e , i l e s t n é c e s s a i r e d ' i n c l u r e stdio.h .

b ) V o i c i l a n o u v e l le f o n c t io n d e m a n d é e :

#include <stdio.h>

void affiche (struct s_point * adp)


{ printf ("point %c de coordonnées %d %d\n", adp->c, adp->x, adp->y) ;
}

N o t e z q u e l ' o n d o i t, c e t te f o i s, f a ir e a p p e l à l ' o p é r a t e u r - > , à l a p l a c e d e l ' o p é r a t e u r p o i n t (. ) , p u i s q u e l ' o n " t ra v a i l le "


su r u n p o i n t e u r su r u n e s t r u c tu r e , e t n o n p l u s s u r l a v a l e u r d e la s t ru c t u r e e l le - m ê m e . T o u te f o i s l' u s a g e d e - > n ' e s t p a s
t o ta l e m e n t i n d i sp e n s a b l e , d a n s l a m e s u r e o ù , p a r e x e m p l e , a dp -> x e s t é q u i v a l e n t à ( * a d p ) . x .

V o i c i l ' a d a p t a t io n d u p r o g r a m m e d ' e ss a i p r é c é d e n t :

main()
{

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 75/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I . L e s s t r uc t u r e s 75
void affiche (struct s_point *) ;
struct s_point s ;
s.c = 'A' ;
s.x = 10 ;
s.y = 12 ;
affiche (&s) ;
}

Remar que :

A u l ie u d ' a f f e c t e r d e s v a l e u r s a u x c h a m p s c , x e t y d e n o t r e s tr u c t u r e s (d a n s l e s d e u x p r o g r a m m e s d ' e s sa i ), n o u s
p o u r r i o n s ( i c i ) u t i l i s e r l e s p o s s i b i l i t é s d ' i n i t i a l i s a t i o n o f f e rt e s p a r le l a n g a g e C , e n é c r iv a n t :

struct s_point s = {'A', 10, 12} ;

E x e r c ic e V II. 2

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n q u i " m e t à z é r o " l es d i f fé r e n t s c h a m p s d ' u n e s tr u c t u r e d u t y p e s _ p o i n t ( d é f i n i d a n s l ' e x e r c i c e


p r é c é d e n t ) q u i lu i e s t t r a n s m i s e e n a r g u m e n t . L a f o n c t i o n n e c o m p o r t e r a p a s d e v a l e u r d e r e t o u r .

_______________________________________________________________

Solution

I c i , b ie n q u e l ' é n o n c é n e l e p r é c i s e p a s , i l e s t n é c e s s a i r e d e t r a n s m e t tr e à l a f o n c t io n c o n c e r n é e , n o n p a s l a v a l e u r , m a i s
l ' a d r e s s e d e l a s tr u c t u r e à " r e m e t tr e à z é r o " . V o i c i la f o n c t i o n d e m a n d é e ( ic i , n o u s a v o n s r e p r o d u i t l a d é c l a ra t i o n d e
s _ p o in t) :

#include <stdio.h>

struct s_point
{ char c ;
int x, y ;
} ;

void raz (struct s_point * adr)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 76/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

76 Exercices en langage C
{ adr->c = 0 ;
adr->x = 0 ;
adr->y = 0 ;
}

V o i c i, à t it r e in d ic a t if , u n p e t it p r o g r a m m e d ' e ss a i ( sa c o m p i la t io n n é c e s s i te l a d é c l a ra t io n d e s _ p o i n t , a i n s i q u e l e fi c h i e 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) ;
}

E x e r c ic e V II. 3

___________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n q u i r e ç o i t e n a r g u m e n t l ' a d r e s s e d ' u n e s t r u c tu r e d u t y p e s _ p o i n t ( d é f in i d a n s l ' e x e r c ic e V I I . 1 ) e t q u i


r e n v o i e e n r é s u lt a t u n e s t ru c t u r e d e m ê m e t yp e c o r r e s p o n d a n t à u n p o i n t d e m ê m e n o m ( c ) e t d e c o o r d o n n é e s o p p o s é e s .

E c r ir e u n p e t it p r o g r a m m e d ' e s sa i .

_______________________________________________________________

Solution

B i e n q u e l ' é n o n c é n e p r é c i s e r ie n , l e r é s u l ta t d e n o t r e f o n c t io n n e p e u t ê t re t r a n s m i s qu e p a r v a l e u r . E n e f f e t , c e r é s u l ta t
d o i t ê t r e c r é é a u s e i n d e l a f o n c t i o n e l le - m ê m e ; c e l a si g n i f i e q u ' i l s e r a d é t r u i t d è s l a s o r t i e d e l a f o n c t i o n ; e n t r a n s m e t t r e

l ' a d r e s s e r e v i e n d r a i t à r e n v o y e r l ' a d r e s s e d e q u e l q u e c h o s e d e s t in é à d isp a r a î t r e . . .


V o ic i c e q u e p o u r r a i t ê t r e n o t r e f o n c ti o n ( ic i , e n c o r e , n o u s a v o n s r e p r o d u i t l a d é c l a r a ti o n d e s _ p o i n t ) :

#include <stdio.h>
struct s_point
{ char c ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 77/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I . L e s s t r uc t u r e 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 ;
}

N o t e z l a " d i s sy m é t r ie " d ' i n st r uc t i o n s t e ll e s q u e r e s . c = a dr -> c ; o n y f a it a p p e l à l ' o p é r a t e u r . à g a u c h e e t à l ' o p é r a t e u r


- > à d r o i te (o n p o u r r a i t c e p e n d a n t é c r i r e r e s .c = ( * a d r) . c .

V o i c i u n e x e m p l e d ' e s s a i d e n o t r e f o n c t i o n (i c i , n o u s a v o n s u t il i s é l e s p o s si b i l i t és d ' i n i t i a l i s a ti o n d ' u n e s t r u c t u r e p o u r


donne r des 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) ;
}

E x e r c ic e V II. 4

___________________________________________________________________________

Enoncé

S o it l a s tr u c t u r e s u i v a n t e , r e p r é s e n t a n t u n p o i n t d ' u n p l a n :

struct s_point
{ char c ;

int x, y ;
} ;

1 ) E c r i r e la d é c l a r a ti o n d ' u n t a b l e a u ( n o m m é c o u r b e ) d e N P p o i n t s ( N P s u p p o s é d é fi n i p a r u n e i n s t r u c ti o n # d e f i n e )

2 ) E c r i re u n e f o n c t io n ( n o m m é e a f f i c h e ) q u i a f f i c h e l e s v a l e u r s d e s d i f f é r e n t s " p o i n t s " d u t a b l e a u c o u r b e , t r a n s m i s en
a r g u m e n t , so u s la f o r m e :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 78/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

78 Exercices en langage C
point D de coordonnées 10 2

3 ) E c r i re u n p r o g r a m m e q u i :

- l it e n d o n n é e s d e s v a l e u r s p o u r l e t a b l e a u c o u r b e ; o n u t i l i s e r a d e p r é f é r e n c e l e s f o n c t i o n s g e t s e t s s c a n f , d e
p r é f é r e n c e à s c a n f ( v o ir é v e n t u e l le m e n t l' e x e r c ic e V I . 5 ) ; o n su p p o ser a q u ' u n e l i g n e d e d o n n é e n e p e u t p a s d é p a s s e r
128 caractères,
- f a it a p p e l à l a f o n c t i o n p r é c é d e n t e p o u r l e s a f f i c h e r .
_______________________________________________________________

Solution

1 ) I l su f f i t d e d é c l a r e r u n t a b l e a u d e s t r u c t u r e s :

struct s_point courbe [NP] ;

2 ) C o m m e c o u r b e e s t u n t a b l e a u , o n n e p e u t q u ' e n t r a n s m e t tr e l' a d r e s s e e n a r g u m e n t d e a f f i c h e . I l e s t p r é f é r a b l e d e
p r é v o i r é g a l e m e n t e n a r g u m e n t l e n o m b r e d e p o i n t s . V o i c i c e q u e p o u r r a i t ê t r e n o tr e f o n c t io n :

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<np ; i++)
printf ("point %c de coordonnées %d %d\n", courbe[i].c,
courbe[i].x, courbe[i].x) ;
}

C o m m e p o u r n ' i m p o r t e q u e l t a b le a u à u n e d i m e n si o n t r a n s m i s en a r g u m e n t , i l e s t p o s si b l e d e n e p a s e n m e n t io n n e r l a
d i m e n s io n d a n s l' e n - t ê t e d e l a fo n c t i o n . B i e n e n t e n d u , c o m m e , e n f a i t , l' i d e n t i fic a t e u r c o u r b e n ' e s t q u ' u n p o i n t e u r d e
t y p e s_ p o i n t * ( p o i n te u r s u r l a p r e m i è r e s tr u c t u r e d u t a b l e a u ) , n o u s a u r i o n s p u ég a l e m e n t é c r i r e s_ p o i n t * c o u r b e .

N
u t oiltieséz s q( uv eo ,i r ce o cmo m
m eb i àn é ls ').a cPc ao ru tu
e xme mé ep, l el ,e n"of tor re mf ao lni csm
t ioen taaubrlea ai tu p" u e ét g lael e"mf oe rnmt as 'lié sm
c r i er e p :o i n t e u r " p e u v e n t ê t r e i n d i ff é re m m e n t

void affiche (struct s_point * courbe, int np)


{
struct s_point * adp ;
int i ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 79/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I . L e s s t r uc t u r e s 79
for (i=0, adp=courbe ; i<np ; i++, adp++)
printf ("point %c de coordonnées %d %d", courbe->c, courbe->x, courbe->y) ;
}

3 ) C o m m e n o u s a v o n s a p p r i s à l e fa i r e d a n s l ' e x e r c i c e V I . 5 , n o u s l i ro n s l e s in f o r m a t io n s r e l a ti v e s a u x d if fé r e n t s p o i n t s à
l ' a i d e d e s d e u x f o n c t io n s :

- g e t s , p o u r l ir e , s o u s f o rm e d ' u n e c h a î n e , u n e l ig n e d ' i n f o r m a t io n ,
- s s c a n f , p o u r d é c o d e r su i v a n t u n f o r m a t le c o n t e n u d e l a c h a î n e a i n si l u e .
V o ic i c e q u e p o u r r a i t l e p r o g r a m m e d e m a n d é ( i c i , n o u s a v o n s r e p r o d u i t, à l a f o i s la d é c l a ra t io n d e s _ p o i n t e t l a f o n c t i o n
affiche p r é c é d e n t e ) :

#include <stdio.h>
struct s_point
{ char c ;
int x, y ;
} ;
#define NP 10 /* nombre de points d'une courbe */
#define LG_LIG 128 /* longueur maximale d'une ligne de donnée */
main()
{ struct s_point courbe [NP] ;
int i ;
char ligne [LG_LIG+1] ;
void affiche (struct s_point [], int) ;

/* lecture des différents points de la courbe */


for (i=0 ; i<NP ; i++)
{ printf ("nom (1 caractère) et coordonnées point %d : ", i+1) ;
gets (ligne) ;
sscanf (ligne, "%c %d %d", &courbe[i].c, &courbe[i].x, &courbe[i].y) ;
}
affiche (courbe, NP) ;
}

void affiche (struct s_point courbe [], int np)


{
int i ;
for (i=0 ; i<np ; i++)
printf ("point %c de coordonnées %d %d\n", courbe[i].c,
courbe[i].x, courbe[i].x) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 80/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

80 Exercices en langage C

E x e r c ic e V II. 5

___________________________________________________________________________

Enoncé

E c r ir e l e p r o g r a m m e d e l a q u e s ti o n 3 d e l' e x e r c i c e p r é c é d e n t , s a n s u t i li s e r d e s t r u c t u r e s. O n p r é v o i r a t o u j o u r s u n e
f o n c t i o n p o u r l ir e l e s in f o r m a t i o n s r e l a t iv e s à u n p o i n t .

_______________________________________________________________

Solution

I c i , il n o u s f a u t o b l ig a t o i r e m e n t p r é v o i r 3 t a b l e a u x d i ff é r e n ts d e m ê m e t a i ll e : u n p o u r l e s n o m s d e p o i n t s , u n p o u r l e u r s
a b s c i s s e s e t u n p o u r l e u r s o r d o n n é e s . L e p r o g r a m m e n e p r é s e n t e p a s d e d i f f ic u l t é s p a r ti c u l iè r e s ( so n p r i n c i p a l i n t é rê t e s t
d ' ê t r e c o m p a r é a u p r é c é d e n t !) .

#include <stdio.h>

#define NP 10 /* nombre de points d'une courbe */


#define LG_LIG 128 /* longueur maximale d'une ligne de donnée */
main()
{
char c [NP] ; /* noms des différents points */
int x [NP] ; /* abscisses des différents points */
int y [NP] ; /* ordonnées des différents points */
int i ;
char ligne [LG_LIG+1] ;
void affiche (char [], int[], int[], int) ;

/* lecture des différents points de la courbe */


for (i=0 ; i<NP ; i++)
{ printf ("nom (1 caractère) et coordonnées point %d : ", i+1) ;
gets (ligne) ;
sscanf (ligne, "%c %d %d", &c[i], &x[i], &y[i]) ;
}
affiche (c, x, y, NP) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 81/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I . L e s s t r uc t u r e s 81

void affiche (char c[], int x[], int y[], int np)
{
int i ;
for (i=0 ; i<np ; i++)
printf ("point %c de coordonnées %d %d\n", c[i], x[i], x[i]) ;
}

E x e r c ic e V II. 6

___________________________________________________________________________

Enoncé

S o ie n t l es d e u x m o d è l e s d e s t r uc t u r e d a t e e t p e r s o n n e d é c l a r é s a i n si :

#define LG_NOM 30
struct date
{ int jour ;
int mois ;
int annee ;
} ;

struct personne
{ char nom [LG_NOM+1] ; /* chaîne de caractères représentant le nom */
struct date date_embauche ;
struct date date_poste ;
} ;

E c r ir e u n e f o n c t i o n q u i r e ç o it e n a r g u m e n t u n e s t r u c tu r e d e t y p e p e r s o n n e e t q u i e n r e m p l it le s d i f f é r e n ts c h a m p s a v e c u n
d ia l o g u e s e p r é s e n t a n t so u s l' u n e d e s 2 f o r m e s s u i v a n t e s :

nom : DUPONT
date embauche (jj mm aa) : 16 1 75
date poste = date embauche ? (O/N) : O

nom : DUPONT
date embauche (jj mm aa) : 10 3 81
date poste = date embauche ? (O/N) : N
date poste (jj mm aa) : 23 8 91

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 82/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

82 Exercices en langage C
_______________________________________________________________

Solution

N o t r e f o n c ti o n d o i t m o d i fi e r le c o n t e n u d ' u n e s t ru c t u r e d e t y p e p e r s o n n e ; i l e s t d o n c n é c e s s a i r e q u ' e l l e e n r e ç o i v e
l ' a d r e s s e e n a r g u m e n t . I c i, l ' é n o n c é n ' i m p o s a n t a u c u n e p r o t e c t io n p a r t ic u l i è re c o n c e r n a n t l e s le c t u r e s a u c l a v i e r , n o u s
l ir o n s " c l a s si q u e m e n t " l e n o m p a r g e t s e t l e s tr o i s a u t re s i n f o r m a t i o n s n u m é r i q u e s p a r s c a n f . V o i c i c e q u e p o u r r a i t ê t r e la
f o n c t io n d e m a n d é e :

void remplit (struct personne * adp)


{
char rep ; /* pour lire une réponse de type O/N */

printf ("nom : ") ;


gets (adp->nom) ; /* attention, pas de contrôle de longueur */

printf ("date embauche (jj mm aa) : ") ;


scanf ("%d %d %d", &adp->date_embauche.jour,
&adp->date_embauche.mois,
&adp->date_embauche.annee) ;

printf ("date poste = date embauche ? (O/N) : ") ;


getchar () ; rep = getchar () ; /* premier getchar pour sauter \n */
if (rep == 'O') adp->date_poste = adp->date_embauche ;
else { printf ("date poste (jj mm aa) : ") ;
scanf ("%d %d %d", &adp->date_poste.jour,
&adp->date_poste.mois,
&adp->date_poste.annee) ;
}
}

N o t e z q u e , c o m m e à l ' a c c o u t u m é e , d è s lo r s q u ' u n e l e c tu r e d e v a l e u r s n u m é r iq u e s ( ic i p a r s c a n f ) e s t s u i v i e d ' u n e l e c t u r e


d ' u n c a r a c t è r e ( i c i p a r g e t c h a r , m a i s l e m ê m e p r o b l èm e s e p o s e ra i t a v e c s c a n f e t l e c o d e % c ) , i l e s t n é c e s s a i r e d e
" s a u t e r " a r ti fi c ie l le m e n t l e c a r a c t è r e a y a n t s e r v i à l a v a l i da t i o n d e l a d e r n i è r e i n f o r m a t i o n n u m é r i q u e ; e n e f f e t , d a n s l e

c a s c o n t r a i re , c ' e s t p r é c is é m e n t c e c a r a c t è r e ( \ n ) q u i e st p r is e n c o m p t e .
E n t o u t e r i g u e u r , l a d é m a r c h e a i n si u t i li s é e n ' e s t p a s i n f a i l li b l e : s i l' u t i li s a t e u r f o u r n i t d e s i n f o r m a t i o n s s u p p l é m e n t a i r e s
a p r è s l a d e r n i è re v a l e u r n u m é r i q u e ( n e s e r a it -c e q u ' u n s i m p l e e s p a c e ) , l e c a r a c t è re l u u l t é r ie u r e m e n t n e s e r a p a s c e l u i
a t te n d u . T o u t e f o is , i l s' a g i t a l o r s d e s " p r o b l è m e s h a b i t u e ls " l i é s à l a f o u r n i t u r e d ' i n f o r m a t io n s e x c é d e n t a i r e s . I ls p e u v e n t
ê t r e r é so l u s p a r d i ff é r e n te s t e c h n i q u es d o n t n o u s a v o n s p a r l é , n o t a m m e n t , d a n s l ' e x e r c i c e V I . 5 .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 83/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I . L e s s t r uc t u r e s 83
V o i c i, à t i tr e i n di c a t i f, u n p e t it p r o g r a m m e d ' e s sa i d e n o t r e f o n c t io n ( s a c o m p i la t io n n é c e s s i te l e s d é c l a r a t io n s d e s
structures date e t personne) :

main()
{
struct personne bloc ;
remplit (&bloc) ;
printf ("nom : %s \n date embauche : %d %d %d \n date poste : %d %d %d",
bloc.nom,
bloc.date_embauche.jour, bloc.date_embauche.mois, bloc.date_embauche.annee,
bloc.date_poste.jour, bloc.date_poste.mois, bloc.date_poste.annee ) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 84/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

D E U X IE M E P A R T I E :

E X E R C I C ES T H E M A T I Q U E S

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 85/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

INTRODUCTION
A L A D E U X IE M E P A R T I E

C e c h a p i tr e v o u s f o u r n i t q u e lq u e s e x p l i c a t io n s c o n c e r n a n t l a m a n i è r e d o n t so n t c o n ç u s l e s p r o b l è m e s p r o p o s é s d a n s c e t te
d e u x i è m e p a r t ie d e l ' o u v r a g e e t l e s q u e l q u e s r è g le s q u e n o u s n o u s so m m e s fi x é e s p o u r la r é d a c t i o n d e s p r o g r a m m e s
correspondants.

1 - C a n e v a s c o m m u n à c h a q u e e x e r c ic e

P o u r c h a q u e e x e r c i c e , n o u s a v o n s a d o p té l e m ê m e c a n e v a s .

a ) L ' e x p o s é d u p r o b lè m e

I l e s t c o n s t it u é d ' u n én o n c é a c c o m p a g n é d ' u n e x e m p l e . C e t e n s e m b l e c o n s t it u e c e q u ' i l e s t in d i s p en s a b l e d e l ir e a v a n t d e


t e n t e r de r é s o u d r e l e p r o b lè m e . C e r t e s, l ' e x e m p l e p e r m e t d ' i ll u s tr e r e t d e c o n c r é t i se r l ' é n o n c é m a i s , d e p l u s , il le
p r é c i s e , e n p a r t ic u l i e r e n e x p l ic i ta n t la m a n i è r e d o n t le p r o g r a m m e d i a l o g u e a v e c l ' u t i li sa t e u r . O n n o t e r a q u e c e t e x e m p l e
c o r r e s p o n d e x a c t e m e n t à u n e i m a g e d ' é c r a n o b te n u e a v e c l e p r o g r a m m e p r o p o s é e n s o l u ti o n .

b ) L ' a n a ly s e

E l l e s p é c i fi e ( o u p r é c i s e ) le s a l g o r i th m e s à m e t tr e e n o e u v r e p o u r a b o u t ir à u n e s o l u ti o n . E l le g a r d e u n c a r a c t è r e g é n é r a l ;
n o t a m m e n t , e l le é v i te d e s ' i n t é r e s se r à c e r t a i n s d é t a i ls d e p r o g r a m m a t io n d o n t le c h o i x e s t r e je t é a u m o m e n t d e l ' é c r i tu r e
d u p r o g r a m m e . A p r i o r i , e l le f a i t d é j à p a r t ie d e l a so l u t i o n ; to u t e f o is , si v o u s s é c h e z s u r l ' é n o n c é l u i- m ê m e , r i e n n e v o u s
e m p ê c h e , a p r è s la l e c tu r e d e c e t te a n a l y s e , d e t e n te r d ' é c r i re l e p r o g r a m m e c o r r e s p o n d a n t . E n e f f e t , u n t e l e x e r c ic e , b i e n

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 86/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

86 Exercices en langage C
q u e l im i té à l a s im p l e tr a d u c t i o n d' u n a l g o r it h m e d a n s u n l a n g a g e , n ' e n p o s s è d e p a s m o i n s u n i n t é r ê t p r o p r e e n c e q u i
c o n c e r n e l ' a p p r e n t i s sa g e d u l a n g a g e lu i -m ê m e .

c ) L e p r o g ra m m e

B i e n q u ' i l su i v e e x a c t e m e n t l' a n a l y se p r o p o s ée , i l n ' e n r e s t e p a s m o i n s q u ' i l fa i ll e le c o n s i d ér e r c o m m e u n e r é d a c t io n


p o s si b l e p a r m i b e a u c o u p d ' a u t r e s . N ' o u b l ie z p a s q u ' à c e n i v e a u i l e s t b i en d i f fi c il e d e p o r t e r u n j u g e m e n t d e v a l e u r s u r
l e s q u a l i té s o u l e s d é f a u t s d e t e l le o u t e l l e r éd a c t i o n , t a n t q u e l ' o n n ' a p a s p r é c i s é l e s c r i tè r e s r e t e n u s ( v i te s s e d ' e x é c u t io n ,
t a il le m é m o i r e , c l a r té d e l a r é d a c t i o n , r e s p e c t d e c e r t a i n e s rè g l e s d e s t y l e , . . . ) ; c e l a e s t d ' a u t a n t p l u s v r a i q u e c e r t a i n s d e

pc er és ccérditeèmr ems epnet udv ae nn st las ' apvr éerme ri èi re


n c po amr pt iea t idbelecse te no tur ve r ae ug xe . mCaei ss ra ev me ca rmq ou ie ns s sd' a' ap cpcl uiqitu ée .n t d ' a i ll e u r s d é jà a u x e x e r c i c e s p r o p o s é s

d ) L e s c o m m e n t a ir es

I ls f o u r n is s e n t c e rt a i n e s e x p l ic a t i o n s q u e n o u s a v o n s j u g é e s u t i le s à l a c o m p r é h e n s io n d u p r o g r a m m e l u i -m ê m e . I l p e u t ,
p a r e x e m p l e , s ' a g ir :

- d e r a p p e l s c o n c e r n a n t u n e i n s t r uc t i o n o u u n e f o n c t i o n p e u u s u e l le ,
- d e j u st if ic a t i o n s d e c e r t a in s c h o i x r é a l i sé s u n i q u e m e n t a u m o m e n t d e l a r éd a c t i o n d u p r o g r a m m e ,
- d e m i s e e n é v i d en c e d e c e r t a i n e s p a r t ic u l a r i té s o u o r i g in a l i té s d u l a n g a g e ,
- etc.

e ) L a d is c u s s i o n

E l l e c o n s t it u e u n e s o r t e d ' o u v e r t u r e f o n d é e s u r u n e r é f l e x io n d e c a r a c t è r e g é n é r a l q u i p e u t p o r t e r s u r :

- l e s i n su f f i sa n c e s é v e n t u e l les d u p r o g r a m m e p r o p o s é , n o t a m m e n t e n c e q u i c o n c e r n e s o n c o m p o r t e m e n t f a c e à d e s
e r r e u r s d e l a p a r t d e l ' u t i l i sa t e u r ,
- le s a m é l i o r a t io n s q u ' i l e s t p o s s i b l e d e l u i a p p o r t e r ,
- u n e g é n é r a l i sa t io n d u p r o b l è m e p o s é ,
- etc.

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 87/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I n t r o d uc t i o n à l a d e u x i è m e p a r t ie 87
2 - P ro t e c t i o n d e s p r o g r a m m e s p a r r a p p o r t a u x d o n n é e s

C o m m e b e a u c o u p d ' a u t r e s la n g a g e s , l e s i n st r uc t i o n s u s u e ll e s d e l e c t u r e a u c l a v ie r d u l a n g a g e C n e s o n t p a s t o t a le m e n t
p r o t é g é e s d ' é v e n t u e l le s r é p o n s e s i n c o r r e c t e s d e l a p a r t d e l ' u t il i sa t e u r . C e l le s -c i p e u v e n t e n t ra î n e r u n c o m p o r t e m e n t
a n o r m a l du p r o g r a m m e .

D ' u n e m a n i è r e g é n é r a le , c e p r o b l è m e d e c o n t r ô le d e s d o n n é es p e u t ê t re r é s o l u p a r l' e m p l o i d e te c h n i q u e s a p p r o p r i é e s
t e ll e s q u e c e l l e s q u e n o u s a v o n s r e n c o n t r é e s d a n s l ' e x e r c i c e V I . 5 d e l a p r e m i è r e p a r t ie . T o u te f o i s, c e l l e s -c i p r é s e n t e n t
l ' i n c o n v é n i e n t d ' a l o u r d i r le t e x te d u p r o g r a m m e . C ' e s t p o u r q u o i n o u s a v o n s é v i té d ' i n t r o d u i r e sy s t é m a t iq u e m e n t d e t e ll e s
p r o t e c t io n s d a n s t o u s n o s ex e m p l e s , c e q u i a u r a i t m a n i fe s t e m e n t m a s q u é l ' o b j e c ti f e s se n t ie l d e l ' e x e r c ic e ( b i e n e n t e n d u ,

cl ee us r p nr ao tt ue rc et iomnês mp eo ,u rr re aq iueinè tr edne tv eu nn ier tienlldei spp re on tes acbt lioe ns d; acnesl luen-c pi r soegrar a aml omr se cr la
é ei lr).e mNe on tt e dz etmo ua tnedfoé ei s dqa unes cl'eérntao inncs é e lxuei-r cmi cê ems e, .d e p a r

3 - A p r o p o s d e s s t r u c t u r e s d e b o u c le

E n p r i n c i p e , l o r s q u e l ' a n a l y se d ' u n p r o b l è m e f a i t i n te r v e n i r u n e r é p é t it io n , i l fa u d r a i t , p o u r ê t r e c o m p l e t, e n p r é c i s e r l e
type :

- r é p é t i t i o n d é f i n i e ( o u a v e c c o m p t e ur ) : e l le e s t r é a l i s é e en C a v e c l ' i n s t r u c t i o n for ,

- r é p é t i t i o n t a n t q u e , d a n s l a q u e l le l e t e s t d e p o u r s u i t e a l ie u e n d é b u t d e b o u c l e : e l l e e s t r é a l i s ée e n C a v e c
l'instruction while,
- r é p é t i t i o n j u s q u ' à d a n s la q u e l l e le t e s t d ' a r r ê t a l ie u e n f i n d e b o u c l e : e l l e e s t r é a l i s é e e n C a v e c l ' i n s t r u c t i o n d o . . .
while.

E n f a it , i l e x i s te p l u s ie u r s r a i so n s d e n e p a s to u j o u r s s p é c i f ie r l e c h o i x d u t y p e d ' u n e r é p é t it io n a u n i v e a u d e l ' a n a l y s e e t
d e l e r e p o r te r a u n i v e a u d e l ' é c r i tu r e d u p r o g r a m m e :

- d ' u n e p a r t , le c h o i x d ' u n t y p e d e b o u c l e n ' e s t p a s to u j o u r s d i c t é im p é r a t iv e m e n t p a r le p r o b l è m e : p a r e x e m p l e , u n


a l g o r i t h m e u t i l i s a n t u n e r é p é t i t i o n d e t y p e j u s q u ' à p e u t t o u j o u r s ê t re t r a n s f o r m é e n u n a l g o r i th m e u t i li s a n t u n e
r é p é t i t io n d e t y p e t a n t q u e ,
- d ' a u t r e p a r t, c o m m e n o u s l ' a v o n s d é j à e n tr e v u d a n s l e c h a p i tr e I I I de l a p r e m i è r e p a r ti e , l e la n g a g e C a u t o r is e d e s
f o r m e s d e r é p é t i ti o n p l u s v a r i é e s q u e l e s t ro i s q u e n o u s v e n o n s d ' é v o q u e r ( e t q u i so n t c e l le s p r o p o s é e s c l a s si q u e m e n t
p a r l a " p r o g r a m m a t io n s t ru c t u r é e " ) : a in si , p a r e x e m p l e :
* g r â c e à l a n o t i o n d ' o p é r a t e u r s é q u e n t i e l, o n p e u t r é a l i se r , à l ' a i d e d e l ' i n s t r uc t i o n w h i l e , d e s b o u c l e s d a n s
l e s q u e ll e s le t e s t d e p o u r s u i t e a l ie u , n o n p l u s e n d é b u t , m a i s e n c o u r s d e b o u c l e ,
* l ' i n s t r u c t i o n b r e a k a u t o r i s e d e s b o u c l e s à so r t ie s m u l t ip l e s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 88/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

88 Exercices en langage C
C e r t e s, o n p e u t o b j e c t e r q u e c e s o n t là d e s p o s si b i l it é s q u i so n t c o n t r a ir e s à l ' e s p r i t d e l a p r o g r a m m a t io n s tr u c t u r é e .
C e p e n d a n t , u ti li s é e s à b o n e s c i e n t , e l le s p e u v e n t a m é l io r e r la c o n c i si o n e t l e te m p s d ' e x é c u t io n d e s p r o g r a m m e s . C o m p t e
t e n u d e l ' o r i e n t a ti o n d u l a n g a g e C , i l n e n o u s a p a s p a r u o p p o r t u n d e n o u s p r i v e r t o ta l e m e n t d e c e s f a c i li té s .

E n d é f in i ti v e , i l n o u s a r r iv e r a s o u v e n t , a u c o u r s d e l ' a n a l y se , d e n o u s c o n t e n t e r d e p r é c i s e r l a ( o u l e s ) c o n d i t io n ( s ) d ' a r r ê t
d ' u n e i té r a t io n e t d e r e p o r te r a u n i v e a u d e l a p r o g ra m m a t io n m ê m e l e c h o i x d e s i n s tr u c t io n s à u t i li se r . O n n o t e r a q u ' e n
p r o c é d a n t a in s i u n e f fo r t d e r é f le x i o n l o g i q u e p e u t r e s te r n é c e s s a i r e a u m o m e n t d e l a r é d a c t io n d u p r o g r a m m e , l a q u e l l e ,
d a n s c e c a s , s e t r o u v e ê t re p l u s q u ' u n e s i m p l e t r a d u c t io n l i tt é r a le !

4 - A p r o p o s d e s f o n c t io n s

a ) C o m m e n o u s l' a v o n s d é j à r e m a r q u é d a n s l ' a v a n t- p r o p o s , l a n o r m e A N S I a c c e p te d e u x f o rm e s d e d é f in i ti o n d e
f o n c t io n s . V o i c i, p a r e x e m p l e , d e u x f a ç o n s d ' é c r ir e l ' e n - t ê te d ' u n e f o n c t io n fct r e c e v a n t d eu x a r g u m e n t s d e t y p e in t e t
chare t r e n v o y a n t u n e v a l e u r d e t y p e double :

double fct (int x, char * p)

double fct (x, p)


int x ;
char * p ;

I l n e s ' a g i t là q u e d e s i m p l es d i f f é r e nc e s d e r é d a c t i o n , s a n s a u c u n e i n c i d e n c e s u r l e p l a n f o n c t io n n e l . I c i , n o u s a v o n s
s y s té m a t iq u e m e n t e m p l o y é l a p r e m i è r e f o r m e ( o n l a n o m m e p a r f o is f o rm e " m o d e r n e " ) , d a n s l a m e s u r e o ù e l le a t e n d a n c e
à s e g é n é r a li s er e t o ù , d e p l u s , il s ' a g it d e l a s eu l e fo r m e a c c e p t é e p a r le C + + .

b ) L e s f o n c t i o n s o n t to u j o u r s é t é d é c l a r é e s d a n s l e s f o n c t i o n s l e s u ti l i sa n t b i e n q u ' a p r i o r i :

- c e l a n e s o i t p a s o b l i g a t o i r e p o u r l e s f o n c t i o n s f o u r n i s s a n t u n r é s u l ta t d e t y p e in t ,
- c e l a n e s o i t p a s o b l ig a t o i r e lo r s q u ' u n e f o n c t io n a é t é d é f in i e , d a n s l e m ê m e s o u r c e , a v a n t d ' ê t r e u t il i sé e.

c ) D a n s l e s d é c l a r a ti o n s d e s f o n c t io n s , n o u s a v o n s u t i li s é l a f o r m e p r o t o t y p e a u t o r is é e p a r l e s ta n d a r d A N S I . C e l le - c i se
r é v è l e s u r t o u t f o r t p r é c i e u s e l o r s q u e l ' o n e x p l o i t e le s p o s s i b i l it é s d e c o m p i l a t io n s é p a r é e e t q u e l ' o n a d o n c a f f a i r e à
p l u si e u r s f ic h i e r s s o u r c e d i ff é r e n ts . C e r t e s , c e n ' e s t p a s l e c a s ic i , m a i s , c o m p t e t e n u d e c e q u ' e l le e s t p r a t iq u e m e n t
a c c e p t é e d e t o u s le s c o m p i la t e u r s a c t u e l s e t q u e , d e p l u s , e l le e s t e s t o b l ig a t o i r e e n C + + , i l n o u s a p a r u ju d i c i e u x d ' e n
f a ir e u n e h a b i t u d e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 89/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I : V A R I A T I O N S A L G O R IT H M IQ U E S
S U R L ES IN S T R U C T IO N S
DE BA SE

C e c h a p i t re v o u s p r o p o se d e s p r o b l è m e s n e f a is a n t a p p e l q u ' a u x n o t i o n s d e b a s e d u l a n g a g e C , à s a v o i r :

- e n t r é e s - so r t ie s c o n v e r s a t i o n n e l le s ( g e t c h a r , s c a n f , g e t s , p u t c h a r , p r i n tf ) ,
- in s t r u c t i o n s d e c o n t r ô l e ,
- tableaux,
- chaînes,

- fonctions.

I - 1 T r i a n g le d e P a s c a l

______________________________________________________________________________
Enoncé

A f fic h e r u n " t r ia n g l e d e P a s c a l" d o n t l e n o m b r e d e l ig n e s e s t fo u r n i e n d o n n é e . N o u s v o u s r a p p e l o n s q u e l e s " c a s e s " d ' u n

t e l tr i a n g l e c o n t ie n n e n t l e s v a l e u r s d e s c o e f f i c i e n t s d u b i n o m e C n , p ( o u n o m b r e d e c o m b in a i s o n s d e n é lé m e n t s p r i s p à p ) .
Cette valeur est placée dans la case correspondant à l'intersection de la ligne de rang n et la colonne de rang p (la
n u m é r o ta ti o n c o m m e n ç a n t à 0 ).

O n é v i t e r a d e c a lc u l e r c h a q u e t e r m e s é p a r é m e n t ; a u c o n t r a i re , o n c h e r c h e r a à e x p l o it e r la r e l a ti o n d e r é c u r r e n c e :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 90/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

90 Exercices en langage C
C = C + C
i, j i-1, j i-1,j-1

O n l im i te r a à 1 5 l e n o m b r e d e l ig n e s d e m a n d é e s p a r l ' u t i li s a te u r e t o n r e s p e c t e r a l a p r é s e n ta t io n p r o p o s é e d a n s l ' e x e m p l e
ci-dessous.

Exemple
combien de lignes voulez vous ? 12

p 0 1 2 3 4 5 6 7 8 9 10 11
n
-----------------------------------------------------------------
0 -- 1
1 -- 1 1
2 -- 1 2 1
3 -- 1 3 3 1
4 -- 1 4 6 4 1
5 -- 1 5 10 10 5 1
6 -- 1 6 15 20 15 6 1
7 -- 1 7 21 35 35 21 7 1
8 -- 1 8 28 56 70 56 28 8 1
9 -- 1 9 36 84 126 126 84 36 9 1
10 -- 1 10 45 120 210 252 210 120 45 10 1
11 -- 1 11 55 165 330 462 462 330 165 55 11 1
______________________________________________________________________________

ANALYSE

A p r i o r i , n o u s p o u r r i o n s u t i li ser u n t a b l e a u t à d e u x d i m e n s io n s c o m p o r t a n t 1 5 x 1 5 é l é m e n t s e t d é c i d e r (a r b i tr a i re m e n t )
q u e l e p r e m i e r i n di c e c o r r e sp o n d a u r a n g d ' u n e l ig n e d u t r ia n g l e , l e s e c o n d à c e l u i d ' u n e c o l o n n e . N o u s r e m p l ir i o n s
a l o r s p a r t i e l le m e n t c e t a b l e a u a v e c l e s v a l e u r s C v o u l u e s ( i v a r ie r a i t d e 0 à n - 1 si n r e p r é s e n t e l e n o m b r e d e l ig n e s
i, j
d e m a n d é e s e t , p o u r c h a q u e v a l e u r d e i , j v a r ie r a i t d e 0 à i ) .

P o u r e x p l o i te r l a r é c u r r e n c e p r o p o s é e , i l n o u s s u f fi ra i t a lo r s de p r o c éd er c o m m e s u i t :

- p l a c e r l a v a l e u r 1 e n t ( 0 , 0 ) (c e q u i c o n s t i tu e l a p r e m i è r e l ig n e ) ,
- p o u r c h a q u e l ig n e d e r a n g i , à p a r t ir d e i= 1 , p r o c é d e r a i n si :
* p l a c e r l a v a l e u r 1 e n t ( i, 0 ) e t t ( i, i ) (e x t r é m i té s d e l a l i g n e d e r a n g i ),
* pou r j variant de 1 à i-1, faire :
t (i , j ) = t ( i- 1 , j ) + t (i -1 , j - 1 )

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 91/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 91


E n f a it , i l e s t p o s si b l e d e n ' u t il i ser qu ' u n t a b l e a u à u n e s e u l e d i m e n s io n , d a n s le q u e l o n v i e n t c a l c u le r s u c c e s s i v e m e n t
c h a c u n e d e s l ig n e s d u t r ia n g l e ( i l fa u t a l o r s , b i e n s û r , a f f ic h e r c h a q u e l ig n e d è s q u ' e l le a é t é d é t e r m i n é e ) .

S u p p o s o n s , e n e f f e t , q u ' à u n i n s t a n t d o n n é , n o u s d i s p o s i o n s d a n s c e t a b l e a u t d e s i +1 v a l e u r s d e l a l i g n e d e r a n g i e t
v o y o n s c o m m e n t d é te r m i n e r c e l le s d e la l ig n e d e r a n g i +1 . N o u s c o n st a to n s q u e l a r é c u r r e n c e p r o p o s é e p e r m e t d e d é f in i r
l a n o u v e l l e v a le u r d ' u n é l é m e n t d e t e n f o n c ti o n d e s o n a n c i e n n e v a l e u r e t d e l ' a n c i e n n e v a l e u r d e l ' é l é m e n t p r é c é d e n t .

C e r t e s, s i n o u s r é p é ti o n s u n e a f f e c ta t io n d e l a f o r m e :

t (j ) = t (j ) + t (j -1 )
e n f a i s a n t v a r ie r j d e 1 à i - 1 , n o u s n ' a b o u t ir i o n s p a s a u r é su l t a t e sc o m p t é p u i s q u ' a l o r s l a v a l e u r d e t ( j ) d ép e n d r a i t d e l a
n o u v e l l e v a l e u r p r é a l a b l e m e n t a t tr i b u é e à t (j - 1 ) .

M a i s , il e s t fa c i le d e m o n t r e r q u ' e n e x p l o r a n t la l i g n e d e d r o i t e à g a u c h e , c ' e s t -à - d ir e e n r é p é t a n t l ' a f f e c ta t io n c i - d es s u s


e n f a i s a n t d é c r o î t re j d e i- 1 à 0 , l e p r o b l è m e n e s e p o s e p l u s .

V o i c i fi n a le m e n t l ' a l g o r it h m e q u e n o u s u t i li se r o n s :

F a ir e v a r ie r i d e 0 à n - 1 . P o u r c h a q u e v a l e u r d e i :
- r é p é t e r , e n f a i s a n t d é c r o î tr e j d e i - 1 à 1 :
t (j ) = t ( j ) + t (j -1 )
- p l a c e r l a v a l e u r 1 da n s t( i ).

Rem arques :

1 ) T e l q u e l ' a l g o r it h m e v i e n t d ' ê t re é n o n c é , n o u s c o n s t a t o n s q u e p o u r i =0 , j d o i t d é c r o ît r e d e - 1 à 1 ! N o u s a d m e t tr o n s
q u e c e l a s ig n i fi e e n f a i t q u ' a u c u n t r a i te m e n t n ' e s t à r é a l i se r d a n s c e c a s ( c e qu i est n o r m a l p u i s q u e a l o r s n o t r e li g n e
e s t r éd u i t e à l a s e u l e v a l e u r 1 , l a q u e l l e s e r a p l a c é e p a r l ' a f f e c t a t io n t ( i ) =1 ) . I l e n v a d e m ê m e p o u r i =1 , j d e v a n t a l o r s
d é c r o î tr e d e 0 à 1 . O n n o t e r a q u ' e n l a n g a g e C l a bo u c l e for p e r m e t d e t e n ir c o m p t e d e c e s c a s p a r t ic u l i e rs ( le t e s t d e
p o u r s u i te d e b o u c l e é t a n t r é a li s é en d é b u t ). C e n ' e s t to u t e f o is p a s là u n e r è g l e g é n é r a l i sa b l e à t o u s l e s l a n g a g e s .
2 ) A v e c l e s p r é c a u t i o n s q u e n o u s v e n o n s d ' é v o q u e r , l ' a l g o r i th m e " s ' i n i t ia l i s e" d e l u i -m ê m e .

Programme

#include <stdio.h>
#define NMAX 15 /* nombre maximal de lignes */

main()
{ int t [NMAX], /* tableau représentant une ligne du triangle */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 92/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

92 Exercices en langage C
nl, /* nombre de lignes souhaitées */
i, /* indice de la ligne courante */
j ; /* indice courant de colonne */

/* lecture nombre de lignes souhaitées et affichage titres */


printf ("combien de lignes voulez vous ? ") ;
scanf ("%d", &nl) ;
if (nl > NMAX) nl = NMAX ;
printf ("\n\n p ") ;
for (i=0 ; i<nl ;i++)
printf ("%5d", i) ;
printf ("\n n\n") ;
for (i=0 ; i<=nl ; i++)
printf ("-----") ;
printf ("\n") ;

/* création et affichage de chaque ligne */


for (i=0 ; i<nl ;i++)
{ t[i] = 1 ;
for (j=i-1 ; j>0 ; j--)
t[j] = t[j-1] + t[j] ;
printf ("%2d --", i) ;
for (j=0 ; j<=i ; j++)
printf ("%5d", t[j]) ;
printf ("\n") ;

}
}

Commentaires

* E n l a n g a g e C , l e s i n d ic e s d ' u n t a b le a u c o m m e n c e n t à 0 . I c i, c e t t e p a r t ic u l a r i té s ' a v è r e i n t é r es s a n t e p u i s q u e n o s
n u m é r o s d e li g n e s o u d e c o lo n n e s d o i v e n t a u s si c o m m e n c e r à 0 .

* P l u t ô t q u e d ' u t i li ser d i r e c t e m e n t l a c o n s t a n te 1 5 d a n s n o t r e p r o g r a m m e , n o u s a v o n s p r é fé r é f a i re a p p e l à l ' i n s tr u c t io n


# d e f i n e d u p r é p r o c e s s e u r p o u r d é f in i r u n sy m b o l e N M A X p o s sé d a n t c e tt e v a l e u r . Il e s t a i n si b e a u c o u p p l u s f a c il e , l e c a s
é c h é a n t , d e m o d i f ie r c e t te v a l e u r ( p u i s q u ' i l su f f i t a l o r s d ' i n t e r v e n ir e n u n s e u l e n d r o i t d u p r o g r a m m e ) . N o t e z q u e n o u s
n ' a u r i o n s p a s p u u t il i se r l a d é c l a r a t io n d e c o n s t a n t e s y m b o l i q u e ( c o n s t in t N M A X = 1 5 ) , c a r , d a n s c e c a s , N M A X n ' a u r a i t
p a s é t é u n e " e x p r e s s i o n c o n s t a n te " , e t n o u s n ' a u r i o n s p a s p u l ' u t i li ser c o m m e d i m e n si o n d ' u n t a b l e a u .

* N e p a s o u b l ie r q u e t [N M A X ] r é se r v e N M A X é lé m e n t s ( c ' e s t- à -d ir e 1 5 ) , d o n t le s in d ic e s v a r i e n t d e 0 à 1 4 .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 93/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 93

* S i l ' u ti li sa t e u r d e m a n d e u n n o m b r e d e l ig n e s s u p é r ie u r à N M A X , l e p r o g r a m m e s e c o n t e n te d e l im i te r c e t te d e m a n d e à
l a v a le u r N M A X .

DISCUSSION

* N o u s a u r io n s p u t e n ir c o m p t e d e l a s y m é t r ie d e c h a q u e l i g n e p a r r a p p o r t à so n c e n t r e ; q u e l q u e s i n s tr u c t io n s
su p p l é m e n t a i re s n o u s a u r a i e n t a lo r s p e r m i s u n e lé g è r e r é d u c t i o n d u t e m p s d e c a l c u l .

* L ' é n o n c é l im i ta i t à 1 5 l e n o m b r e d e l i g n e s d e n o t r e tr ia n g l e . E n e f f e t, a u - d e là , i l n ' e s t g é n é r a l e m e n t p l u s p o s si b l e
d ' a f fi c h e r t o u t es l e s v a l e u r s s u r u n e s e u l e l i g n e d ' é c r a n .

* N o t r e p r o g ra m m e n ' e s t p a s p r o t é g é d a n s l e c a s o ù l ' u t i li s a te u r f o u r n i t u n e r é p o n s e n o n n u m é r i q u e à l a q u e s t io n p o s é e .
D a n s c e c a s , t o u t e f o is , l a s i tu a t io n n ' e s t p a s t r è s g r a v e ; e n e f f e t , l a v a l e u r d e n l e s t , c e r t e s , a l é a t o i r e m a i s , d e t o u t e
f a ç o n , e l le s e r a li m i té e à 1 5 p a r l e p r o g r a m m e .

S i v o u s s o u h a i t ie z q u a n d m ê m e t r a it e r c e ty p e d ' a n o m a l ie , i l v o u s s u ff ir a i t d ' e x a m i n e r le c o d e d e r e t o u r d e l a f o n c t io n
s c a n f ( il f o u r n it l e n o m b r e d e v a l e u r s c o n v e n a b le m e n t l u e s ) e t d e v é r if ie r q u ' i l es t b i en ég a l à 1 .

I- 2 C r i b le d ' E ra t o s t h è n e

________________________________________________________________________________________

I l e x i s te u n e m é t h o d e d e d é t e r m i n a t i o n d e n o m b r e s p r e m i e r s c o n n u e s o u s l e n o m d e " c r ib le d ' E r a st o th è n e " . E l le p e r m e t


d ' o b t e n ir t o u s le s n o m b r e s p r e m i e r s i n f é r ie u r s à u n e v a l e u r d o n n é e n .

L a m é t h o d e ( m a n u e l l e ) c o n s i s te à d r e s s e r u n e l i st e d e s n o m b r e s c o n s i d é r é s ( d e 1 à n ) e t à y r a y e r t o u s le s n o m b r e s
m u l ti p le s d ' a u t r e s e n t ie r s ( d e te l s n o m b r e s s o n t n é c e s s a i re m e n t n o n p r e m i e r s) . P l u s p r é c i sé m e n t , o n p r o c è d e a i n si :

1 - o n r a y e l e 1 ( q u i , p a r d é f in i ti o n , n ' e s t p a s u n n o m b r e p r e m i e r ).

2 - o n r e c h e r c h e , à p a r ti r d u d e r n i e r n o m b r e p r e m i e r c o n si d é r é ( la p r e m i è r e fo i s , o n c o n v i e n t q u ' i l s ' a g i t d u 1 ) , l e
p r e m i e r n o m b r e n o n r a y é ( o n p e u t m o n t r e r q u ' i l e s t p r e m i e r ) . I l d e v i e n t , à so n t o u r , le d e r n i e r n o m b r e p r e m i e r c o n si d é r é
e t o n r a y e t o u s s e s m u l ti p le s .

3 - o n r é p è t e le p o i n t 2 j u s q u ' à c e q u e l e n o m b r e p r e m i e r c o n si d é r é so i t s u p é r i eu r à l a r a c i n e c a r r é e d e n . O n p e u t a l o r s
m o n t r e r q u e t o u s le s n o m b r e s n o n p r e m i e r s o n t é té r a y é s d e l a l i st e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 94/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

94 Exercices en langage C
Enoncé

E c r ir e u n p r o g r a m m e b a s é s u r c e t te m é t h o d e r e c h e r c h a n t t o u s le s n o m b r e s p r e m i e r s c o m p r i s e n tr e 1 e t n (l a v a l e u r d e n
é t a n t fi x é e d a n s le p r o g r a m m e )

Exemple

entre 1 et 1000, les nombres premiers sont :


2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71

73 79 83 89 97 101 103 107 109 113


127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541
547 557 563 569 571 577 587 593 599 601
607 613 617 619 631 641 643 647 653 659
661 673 677 683 691 701 709 719 727 733
739 743 751 757 761 769 773 787 797 809
811 821 823 827 829 839 853 857 859 863

877 881 883 887 907 911 919 929 937 941
947 953 967 971 977 983 991 997

________________________________________________________________________________________

ANALYSE

L a m é t h o d e m a n u e l l e su g g è r e d ' u t il i ser u n t a b l e a u . T o u t e fo i s , d e v o n s - n o u s , p a r a n a l o g ie , y r a n g e r l e s n o m b r e s e n t ie r s d e
1 à n ? E n f a i t, c e l a n e s e r a i t g u è r e u t i le p u i s q u e a l o r s c h a q u e n o m b r e s e r a i t é g a l à s o n r a n g d a n s le t a b l e a u ( d u m o i n s , à
u n e u n i té p r è s , s u i v a n t l e s c o n v e n t io n s q u e l ' o n a d o p t e r a it p o u r l ' i n d ic e d u p r e m i e r é l é m e n t ) .

E n r é a l i té , l e b o n d ér o u l e m e n t d e l' a l g o r i th m e n o u s i m p o s e s e u l e m e n t d ' ê t r e e n m e s u r e d e f a i re c o r r e s p o n d r e à c h a q u e
e n t i e r e n t r e 1 e t n , u n e i n f o r m a t i o n p r é c i s a n t, à c h a q u e i n s ta n t , s ' i l e s t r a y é o u n o n ( c e t t e i n fo r m a t io n p o u v a n t é v o l u e r a u
f il d u d ér o u l e m e n t d u p r o g r a m m e ) . I l s ' a g i t là t o u t n a t u r e ll e m e n t d ' u n e i n f o r m a t i o n d e t y p e " l o g i q u e " ( v r a i o u f a u x ) .
C o m m e c e ty p e n ' e x i s te p a s e n t a n t q u e t e l e n l a n g a g e C , n o u s le s im u l e r o n s à l' a i de d e d e u x c o n s t a n t e s e n t iè r e s : V R A I
d e v a l e u r 1 , F A U X d e v a le u r 0 . N o t e z q u e le c h o i x d e l a v a le u r 0 p o u r F A U X e st im p o s é p a r la m a n i è re d o n t l e la n g a g e

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 95/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 95


C c o n s i d è r e u n e e x p r e s s i o n n u m é r i q u e a p p a r a i s sa n t d a n s u n e c o n d i ti o n ; l a v a l e u r 1 , p a r c o n t r e , p o u r r a i t ê tr e , s a n s
i n c o n v é n i e n t , r e m p l a c é e p a r n ' i m p o r t e q u e l le v a l e u r n o n n u l l e .

N o t o n s r a y e u n t e l t a b l e a u e t s u p p o s o n s q u e r a y e [ i ] c o r r e s p o n d à l ' e n t i e r i ( c e q u i , c o m p t e t e n u d e s c o n v e n t io n s d u
l a n g a g e C , si g n i f ie q u e r a y e [ 0 ] e s t i n u t il i sé ). N o t r e a lg o r i th m e n o u s i m p o s e d e g a r d e r la t r a c e d u d e r n i er n o m b r e p r e m i e r
c o n si d ér é . N o u s l e n o m m e r o n s p r e m . L a d é m a r c h e m a n u e l le s e t r a n s p o s e a lo r s c o m m e s u i t :

* Initialisation :
- m e t tr e à F A U X t o u s le s é lé m e n t s d u t a b le a u r a y e ,
- m e t tr e à F A U X l e p r e m i e r é l é m e n t d e r a y e , e t f a i r e :

prem = 1
* Itération :
- r e c h e r c h e r , à p a r t ir d e p r e m , l e p r e m i e r n o m b r e n o n e n c o r e r a y é , c ' e s t - à - di r e in c r é m e n t e r la v a l e u r d e p r e m
j u s q u ' à c e q u e t [ p r e m ] so i t F A U X ( en t o u t e r ig u e u r , i l f a u t s e d e m a n d e r s' i l e x is te e n c o r e u n t e l n o m b r e d a n s
n o t r e t a b le a u , e t d o n c l i m i te r l ' i n c r é m e n t a t io n d e p r e m à N ) .
- r a y e r t o u s l e s m u l t ip l e s d e p r e m , d a n s l e c a s o ù u n t e l n o m b r e a é t é t r o u v é .
* L ' i té r a t io n p r o p o s é e p e u t ê t r e r é p é t é e , i n d i ff é r e m m e n t ( le s d e u x f o r m u l a ti o n s é t a n t é q u i v a l e n t es d è s q u e N e s t
su p ér i eu r o u ég a l à 1 ) :
- j u s q u ' à c e q u e l a v a l e u r d e p r e m so i t s u p é r i e u r e à l a r a c i n e c a r r é e d e N ,
- o u t a n t q u e l a v a l e u r d e p r e m e s t in f é r ie u r e o u é g a l e à l a r a c in e c a r r é e d e N .

Programme

#include <stdio.h>
#define N 1000 /* plus grand entier à examiner */
#define VRAI 1 /* pour "simuler" des ..... */
#define FAUX 0 /* ..... valeurs logiques */

main()
{

int raye [N+1], /* tableau servant de crible */


prem, /* dernier nombre premier considéré */
na, /* compteur de nombres affichés */
i ;

/* initialisations */
for (i=1 ; i<=N ; i++) /* mise à zéro du crible */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 96/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

96 Exercices en langage C
raye[i] = FAUX ;
raye[1] = VRAI ; /* on raye le nombre 1 */

/* passage au crible */
prem = 1 ;
while (prem*prem <= N)
{ while (raye[++prem] && prem<N ) {}
/* recherche premier nombre non rayé */
for (i=2*prem ; i<=N ; i+=prem) /* on raye tous ses multiples */
raye[i] = VRAI ;
}

/* affichage résultats */

printf ("entre 1 et %d, les nombres premiers sont :\n", N) ;


na = 0 ;
for (i=1 ; i<=N ; i++)
if ( !raye[i] )
{ printf ("%7d",i) ;
na++ ;
if ( na%10 == 0) printf ("\n") ; /* 10 nombres par ligne */
}
}

Commentaires

* L a r e c h e r c h e d u p r e m i e r n o m b r e n o n e n c o r e r a y é e s t r é a li s ée p a r l a s e u l e in s t ru c t io n :

while (raye[++prem] && prem<N) {}

N o t e z b i e n l a p r é -i n c r é m e n t a t io n d e p r e m ; u n e p o s t -i n c r é m e n t a t io n :

while (t[prem++] && prem<N) {}

a u r a i t c o n d u i t à u n e b o u c l e in f in i e s u r le p r e m i e r n o m b r e p r e m i e r tr o u v é , c ' e s t - à -d ir e 2 ( d u m o i n s si N e st su p ér i eu r o u
é g a l à 2 ) . I l s u f f ir a i t to u t e f o i s d ' i n c r é m e n t e r p r e m u n e f o i s a v a n t d ' e n t re r d a n s l a b o u c l e p o u r q u e c e l a fo n c t i o n n e .

* N ous avons conservé le garde-fou :

prem < N

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 97/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 97


O n p o u r r a i t to u t e f o is d é m o n t r e r q u e , d è s q u e N e s t su p ér i eu r o u é g a l à 2 , o n e s t to u j o u r s a s s u ré d e t r o u v e r a u m o i n s u n
n o m b r e n o n r a y é a v a n t l a f in d u ta b l e a u (c o m p t e te n u d e c e q u e l ' o n c o m m e n c e l ' e x p l o r a t io n a v e c u n n o m b r e i n fé r i e u r
o u é g a l à l a r a c i n e c a r r ée d e N ) .

* N o u s a v o n s p r é v u d ' a f f ic h e r n o s n o m b r e s p r e m i e r s, à r a iso n d e 1 0 p a r l ig n e , c h a q u e n o m b r e o c c u p a n t 7 c a r a c t è r e s.
P o u r c e f a ir e , n o u s u t il i so n s u n e v a r i a b l e n o m m é e n a n o u s p e r m e t ta n t d e c o m p t a b i li se r le n o m b r e d e n o m b r e s a f fic h é s . A
c h a q u e f o is q u e n a e s t m u l ti p le d e 1 0 , n o u s p r o v o q u o n s u n s a u t d e l i g n e .

DISCUSSION

* T e l q u ' i l e s t p r o p o s é i c i, l e p r o g r a m m e t r a i te l e c a s n =1 0 0 0 . P o u r l e f a i r e f o n c t i o n n e r a v e c d ' a u t r e s v a l e u r s , i l e s t
n é c e s s a i r e d ' i n t e r v e n i r a u n i v e a u d u p r o g r a m m e l u i- m ê m e e t d e le r e c o m p i le r . S i v o u s s o u h a i te z q u e l a v a l e u r d e n p u i s se
ê t r e f o u r n ie e n d o n n é e , i l fa u t l u i fi x e r u n e v a l e u r m a x i m a l e , a f i n d e p r é v o i r l a r é s e r v a t io n d u t a b l e a u c o r r e s p o n d a n t .

N o t e z t o u t e fo i s q u e l e s p o ssi b i l it é s d e g e s t i o n d y n a m i q u e d u l a n g a g e C o f fr e n t u n e s o l u ti o n p l u s a g r é a b l e à c e p r o b lè m e
d e d i m e n si o n s v a r i a b le s . V o u s e n t r o u v e r e z c e r t a i n s e x e m p l e s d a n s le c h a p i tr e c o n s a c r é à l a g e s t io n d y n a m i q u e .

* L e t a b le a u r a y e , a i n s i q u e l e s v a r i a b l e s p r e m e t i , o n t é t é d é c l a r é s d e t y p e in t , c e q u i , d a n s c e r t a in e s i m p l é m e n t a t io n s ,
p e u t l im i te r à 3 2 7 6 7 l e s v a l e u r s q u ' i l e s t a i n si p o s si b l e d ' e x a m i n e r . O n p e u t t o u jo u r s f a i re m i e u x , e n u t il i sa n t l e t yp e
u n s i g n e d i n t , o u m i e u x l e ty p e l o n g o u u n s i g n e d l o n g . T o u t e fo i s , d a n s c e c a s , o n s ' a s s u r e r a q u e l ' o n n ' e s t p a s s o u m i s à
d e s c o n t r a i n t e s s u r la t a i ll e d e s d i f f é r e n t s m o d u l e s o b j e t s , su r l a t a il le d e l a p i l e o u , e n c o r e , t o u t si m p l e m e n t , s u r l a t a i l l e
d e s d i f fé r e n t s o b j e ts q u ' i l e s t p o ss i b l e d e m a n i p u l e r . Il n ' e s t p a s r a r e , e n e f fe t , q u e l ' o n r e n c o n t r e d e s l im i ta t io n s à 6 4 K O
( c ' e s t l e c a s, a c t u e ll e m e n t , d e s c o m p i la t e u r s B o r la n d / T u r b o C / C + + u t il i sé s d a n s l ' e n v ir o n n e m e n t D O S ) .

I- 3 L e t t r e s c o m m u n e s à d e u x m o t s ( 1 )

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e q u i a f fi c h e le s le t tr e s c o m m u n e s à d e u x m o t s fo u r n i s a u c la v i e r . O n p r é v o i r a d ' a f fi c h e r p l u si e u r s
f o i s u n e le t tr e q u i a p p a r a î t à p l u s ie u r s r e p r i s es d a n s c h a c u n d e s d e u x m o t s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 98/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

98 Exercices en langage C
O n s u p p o ser a q u e c e s m o t s n e p e u v e n t p a s c o m p o r t e r p lu s d e 2 6 c a r a c t è r e s e t o n l e s li ra à l ' a i de d e l a f o n c t io n s g e t s .

Exemples

donnez un premier mot : monsieur


donnez un deuxième mot : bonjour
la lettre o est commune aux deux mots
la lettre n est commune aux deux mots
la lettre u est commune aux deux mots
la lettre r est commune aux deux mots

_________________

donnez un premier mot : barbara


donnez un deuxième mot : ravage
la lettre a est commune aux deux mots
la lettre r est commune aux deux mots
la lettre a est commune aux deux mots

________________________________________________________________________________________

ANALYSE

L ' é n o n c é n o u s i m p o s e d ' u t i li se r g e t s , d o n c d e r e p r é s e n te r n o s m o t s so u s f o r m e d e c h a î n e s d e c a r a c t è r e s ( su i t e s d e
c a r a c t è r e s te r m i n é e s p a r l e c a r a c tè r e n u l , n o t é e n C : \ 0 ) . N o u s u ti li ser o n s à c e t e f f e t d e s t a b l e a u x d e c a r a c t è r es d e
d i m e n si o n 2 7 ( p o u r 2 6 l e t tr e s m a x i m u m e t u n c a r a c t è r e d e f i n ).

L a r e c h e r c h e d e s le t tr e s c o m m u n e s a u x d e u x m o t s p e u t se f a ir e e n c o m p a r a n t c h a c u n d e s c a r a c t è r e s d e l a p r e m i è r e c h a î n e
à c h a c u n d e s c a ra c t è r e s d e l a s e c o n d e . C e l a n o u s c o n d u i t n a t u re l le m e n t à l ' u t il i sa t io n d e d e u x b o u c l e s a v e c c o m p t e u r
( i n s t r u c t i o n s for ) im b r i q u é e s .

T o u t e fo i s , n o u s d e v o n s te n i r c o m p t e d e c e q u ' u n e m ê m e l e tt re p e u t fi g u r e r p lu s i eu r s f o is d a n s u n m ê m e m o t . D a n s c e s
c o n d i t io n s , i l fa u t é v i t e r :

* q u ' u n e m ê m e l e tt re d u p r e m i e r m o t n e p u i ss e ê tr e t ro u v é e e n d e u x e n d r o i t s d i f fé r e n t s d u s ec o n d . P a r e x e m p l e ,
avec :
m o n si eu r
et
bonjour

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 99/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 99


après avoir trouvé que le o de monsieur figurait en position 2 de bonjour, il faut éviter de signaler une nouvelle
c o ï n c i de n c e e n t re c e m ê m e o d e m o n s i e u r e t le s e c o n d o d e b o n j o u r .
I l e s t d o n c n é c e s s a i re d ' i n t e r r o m p r e l a c o m p a r a i so n e n t re u n e l e t tr e d u p r e m i e r m o t a v e c t o u te s c e l le s d u s e c o n d m o t ,
d è s q u ' u n e c o ï n c i de n c e a é t é d é t e c té e .
* q u ' u n e m ê m e l e tt r e d u s e c o n d m o t n e p u i s se c o ï n c i d e r a v e c d e u x l e tt r es d i f fé r e n t e s d u s e c o n d . P a r e x e m p l e , a v e c
( a tt e n t io n à l ' o r d r e d e s m o t s ) :
bonjour
et
m o n si eu r

i l f a u t é v it e r d e t r o u v e r u n e c o ï n c i de n c e e n t re l e p r e m i e r o d e b o n j o u r e t l ' u n i q u e o d e m o n s i e u r e t u n e a u t r e
c o ï n c i de n c e e n t r e l e s e c o n d o d e b o n j o u r e t l e m ê m e o d e m o n s i e u r .
P o u r c e f a i re , u n e d é m a r c h e ( p a r m i d ' a u t r e s ) c o n si s te à é l i m i n e r d a n s l e s e c o n d m o t l a l e tt r e a y a n t f a it l ' o b j e t d ' u n e
c o ï n c i de n c e . P l u s p r é c i s ém e n t , i l s u f fi t d e r e m p l a c e r u n e t e l le l e t tr e p a r u n c a r a c t è r e d o n t o n e s t s û r q u ' i l n ' a p p a r a î tr a
p a s d a n s u n m o t . I c i , n o u s a v o n s c h o i si l ' e s p a c e p u i s q u e n o u s s o m m e s c e n s é s tr a v a i ll e r a v e c d e s m o t s.

Programme

#include <stdio.h>

#include <string.h>
#define LMAX 26

main()
{
char mot1 [LMAX+1], /* premier mot */
mot2 [LMAX+1] ; /* deuxième mot */
int i, j ;

/* lecture des deux mots */


printf ("donnez un premier mot : ") ;
gets (mot1) ;
printf ("donnez un deuxième mot : ") ;
gets (mot2) ;

/* comparaison */
for (i=0 ; i<strlen(mot1) ; i++)
for (j=0 ; j<strlen(mot2) ; j++)
if (mot1[i] == mot2[j])

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 100/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

100 Exercices en langage C


{ printf ("la lettre %c est commune aux deux mots\n", mot1[i]) ;
mot2[j] = ' ' ;
break ;
}
}

Commentaires

* N o u s a v o n s u t i li s é l e sy m b o l e L M A X p o u r r e p r é s e n te r l a lo n g u e u r m a x im a l e d ' u n m o t . N o t e z b ie n q u e l e s t a b le a u x
m o t 1 e t m o t 2 o n t d û ê tr e p r é v u s d e d i m e n si o n L M A X +1 , a f i n d e t e n ir c o m p t e d e l a p r é s e n c e d u c a r a c t è r e d e f in d e

chaîne.

* N o u s a u r i o n s p u u t i li ser , à l a p l a c e d e l a s e c o n d e b o u c l e a v e c c o m p t e u r ( e n j ), u n e b o u c l e t a n t q u e ( w h i l e ) . C e r t e s, l a
p r o g r a m m a t io n e û t é té p l u s s tr u c t u r é e m a is , n é a n m o i n s , m o i n s c o n c i s e .

DISCUSSION

C e p r o g r a m m e n ' e s t p a s p r o t é g é c o n t re d e s r é p o n s e s d e p l u s d e 2 6 c a r a c t è r e s . D a n s c e c a s, e n e ff e t, l e s c a ra c t è r e s
su p e r f lu s ir o n t é c r a s e r le s d o n n é e s s e tr o u v a n t a u - d e là d e l ' u n d e s t a b l e a u x m o t 1 o u m o t 2 . L e s c o n s é q u e n c e s p e u v e n t ê tr e
a s s e z v a r i é e s ( v o u s p o u v e z e x p é r i m e n t e r l e p r é s e n t p r o g r a m m e d a n s d i v e r s e s s i tu a t io n s e t t e n te r d ' e x p l i q u e r le s
c o m p o r te m e n t s o b s er v é s ) .

I l e x is te d i f fé r e n t e s f a ç o n s d ' é v it e r c e r i s q u e . C i to n s , p a r e x e m p l e :

- l ir e ( t o u j o u r s p a r g e t s ) , u n e c h a î n e c o m p o r t a n t u n n o m b r e d e c a r a c t è r e s s u ff i sa m m e n t é l e v é p o u r q u e l ' u t i li s a te u r n e
r i s qu e p a s ( t r o p !) d ' e n f o u r n i r p lu s . O n p o u r r a i t c h o i si r , p a r e x e m p l e 8 0 o u 1 2 8 c a r a c t è r e s (d a n s c e r t a i n e s
i m p l é m e n t a t io n s , i l n ' e s t j a m a i s p o ss i b le d e t a p e r d e s l i g n e s d e p l u s de 1 2 8 c a r a c t è r e s) .
- li m i te r a u t o m a t iq u e m e n t l a l o n g u e u r d e l a c h a î n e l u e , e n u t il i sa n t l a f o n c t io n fg e ts ; p a r e x e m p l e , a v e c f g e t s ( m o t 1 ,
L M A X , s td i n ) , o n l im i te à L M A X l e n o m b r e d e c a r a c t è r e s lu s s u r s t d i n .

- u t il iser , d a n s c e r t a in e s im p l é m e n t a ti o n s (T u r bo / B o r la n d C / C + + , C / Q u i c k C M ic r o so f t ), u n e f o n c t io n ( n o n
p o r ta b l e ! ) n o m m é e c g e t s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 101/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 101


I- 4 L e t t r e s c o m m u n e s à d e u x m o t s ( 2 )

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e q u i a f f ic h e l e s l e tt r e s c o m m u n e s à d eu x m o t s fo u r n i s e n d o n n é e . C e t te f o is , o n n ' i m p o s e r a p a s d e
l im i te à l a t a il le d e s m o t s fo u r n i s p a r l ' u t i li s a te u r , m a i s o n n e p r e n d r a e n c o m p t e q u e l e s 2 6 p r e m i e r s c a r a c t è r e s . Q u e l q u e
so i t l e n o m b r e d e c a r a c t è r e s e f fe c t iv e m e n t f r a p p é s , l ' u t i li s a te u r d e v r a t o u j o u r s v a l i der s a r é p o n se p a r l a f r a p p e d e l a
t o u c h e return.

L à e n c o r e , o n p r é v o i r a d ' a f f ic h e r p l u si e u r s f o i s u n e l e tt r e q u i a p p a r a î t à p l u si eu r s r ep r i ses d a n s c h a c u n d e s m o t s .

O n s ' a s tr e i n dr a à n ' u t il iser p o u r l a l e c t u r e a u c l a v i e r q u e l a s e u l e f on c t i o n g e t c h a r . D e p l u s , o n r é a l i s e r a u n e f o n c t i o n


d e s t in é e à l ir e u n m o t d a n s u n t a b le a u q u ' o n l u i tr a n s m e t tr a e n a r g u m e n t ; e l le f o u r n i ra , e n r e t o u r , l a l o n g u e u r e f fe c t iv e
d u m o t a i n si l u .

Exemples

V o ir c e u x d e l ' e x e r c i c e p r é c é d e n t

________________________________________________________________________________________

ANALYSE

L ' é n o n c é n o u s i m p o s e l ' e m p l o i d e g e t c h a r , c e q u i si g n i f ie q u e c h a c u n d e s d e u x m o t s d e v r a ê t r e lu c a r a c t è r e p a r
c a r a c t è r e . D a n s c e s c o n d i ti o n s , n o u s p o u v o n s c h o i si r d e r e p r é se n t e r n o s m o t s :

- so i t so u s fo r m e d ' u n e c h a î n e d e c a r a c t è r e s . I l n o u s f a u d r a a l o r s i n t r o d u i r e n o u s - m ê m e s l e c a r a c t è r e d e f in d e c h a î n e
( \ 0 ), c e q u e f a is a i t a u t o m a t iq u e m e n t g e t s .
- so i t so u s fo r m e d ' u n e si m p l e s u i te d e c a r a c t è r e s (c ' e s t -à - d ir e s a n s c e c a r a c t è r e d e f in ) . D a n s c e c a s, i l n o u s f a u d r a
a l o r s p r é v o ir d ' e n d é t e r m i n e r la " l o n g u e u r " .

C o m m e l' é n o n c é n o u s i m p o s e q u e l a fo n c t i o n d e le c t u r e d ' u n m o t e n r e st it u e la l o n g u e u r , n o u s c h o i si r o n s l a s e c o n d e
solution.

L a l e c t u r e d ' u n m o t c o n s i st e d o n c à l i r e d e s c a r a c t è r es a u c l a v i e r ju s q u ' à c e q u e l ' o n r e n c o n t r e u n e v a l i da t i o n ( \ n ) o u q u e


l ' o n a i t o b t e n u 2 6 c a r a c t è r e s ; d e p l u s , d a n s l e c a s o ù l ' o n a o b t e n u 2 6 c a r a c t è r e s, i l f a u t p o u r su i v r e l a l e c t u r e d e
c a r a c t è r e s a u c l a v ie r , s a n s l es p r e n d r e e n c o m p t e , j u s q u ' à c e q u e l ' o n r e n c o n t r e u n e v a l id a t io n .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 102/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

102 Exercices en langage C

Programme

#include <stdio.h>
#define LMAX 26 /* longueur maximale d'un mot */

main()
{
int lire(char []) ; /* déclaration (prototype) fonction lecture d'un mot */
char mot1 [LMAX], /* premier mot (sans '\0') */
mot2 [LMAX] ; /* deuxième mot (sans '\0') */
int l1, /* longueur premier mot */
l2, /* longueur deuxième mot */
i, j ;

/* lecture des deux mots */


printf ("donnez un premier mot : ") ;
l1 = lire (mot1) ;
printf ("donnez un deuxième mot : ") ;
l2 = lire (mot2) ;

/* comparaison */
for (i=0 ; i<l1 ; i++)
for (j=0 ; j<l2 ; j++)
if (mot1[i] == mot2[j])
{ printf ("la lettre %c est commune aux deux mots\n", mot1[i]) ;
mot2[j] = ' ' ;
break ;
}
}

/* Fonction de lecture d'un mot */


int lire (char mot [LMAX])
{
int i ; /* rang du prochain caractère à lire */
char c ;

i = 0 ;
while ( (c=getchar()) != '\n' && i<=LMAX )
mot[i++] = c ;
/* ici, soit on a lu \n, soit on a lu LMAX caractères */
/* dans tous les cas, c contient le premier caractère */
/* non pris en compte */
if (c != '\n')

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 103/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 103


while (getchar() != '\n') {} /* recherche '\n' */
return(i) ;
}

Commentaires

* L à e n c o r e , n o u s a v o n s u t il i s é l e s y m b o l e L M A X p o u r r e p r é s e n t e r l a ta i ll e m a x i m a l e d ' u n m o t . P a r c o nt r e , c e tt e fo i s , la
d i m e n s i o n d e s t a b le a u x m o t 1 e t m o t 2 e s t é g a l e à L M A X ( e t n o n p l u s L M A X + 1 ) , p u is q u e n o u s n ' a v o n s p a s à y in t r o du i r e
l e c a r a c t è r e s u p p l é m e n t a ir e d e f i n d e c h a î n e .

* E n c e q u i c o n c e r n e la f o n c ti o n (n o m m é e l i r e ) d e le c t u r e d ' u n m o t a u c l a v ie r , v o u s c o n s t a te z q u e n o u s l ' a v o n s d é c l a r é e
d a n s l e p r o g r a m m e p r in c i p a l ( m a i n ) , b i e n q u e c e l a s o i t fa c u l ta t i f, d a n s l a m e s u r e o ù e l l e fo u r n i t u n r é s u l ta t d e t y p e i n t ( e n
e f f e t, t o u t e f o n c t i o n q u i n ' e s t p a s e x p l i c it e m e n t d é c l a r é e e s t s u p p o s ée p r o d u i r e u n r é su l t a t d e t y p e in t ) .

D ' a u t r e p a r t , c o m m e n o u s l ' a v o n s e x p l i q u é d a n s l ' i n tr o d u c t i o n d e c e t te s e c o n d e p a r t ie , n o u s a v o n s u t i li s é, d a n s c e t t e


d é c l a r a t io n , l a f o r m e " p r o to t y p e " a u t o r is é e p a r l a n o r m e A N S I ( c e p r o to t y p e a s s u r e le s c o n t r ô le s d e t y p e s d ' a r g u m e n t s e t
m e t e n p l a c e d ' é v e n t u e ll e s c o n v e r si o n s) .

P a r a il l e u r s , l' e n - t ê t e d e n o t r e f o n c t i o n l i r e a é t é é c r i t su i v a n t l a fo r m e " m o d e r n e " . L a n o r m e A N S I a u r a it a u to r i s é l e


r e m p l a c e m e n t d e n o t e e n -t ê te p a r :

int lire (mot)


char mot [LMAX] ;

* L e t a b l e a u d e c a r a c tè r e s r e p r é s e n ta n t l' u n i q u e a r g u m e n t d e lir e d o i t o b l ig a t o i r e m e n t ê t r e t r a n s m i s p a r a d r e s s e p u i s q u e
c e t te f o n c t io n d o i t ê t r e e n m e s u r e d ' e n m o d i f ie r le c o n t e n u . N ' o u b l ie z p a s c e p e n d a n t q u ' e n l a n g a g e C u n n o m d e t a b l e a u
e s t in t e r p r é té ( p a r le c o m p i la t e u r ) c o m m e u n p o i n t e u r (c o n s t a n t ) su r so n p r e m i e r é lé m e n t . C ' e s t c e q u i j u s t if ie l a
p r é s e n c e , d a n s l e s a p p e l s à l a f o n c t io n l i r e , d e m o t 1 o u m o t 2 , e t n o n d e & m o t 1 o u & m o t 2 .

* L a d é c l a r a t io n d e l ' a r g u m e n t d e l i r e , d a n s s o n e n - t ê te :

char mot [LMAX]

aurait pu égalem ent s'écrire :

char mot []

ou même :

char * mot

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 104/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

104 Exercices en langage C


D a n s l e p re m i e r c a s , o n c o n t i n u e d e s p é c i fi e r ( a u le c t e u r d u p r o g r a m m e p l u s q u ' a u c o m p i la t e u r ) q u e m o t e s t u n t a b l e a u
d e c a r a c t è r e s m a i s q u e s a d i m e n si o n n ' a p a s b es o i n d ' ê t r e c o n n u e a u s e in d e l i r e . D a n s le s e c o n d c a s , o n e x p r i m e p l u s
c l a ir e m e n t q u e , fi n a l e m e n t , l' a r g u m e n t re ç u p a r l i r e n ' e s t r i e n d' a u t r e q u ' u n p o i n te u r su r d es c a r a c t è r e s . C e s
f o r m u l a ti o n s s o n t to t a l e m e n t é q u i v a l e n te s p o u r l e c o m p i la t e u r e t , d a n s t o u s l e s c a s ( m ê m e l e d e r n i e r ) , il r e s te p o s s i b l e d e
f a ir e a p p e l a u " f o r m a l i sm e " t a b l e a u a u s e i n d e l i r e , e n u t i li s a n t u n e n o t a t io n t e l l e q u e :

mot [i++]

D ' a i ll e u r s , p o u r l e c o m p i la t e u r , c e t te d e r n i è r e e s t é q u i v a l e n te à :

* (mot + i++)

L e s m ê m e r e f le x i o n s s ' a p p l i q u e n t à l ' é c r i tu r e d u p r o t o t y p e d e l i r e .

DISCUSSION

* Le sym bole L M A X e s t d é f in i p o u r l' e n s e m b l e d u so u r c e c o n t e n a n t , i c i , le p r o g r a m m e p r i n c ip a l e t la f o n c t io n l i r e .


M a i s , si c e t t e fo n c t i o n d e v a i t ê t r e c o m p i l é e s é p a r é m e n t d u r e s t e , i l s e r a i t a l o r s n é c e s s a i r e d e f a i r e f ig u r e r l a d é f in i t io n
( # d e f i n e ) da n s l e s d e u x so u r c e s , c e q u i c o m p o r t e u n r i s q u e d ' e r r e u r . D a n s u n e si t u a ti o n " r é e l l e " , o n p o u r r a i t a v o i r in t é r ê t
à f a i re a p p e l à l'une d es dém arches suivantes :

- tr a n s m e t tr e l a v a le u r d e L M A X e n a r g u m e n t d e la f o n c ti o n l i r e .
- r e g r o u p e r l e s d é f in i ti o n s d e s y m b o l e s c o m m u n s à p l u si eu r s so u r c es d a n s u n f ic h i e r s é p a r é q u e l ' o n a p p e l l e p a r

#include dans chac un des sources concernés.

* C o n t r a ir e m e n t a u p r o g r a m m e d e l ' e x e r c i c e p r é c é d e n t , c e l u i- c i s e tr o u v e p r o t é g é d e r é p o n s e s t r o p l o n g u e s d e l a p a r t d e
l'utilisateur.

I- 5 C o m p t a g e d e l e t t r e s

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 105/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 105


Enoncé

R é a l iser u n p r o g r a m m e q u i c o m p t e le n o m b r e d e c h a c u n e d e s l e tt r es d e l ' a l p h a b e t d ' u n t e x te e n t r é a u c l a v ie r . P o u r


si m p l if ie r , o n n e t i e n d r a c o m p t e q u e d e s m i n u sc u l e s , m a i s o n c o m p t e ra l e n o m b r e d e s c a r a c t è r e s n o n r e c o n n u s c o m m e
t e l s ( q u e l s q u ' i l s s o i e n t : m a j u s c u l e s , p o n c t u a t io n , c h i f f re s , . . . ) .

L e p r o g r a m m e d e v r a a c c e p t e r u n n o m b r e q u e l c o n q u e d e l ig n e s . L ' u t i li sa t e u r ta p e r a u n e " l ig n e v i d e " p o u r si g n a l e r q u ' i l a


t e r m i n é l a f r a p p e d e s o n t e x t e (c e q u i r e v ie n t à d i r e q u ' i l f ra p p e r a d o n c d e u x f o is d e s u i t e l a t o u c h e r e t u r n , a p r è s l a
f r a p p e d e s a d e r n iè r e l i g n e ) .

O n s u p p o ser a q u e l e s li g n e s fr a p p é e s a u c l a v i e r n e p e u v e n t ja m a i s d ép a s s e r 1 2 7 c a r a c t è r e s . P a r a il le u r s , o n f e r a
l ' h y p o t h è s e ( p e u r e s tr ic t i v e e n p r a t i q u e ) q u e l e s " c o d e s " d e s l e tt re s m i n u s c u l e s a à z so n t c o n s é c u t i fs ( c e q u i e s t l e c a s ,
n o t a m m e n t , a v e c l e c o d e A S C I I) .

Exemple

donnez votre texte, en le terminant par une ligne vide


je me figure ce zouave qui joue
du xylophone en buvant du whisky

votre texte comporte 63 caractères dont :


2 fois la lettre a

1 fois la lettre b
1 fois la lettre c
2 fois la lettre d
8 fois la lettre e
1 fois la lettre f
......
......
7 fois la lettre u
2 fois la lettre v
1 fois la lettre w
1 fois la lettre x
2 fois la lettre y
1 fois la lettre z

et 11 autres caractères

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 106/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

106 Exercices en langage C


ANALYSE

I l n o u s f a u t d o n c u t i li ser u n t a b l e a u d e 2 6 e n t ie r s p e r m e t ta n t d e c o m p t a b i li se r l e n o m b r e d e f o is o ù l ' o n a r e n c o n t r é
c h a c u n e d e s 2 6 le t tr e s (m i n u s c u l e s) d e l ' a l p h a b e t . N o u s l e n o m m e r o n s c o m p t e . N o u s u t i li ser o n s ég a l e m e n t u n c o m p t e u r
n o m m é n t o t p o u r l e n o m b r e t o ta l d e c a r a c tè r e s e t u n a u t r e n o m m é n a u t r e s p o u r l e s c a r a c t è r e s d i f f é r e n t s d ' u n e l e t t r e
m i n u sc u l e .

E n c e q u i c o n c e r n e l e c o m p t a g e p r o p r e m e n t d i t, i l n o u s f a u t e x a m i n e r c h a c u n e d e s le t tr e s d u t e x te . P o u r c e f a i re , i l e x is t e
( a u m o i n s ) d e u x d é m a r c h e s p o s si b l e s :

- e f fe c t u e r u n e r é p é t it io n d u t r a i te m e n t d ' u n c a r a c t è r e ,

- e f fe c t u e r u n e r é p é t i ti o n d u t r a i te m e n t d ' u n e l i g n e , l u i- m ê m e c o n s t i tu é d e l a r é p é t it io n d u t r a it e m e n t d e c h a c u n d e s
c a r a c t è r e s q u ' e l le c o n t i e n t.
a ) L a p r e m i è r e d é m a r c h e a b o u t it à u n e s im p l e b o u c l e a v e c c o m p t e u r . E l le n e d e m a n d e d ' a c c é d e r q u ' à u n s e u l c a ra c t è re à
l a fo i s (p a r e x e m p l e , p a r g e t c h a r ) . E l le n é c e s s it e , p a r c o n t re , l ' é l i m i n a ti o n d e s c a r a c t è r es d e f i n d e l i g n e \ n ( q u i so n t
t r a n s m i s c o m m e le s a u tr e s pa r g e t c h a r ) , p u i s q u ' i l s n e f o n t p a s v r a i m e n t p a r t ie d u t e x te .

D e s u r c r o ît , la d é t e c ti o n d e l a fi n d u t e x te o b l i g e à c o n s e r v e r e n p e r m a n e n c e l e " c a r a c t è r e p r é c é d e n t " . L o r s q u e c e
caractère, ainsi que le caractère courant, sont égaux à \n, c'est que l'on a atteint la fin du texte. Il suffit d'initialiser
a r t if ic i e l le m e n t c e c a r a c t è r e p r é c é d e n t à u n e v a l e u r q u e l c o n q u e ( a u t r e q u e \ n ) p o u r é v i te r d e d e v o i r e f fe c t u e r u n
t r a it e m e n t p a r t ic u l i e r p o u r l e p r e m i e r c a r a c t è r e .

b ) L a s e c o n d e d é m a r c h e a b o u t i t à d eu x b o u c l e s i m b r i q u é e s . E l le p e r m e t d e li r e d i r e c t e m e n t c h a q u e l ig n e p a r g e t s . E l le

r è g l e d e m a n i è r e n a t u r e ll e l e s p r o b l è m e s d e f i n d e l ig n e e t d e f i n d e t e x t e .
N o u s v o u s p r o p o so n s ic i d e u x p r o g r a m m e s , c o r re s p o n d a n t à c h a c u n e d e c e s d e u x d é m a r c h e s.

P r o g r a m m e b a s é s u r la r é p é t it io n d u t r a it e m e n t d ' u n c a r a c t è r e

#include <stdio.h>
main()
{
char c, /* pour lire un caractère frappé au clavier */
cprec ; /* caractère précédent */
int compte[26] ; /* pour compter les différentes lettres */

int numl, /* rang lettre courante dans l'alphabet */


ntot, /* nombre de caractères du texte */
nautres, /* nb caractères autres qu'une lettre minuscule */
i ;

/* initialisations */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 107/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 107


cprec = ' ' ;
ntot = 0 ; nautres = 0 ;
for (i=0 ; i<26 ; i++) compte[i]=0 ;

/* lecture texte et comptages */


printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
while ( (c=getchar()) != '\n' || cprec != '\n' )
{ if (c != '\n')
{ numl = c - 'a' ; /* on donne le rang 0 à la lettre 'a' */
if (numl >=0 && numl < 26) compte[numl]++ ;
else nautres++ ;
ntot++ ;
}
cprec = c ;
}

/* affichage résultats */
printf ("\n\nvotre texte comporte %d caractères dont :\n", ntot) ;
for (i=0; i<26 ; i++)
printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
printf ("\net %d autres caractères\n", nautres) ;
}

Commentaires

* L ' e x p r e s si o n :

c - 'a'
p e r m e t d ' o b t e n ir le " r a n g " d a n s l ' a l p h a b e t du c a r a c t è r e c o n te n u d a n s c . N ' o u b li e z p a s q u e le l a n g a g e C c o n s i d è r e le t y p e
c h a r c o m m e n u m é r i q u e . P l u s p r é c i s ém e n t , d a n s le c a s p r é s en t , le s v a l e u r s d e c e t d e ' a ' s o n t c o n v e r t ie s e n in t ( c e q u i
f o u r n i t l a v a le u r n u m é r i q u e d e le u r c o d e ) a v a n t q u e n e s o it é v a lu é e l ' e x p r e s s io n c - ' a ' . C o m m e n o u s a v o n s s u p p o s é q u e
l e s c o d e s d e s m i n u s c u l e s s o n t c o n s é c u t if s , n o u s o b t e n o n s b i e n l e r é s u lt a t e sc o m p t é .

* L e s i n s t ru c t i o n s :

if (c != '\n')
{ numl = c - 'a' ;
if (numl >=0 && numl < 26) compte[numl]++ ;
else nautres++ ;
ntot++ ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 108/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

108 Exercices en langage C


}
cprec = c;

pourraient se condenser en :

if ( (cprec=c) != '\n')
{ numl = c - 'a' ;
if (numl >=0 && numl < 26) compte[numl]++ ;
else nautres++ ;
ntot++ ;
}

P r o g r a m m e b a s é s u r la r é p é t it io n d u t r a it e m e n t d ' u n e l ig n e

#include <stdio.h>
#include <string.h>

main()
{ char ligne[128] ; /* pour lire une ligne frappée au clavier */
int compte[26] ; /* pour compter les différentes lettres */
int numl, /* rang lettre courante dans l'alphabet */
ntot, /* nombre de caractères du texte */
nautres, /* nombre de caractères autres qu'une lettre minuscule */

i ;

/* initialisations */
ntot = 0 ; nautres = 0 ;
for (i=0 ; i<26 ; i++) compte[i]=0 ;

/* lecture texte et comptages */


printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
do
{ gets(ligne) ;
for (i=0 ; i<strlen(ligne) ; i++, ntot++)
{ numl = ligne[i] - 'a' ;/* on donne le rang 0 à la lettre 'a' */
if (numl >=0 && numl < 26) compte[numl]++ ;
else nautres++ ;
}
}
while (strlen(ligne)) ;

/* affichage résultats */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 109/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 109


printf ("\n\nvotre texte comporte %d caractères dont :\n", ntot) ;
for (i=0; i<26 ; i++)
printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
printf ("\net %d autres caractères\n", nautres) ;
}

DISCUSSION

* A u c u n d e s d eu x p r o g r a m m e s p r o p o s é s n e p o s e d e p r o b l è m e d e p r o t e c t io n v i s - à -v i s d e s r é p o n s e s f o u r n i e s p a r
l'utilisateur.

I -6 C o m p t a g e d e m o t s

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g ra m m e p e r m e t ta n t d e c o m p t e r le n o m b r e d e m o t s c o n t e n u s d a n s u n t e x t e fo u r n i a u c l a v i e r . L e t e x t e p o u r r a
c o m p o r t e r p l u si e u r s l ig n e s e t l ' u t i li s a te u r t a p e r a u n e l ig n e " v i d e " p o u r si g n a l e r q u ' i l e n a t e r m i n é l a f r a p p e ( c e q u i r e v i e n t
à d i r e q u ' i l fr a p p e r a d e u x f o i s d e s u i t e l a t o u c h e r e t u r n a p r è s a v o i r f o u r n i la d e r n i è r e l ig n e ) .

O n a d m e t tr a q u e d e u x m o t s so n t t o u jo u r s s é p a r é s p a r u n o u p l u s i eu r s d e s c a ra c t è r e s s u iv a n t s :

- fin de ligne
- espace
- p o n c t u a t io n : : . , ; ? !

- parenthèses : ( )

- guillem ets : "


- apostrophe : '
O n a d m e t tr a é g a le m e n t , p o u r si m p l if ie r , q u ' a u c u n m o t n e p e u t ê t r e c o m m e n c é s u r u n e l ig n e e t s e p o u r su i v r e s u r la
suivante.

O n p r é v o i r a u n e f o n c t io n p e r m e t ta n t d e d é c i d e r si u n c a r a c t è r e d o n n é t ra n s m i s en a r g u m e n t e s t u n d e s s é p a r a t e u r s
m e n t io n n é s c i -d e s su s . E l le f o u r n i ra l a v a l e u r 1 l o r s q u e l e c a r a c t è r e e s t u n s é p a r a t e u r e t l a v a l e u r 0 d a n s l e c a s c o n t r a i re .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 110/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

110 Exercices en langage C


Exemple

donnez votre texte, en le terminant par une ligne vide


Le langage C a été conçu en 1972 par Denis Ritchie avec un objectif
très précis : écrire un "système d'exploitation" (UNIX). A cet effet,
il s'est inspiré du langage B (créé par K. Thompson) qu'il a haussé
au niveau de langage évolué, notamment en l'enrichissant de structures
et de types, et ceci tout en lui conservant ses aptitudes de
programmation proche de la machine.

votre texte comporte 68 mots

_______________________________________________________________________________________

ANALYSE

C o m m e d a n s l' e x e r c ic e p r é c é d e n t , i l e x i s te (a u m o i n s ) d e u x d é m a r c h e s p o s si b l e s :

- e f fe c t u e r u n e r é p é t it io n d u t r a i te m e n t d ' u n c a r a c t è r e ,
- e f fe c t u e r u n e r é p é t i ti o n d u t r a i te m e n t d ' u n e l i g n e , l u i- m ê m e c o n s t i tu é d e l a r é p é t it io n d u t r a it e m e n t d e c h a c u n d e s
c a r a c t è r e s q u ' e l le c o n t i e n t.

L a p r e m i è r e d é m a r c h e a b o u t it à u n e s im p l e b o u c l e a v e c c o m p t e u r . E l le d e m a n d e s i m p l e m e n t d' a c c é d e r à u n s e u l
c a r a c t è r e (p a r e x e m p l e p a r g e t c h a r ) .

L a s e c o n d e d é m a r c h e a b o u t i t à d eu x b o u c l e s i m b r i q u é e s . E l l e d e m a n d e d ' e ff e c tu e r u n e l e c t u r e li g n e p a r li g n e ( p a r
e x e m p l e p a r g e t s) .

L à e n c o r e , n o u s e x a m i n e ro n s le s d e u x d é m a r c h e s e t n o u s p r o p o s er o n s u n p r o g r a m m e c o r r e s p o n da n t à c h a c u n e d ' e n tr e
elles.

D a n s l e s d e u x d é m a r c h e s , t o u s l e s c a ra c t è r e s s é p a r a te u r s j o u e n t le m ê m e r ô l e , à c o n d i ti o n d ' y i n c l u r e \ n ( s i l' o n t ra v a i l le
a v e c g e t c h a r ) o u \ 0 ( s i l ' o n t r a v a i l l e a v e c g e t s ) . O n p e u t a l o rs d i r e q u e l' o n a p r o g r e s s é d ' u n m o t d a n s le t e x te , c h a q u e
fois que l'on a réalisé la séquence suivante :

- r e c h e r c h e d u p r e m i e r c a r a c tè r e d i f fé r e n t d ' u n sép a r a t e u r ,
- recherche du p rem ier caractère égal à un séparateur.

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 111/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 111


O n p o u r r a i t r é p é t e r su c c e s s i v e m e n t c e s d e u x o p é r a t io n s , t a n t q u e q u e l ' o n n ' e s t p a s a r r iv é à l a f in d u t e x te . E n f a i t, i l e s t
p l u s si m p l e d ' u t il iser u n " i n d ic a t e u r l o g iq u e " ( n o u s l ' a p p e l le r o n s m o t _ e n _ c o u r s ) e t d ' e f fe c t u e r p o u r c h a q u e c a r a c t è r e l e
t r a i te m e n t su i v a n t :

- s i le c a r a c t è r e e s t u n s é p a r a t e u r e t s i m o t _ e n _ c o u r s e s t v r a i , a u g m e n t e r d e u n le c o m p t e u r d e m o t s e t r e m e t tr e
mot_en_cours à faux.

- si l e c a r a c t è r e n ' e s t p a s u n sép a r a t e u r e t si m o t _ e n _ c o u r s e s t fa u x , m e t tr e m o t _ e n _ c o u r s à v r a i .
Q u a n t à la c o n d it io n d ' a r r ê t , e l le s ' e x p r i m e d i ff é r e m m e n t su i v a n t la d é m a r c h e a d o p t é e :

- d eu x c a r a c t è r e s c o n s é c u t if s é g a u x à \ n p o u r l a p r e m i è r e , c e q u i i m p o s e d e c o n s e r v e r e n p e r m a n e n c e l a v a l e u r d u
" c a r a c t è r e p r é c é d e n t " ; c e d e r n i e r s e r a i n it ia l i s é à u n e v a l e u r q u e l c o n q u e d i f f é r e n te d e \ n p o u r é v i te r u n t r a it e m e n t
p a r t ic u l i e r d u p r e m i e r c a r a c t è r e d u t e x t e .
- l ig n e v i d e p o u r l a s e c o n d e .

P r o g r a m m e b a s é s u r la r é p é t it io n d u t r a it e m e n t d ' u n c a r a c t è r e

#include <stdio.h>
#define VRAI 1 /* pour "simuler" des ..... */
#define FAUX 0 /* ..... valeurs logiques */

main()

{ int sep(char) ; /* prototype fonction test "caractère séparateur?" */


char c, /* pour lire un caractère frappé au clavier */
cprec ; /* caractère précédent */
int nmots, /* compteur du nombre de mots */
fin_texte, /* indicateurs logiques : - fin texte atteinte */
mot_en_cours ; /* - mot trouvé */

cprec = ' ' ;


fin_texte = FAUX ;
mot_en_cours = FAUX ;
nmots = 0 ;
printf ("donnez votre texte, en le terminant par une ligne vide\n") ;

while (!fin_texte)
{ if ( sep(c=getchar()) )
{ if (mot_en_cours)
{ nmots++ ;
mot_en_cours = FAUX ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 112/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

112 Exercices en langage C


}
else mot_en_cours = VRAI ;
if ( c=='\n' && cprec=='\n') fin_texte = VRAI ;
cprec = c ;
}
printf ("\n\nvotre texte comporte %d mots :\n", nmots) ;
}

/*******************************************/
/* fonction d'examen d'un caractère */
/*******************************************/
int sep (char c)
{
char sep[12] = {'\n', /* fin de ligne */
' ', /* espace */
',', ';', ':', '.', '?', '!', /* ponctuation */
'(', ')', /* parenthèses */
'"', '\'' } ; /* guillemets, apostrophe*/
int nsep=12, /* nombre de séparateurs */
i ;

i = 0 ;
while ( c!=sep[i] && i++<nsep-1 ) ;
if (i == nsep) return (0) ;
else return (1) ;

Commentaires

* N o u s a v o n s in t r o d u it u n e v a r ia b le " l o g iq u e " n o m m é e f i n _ t e x t e q u i n o u s f a c i li te l a d é t e c t io n d e l a f in d u t e x te . N o u s
a u r i o n s p u n o u s e n p a sser e n i n t r o d u i sa n t u n e i n s t r u c ti o n b r e a k a u s e i n d' u n e b o u c l e d o . . . w h i le { 1 } ( b o u c l e i n f i n i e ).

* D a n s l e tr a i te m e n t d e c h a q u e c a r a c t è re , n o u s n ' a v o n s p a s r e sp e c t é " à l a le t tr e " l ' a l g o r i th m e p r o p o s é l o r s d e l ' a n a l y se .


E n e f fe t , n o u s e x é c u t o n s l ' i n s t ru c t io n :

mot_en_cours = VRAI

m ê m e s i l ' in d ic a t e u r m o t _ e n _ c o u r s a d é jà l a v a l e u r V R A I ; c e l a n o u s é v i te u n t e s t su p p l é m e n t a i re , s a n s m o d i f ie r l e
c o m p o r t e m e n t du p r o g r a m m e ( p u i s qu e l a m o d i f ic a t i o n a in s i a p p o r t é e c o n s i s te à m e t tr e à V R A I l' i n d ic a t e u r a lo r s q u ' i l y
est déjà).

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 113/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I. Variations algorithmiques sur les instructions de base 113

* D a n s l a fo n c t i o n s e p , l a s e u l e i n s t r u c t i o n :

while ( c!=sep[i] && i++<nsep-1 ) ;

p e r m e t d e s a v o i r si l e c a r a c t è r e c e s t u n s é p a r a t e u r . E n e f f e t, i l n e f a u t p a s o u b l i e r q u e l ' o p é r a t e u r & & n ' é v a l u e s o n


s e c o n d o p é r a n d e q u e l o r s q u e c e l a e s t n é c e s s a i r e . A u t r e m e n t d i t, s i l a p r e m i è r e c o n d i ti o n e s t fa u s s e ( c e s t do n c é g a l à u n
s é p a r a t e u r ), l ' e x p r e s s i o n i++<nsep-1 n ' e s t p a s é v a l u é e e t i n ' e s t d o n c p a s in c r é m e n t é e . S i, p a r c o n t r e , c e t te p r e m i è r e
c o n d i ti o n e s t v é r if ié e a l o r s q u ' o n a e x p l o r é l a t o t a li té d e s s é p a r a t e u r s ( i= 1 1 ) , l a s e c o n d e c o n d i ti o n e s t é v a l u é e e t e l le e s t
t r o u v é e f a u s se , m a i s e n m ê m e t e m p s , i s e tr o u v e i n c r é m e n t é e (à 1 2 ) .

E n d é f i n i t iv e , o n v o i t q u ' à l a fi n d e c e t t e in s t r u c t i o n , l o r s q u e i v a u t 1 2 , c e l a si g n i f ie q u e c n e f i g u r e p a s d a n s l a l i s te d e s
séparateurs.

P r o g r a m m e b a s é s u r la r é p é t it io n d u t r a it e m e n t d ' u n e l ig n e

#include <stdio.h>
#include <string.h>
#define VRAI 1 /* pour "simuler" des ..... */
#define FAUX 0 /* ..... valeurs logiques */
main()
{
int sep(char) ; /* prototype fonction test "caractère séparateur?" */
char ligne[128] ; /* pour lire une ligne frappée au clavier */

int nmots, /* compteur du nombre de mots */


mot_en_cours, /* indicateur logique : mot trouvé */
i ;

nmots = 0 ;
mot_en_cours = FAUX ;
printf ("donnez votre texte, en le terminant par une ligne vide\n") ;
do
{ gets(ligne) ;
for (i=0 ; i<=strlen(ligne) ; i++) /* on traite aussi le '\0' */
if ( sep(ligne[i]) )
{ if (mot_en_cours)
{ nmots++ ;
mot_en_cours = FAUX ;
}
}
else mot_en_cours = VRAI ;
}
while (strlen(ligne)) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 114/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

114 Exercices en langage C


printf ("\n\nvotre texte comporte %d mots :\n", nmots) ;
}
/********************************************/
/* fonction d'examen d'un caractère */
/********************************************/
int sep (char c)
{
char sep[12] = {'\0', /* fin de ligne (chaîne) */
' ', /* espace */
',', ';', ':', '.', '?', '!', /* ponctuation */
'(', ')', /* parenthèses */
'"', '\'' } ; /* guillemets, apostrophe*/
int nsep=12, /* nombre de séparateurs */
i ;

i = 0 ;
while ( c!=sep[i] && i++<nsep-1 ) ;
if (i == nsep) return (0) ;
else return (1) ;
}

Commentaires

N ous avons dû :

- d ' u n e p a r t , a u s e i n d e l a f o n c t io n s e p , r e m p l a c e r le s é p a r a t e u r \ n p a r \ 0 ,
- d' a u t r e p a r t, d a n s l a b o u c l e d e t r a it e m e n t d e s c a r a c t è r es d ' u n e li g n e , t r a it e r c o m m e l e s a u t r e s c e c a r a c t è re d e f i n d e
l ig n e ( c ' e s t - à - d i r e f a i r e v a r i e r i d e 0 à s t r l e n ( l i g n e ) e t n o n s t r l e n ( l i g n e ) - 1 ) , a f i n d ' é v i t e r de c o m p t e r p o u r u n s e u l m o t
l e d e r n i e r m o t d ' u n e l ig n e ( n o n su i v i d ' u n s ép a r a t e u r ) e t l e p r e m i e r d e l a su i v a n t e .

Discussion

* E n c e q u i c o n c e r n e l a fo n c t io n d ' e x a m e n d ' u n c a r a c t è r e ( n o m m é e s e p ) , v o u s c o n s t a t e z ( d a n s l e s d e u x v e r s i o n s
p r o p o s é e s ) q u e n o u s l ' a v o n s d é c l a r é e d a n s l e p r o g r a m m e p r in c i p a l ( m a i n ) , b i e n q u e c e l a s o i t fa c u l ta t i f, d a n s l a m e s u r e o ù
e l l e f o u r n i t u n r é s u l t a t d e t y p e in t .

* A u c u n d e s d eu x p r o g r a m m e s p r o p o s é s n e p o s e d e p r o b l è m e d e p r o t e c t io n v i s - à -v i s d e s r é p o n s e s f o u r n i e s p a r
l'utilisateur.

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 115/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

II : U T IL IS A T IO N
D E S T R U C T U R ES

L e c h a p i t re I v o u s a p r o p o s é d e s e x e r c i c e s f a is a n t a p p e l a u x i n s tr u c t io n s d e b a s e d u l a n g a g e C . L e s e x e r c i c e s d e c e
c h a p i t r e f o n t i n t e r v e n i r , e n p l u s , l a n o t i o n d e s t r u c t u r e s o u s d e s fo r m e s d i v e r s e s ( e n p a r t i c u l i e r le s t a b l e a u x d e s tr u c t u r e s
et leur initialisation).

II- 1 S ig n e d u z o d ia q u e
________________________________________________________________________________________

Enoncé

A f fic h e r l e s i g n e d u z o d i a q u e c o r r e s p o n d a n t à u n e d a t e d e n a i s s a n c e f o u r n i e e n d o n n é e , s o u s la f o r m e :

j o ur m o i s
L e s d e u x i n fo r m a t io n s s e r o n t s é p a r é e s p a r a u m o i n s u n e sp a c e. L a p r e m i è r e s e ra f o u r n i e s o u s fo r m e n u m é r i q u e , t a n d is
q u e l a s e c o n d e l e s e ra s o u s f o r m e d ' u n e c h a î n e d e c a r a c t è re s .

N o u s v o u s r a p p e l o n s q u e l e s p é r i o d e s c o r r e s p o n d a n t à c h a q u e s i g n e s o n t le s s u i v a n t e s :

Capricorne 23 décembre - 19 janvier


Verseau 20 janvier - 19 février
Poisson 20 février - 20 mars

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 116/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

116 Exercices en langage C


Bélier 21 mars - 19 avril
Taureau 20 avril - 20 mai
Gémeau 21 mai - 20 juin
Cancer 21 juin - 21 juillet
Lion 22 juillet - 22 août
Vierge 23 août - 22 septembre
Balance 23 septembre - 22 octobre
Scorpion 23 octobre - 21 novembre
Sagittaire 22 novembre - 22 décembre

Exemples

donnez votre jour et votre mois (sans accent) de naissance ?


11 july
*** erreur de nom de mois ***
_______________________

donnez votre jour et votre mois de naissance ?


16 janvier
vous êtes né sous le signe suivant : Capricorne
________________________________________________________________________________________

ANALYSE

L e p r o g r a m m e d o i t ê t r e e n m e s u r e d ' é ta b l ir u n e c o r r e s p o n d a n c e e n t r e le n o m d ' u n s ig n e e t le s d e u x d a t e s l im i te s
c o r r e s p o n d a n t e s . O n p e u t d é j à n o t e r q u e l a d a t e d e f in d ' u n si g n e e s t la v e i ll e d e c e l le d e d é b u t d u s u i v a n t . N o u s n o u s
c o n t e n t e r o n s d o n c d e n e c o n s e r v e r q u ' u n e s e u l e d e c e s d e u x i n f o r m a t i o n s , p a r e x e m p l e la d a t e d e f in .

L a c o r r e s p o n d a n c e s o u h a i té e p e u t ê tr e r é a l i s ée :

- p a r p l u si e u r s t a b le a u x ( jo u r , m o i s , si g n e ) r e l ié s p a r u n e v a l e u r c o m m u n e d ' i n d i c e .
- p a r u n s e u l ta b l e a u d a n s l e q u e l c h a q u e é l é m e n t e s t u n e s t r u c t u r e c o m p o r ta n t u n n u m é r o d e j o u r , u n n o m d e m o i s e t
u n n o m d e si g n e .

N o u s c h o i si r o n s l a s e c o n d e s o l u ti on c a r e l l e p e r m e t d e m i e u x m e t tr e e n é v i d en c e la c o r r e sp o n d a n c e e n t r e l e s
i n f o rm a t io n s , a u m o m e n t d e l' i n i tia l i sa t io n a u s e i n d u p r o g r a m m e .

L a r e c h e r c h e du s i g n e c o r r e sp o n d a n t à u n e d a t e d o n n é e s e f a it a lo r s d e l a m a n i è r e s u iv a n t e :

- O n c h e r c h e t o u t d ' a b o r d l' é l é m e n t (n o u s l e n o m m e r o n s x ) a p p a r t e n a n t à n o t r e ta b l e a u d e s t ru c t u r e s , d o n t le n o m d e
m o i s c o r re s p o n d à c e l u i p r o p o s é e n d o n n é e . S ' i l n ' e x i s te p a s , o n l e s ig n a l e p a r u n m e s s a g e a p p r o p r i é .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 117/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 117
- O n r e g a r d e e n s u i t e s i le n u m é r o d u j o u r p r o p o s é e s t in f é r ie u r o u é g a l à c e l u i d e l ' é l é m e n t x .
D a n s l ' a f fi r m a t i v e , o n p e u t e n c o n c l u r e q u e l a d a t e p r o p o s é e e s t a n t é r ie u r e à l a d a t e d e f i n d u s ig n e f ig u r a n t d a n s
l ' é l é m e n t x , c e q u i f o u r n it la r é p o n s e v o u l u e .
D a n s l e c a s c o n t ra i r e , o n e n c o n c l u t q u e l a d a t e p r o p o s é e e s t p o s t é r ie u r e à l a d a t e d e d é b u t d u s ig n e f ig u r a n t d a n s
l ' é l é m e n t x ; i l su f f it d o n c d ' e x a m i n e r l' é l é m e n t su i v a n t p o u r o b t e n i r la r é p o n s e v o u l u e . T o u te f o i s, s i x e st l e
d e r n i e r é l é m e n t d e n o t r e t a b le a u , i l f a u dr a c o n s i d ér e r q u e s o n s u i v a n t e s t e n f a it le p r e m i e r é lé m e n t d u t a b l e a u .

O n r e m a r q u e r a q u e l ' a lg o r it h m e p r o p o s é f o n c t io n n e e f f e c t iv e m e n t p a r c e q u e c h a c u n d e s 1 2 m o i s d e l ' a n n é e n e c o m p o r te
q u ' u n s e u l c h a n g e m e n t d e si g n e . S i c e l a n ' a v a it p a s é t é le c a s , i l a u r a it fa l lu " e n c a d r e r " l a d a t e p r o p o s é e p a r d e u x d a t e s
d ' é lé m e n t s c o n s é c u t if s d e n o t r e ta b l e a u .

Programme

#include <stdio.h>
#include <conio.h>
#include <string.h>

main()
{
struct s_date { int jour ;
char mois [10] ;
char signe [11] ;
} ;
struct s_date date [12] = { 23, "decembre", "Sagittaire",
20, "janvier", "Capricorne",
20, "fevrier", "Verseau",
21, "mars", "Poisson",
20, "avril", "Bélier",
21, "mai", "Taureau",
21, "juin", "Gémeau",
22, "juillet", "Cancer",
23, "aout", "Lion",
23, "septembre", "Vierge",
23, "octobre", "Balance",
22, "novembre", "Scorpion"
} ;
int jour_n ; /* jour de naissance */
char mois_n [10] ; /* mois de naissance */
int nbv, i ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 118/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

118 Exercices en langage C

/* lecture date de naissance */


printf ("donnez votre jour et votre mois de naissance ?\n") ;
scanf ("%d %s", &jour_n, mois_n) ;

/* recherche et affichage du signe correspondant */


i = 0 ;
while ( stricmp(date[i].mois, mois_n) && i++<11 ) { }

if (i<12)
{ printf ("vous êtes né sous le signe suivant : ") ;
if (jour_n >= date[i].jour) i = (i+1)%12 ;
printf ("%s", date[i].signe) ;
}
else printf ("*** erreur de nom de mois ***") ;
}

Commentaires

* N o u s a v o n s d é f in i ic i u n m o d è l e d e s tr u c tu r e n o m m é s _ d a t e , d a n s le q u e l n o u s tr o u v o n s u n n u m é r o d e j o u r , u n n o m d e
m o i s e t l e s ig n e c o r r e s p o n d a n t . N o u s a v o n s p r é v u 1 0 c a r a c t è r e s p o u r le n o m d e m o i s , c e q u i a u t o r i se d e s c h a î n e s d e
l o n g u e u r i n f é r ie u r e o u é g a l e à 9 ( c o m p t e te n u d u \ 0 d e f in ) ; d e m ê m e , n o u s a v o n s p r é v u 11 c a r a c t è r e s p o u r l e si g n e .

L e t a b le a u n o m m é d a t e e s t u n t a b l e a u d e 1 2 é l é m e n t s a ya n t c h a c u n l e t y p e s _ d a t e . N o u s l' a v o n s i n i tia l i s é d a n s s a
d é c l a r a t io n , c e q u i p e r m e t d e m e t tr e f a c il e m e n t e n p a r a l l è le c h a q u e s i g n e e t s a d a t e d e f i n .

* E n c e q u i c o n c e r n e l a le c t u r e d e la d a t e a u c l a v i e r , n o u s n ' a v o n s p a s p r év u , i c i , d e p r o t e c t io n v i s - à -v i s d ' é v e n tu e l l es
e r r e u r s d e f r a p p e d e l ' u t il i sa t e u r (c e l a n ' é t a it p a s d e m a n d é p a r l ' é n o n c é ) .

* R a p p e l o n s q u e l a f o n c t io n s t r i c m p c o m p a r e , s a n s t e n ir c o m p t e d e l a d i st in c t i o n m a j u s c u le s / m i n u s c u l es , l e s d e u x c h a î n e s
d o n t o n l u i fo u r n i t l' a d r e s s e e n a r g u m e n t . E l l e r e s ti tu e u n e v a l e u r n o n n u l l e ( q u ' o n p e u t i n te r p r é t e r c o m m e v r a i ) lo r s q u e
l e s d e u x c h a î n e s s o n t d i f fé r e n t e s e t u n e v a l e u r n u l l e ( fa u x ) lo r s q u ' e l l e s s o n t é g a l e s .

* L a r e c h e r c h e d u n o m d e m o i s e s t r é a l i sé e p a r l a s e u le i n s tr u c t io n :

while ( stricmp(date[i].mois, mois_n) && i++<11 ) {}

C e l le - c i p o s sè d e u n d o u b l e a v a n t a g e ; to u t d ' a b o r d , c e l u i d e l a c o n c i si o n ; e n su i t e , c e l u i d e n o u s p e r m e t tr e d e s a v o i r
d i r e c te m e n t si l a r e c h e r c h e a é t é f r u c t u e u s e o u n o n .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 119/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 119
E n e f fe t , il n e fa u t p a s o u b l ie r q u e l ' o p é r a t e u r & & n ' é v a l u e s o n s e c o n d o p é r a n d e q u e l o r s q u e c e l a e s t n é c e s s a ir e .
A u t re m e n t d i t, s i l a p r e m i è r e c o n d i ti o n e s t fa u s s e ( il y a d o n c é g a l it é d e s d e u x c h a î n e s ) , l ' e x p r e s s io n i++<11 n ' e s t p a s
é v a l u é e e t i n ' e s t do n c p a s in c r é m e n t é e . L a v a l e u r d e i d é si g n e a l o r s l' é l é m e n t v o u l u .

S i , p a r c o n t r e , c e t te p r e m i è r e c o n d i t io n e s t v é r i f ié e ( i l n ' y a d o n c p a s é g a l it é d e s d e u x c h a î n e s ) a l o rs q u ' o n e s t a r r iv é e n
f i n d e ta b l e (i = 1 1 ) , l a se c o n d e c o n d i ti o n e s t é v a l u é e e t e ll e e s t t r o u v é e f a u s s e, m a i s en m ê m e t e m p s i s e tr o u v e
i n c r é m e n t é e ( à 1 2 ).

E n d é f in i ti v e , o n v o i t q u e , à l a f i n d e c e t te i n s t ru c t i o n , l o r s q u e i v a u t 1 2 , c e l a si g n i f ie q u e l ' é l é m e n t c h e r c h é n e f i g u r e p a s
d a n s l a ta b l e . D a n s le c a s c o n t ra i r e ( i< 1 2 ) , i d é s ig n e l ' é l é m e n t c h e r c h é .

B i e n e n te n d u , c e t te " r e c h e r c h e e n t a b le " p o u v a it s e p r o g r a m m e r d e b e a u c o u p d ' a u t re s m a n i è re s . P a r e x e m p l e , n o u s


aurions pu écrir e :

while ( stricmp(date[i].mois, mois_n) && i<11 ) i++ ;

T o u t e f o i s , c e t t e i n s tr u c t i o n n ' e s t p a s é q u i v a l e n t e à la p r é c é d e n t e . E n e f f e t , l o r s q u e i v a u t 1 1 , c e l a p e u t si g n i f ie r :

- so i t q u e l ' é l é m e n t c h e r c h é e s t e n p o s i t io n 1 1 ( p r e m i e r te s t s a t i sf a i t ),
- so i t q u e l ' é l é m e n t c h e r c h é n e f i g u r e p a s d a n s l a ta b l e ( s e c o n d t e s t s a ti s f a it ) .
P o u r t ra n c h e r , i l e s t d o n c n é c e s s a i re , d a n s c e c a s , d ' e f f e c t u e r u n e c o m p a r a i so n su p p l é m e n t a i re .

N o t e z q u e , p a r c o n t r e , u n e i n s t r u c ti o n t e ll e q u e :

while ( stricmp(date[i].mois, mois_n) && i++ <= 11) {}

s e r a i t q u e l q u e p e u e r r o n é e . E n e f f e t, d a n s l e c a s o ù l ' é l é m e n t c h e r c h é n e f ig u r e r a i t pa s d a n s l e t a b l e a u , o n s e r a i t a m e n é à
évaluer l'expression :

date[i].mois

a v e c u n e v a l e u r i é g a l e à 1 2 , c ' e s t -à - d ir e d ési g n a n t u n é l é m e n t s it u é e n d e h o r s d u t a b l e a u . C e r t e s, e n g é n é r a l , c e l a n e
s e r a i t g u è r e v i si b l e d a n s le c o m p o r t e m e n t d u p r o g r a m m e , d a n s l a m e s u r e o ù i l e s t bi en p eu p r o b a b l e q u e c e t te v a l e u r so i t
égale au nom d e m ois voulu...

* N o t e z l ' e m p l o i d e l' o p é r a t e u r a r i th m é t iq u e % q u i p e r m e t d e r é g le r l e p r o b l è m e d u s i g n e s u i v a n t l e d e r n i e r si g n e d u
tableau.

DISCUSSION

* T e l q u ' i l a é t é p r é v u , n o t r e p r o g ra m m e a c c e p t e d e s n o m s d e m o i s é c r it s e n m i n u s c u l e s o u e n m a j u s c u l es m a i s s a n s
a c c e n t . D a n s u n p r o g r a m m e r é e l , il s e ra i t so u h a i t a b le d e f a i re p r e u v e d e p l u s d e to l é r a n c e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 120/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

120 Exercices en langage C

* N o t r e r e c h e r c h e d u n o m d e m o i s a é t é r é a li s ée i c i p a r u n a l g o r it h m e d i t d e r e c h e r c h e s é q u e n t ie ll e en t a b l e ( a l g o r i t h m e
q u i , c o m m e n o u s l ' a v o n s v u , p e u t s e p r o g ra m m e r e n C à l ' a i de d ' u n e se u l e in s tr u c ti o n ). D ' a u t r e s a l g o r i th m e s p l u s
r a p i d e s e x i s t e n t , e n p a r t i c u l i e r c e l u i d it d e r e c h e r c h e d ic h o t o m i q u e . L ' e x e r c ic e I V - 5 v o u s en p r o p o s er a u n ex em p l e .

II- 2 C o d a g e m o r s e
________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e a f fi c h a n t le c o d a g e e n m o r se d ' u n t e x t e f o u r n i a u c l a v ie r e t n e d é p a s s a n t p a s u n e " l ig n e " d e 1 2 7


c a r a c t è r e s . L e s c a r a c t è r e s s u s c e p t ib l es d ' ê t r e c o d é s e n m o r s e s o n t :

- le s 2 6 l e t t re s d e l ' a l p h a b e t ( s u p p o s ée s t a p é e s e n m a j u s c u l es ) ,
- le s 1 0 c h i f fr e s d e 0 à 9 ,
- le point,
S i l e te x t e c o n t i e n t d' a u t r e s c a r a c tè r e s q u e c e u x - c i , le p r o g r a m m e a f f ic h e r a si m p l e m e n t d e s p o i n t s d ' i n t e r r o g a t io n à l a
place du code m orse.

T a b le a u d e s c o d e s m o r s e s

A .- B -... C -.-. D -.. E .


F ..-. G --. H .... I .. J .---
K -.- L .-.. M -- N -. O ---
P .--. Q --.- R .-. S ... T -
U ..- V ...- W .-- X -..- Y -.--
Z --.. . .-.-.-
0 ----- 1 .---- 2 ..--- 3 ...-- 4 ....-
5 ..... 6 -.... 7 --... 8 ---.. 9 ----.

Exemple
donnez votre message (1 ligne maxi) :
LE LANGAGE C, CONCU EN 1972, EST L'OEUVRE DE DENIS RITCHIE.

voici la traduction de votre message

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 121/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 121
.-.. . ?????? .-.. .- -. --. .- --. .
?????? -.-. ?????? ?????? -.-. --- -. -.-. ..- ??????
. -. ?????? .---- ----. --... ..--- ?????? ?????? .
... - ?????? .-.. ?????? --- . ..- ...- .-.
. ?????? -.. . ?????? -.. . -. .. ...
?????? .-. .. - -.-. .... .. . .-.-.-
________________________________________________________________________________________

ANALYSE

L e p r o g ra m m e d o i t d o n c ê t r e e n m e s u r e d ' é ta b l ir u n e c o r r e s p o n da n c e e n t re u n c a r a c t è r e e t so n c o d e m o r s e . L à e n c o r e ,
n o u s p o u r r i o n s u t i li se r d eu x t a b le a u x r e l i é s p a r u n e v a l e u r c o m m u n e d' u n i n d i c e . M a i s l ' e m p l o i d' u n t a b l e a u d e
s t ru c t u r e s p e r m e t d e m i e u x m e t tr e e n é v i d e n c e la c o r r e sp o n d a n c e e n t r e l e s i n f o rm a t io n s , l o r s d e l ' i n i ti a li sa t io n . C h a q u e
é l é m e n t ( s tr u c t u r e ) d u t a b l e a u c o n t i e n d r a :

- un caractère,
- le c o d e m o r s e c o r re s p o n da n t , e x p r i m é s o u s f o r m e d ' u n e c h a î n e .
L e c o d a g e d ' u n c a r a c t è r e s e fe r a a l o r s si m p l e m e n t p a r s a l o c a l i sa t io n d a n s l e t a b le a u .

Programme

#include <stdio.h>
#include <string.h>
#define NL 37 /* nombre de caractères codés */

main()
{
struct code { char lettre ;
char * morse ;
} ;
struct code table[NL] = /* code morse */
{ 'A', ".-", 'B', "-...", 'C', "-.-.",
'D', "-..", 'E', ".", 'F', "..-.",

'G', "--.", 'H', "....", 'I', "..",


'J', ".---", 'K', "-.-", 'L', ".-..",
'M', "--", 'N', "-.", 'O', "---",
'P', ".--.", 'Q', "--.-", 'R',".-.",
'S', "...", 'T', "-", 'U', "..-",
'V', "...-", 'W', ".--", 'X', "-..-",

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 122/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

122 Exercices en langage C


'Y', "-.--", 'Z', "--..",
'.', ".-.-.-",
'0', "-----", '1', ".----", '2', "..---",
'3', "...--", '4', "....-", '5', ".....",
'6', "-....", '7', "--...", '8', "---..",
'9', "----."
} ;
char ligne[128] ; /* pour lire une ligne au clavier */
int i, j ;

/* lecture message à traduire */


printf ("donnez votre message (1 ligne maxi) : \n") ;
gets (ligne) ;
printf ("\n\n voici la traduction de votre message\n") ;

/* traduction lettre par lettre */


for (i=0 ; i<strlen(ligne) ; i++)

{ j=0 ;
while (ligne[i] != table[j].lettre && j++<NL-1) ;
if (j<NL) printf ("%7s", table[j].morse) ;
else printf (" ??????") ;
if ( ! ((i+1)%10) ) printf ("\n") ; /* 10 codes morse par ligne */
}
}

Commentaires

* N o u s a v o n s d é fi n i u n m o d è l e d e s t ru c t u r e , n o m m é c o d e , d a n s l e q u e l n o u s t r o u v o n s :

- un caractère,
- u n p o i n t e u r su r u n e c h a î n e d e c a r a c t è r e s d e s t i n é e à c o n t e n ir l e c o d e m o r s e c o r r e s p o n d a n t .
N o t e z q u e , c o n t r a i re m e n t à c e q u e n o u s a v i o n s fa i t d a n s l e p r o g ra m m e d e l ' e x e r c i c e p r é c é d e n t , n o u s a v o n s p r é v u i c i u n
p o i n t e u r s u r u n e c h a î n e e t n o n u n t a b l e a u d e c a r a c t è r es .

D a n s c e s c o n d i ti o n s , l e ta b l e a u t a b l e o c c u p e r a s e u le m e n t 3 7 (v a l e u r d e N L ) e m p l a c e m e n t s d o n t la t a il le s e r a
g é n é r a l e m e n t de 3 o u 5 o c t e t s (1 p o u r l e c a ra c t è r e e t 2 o u 4 p o u r l e p o in t e u r ). L ' e m p l a c e m e n t m ê m e d e s c h a î n e s
c o r r e s p o n d a n t e s s e t r o u v e c e p e n d a n t r é s e r v é à l a c o m p i la t io n , d e p a r l e f a it q u e n o u s a v o n s i n i tia l i s é c e t a b l e a u l o r s d e s a
d é c l a r a t io n . I l n e f a u t p a s o u b l i e r , e n e f f e t , q u ' u n e n o t a t io n t e l l e q u e :

".-.-."

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 123/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 123
e s t i n te r p r é t é e p a r l e c o m p i la t e u r c o m m e r e p r é s e n t a n t l ' a d r e s s e d e l a c h a î n e fo u r n i e , m a i s q u ' e n m ê m e t e m p s i l l u i
r é s er v e u n e m p l a c e m e n t .

C e t te f a ç o n d e p r o c é d e r p e u t s e r é v è le r p lu s é c o n o m i q u e e n p la c e m é m o i r e q u e la p r é c é d e n t e , d a n s l a m e s u r e o ù c h a q u e
c h a î n e n ' o c c u p e q u e l ' e s p a c e q u i l u i e s t n é c e s s a ir e ( il f a u t to u t e f o is a j o u t e r , p o u r c h a q u e c h a î n e , l ' e s p a c e n é c e s s a i r e à u n
pointeur).

Remarque :

E n t o u t e r i g u e u r , l e t a b l e a u table est de classe automatique (puisqu' il apparaît au sein d' une fonction - ici le
p r o g ra m m e p r in c i p a l ). S o n e m p l a c e m e n t e s t d o n c a l lo u é a u m o m e n t d e l ' e x é c u ti o n d u p r o g r a m m e ( c ' e s t -à - di r e , ic i ,

d è s l e d éb u t ). L e s c o n s t a n t e s c h a în e s , p a r c o n t re , v o i e n t l e u r s e m p l a c e m e n t s d é f in i s d è s l a c o m p i la t io n .
S i n o t r e t a b l e a u t a b l e a v a i t é té d é c l a ré d e m a n i è r e g l o b a l e , i l a u r a it é t é d e c l a s s e s t a t i q u e . S o n e m p l a c e m e n t a u r a it
a l o r s é t é r é s e r v é d è s l a c o m p i la t io n .
U n e t e l l e d i s ti n c t i o n e s t t o u t e f o i s re l a t i v e m e n t f o r m e l l e e t e l l e n ' a g u è r e d ' i n c i d e n c e e n p r a t iq u e . I l e s t, e n e f f e t ,
g é n é r a l e m e n t , a s s e z t e n ta n t d e c o n s i d ér e r l e s v a r i a bl e s d é c l a r é e s d a n s l e p ro g r a m m e p r in c i p a l c o m m e " q u a s i
s ta t iq u e s " , d a n s la m e s u r e o ù , b i e n q u e n o n r é s e r v é e s à l a c o m p i la t io n , e l l e s n ' e n n ' o c c u p e n t p a s m o i n s d e l' e s p a c e
p e n d a n t t o u t e l a d u r é e d e l' e x é c u t io n d u p r o g r a m m e .

* L a r e c h e r c h e d u c a r a c t è r e d a n s n o t re t a b l e a u t a b l e e s t r é a l i s é e p a r l a s e u l e i n s t r u c t i o n :

while (ligne[i] != table[j].lettre && j++<NL-1) ;

DISCUSSION

D a n s u n p r o g r a m m e " r é e l " , i l f a u d r a i t p r é v o i r d ' a c c e p t e r u n m e s s a g e d e p l u s d ' u n e l ig n e , c e q u i p o s e r a i t l e p r o b l è m e d e


s a m é m o r i s a ti o n . O n p o u r r a i t ê t r e a m e n é , s o i t à l u i i m p o s e r u n e t a il le m a x i m a l e , so i t à s e to u r n e r v e r s d e s m é t h o d e s d e
" g e s ti o n d y n a m i q u e " .

II- 3 D é c o d a g e m o r s e

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 124/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

124 Exercices en langage C


Enoncé

E c r ir e u n p r o g ra m m e p e r m e t ta n t d e d é c o d e r u n m e s s a g e e n m o r s e f o u rn i a u c l a v i e r so u s f o r m e d ' u n e su i t e d e c a r a c t è r e s .
C e l le - c i p o u r r a c o m p o r t e r :

- d es p o i n t s e t d e s t ir e t s r e p r é s e n t a n t l e s c o d e s p r o p r e m e n t d i t s ,
- u n o u p l u s i eu r s e sp a c es p o u r s ép a r e r l es d i f fé r e n t s c o d e s ( o n n ' i m p o s e r a d o n c p a s à l ' u t i li sa t e u r d ' e m p l o y e r u n
" g a b a r it " f ix e p o u r c h a q u e c o d e ) .
O n s u p p o ser a q u e l e m e s s a g e f o u r n i n e d é p a s s e p a s u n e li g n e d e 1 2 7 c a r a c t è r e s. L e s c o d e s i n e x is ta n t s s e r o n t tr a d u i ts p a r
l e c a r a c tè r e " ? " .

O n u t il i ser a l e t a b le a u d e s c o d e s m o r s e s f o u r n i d a n s l ' e x e r c i c e p r é c é d e n t ( II - 2) .

Exemple

donnez votre message (1 ligne maxi) :


-... --- -. .--- --- ..- .-. .-.-.- .-.-.

voici la traduction de votre message


B O N J O U R . ?

________________________________________________________________________________________

ANALYSE

C e p r o g r a m m e d o i t do n c é t a b l ir u n e c o r re s p o n d a n c e e n t re u n c o d e m o r s e e t u n c a r a c t è r e . N o u s p o u v o n s , p o u r c e f a i r e ,
u t il i se r l a m ê m e s t ru c t u r e q u e d a n s l ' e x e r c i c e p r é c é d e n t . L e d é c o d a g e d ' u n c a r a c t è r e s e f e ra a l o r s e n e x p l o r a n t , n o n p l u s
l a p a r ti e c a r a c t è re , m a i s la p a r t ie c h a î n e d u t a b le a u d e s t ru c t u r e . L ' a l g o r i th m e d e r e c h e r c h e s e r a d o n c s i m i la i r e , l a
c o m p a r a i so n d e c a ra c t è r e s é ta n t re m p l a c é e p a r u n e c o m p a r a i so n d e c h a în e s .

E n c e q u i c o n c e r n e l e m e s s a g e e n m o r s e , n o u s p o u v o n s l e li r e p a r g e t s d a n s u n t a b le a u d e 1 2 8 c a r a c t è re s , n o m m é l i g n e .
L e p r in c i p a l p r o b l è m e q u i s e p o s e a lo r s à n o u s e s t c e l u i d e l' a c c è s à c h a c u n d e s c o d e s m o r s e s c o n t e n u s d a n s l i g n e ; e n
e f f e t, c e u x - c i s o n t é c r i ts a v e c u n g a b a r it v a r i a b le e t s é p a r é s p a r u n n o m b r e v a r ia b l e d ' e sp a c e s .
N o u s p r o p o so n s d e r é p é t e r l e tr a i te m e n t su i v a n t , fo n d é s u r l ' e m p l o i d ' u n p o i n te u r d e c a r a c t è r e s (i n d ic e ) d a n s l e ta b l e a u
ligne :

- A v a n c e r l e p o i n t e u r , t a n t q u ' i l d é si g n e u n e sp a c e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 125/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 125
- E x t r a ir e , à p a r t ir d e l a p o s i ti o n i n d i q u é e p a r l e p o i n t e u r , à l ' a i de d e s s c a n f , u n e c h a în e d e l o n g u e u r m a x i m a l e 7
( p u i s qu e a u c u n c o d e m o r s e n e d é p a s s e c e t te l o n g u e u r ) . P o u r c e l a , n o u s f e r o n s a p p e l a u c o d e f o r m a t % 7 s , l e q u e l
i n t e r r o m p t l' e x p l o r a t i o n , s o i t q u a n d u n s é p a r a t e u r e s t r e n c o n t r é , s o i t lo r s q u e l a l o n g u e u r i n d i q u é e ( 7 ) e s t a t t e i n te .
- I n c r é m e n t e r le p o i n t e u r d e l a l o n g u e u r d e l a c h a î n e a i n si l u e ( c a r , b i e n s û r , i l n ' a u r a p a s é t é m o d i f ié p a r s s c a n f ) .

Programme

#include <stdio.h>
#include <string.h>
#define NL 37 /* nombre de caractères codés */
#define LG 127 /* longueur ligne clavier */

main()
{
struct code { char lettre ;
char * morse ;
} ;
struct code table[NL] = /* code morse */
{ 'A', ".-", 'B', "-...", 'C', "-.-.",
'D', "-..", 'E', ".", 'F', "..-.",
'G', "--.", 'H', "....", 'I', "..",
'J', ".---", 'K', "-.-", 'L', ".-..",

'M', "--", 'N', "-.", 'O', "---",


'P', ".--.", 'Q', "--.-", 'R',".-.",
'S', "...", 'T', "-", 'U', "..-",
'V', "...-", 'W', ".--", 'X', "-..-",
'Y', "-.--", 'Z', "--..",
'.', ".-.-.-",
'0', "-----", '1', ".----", '2', "..---",
'3', "...--", '4', "....-", '5', ".....",
'6', "-....", '7', "--...", '8', "---..",
'9', "----."
} ;
char ligne[LG+1] ; /* pour lire une ligne au clavier */
char code[7] ; /* code courant à traduire */

int i, j ;

/* lecture message à traduire */


printf ("donnez votre message (1 ligne maxi) : \n") ;
gets (ligne) ;
printf ("\n\n voici la traduction de votre message\n") ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 126/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

126 Exercices en langage C

/* traduction code par code */


i=0 ;
while (i<strlen(ligne))
{
while (ligne[i] == ' ') i++ ; /* saut des espaces éventuels */
if ( i<strlen(ligne) ) /* si pas en fin de ligne */
{ sscanf (&ligne[i], "%6s", code); /* lecture code (6 car max) */
i += strlen(code) ; /* incrément pointeur dans ligne */
j=0 ; /* recherche code dans table */
while ( stricmp (code, table[j].morse) && j++<NL-1) ;
if (j<NL) printf ("%2c", table[j].lettre) ; /* code trouvé */
else printf (" ?") ; /* code non trouvé */
}
}
}

Commentaires

* D a n s l a b o u c l e d e s a u t d e s e s p a c e s é v e n t u e l s , o n n e r i s q u e p a s d ' a l le r a u - de l à d e l a f in d e l a c h a î n e c o n t e n u e d a n s
l i g n e , c a r l e c a r a c t è r e d e f i n ( \ 0 ) , d i f fé r e n t d ' u n e s p a c e , s e r v ir a d e " s e n t i n e ll e " .

* P a r c o nt r e , a v a n t d ' e x t ra i r e u n n o u v e a u c o d e p a r s s c a n f , i l e st n é c e s s a ir e d e s ' a s s u r e r q u e l ' o n n ' e s t p a s p a r v e n u e n f i n


d e l i g n e . E n e f fe t , d a n s c e c a s , s s c a n f f o u r n ir a i t u n e s u i te d e c a r a c t è r e s c o n s t it u é e d u c a r a c t è r e \ 0 ( q u i n ' e s t p a s c o n s i d é r é
p a r c e t t e fo n c t i o n c o m m e u n s é p a r a t e u r ) e t d e s c a r a c t è r e s s u i v a n t s (p r é l e v é s e n d e h o r s d u t a b le a u l i g n e ) . N o t e z q u e , e n
l ' a b s e n c e d ' u n t e l t e st , le m a l n e s e r a i t p a s t r è s g r a v e p u i s q u ' i l r e v i e n d r a i t si m p l e m e n t à p l a c e r a u p l u s 7 c a r a c t è r es d a n s
code, com m ençant par \0.

* L a r e c h e r c h e d u c o d e m o r s e d a n s le t a b le a u t a b l e e s t r é a l i s é e p a r l a s e u l e i n s t r u c t i o n :

while ( stricmp (code, table[j].morse) && j++<NL-1) ;

L e s r e m a r q u e s f a it es d a n s l e q u a t r iè m e c o m m e n t a i re d e l ' e x e r c i c e I I - 1 , à p r o p o s d e l a r e c h e r c h e s é q u e n t ie l le e n t a b l e ,
s ' a p p l i q u e n t é g a l e m e n t ic i .

DISCUSSION

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 127/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 127
N o t r e p r o g ra m m e n e d é t e c t e p a s l e c a s o ù l ' u t il i sa t e u r fo u r n i t u n c o d e m o r s e d e p l u s d e 6 c a r a c t è r e s . D a n s c e c a s, e n
effet, il se contente de le "découper" en tranches de 6 caractères (la dernière tranche pouvant avoir une longueur
inférieure).

S i l' o n s o u h a i ta i t d é t e c t e r c e g e n r e d ' a n o m a l ie , i l f a u d r a i t, a p r è s c h a q u e e x a m e n d ' u n c o d e , s ' a s s u r e r q u ' i l e s t


e f f e c ti v e m e n t su i v i d ' u n e s p a c e o u d ' u n e f i n d e c h a î n e .

II - 4 F a c t u r a t io n p a r c o d e
________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e é t a b l i ss a n t u n e f a c tu r e p o u v a n t p o r t e r su r p l u si eu r s a r t ic l e s . P o u r c h a q u e a r ti c le à f a c tu r e r ,
l ' u t i l i s a t e u r n e f o u r n i r a q u e l a q u a n t i t é e t u n n u m é r o d e c o d e à p a r t ir d u q u e l l e p r o g r a m m e d e v r a r e t ro u v e r à l a f o is l e
l i b e l lé e t l e p r i x u n i t a i re .

L e p r o g r a m m e d e v r a r e f u s e r l e s c o d e s i n e x i s ta n t s . A l a f in , i l a f f ic h e r a u n r é c a p it u la t if t e n a n t l ie u d e f a c t u r e .

L e s i n f o r m a t io n s r e l a ti v e s a u x d i ff é r e n ts a r t ic l e s s e r o n t d é f in i e s d a n s l e s o u r c e m ê m e d u p r o g r a m m e ( e t n o n d a n s u n
f ic h i e r d e d o n n é es ). E l le s e r o n t t o u t e fo i s p l a c é e s à u n n i v e a u g l o b a l, d e m a n i è r e à p o u v o i r , l e c a s é c h é a n t , f a i re l ' o b j e t
d'un sourc e séparé, appelable par #include.

O n p r é v o i r a d e u x f o n c t io n s :

- u n e p o u r r e c h e r c h e r l e s in f o r m a t io n s r e l a ti v e s à u n a r t ic l e , à p a r t i r d e s o n n u m é r o d e c o d e ,
- u n e p o u r a f f ic h e r l a fa c t u r e r é c a p i t u l a ti v e .

Exemple

combien d'articles à facturer ? 3


code article ? 25
quantité de Centrifugeuse au prix unitaire de 370.00 ? 33
code article ? 7
** article inexistant - redonnez le code : 16

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 128/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

128 Exercices en langage C


quantité de Grille-pain au prix unitaire de 199.50 ? 12
code article ? 26
quantité de Four à raclette 6P au prix unitaire de 295.25 ? 6

FACTURE

ARTICLE NBRE P-UNIT MONTANT

Centrifugeuse 33 370.00 12210.00


Grille-pain 12 199.50 2394.00
Four raclette 6P 6 295.25 1771.50

TOTAL 16375.50

________________________________________________________________________________________

ANALYSE

L ' é n o n c é n o u s p r é c i s e qu e l e s c o d e s d ' a r t ic l e s s o n t n u m é r i q u e s , m a i s i l n e d i t p a s q u ' i ls s o n t c o n s é c u t i f s . D a n s c e s


c o n d i ti o n s , il e st n é c e s s a ir e d e m é m o r i s e r l es d i f fé r e n t e s v a l e u r s p o s si b l e s d e c e s c o d e s . C o m m e n o u s d e v o n s p o u v o i r
a s s o c i e r à c h a q u e c o d e u n l i b e ll é (c h a î n e ) e t u n p r i x ( r é e l ), n o u s p o u v o n s s o n g e r à u t il i ser u n t a b l e a u d e s t r u c t u r e s, d a n s
l e q u e l c h a q u e é l é m e n t c o n t i e n t l e s i n f o r m a t i o n s r e l a ti v e s à u n a r t ic l e ( c o d e , l i b e ll é , p r i x u n i t a ir e ) . C e t a b l e a u s e r a ,
c o m m e d e m a n d é p a r l ' é n o n c é , d é c la r é à u n n i v e a u g l o b a l e t in i tia l i s é d a n s s a d é c la r a t io n .
L e t ra v a i l d e la f o n c t io n d e r e c h e r c h e ( n o u s l a n o m m e r o n s r e c h e r c h e ) c o n s i s te r a à v é r i f i e r l a p r é s e n c e d u c o d e d ' a r t ic l e
d a n s l e t a b l e a u d e s t r u c t u re a i n si d é f in i . E n c a s d e s u c c è s , e l l e e n r e s t it u e r a l e r a n g ( c e q u i s e r a s u f fi sa n t a u p r o g r a m m e
p r i n c ip a l p o u r a f fi c h e r l e s i n fo r m a t io n s c o r r e s p o n d a n t e s ). D a n s l e c a s c o n t r a i r e , e l le r e s t it u e r a l a v a l e u r - 1 . N o t e z q u e l e
c o d e d ' a r ti c le s e r a l e s e u l a r g u m e n t d e c e t t e f o n c t io n .

N o u s v o y o n s d o n c d é j à c o m m e n t , p o u r c h a q u e c o d e ( c o r r e c t ) fo u r n i p a r l ' u t i li sa t e u r , a f fic h e r l e s i n f o r m a t io n s
c o r r e s p o n d a n t e s a v a n t d ' e n d e m a n d e r l a q u a n t it é . M a i s , c o m p t e t e n u d e c e q u e l ' é d i t io n d e l a f a c t u r e d o i t ê t r e f a it e a p r è s
l e s s a is i e s re l a t i v e s à t o u s l e s a r t ic l e s , n o u s d e v o n s o b l i g a t o i r e m e n t , p o u r c h a q u e a r t ic l e à f a c t u r e r , c o n s e r v e r :

- l a q u a n t i té ,
- u n e i n fo r m a t io n p e r m e t ta n t d ' e n r e tr o u v e r l e l i b e l lé e t l e p r i x u n i t a ir e . N o u s p o u r r i o n s, c e r t e s , a r c h i v e r c e s
i n fo r m a t io n s d a n s u n t a b le a u . M a i s , e n f a it , c e l a n ' e s t p a s n é c e s s a ir e p u i s q u ' i l e s t p o s si b l e d e l e s r e tr o u v e r à p a r t ir d u
r a n g d e l ' a r t ic l e d a n s l a s tr u c t u r e ( le c o d e a r t ic l e c o n v i e n d r a i t é g a l e m e n t , m a i s i l n o u s f a u d r a i t a lo r s e x p l o r e r à
n o u v e a u n o t r e ta b l e a u d e s tr u c t u r e s l o r s d e l' é d i t i o n d e la f a c t u r e ) .
C e s d e u x in f o r m a t io n s s e r o n t c o n s e r v é e s d a n s d eu x t a b le a u x ( n o m m é s q te e t r a n g a r t ) c o m p o r t a n t a u t a n t d ' é lé m e n t s q u e
d ' a r t i c le s à fa c t u r e r (o n e n p r é v o i r a u n n o m b r e m a x i m a l ).

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 129/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 129
L a f o n c t i o n d ' é d i t io n d e l a fa c t u r e ( n o m m é e f a c t u r e ) s e c o n t e n t e r a a l o r s d ' e x p l o r e r s é q u e n t i e ll e m e n t c e s d e u x t a b le a u x
p o u r r e t r o u v e r t o u te s l e s in f o r m a t io n s n é c e s sa i r e s . E l le r e c e v r a , e n a r g u m e n t , l e s a d r e ss e s d e s d e u x t a b le a u x ( q t e e t
r a n g a r t ) , a i n si q u e l e n o m b r e d ' a r t ic l e s à f a c t u r e r .

Programme

#include <stdio.h>

/* ------ structure contenant les informations relatives aux */


/* différents articles -------------- */
#define NBART 6 /* nombre total d'articles */
typedef struct { int code ; /* code article */
char * lib ; /* libellé */
float pu ; /* prix unitaire */
} t_article ;
t_article article [NBART] =
{ 11, "Gaufrier", 268.0,
14, "Cafetière 12 T", 235.0,
16, "Grille-pain", 199.50,
19, "Balance de ménage", 278.0,
25, "Centrifugeuse", 370.0,
26, "Four raclette 6P", 295.25
} ;
/* ----------------------------------------------------------------------*/

#define NAFMAX 10 /* nombre maxi d'articles à facturer */

main()
{
int recherche(int) ; /* proto fonction de recherche d'un article */
void facture(int[], int[], int) ; /* proto fonction d'affichage de la facture */
int naf, /* nombre d'articles à facturer */
rang, /* rang courant d'un article */
codart, /* code courant d'un article */
i ;

int rangart [NAFMAX], /* rang des articles à facturer */


qte [NAFMAX] ; /* quantité de chaque article à facturer */

/* entrée du nombre d'articles à facturer */


printf ("combien d'articles à facturer ? ") ;
scanf ("%d", &naf) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 130/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

130 Exercices en langage C


/* boucle de traitement de chaque article à facturer */
for (i=0 ; i<naf ; i++)
{
printf ("code article ? ") ;
do
{ scanf ("%d", &codart) ;
rang = recherche (codart) ;
if (rang == -1)
printf (" ** article inexistant - redonnez le code : ") ;
}
while (rang == -1) ;
rangart[i] = rang ;
printf ("quantité de %s au prix unitaire de %8.2f ? ",
article[rang].lib, article[rang].pu) ;
scanf ("%d", &qte[i]) ;
}

/* affichage facture */
facture (rangart, qte, naf) ;
}

/***********************************************************/
/* fonction de recherche d'un code article */
/***********************************************************/
int recherche (int codart)

{
int rang ; /* rang courant d'un article */
rang = 0 ;
while (article[rang].code != codart && rang++ < NBART-1) {} ;
if (rang <NBART) return (rang) ;
else return (-1) ;
}

/***********************************************************/
/* fonction d'affichage de la facture */
/***********************************************************/
void facture(int rangart[], int qte[], int naf)
/* rangart : tableau des rangs des codes articles */
/* qte :tableau des prix unitaires */
/* naf :nombre d'articles à facturer */
{
float somme, /* total facture */
montant ; /* montant relatif à un article */
int i ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 131/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I I . U t i li s a t i o n d e s t r u c t u r e s 131

printf ("\n\n %32s\n\n", "FACTURE") ;


printf ("%-20s%5s%10s%12s\n\n",
"ARTICLE", "NBRE", "P-UNIT", "MONTANT") ;
somme = 0 ;
for (i=0 ; i<naf ; i++)
{ montant = article[rangart[i]].pu * qte[i] ;
printf ("%-20s%5d%10.2f%12.2f\n",
article[rangart[i]].lib, qte[i],
article[rangart[i]].pu, montant) ;
somme += montant ;
}
printf ("\n\n%-35s%12.2f", " TOTAL", somme) ;
}

Commentaires

* N o u s a v o n s c h o i si i c i d ' u t il i se r t y p e d e f p o u r d é f in i r so u s le n o m t _ a r t i c l e l a s tr u c t u r e c o r r e s p o n d a n t à u n a r t ic l e . V o u s
c o n s t a t e z q u e le l i b el lé y a p p a r a î t so u s la f o r m e d' u n p o i n t e u r su r u n e c h a î n e e t n o n d ' u n e c h a î n e o u d ' u n t a b l e a u d e
c a r a c t è r e s . D a n s c e s c o n d i ti o n s , l e t a b le a u a r t i c l e , d é c l a r é d e c e t y p e , n ' o c c u p e r a q u e 6 e m p l a c e m e n t s d e p e t it e ta i ll e
(généralem ent 6 ou 8 octets)

* L à e n c o r e , u n e s e u l e i n st r uc t i o n p e r m e t d ' e ff e c tu e r l a r e c h e r c h e d ' u n c o d e a r t ic l e d a n s l e t a b l e a u a r t i c l e . V o y e z , à c e
p r o p o s , l e s r e m a r q u e s f a it es d a n s l e q u a t r iè m e c o m m e n t a i re d e l ' e x e r c i c e I I - 1 .

* L e c o d e f o r m a t % - 2 0 s , u t i l i s é à d e u x r e p r i s es d a n s l a f o n c t i o n f a c t u r e , p e r m e t d e " c a d r e r " u n e c h a î n e à g a u c h e .

DISCUSSION

* N o t r e p r o g r a m m e n ' e s t p a s p r o t é g é c o n t r e d e s r é p o n s e s i n c o r r e c t es d e l a p a r t d e l ' u t i li s a te u r . E n p a r t i c u li e r , u n e
r é p o n s e n o n n u m é r i q u e p e u t e n tr a î n e r u n c o m p o r t e m e n t a s s e z d é sa g r é a b l e . D a n s u n p r o g r a m m e r é e l , il se r a i t n é c e s s a i r e
d e r é g l e r c o n v e n a b l e m e n t c e ty p e d e p r o b l è m e , p a r e x e m p l e e n u ti li sa n t f g e t s ( . . . , s t d i n ) e t s s c a n f .

* D e m ê m e , d a n s u n p r o g r a m m e r é e l , il p o u rr a i t ê t r e j u d ic i e u x d e d e m a n d e r à l ' u t il i sa t e u r d e c o n f ir m e r q u e l e p r o d u i t
c h e r c h é e s t b i e n c e lu i d o n t o n v i e n t d e l u i a f fi c h e r l e s in f o r m a t i o n s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 132/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

132 Exercices en langage C

* L a p r é c i si o n o f fe r t e p a r l e t y p e flo a t ( 6 c h i f fr e s s i g n i f i c a t i fs ) p e u t s e r é v é l e r i n s u f f i s a n t e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 133/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III : H A S A R D ET
RECREATIONS

C e c h a p i t re v o u s p r o p o s e u n c er t a i n n o m b r e d ' e x e r c i c es c o r r esp o n d a n t à l a r é a li s a ti o n d e p r o g r a m m e s r é c r é a t if s , ba s é s
su r l ' u t i l i sa t i o n d u h a s a r d .

L e s d e u x p r e m i e r s e x e r c i c e s so n t e s s e n ti e ll e m e n t d e s ti n é s à v o u s m o n t r e r c o m m e n t g é n é r e r d e s n o m b r e s a l é a to i r e s e n
langage C .

I II -1 T ir a g e a l é a t o ir e

________________________________________________________________________________________

Enoncé

E c r i r e u n e f o n c t i o n f o u r n i s s a n t u n n o m b r e e n t i e r t ir é a u h a s a r d e n t r e 0 (i n c l u s ) e t u n e v a l e u r n ( in c l u s e ) fo u r n i e e n
argument.

R é a l iser u n p r o g r a m m e p r i n c ip a l u t i li s a n t c e tt e f o n c t io n p o u r e x a m i n e r l a " d i s tr i b u ti o n " d e s v a l e u r s a i n si o b t e n u e s d a n s


l ' i n te r v a l le [ 0 , 1 0 ] . L e n o m b r e d e t ir a g e s à r é a l i se r se r a l u e n d o n n é e e t le p r o g r a m m e a f f ic h e r a l e n o m b r e d e f o i s o ù
chac une de ces valeurs aura été obtenue.

Exemple
combien de tirages : 1100
nombre de tirages obtenus
0 : 106
1 : 95

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 134/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

134 Exercices en langage C


2 : 115
3 : 95
4 : 91
5 : 103
6 : 103
7 : 101
8 : 92
9 : 94
10 : 105

I n d i c a t i o n : i l e s t n é c e s s a i r e d e f a i r e a p p e l à l a f o n c t i o n r a n d d e l a " b i b li o th è q u e s t a n d a r d " .

________________________________________________________________________________________

ANALYSE

I l fa u t f a i r e a p p e l à l a f o n c t io n r a n d . C e l le - c i fo u r n i t u n n o m b r e e n t ie r , t i ré d e f a ç o n " p s e u d o - a l é a to i r e " d a n s l ' i n t e r v a ll e


[ 0 , R A N D _ M A X ] , c h a q u e n o m b r e d e c e t in t e rv a l le a y a n t q u a si m e n t la m ê m e p r o b a b i li té d ' ê t re t ir é . N o t e z q u e l a v a le u r
d e R A N D _ M A X e s t d é f i n i e d a n s s t d l i b . h ; d ' a p r è s l a n o r m e , e l le n ' e s t j a m a i s i n f é r ie u r e à l a c a p a c i té m i n im a l e d ' u n in t ,
c ' e s t - à - di r e 3 2 7 6 7 .

P o u r a b o u t ir a u r é s u lt a t v o u l u , u n e d é m a r c h e c o n s i s te à t ra n s f o r m e r u n t e l n o m b r e e n u n n o m b r e r é e l a p p a r t e n a n t à
l ' i n t e r v a l l e [ 0 , 1 [ . I l su f f i t e n su i t e d e m u l t ip l i e r c e r é e l p a r n +1 e t d ' e n p r e n d r e l a p a r t i e e n t i è r e p o u r o b t e n i r l e r é s u l t a t

e s c o m p t é . O n p e u t a l o r s m o n t r e r q u e l e s v a l e u r s 0 , 1 , . . . n - 1 , n so n t q u a s i équ i p r o b a b l e s .
P o u r o b t e n i r u n t e l n o m b r e a l é a t o ir e , n o u s p o u v o n s d i v i s er l e n o m b r e f o u r n i p a r r a n d p a r l a v a l e u r R A N D _ M A X + 1 ( i l
f a u t é v i t e r d e d i v i s e r p a r R A N D _ M A X , c a r l a v a l e u r 1 r i s q u e r a it a lo r s d ' ê t r e o b t e n u e - e n m o y e n n e u n e f o i s s u r
R A N D _ M A X ! ). L à e n c o r e , o n p e u t , d e m a n i è r e f o r m e l l e , m o n t r e r q u e s i la l o i d e p r o b a b i l it é e s t u n i f o r m e s u r [ 0 , 1 [ , il e n
v a d e m ê m e d e c e l l e d u n o m b r e a i n si f a b r iq u é d a n s l' i n t e r v a l le d ' e n t ie r s [0 , n ] .

Programme

#include <stdio.h>
#include <stdlib.h> /* pour la fonction rand */

#define N 10 /* les tirages se feront entre 0 et N */

main()
{

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 135/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 135


int aleat (int) ; /* prototype fonction de tirage aléatoire */
int ntir, /* nombre de tirages requis */
t[N+1], /* tableau comptage tirages de chaque valeur */
i ;

printf ("combien de tirages : ") ;


scanf ("%d", &ntir) ;
for (i=0 ; i<=N ; i++)
t[i] = 0 ;
for (i=1 ; i<=ntir ; i++)
t[aleat(N)]++ ;
printf ("nombre de tirages obtenus\n") ;
for (i=0 ; i<=N ; i++)
{ printf ("%4d : ", i) ;
printf ("%6d\n", t[i]) ;
}
}

/********************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0, n] */
/********************************************************/
int aleat (int n)
{
int i ;
i = rand() / (RAND_MAX + 1.) * (n+1) ;

return (i) ;
}

Commentaires

* D a n s l a fo n c t i o n a l e a t , l a d i v i si o n p a r R A N D _ M A X + 1 d o i t b i en s ûr s ' e f fe c t u e r su r d e s v a le u r s r é e l le s . M a i s , d e p l u s , i l
f a u t p r e n d r e g a r d e à n e p a s é c r ir e l e d i v i s eu r so u s la f o r m e R A N D _ M A X + 1 . E n e f f e t , c e l u i -c i s e r a i t é v a l u é d a n s l e ty p e
i n t e t , d a n s l e c a s ( f r é q u e n t ) o ù l a v a l e u r d e R A N D _ M A X e s t e x a c t e m e n t la v a l e u r m a x i m a l e d u t y p e in t , l ' a d d it io n d e 1 à
R A N D _ M A X c o n d u i r a i t à l a v a l e u r . . . - 1 ( l e d é p a s s e m e n t d e c a p a c i té n ' é t a n t ja m a i s d é t e c té e n c a s d ' o p é r a t i o n s s u r d e s
entiers).

DISCUSSION

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 136/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

136 Exercices en langage C


E n g é n é r a l , l a f o n c t io n r a n d f o u r n i t t o u jo u r s l a m ê m e s u i te d e v a l e u r s , d ' u n e e x é c u t i o n à u n e a u t r e . L ' e x e r c i c e s u iv a n t
v o u s m o n t re c o m m e n t é v i te r c e p h é n o m è n e .

I II -2 T ir a g e a lé a t o i r e v a r ia b le

________________________________________________________________________________________

Enonce

E c r ir e u n e f o n c t i o n fo u r n i s s a n t u n n o m b r e e n t ie r t ir é a u h a s a r d e n t r e 0 e t u n e v a l e u r n f o u r n i e e n a r g u m e n t . L a s u i te d e s
v a l e u r s r e s ti tu é e s p a r c e t t e f o n c t io n ( lo r s q u ' o n l ' a p p e l l e à d i v e r s e s r e p r i s e s ) d e v r a ê t r e d i ff é r e n te d ' u n e ex é c u t i o n à u n e
a u t r e e t n e p a s d é p e n d r e d ' u n e q u e lc o n q u e i n fo r m a t io n f o u r n i e p a r l ' u t i li s a te u r .

C o m m e d a n s l' e x e r c ic e p r é c é d e n t , o n r é a l i ser a u n p r o g r a m m e p r in c i p a l u t il i sa n t c e t te f o n c t io n p o u r e x a m i n e r la
" d i s t r ib u t io n " d e s v a l e u r s a i n si o b t e n u e s d a n s l ' i n t e r v a ll e [ 0 , 1 0 ] . P o u r c e f a i re , o n l ir a e n d o n n é e s l e n o m b r e d e t ir a g e s à
r é a l i se r e t l e p r o g r a m m e a f f ic h e r a l e n o m b r e d e f o i s o ù c h a c u n e d e s v a l e u r s a u r a é té o b t e n u e .

S u g g e s t i o n : i l f a u t " i n it ia l i ser " c o n v e n a b l e m e n t l e " g é n é r a t e u r d e n o m b r e s a l é a t o ir e " , e n u t il i sa n t l a f o n c t i o n s r a n d . L a


" g r a î n e " n é c e s s a i r e p e u t ê t r e f a b r i q u é e à l ' a i d e d e l a f o n c t i o n t i m e , d e f a ç o n à a v o i r u n c a r a c t è r e su f f is a m m e n t
i m p r é v i si b l e .

Exemples

( il s ' a g i t l à d e s r é s u lt a ts c o r r e s p o n d a n t à d e u x e x é c u t io n s d i f fé r e n t es d u m ê m e p r o g r a m m e )

combien de tirages : 1100


nombre de tirages obtenus
0 : 124
1 : 104
2 : 97
3 : 97
4 : 89
5 : 93
6 : 105

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 137/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 137


7 : 109
8 : 110
9 : 89
10 : 83
___________________

combien de tirages : 1100


nombre de tirages obtenus
0 : 104
1 : 98
2 : 98
3 : 106
4 : 98
5 : 97
6 : 99
7 : 109
8 : 99
9 : 96
10 : 96

________________________________________________________________________________________

ANALYSE

E n l a n g a g e C , la f o n c t io n s r a n d p e r m e t d ' i n i ti a li s er l e g é n é r a t e u r d e n o m b r e s a l é a t o ir e s . I l f a u t c e p e n d a n t l u i f o u r n ir u n e
" g r a î n e " , c ' e s t -à - d ir e u n n o m b r e e n t i e r ( de t y p e u n s i g n e d i n t ) q u i d é te r m i n e r a le p r e m i e r n o m b r e t ir é p a r r a n d . C e t te
m é t h o d e p e r m e t a i n si , s i o n l e s o u h a i t e , d ' o b t e n ir à v o l o n t é u n e m ê m e s u i te d e n o m b r e s a l é a t o ir e s ; i l f a u t d' a i ll e u r s
n o t e r q u e , p a r d é f a u t, t o u t s e p a s s e c o m m e s i s r a n d é t a i t a p p e l é , e n d é b u t d e l ' e x é c u t i o n d ' u n p r o g r a m m e , a v e c
l'argument 1.

I c i , p a r c o n tr e , n o u s s o u h a i to n s o b t e n i r u n e s u it e d i f f é r e n te d ' u n e e x éc u t i o n à u n e a u t re . U n e s o l u t io n à c e p r o b lè m e
c o n s i s te à c h o i si r u n e " g r a î n e " a l é a t o ir e . B ie n s û r , i l n ' e s t p a s q u e s t i o n d e f a i r e a p p e l à r a n d d a n s c e c a s . P a r c o n tr e , l a
f o n c t i o n t i m e f o u r n i t u n e d a t e , e x p r i m é e e n s e c o n d e s . C e l l e -c i p o s s è de u n c a r a c t è r e su f f i sa m m e n t im p r é v i si b l e p o u r ê tr e
u t il i s ée c o m m e g r a în e .

C e t te i n i ti a li s a ti o n d u g é n é r a t e u r d e n o m b r e s a l é a t o ir e s d o i t t o u t e fo i s n ' ê t r e r é a l i sé e qu ' u n e s eu l e f o i s p o u r u n e e x é c u t i o n
donné e. D a n s le c a s c o n t r a ir e , o n r i s q u e r a it , e n e f f e t, d ' o b t e n i r p lu s i eu r s fo i s d e s u i t e l e s m ê m e s n o m b r e s . S i l ' o n
so u h a i te q u e c e p r o b l è m e s o i t p r i s en c h a r g e p a r l a fo n c t i o n d e t ir a g e d ' u n n o m b r e e l l e -m ê m e , i l e s t n é c e s s a i r e q u e c e t t e
dernière s o it c a p a b l e d e l e f a ir e l o rs d e so n p r e m i e r a p p e l ( e t u n i q u e m e n t à c e m o m e n t - là ) . C e m é c a n is m e p a s s e p a r
l'em ploi d' u n e v a r ia b l e d e c l a s s e s t a t i q u e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 138/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

138 Exercices en langage C


Programme

#include <stdio.h>
#include <stdlib.h> /* pour la fonction rand */
#include <time.h> /* pour la fonction time */

#define N 10 /* les tirages se feront entre 0 et N */

main()
{
int aleat (int) ; /* prototype fonction de tirage aléatoire */
int ntir, /* nombre de tirages requis */
t[N+1], /* tableau comptage tirages de chaque valeur */
i ;

printf ("combien de tirages : ") ;


scanf ("%d", &ntir) ;
for (i=0 ; i<=N ; i++)
t[i] = 0 ;
for (i=1 ; i<=ntir ; i++)
t[aleat(N)]++ ;
printf ("nombre de tirages obtenus\n") ;
for (i=0 ; i<=N ; i++)
{ printf ("%4d : ", i) ;

printf ("%6d\n", t[i]) ;


}
}

/********************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0, n] */
/********************************************************/
int aleat (int n)
{
int i ;
static int prem = 1 ; /* drapeau premier appel */
time_t date ; /* pour l'argument de time */
/* time_t est un type entier défini dans time.h */

/* initialisation générateur au premier appel */


if (prem)
{ srand (time(&date)) ;
prem = 0 ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 139/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 139

/* génération nombre */
i = rand() / (RAND_MAX + 1.) * (n+1) ;
return (i) ;
}

Commentaires

* L e m é c a n is m e d u t r a it e m e n t p a r t ic u l i e r à e f fe c t u e r a u p r e m i e r a p p e l e s t r é a li sé g r â c e à l a v a r i a b l e p r e m , d é c l a r é e d e

c l a s s e s ta t iq u e . C e t te v a r ia b l e e s t in i ti a li s é e à u n , l o r s d e l a c o m p i la t io n . D è s l e p r e m i e r a p p e l , eslrlae neds t m i s e à z é r o e t e l le
g a r d e r a e n s u i t e c e t te v a l e u r j u s q u ' à l a f i n d e l ' e x é c u t i o n d u p r o g r a m m e . A i n si , l a f o n c t io n n ' e s t e f fe c t iv e m e n t
a p p e l é e q u ' u n e s e u l e f o i s, l o r s d u p r e m i e r a p p e l d e n o t re f o n c t io n a l e a t .

* L a f o n c t io n t i m e f o u r n i t e n r e t o u r le t e m p s ( e x p r i m é e n s e c o n d e s ) é c o u l é d e p u i s u n e c e r t a in e " o r i g in e " d é p e n d a n t d e
l ' i m p l é m e n t a t io n . L e t y p e d e c e t te v a l e u r d é p e n d , l u i a u s s i , d e l ' i m p l é m e n t a ti o n ; t o u t e fo i s , la n o r m e p r é v o i t q u ' i l e x i s te ,
d a n s t i m e . h , u n s y m b o l e t i m e _ t ( d é f i n i p a r t y p e d e f ) p r é c i sa n t l e t yp e e f fe c t iv e m e n t e m p l o y é . I c i , l o r s q u e n o u s
t r a n s m e t t o n s c e t t e v a l e u r à s r a n d , i l e s t p o s si b l e q u ' a p p a r a i s s e u n e c o n v e r si o n d u t y p e t i m e _ t d a n s l e t y p e u n s i g n e d i n t ;
i c i, c e l a n ' a g u è r e d ' i m p o r t a n c e , d a n s l a m e s u r e o ù , m ê m e s i c e t t e c o n v e r s i o n e s t " d ég r a d a n t e " , l a v a l e u r o b te n u e r e s t e r a
i m p r é v i s i b l e p o u r l' u t il i sa t e u r .

D ' a u t r e p a r t, l a f o n c t io n t i m e n e s e c o n t e n te p a s d e f o u r n ir u n e " h e u r e " e n r e t o u r ; e l le r a n g e é g a l e m e n t c e t te m ê m e

i n f or m a t i o n à l ' a d r e s s e q u ' o n l u i fo u r n i t ( o b li g a to i r e m e n t ) e n a r g u m e n t ; c ' e s t c e q u i j u s ti fi e l ' e x i s te n c e d e l a v a r ia b l e


d a t e ( q u i n ' e s t p a s u t i li s é e p a r a i ll e u r s ) e t q u i d o i t , ic i , a b s o l u m e n t ê t r e d é c l a r é e d a n s le " b o n t y p e " , s o u s p e i n e d e r i s qu e r
d ' a b o u t ir à u n é c r a s e m e n t in t e m p e s t if d e d o n n é es ( d a n s l e c a s o ù o n a u r a i t d é c l a r é d a t e d ' u n t y p e " p l u s p e t i t" q u e l e t y p e
effectif).

III- 3 A lé a d ' é t o ile s

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 140/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

140 Exercices en langage C


Enoncé

A f fic h e r a u h a s a r d u n c e r t a in n o m b r e d ' é to i le s (c a r a c t è r e " * " ) à l ' i n t é r ie u r d ' u n r e c t a n g l e . L e n o m b r e d ' é to i le s


so u h a i té e s , a i n s i q u e l e n o m b r e d e l i g n e s e t d e c o l o n n e s d u r e c t a n g l e s e r o n t fo u r n i s e n d o n n é e s .

L e p r o g r a m m e v é r i fi e r a q u e la z o n e e s t a s se z g r a n d e p o u r r e c e v o i r le n o m b r e d ' é to i le s r e q u i s . O n é v i te r a q u e p l u s i eu r s
é t o i l e s n e s o i e n t su p e r p o s ée s.

Exemple

combien de lignes : 10
combien de colonnes : 45
combien de points : 200
** * **** ** *** * ** *** * *** **
* * * ** * ** * * ****** * ** **
* * ** * * * ***** *** ** * *** * *
* *** * * * * * ** * * **
* * ** ** ** **** ** ** ** ** * * * *
* * ** *** * * * ** * * * * **
*** ** ** * ** * * * * **
* * * * * ***** ** ** * *
* * ***** ** *** * ** * *****
**** * * *** * ** **** * *****

________________________________________________________________________________________

ANALYSE

N o u s u t i li ser o n s u n t a b l e a u d e c a r a c t è r e s à d eu x d i m e n s io n s, d a n s le q u e l c h a q u e é l é m e n t r e p r é s e n te r a u n e c a s e d e n o t r e
r e c t a n g l e . N o u s c o n v i e n d r o n s q u e l e p r e m i e r in d ic e r e p r é s e n t e l e r a n g d e l a l ig n e e t q u e l e s e c o n d i n d ic e r e p r é s e n t e l e
r a n g d e l a c o lo n n e . C o m m e l ' u t i li s a te u r d o i t p o u v o ir c h o i si r l es d i m e n s io n s d u r ec t a n g l e c o n c e r n é , n o u s p r é v o ir o n s d e
donner à notre tableau une taille suffisante pour couvrir tous les cas possibles (nous avons choisi, ici, 25 lignes de 80
c a r a c t è r e s ) ; c e l a si g n i f ie q u e , l a p l u p a r t d u t e m p s , l e p r o g r a m m e n ' u t il iser a qu ' u n e p a r t i e d e c e t a b l e a u .

A u d é p a r t , n o u s i n i tia l i se r o n s to u s l e s é l é m e n t s d e l a " p a r t ie u t i le " d e c e t a b l e a u a v e c l e c a r a c t è r e e s p a c e . N o u s


c h o i si r o n s en s u i t e a u h a s a r d l e s é lé m e n t s d a n s l e s q u e l s n o u s d e v r o n s p l a c e r u n c a r a c t è r e " * " . P o u r c e f a ir e , i l n o u s s u f f ir a
d e t ir e r a u h a s a r d u n n u m é r o d e l ig n e e t u n n u m é r o d e c o l o n n e j u s q u ' à c e q u e l' e m p l a c e m e n t c o r r e s p o n d a n t so i t
d i sp o n i b l e (c a r a c t è r e e s p a c e ) . L ' a l g o r it h m e d e t ir a g e a u h a s a r d d ' u n n o m b r e e n t i e r a p p a r te n a n t à u n i n te r v a l le d o n n é a
é t é e x p o s é d a n s l ' a n a l y s e d e l ' e x e r c i c e I I I -1 .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 141/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 141


I l n e n o u s r e s t e ra p l u s q u ' à a f f ic h e r , p a r e x e m p l e a v e c l a f o n c t io n p u t c h a r , l e s d i f fé r e n t s é lé m e n t s d e n o t re t a b l e a u , e n
p r é v o y a n t u n " c h a n g e m e n t d e li g n e " a u x m o m e n t s o p p o r t u n s .

Programme

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* pour memset */
#include <time.h>
#define NY 25 /* nombre total de lignes de l'écran */
#define NX 80 /* nombre total de colonnes de l'écran */
main()
{
int aleat (int) ; /* prototype fonction tirage aléatoire */
int ny, /* nombre de lignes du rect. considéré */
nx, /* nombre de col. du rect. considéré */
ix, /* colonne courante */
iy, /* ligne courante */
nb_points, /* nombre de points à tirer */
i, j ;
char ecran [NX] [NY] ; /* image de l'écran */
const char blanc = ' ', /* caractère de remplissage */
point = '*' ; /* représentation d'un point */

/* entrée des dimensions du rectangle considéré ...


... et du nombre de points souhaités */
do
{ printf ("combien de lignes : ") ;
scanf ("%d", &ny) ;
}
while (ny<=0 || ny>=NY) ;
do
{ printf ("combien de colonnes : ") ;
scanf ("%d", &nx) ;
}

while (nx<=0 || nx>=NX) ;


do
{ printf ("combien de points : ") ;
scanf ("%d", &nb_points) ;
}
while (nb_points > nx*ny || nb_points < 1 ) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 142/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

142 Exercices en langage C


/* remplissage aléatoire du tableau image d'écran */
memset (ecran, blanc, NX*NY) ;
for (i=1 ; i<=nb_points ; i++)
{ do
{ ix = aleat (nx-1) ;
iy = aleat (ny-1) ;
}
while ( ecran [ix] [iy] != blanc) ;
ecran [ix] [iy] = point ;
}

/* affichage du tableau image d'écran */


for (j=0 ; j<ny ; j++)
{ for (i=0 ; i<nx ; i++)
putchar ( ecran [i] [j] ) ;
printf ("\n") ;
}
}

/*******************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0,n] */
/*******************************************************/
int aleat (int n)
{
int i ;

static int prem = 1 ; /* drapeau premier appel */


time_t date ; /* pour l'argument de time */

/* initialisation générateur au premier appel */


if (prem)
{ srand (time(&date) ) ;
prem = 0 ;
}

/* génération nombre aléatoire */


i = rand() / (RAND_MAX + 1.) * (n+1) ;
return (i) ;
}

Commentaires

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 143/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 143


* L ' i n i ti a li s a ti o n d e l a p a r ti e u t il e d u t a b l e a u a v e c l e c a r a c t è r e e s p a c e a u r a i t p u s e p r o g r a m m e r a i n si :

for (i=0 ; i<nx ; i++)


for (j=0 ; j<ny ; j++)
ecran [i][j] = ' ' ;

I c i , n o u s a v o n s p r é f é r é f a i r e a p p e l à l a f o n c t i o n m e m s e t , d ' e x é c u t i o n p l u s r a p i d e . T o u te f o is , c e l l e -c i r e m p l it d ' u n
c a r a c t è r e d o n n é u n e su i t e d ' o c t e t s c o n s é c u t i f s ; c e c i e x c l u t d o n c d e l im i te r l ' i n i t ia l i s a t io n à l a p a r t i e u t il e d u t a b l e a u . I l n e
f a u t p a s o u b l ie r , e n e f f e t , q u e c e l le - c i n ' e s t p a s f o r m é e d e n x * n y o c t e ts c o n s é c u t i fs ( q u o i q u e , e n t o u t e r ig u e u r , e n t e n a n t
c o m p t e d e l a m a n i è r e d o n t so n t r a n g é s e n m é m o i r e le s d i f f é r e n ts é l é m e n t s d ' u n t a b le a u , i l so i t p o s si b l e d e l i m i te r
l ' i n it ia l i sa t io n à n x * N Y é lé m e n t s c o n s é c u t i fs ) .

* N o u s a v o n s r e p r i s l a f o n c t io n a l e a t d e l ' e x e r c ic e p r é c é d e n t . C e l le - c i ti r e u n e v a l e u r e n t i è re a u h a s a r d e n t r e 0 e t u n e
l im i te q u ' o n l u i f o u r n i t e n a r g u m e n t ; d e p l u s , l o r s d e so n p r e m i e r a p p e l , e l le e f f e c tu e u n e i n it ia l i sa t io n d u g é n é r a t e u r d e
n o m b r e s a l é a to i r e s .

III- 4 E s t i m a t i o n d e p i

________________________________________________________________________________________

Enoncé

C a l c u l e r u n e v a l e u r a p p r o c h é e d e p i, p a r l a m é t h o d e s u i v a n t e :

- o n t ir e u n c e r t a i n n o m b r e d e p o i n t s a u h a s a r d d a n s u n c a r r é d o n n é .
- o n d é t e r m i n e l e r a p p o r t e n t r e le n o m b r e d e c e s p o i n ts a p p a r t e n a n t a u c e r c l e i n s c r it d a n s l e c a r r é e t l e n o m b r e t o t a l
d e p o i n t s t ir é s . C e r a p p o r t f o u r n i t u n e e s t im a t io n d e l a v a l e u r d e p i/4 .
L e n o m b r e t o t a l d e p o i n t s à t ir e r s e r a f o u r n i e n d o n n é e .

Exemple

combien de points ? 10000


estimation de pi avec 10000 points : 3.164800e+000

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 144/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

144 Exercices en langage C


________________________________________________________________________________________

ANALYSE

N o u s c h o i si r o n s u n c a r r é d e c ô t é u n i t é . N o u s c o n v i e n d r o n s d e p r e n d r e so n c o i n b a s g a u c h e c o m m e o r i g in e d ' u n r e p è r e
cartésien.

N o u s t ir e r o n s a l o r s a u h a s a r d le n o m b r e d e p o i n t s v o u l u s , à l' i n t é r ie u r d e c e c a r r é . P l u s p r é c i s ém e n t , p o u r c h a q u e p o i n t ,
n o u s d é t e r m i n e r o n s a u h a s a r d s e s d e u x c o o r d o n n é e s , e n t i ra n t d eu x n o m b r e s r é e l s a p p a r t e n a n t à l' i n t e r v a ll e [ 0 , 1 ] . A c e t
e f f e t, n o u s f e r o n s a p p e l à l a m é t h o d e e x p o s é e d a n s l ' a n a l y s e d e l ' e x e r c i c e I I I -1 .

P o u r c h a q u e p o i n t, n o u s c a l c u l e r o n s s a d i st a n c e a u c e n t r e d u c a r r é ( d e c o o r d o n n é e s : 0 . 5 , 0 . 5 ) e t n o u s c o n si d ér e r o n s qu ' i l
a p p a r t ie n t a u c e r c l e i n s c r i t s i c e t te d i s t a n c e e s t i n f é r ie u r e à 0 . 5 ( n o t e z q u e , p a r so u c i d e s im p l i c i té , n o u s t r a v a i l le r o n s e n
f a i t a v e c l e c a r r é d e c e t t e d i s ta n c e ) .

Programme

#include <stdio.h>
#include <stdlib.h>

main()
{
float caleat(void) ; /* prototype fonction de tirage valeur aléatoire */
float x, y, /* coordonnées d'un point courant */
d2, /* distance (au carré) d'un point courant au centre */
pi ; /* valeur approchée de pi */
int np, /* nombre de points à tirer */
nc, /* nombre de points à l'intérieur du cercle */
i ;

printf ("combien de points ? ") ;


scanf ("%d", &np) ;

for (nc=0, i=1 ; i<=np ; i++)

{ x = caleat() ;
y = caleat() ;
d2 = (x-0.5) * (x-0.5) + (y-0.5) * (y-0.5) ;
if (d2 <= 0.25) nc++ ;
}

pi = (4.0 * nc) / np ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 145/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 145


printf ("estimation de pi avec %d points : %e", np, pi) ;
}

float caleat (void) /* fonction fournissant une valeur aléatoire */


/* appartenant à l'intervalle [0-1] */
{
return ( (float) rand() / (RAND_MAX + 1.0) ) ;
}

DISCUSSION

N o t r e f o n c t io n d e t i r a g e a l é a to i r e d ' u n e n t ie r f o u r n i t t o u j o u r s la m ê m e s u i te d e v a l e u r s . C e q u i si g n i f ie q u e , p o u r u n
n o m b r e d o n n é d e p o i n t s , n o u s o b t i e n d r o n s t o u jo u r s la m ê m e e s ti m a t io n d e p i . V o u s p o u v e z é v i t e r c e p h é n o m è n e e n
u t i li s a n t l a f o n c t i o n r é a l i s é e d a n s l ' e x e r c i c e I I I - 2 .

I II- 5 J e u d u d e v in

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i c h o i si t u n n o m b r e e n t ie r a u h a s a r d e n t r e 0 e t 1 0 0 0 e t q u i d e m a n d e à l ' u t i li s a te u r d e l e
" d e v i n e r " . A c h a q u e p r o p o s i ti o n fa i te p a r l e jo u e u r , l e p r o g r a m m e r é p o n d r a e n s i tu a n t l e n o m b r e p r o p o s é p a r r a p p o r t à
c e l u i à d e v i n e r ( p l u s g r a n d , p l u s p e ti t o u g a g n é ) .

L o r s q u e l e j o u e u r a u r a d e v i n é le n o m b r e c h o i si , o u l o r s q u ' u n n o m b r e m a x i m a l d e c o u p s ( 1 0 ) a u r a é t é d é p a s s é , le
p r o g r a m m e a f fi c h e r a l a r é c a p i tu l a ti o n d e s d i f fé r e n t e s p r o p o s i t io n s .

Exemple

Devinez le nombre que j'ai choisi (entre 1 et 1000)


votre proposition : 500
----------- trop grand

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 146/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

146 Exercices en langage C


votre proposition : 250
----------- trop grand
votre proposition : 125
----------- trop grand
votre proposition : 64
----------- trop grand
votre proposition : 32
----------- trop grand
votre proposition : 16
----------- trop grand
votre proposition : 8
----------- trop petit
votre proposition : 12
----------- trop grand
votre proposition : 10

++++ vous avez gagné en 9 coups

---- Récapitulation des coups joués ----

500 trop grand


250 trop grand
125 trop grand
64 trop grand
32 trop grand

16 trop grand
8 trop petit
12 trop grand
10 exact

________________________________________________________________________________________

ANALYSE

L e p r o g ra m m e c o m m e n c e r a p a r tir e r u n n o m b r e e n ti e r a u h a s a r d , su i v a n t la d é m a r c h e e x p o s é e d a n s l ' a n a l y se d e
l'exercice III-1.

Il dev ra ensuite répéter l'action :


faire jouer le joueur

j u s q u ' à c e q u e l e jo u e u r a i t g a g n é o u q u ' i l a i t d é p a s s é l e n o m b r e m a x i m a l d e c o u p s p e r m i s.

L ' a c t i o n e n q u e s t io n c o n s i s te s i m p l e m e n t à :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 147/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 147


- D e m a n d e r a u jo u e u r d e p r o p o se r u n n o m b r e .
- C o n s e r v e r c e n o m b r e d a n s u n t a b l e a u ( p o u r p o u v o i r é t a b li r la r é c a p i tu l a ti o n f in a l e ) . N o t e z q u e , c o m p t e te n u d e c e
q u ' u n n o m b r e d e c o u p s m a x i m a l e s t im p o s é , c e d e r n ie r f o u r n ir a l e n o m b r e m a x i m a l d ' é lé m e n t s d e n o t re t a b le a u .
- C o m p a r e r le n o m b r e f o u r n i a v e c l a v a l e u r c h o i si e p a r l e p r o g r a m m e e t a ff ic h e r l e m e s s a g e c o r r e s p o n d a n t .

Programme

#include <stdio.h>

#include <stdlib.h>

#define NCOUPS 15 /* nombre maximal de coups autorisés */


#define NMAX 1000 /* valeur maximale du nombre à deviner */

main()
{
int aleat(int) ; /* prototype fonction de tirage d'un nombre au hasard */
int nc, /* compteur du nombre de coups joués */
ndevin, /* nombre à deviner */
n, /* nombre courant proposé par le joueur */
prop[NMAX], /* tableau récapitulatif des nombres proposés */
i ;

/* initialisations et tirage du nombre secret */


nc = 0 ;
printf ("Devinez le nombre que j'ai choisi (entre 1 et %d)\n", NMAX) ;
ndevin = aleat(NMAX) ;

/* déroulement du jeu */
do
{ printf ("votre proposition : ") ;
scanf ("%d",&n) ;
prop [nc++] = n ;
if (n < ndevin) printf ("----------- trop petit\n") ;
else if (n > ndevin) printf ("----------- trop grand\n") ;
}
while (n != ndevin && nc < NCOUPS) ;

/* affichage résultats */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 148/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

148 Exercices en langage C


if (n == ndevin) printf ("\n\n++++ vous avez gagné en %d coups\n", nc) ;
else { printf ("\n\n---- vous n'avez pas trouvé\n") ;
printf ("le nombre choisi était %d\n", ndevin) ;
}

/* affichage récapitulation */
printf ("\n ---- Récapitulation des coups joués ----\n\n") ;
for (i=0 ; i<nc ; i++)
{ printf ("%4d ", prop[i]) ;
if (prop[i] > ndevin)
printf ("trop grand \n") ;
else if (prop[i] < ndevin)
printf ("trop petit\n") ;
else printf ("exact\n") ;
}
}

/*******************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0,n] */
/*******************************************************/
int aleat(int n)
{
int i = rand() / (RAND_MAX + 1.) * (n+1) ;
return i ;
}

DISCUSSION

N o t r e f on c t i o n d e t ir a g e a l é a t o ir e d ' u n n o m b r e e n t ie r f o u r n it to u j o u r s la m ê m e v a l e u r , c e q u i g â c h e q u e l q u e p e u l ' i n té r ê t
d u j e u . D a n s l a p r a t iq u e , i l s e r a i t n é c e s s a i r e d e r e m p l a c e r l a f o n c t io n a l e a t d e c e p r o g r a m m e p a r c e l le p r o p o s é e d a n s
l ' e x e r c i c e I I I -2 , l a q u e l le p e r m e t d ' o b t e n i r u n n o m b r e d i ff é r e n t d ' u n e e x é c u t io n à u n e a u t r e .

III- 6 M a s t e rm in d

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 149/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 149


Enoncé

R é a l iser u n p r o g r a m m e q u i c h o i s i t a u h a s a r d u n e c o m b in a i s o n d e 5 c h i ff r e s ( c o m p r i s e n tr e 1 e t 8 ) e t q u i d e m a n d e à
l ' u t il i sa t e u r d e l a d e v i n e r . A c h a q u e p r o p o s i ti o n , l e p r o g r a m m e p r é c i s e r a :

- le n o m b r e d e c h i ff r e s e x a c t s p r o p o s é s à l a b o n n e p l a c e ,
- le n o m b r e d e c h i ff r e s e x a c t s m a i s p r o p o s és à l a m a u v a i se p l a c e .
L e s d i f f é r e n t e s p r o p o s i ti o n s d u j o u e u r s e r o n t f o u r n ie s s o u s l a f o r m e d e 5 c h i ff r e s c o n s é c u t if s ( s a n s a u c u n s é p a r a t e u r ),
v a l i d é s p a r return .

L e p r o g r a m m e d e v r a t r a i te r c o n v e n a b le m e n t l e c a s d e s r é p o n s e s in c o r r e c t e s : le t tr e à l a p l a c e d' u n c h i ff r e , r é p o n s e t r o p
c o u r t e o u t r o p l o n g u e , c h i ff r e in c o r r e c t ( n u l o u su p ér i e u r à 8 ) .

O n p r é v o i r a u n n o m b r e l im i te d ' e s sa i s , a u - d e là d u q u e l l e p r o g r a m m e s ' i n t e r ro m p r a e n i n d i q u a n t q u e ll e é t a it la
c o m b in a i so n à d e v i n e r .

Exemple

proposition ? : 12345
2 P 0 C
proposition ? : 23456
0 P 1 C
proposition ? : 34567
0 P 1 C
proposition ? : 45678
0 P 0 C
proposition ? : 56789
** incorrect **
proposition ? : 1133é
** incorrect **
proposition ? : 11332
3 P 1 C
proposition ? : 11333
4 P 0 C
proposition ? : 11313

5 P 0 C
vous avez trouvé en 7 coups

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 150/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

150 Exercices en langage C


ANALYSE

I l p a r a î t a s s e z n a t u r e l d' u t il i ser u n t a b l e a u à 5 é l é m e n t s p o u r y r a n g e r l a c o m b in a i s o n t i ré e a u h a s a r d . N o t e z q u e n o u s
p o u r r i o n s é g a l e m e n t t ir e r a u h a s a r d u n n o m b r e d e 5 c h i f f re s , m a i s i l fa u d r a i t, d e t o u te f a ç o n , e n e x t r a i r e c h a c u n d e s
c h i f fr e s ; d e p l u s , l a m é t h o d e s e r a i t d if fi c il e m e n t g é n é r a l i sa b l e à u n n o m b r e q u e l c o n q u e d e p o s i ti o n s .

L a p r in c i p a l e d i f f ic u l t é r é s i d e d a n s l ' a n a l y s e d e l a p r o p o s i t io n d u j o u e u r . D a n s l a c o m p a r a i so n d e s d e u x t a b le a u x
( c o m b in a i s o n t ir é e p a r l e p r o g r a m m e e t c o m b in a i so n p r o p o s é e p a r le j o u e u r ) , il fa u d r a t e n i r c o m p t e d e s r e m a r q u e s
suivantes :

- U n c h i ff re c o m p t é " à s a p l a c e " n e d o i t p a s p o u v o i r ê t re é g a l e m e n t c o m p t é c o m m e " e x a c t , m a i s m a l p l a c é " .

- L o r s q u ' u n t ir a g e c o m p o r t e p l u si eu r s c h i f fr e s i d e n t iq u e s , i l n e f a u t p a s q u ' u n m ê m e c h i f f re d e l a p r o p o s i t io n d u
j o u e u r p u i s s e ê tr e c o m p t é p l u si e u r s f o is c o m m e e x a c t .
- L o r s q u ' u n e p r o p o s i ti o n c o m p o r t e p l u si eu r s c h i ff r e s i d en t i q u e s , i l n e f a u t p a s l e s c o n s i d ér e r tous com m e
c o r r e s p o n d a n t à u n m ê m e c h i ff r e d u t ir a g e .
N o u s v o u s p r o p o s o n s la m é th o d e s u i v a n te :

1 - N o u s r e c h e r c h o n s t o u t d ' a b o r d l e s c h i ff r e s e x a c ts p l a c é s e n b o n n e p o s i ti o n . A c h a q u e f o i s q u ' u n e c o ï n c i de n c e e s t
r e l e v é e , n o u s s u p p r i m o n s l e c h i f fr e , à l a f o i s d a n s l a p r o p o s i t i o n d u j o u e u r e t d a n s l e ti r a g e ( e n l e r e m p l a ç a n t , p a r
e x e m p l e , p a r la v a l e u r 0 ) .
2 - N o u s r e p r e n o n s e n s u i t e , u n à u n , c h a c u n d e s c h i ff r es d u t ir a g e q u i n ' o n t p a s é t é s u p p r i m é s ( c ' e s t -à - d ir e q u i s o n t
d i ff é r e n ts d e 0 ) . N o u s l e s c o m p a r o n s à c h a c u n d e s c h i f fr e s d e l a p r o p o s i ti o n . L à e n c o r e , s i u n e c o ï n c i d e n c e e s t
r e l e v é e , n o u s s u p p r i m o n s l e s c h i ff r e s c o r r es p o n d a n t s, à l a f o i s d a n s l a p r o p o s i ti o n e t d a n s l e t ir a g e . N o t e z b i e n q u ' i l
f a u t a b s o l u m e n t é v i t e r d e c o n si d é r e r l e s c h i f fr e s d é j à s u p p r i m é s d u t ir a g e : i ls r i s q u e r a ie n t d ' ê t r e t r o u v é s é g a u x à
d ' a u t r e s c h i ff r e s s u p p r im é s d e l a p r o p o s i ti o n .
C e t te m é t h o d e q u i d é t r u i t l e ti ra g e n o u s o b l i g e n é c e s s a ir e m e n t à e n f a i r e u n e c o p i e a v a n t d ' e n t a m e r l ' a n a l y s e d e l a
proposition.

N o u s a v o n s c h o i si d e r é a l i se r t r o is f o n c t io n s :

- t i r a g e : t ir a g e a u h a s a r d d e l a c o m b in a i so n ( t a b le a u d e 5 e n t i e r s) à d e v i n e r .
- entree : entrée de la proposition du joueur. Il paraît logique que cette fonction fournisse cette proposition dans un
t a b le a u d ' e n t i e r s. T o u te f o i s, a f i n d e t r a i te r c o n v e n a b l e m e n t l e s c a s d e r é p o n s e s i n c o r r e c t es , l a p r o p o s i t io n d u j o u e u r
s e r a t o u t d' a b o r d l u e d a n s u n e c h a î n e à l ' a i de d e l a f o n c t i o n c g e t s ( so n m é c a n is m e e s t d é c r i t da n s l ' e x e r c i c e I I -4 ) .
- a n a l y s e : a n a l y s e d e l a p r o p o s i ti o n d u j o u e u r , su i v a n t l' a l g o r i th m e d é c r i t p ré c é d e m m e n t .

Programme

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 151/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 151


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NPOS 5 /* nombre de positions */


#define NCHIF 8 /* nombre de chiffres (ici, de 1 a 8) */
#define NCMAX 12 /* nombre maximal de coups */

main()
{
void tirage (int []) ; /*****************************/
int entree (int []) ; /* prototypes fonctions */
void analyse(int [], int[], int[], int []) ; /*****************************/

int tir[NPOS], /* combinaison tirée par le programme */


prop[NPOS], /* proposition du joueur */
ncoup, /* compteur de coups joués */
bpos, /* nombre de chiffres bien placés */
bchif ; /* nombre de chiffres exacts mais mal placés */

/* initialisations */
tirage (tir) ;
ncoup = 0 ;

/* déroulement du jeu */

do
{ while (printf ("proposition ? : "), entree(&prop) )
printf ("\n** incorrect **\n") ;
analyse (prop, tir, &bpos, &bchif) ;
printf ("\n %22d P %d C\n", bpos, bchif) ;
ncoup++ ;
}
while (bpos < NPOS && ncoup < NCMAX) ;

/* affichage résultats */
if (bpos == NPOS) printf ("vous avez trouvé en %d coups", ncoup) ;
else { int i ;
printf ("vous n'avez pas trouvé en %d coups\n", NCMAX) ;
printf ("la bonne combinaison était : ") ;
for (i=0 ; i<NPOS ; i++) printf ("%d",tir[i]) ;
printf ("\n") ;
}
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 152/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

152 Exercices en langage C


/*************************************************/
/* fonction de tirage de la combinaison secrète */
/*************************************************/
void tirage (int tir [])
{
int i ;
for (i=0 ; i<NPOS ; i++)
tir[i] = rand() / (RAND_MAX + 1.) * NCHIF + 1 ;
}

/*************************************************/
/* fonction de lecture de la proposition du joueur */
/*****************************************************/
int entree (int prop [])
{
char ch[NPOS+3] ; /* chaîne où sera lue la proposition du joueur */
int i ;

/* lecture proposition joueur dans chaîne ch */


ch[0] = NPOS+1 ; /* préparation longueur maxi chaîne lue */
cgets (ch) ;

/* contrôles */
if (strlen (&ch[2]) != NPOS) return(-1) ;

for (i=2 ; i<NPOS+2 ; i++)


if (ch[i] < '1' || ch[i] > '1'+NCHIF-1) return(-1) ;

/* extraction des chiffres choisis */


for (i=0 ; i<NPOS ; i++)
prop[i] = ch[2+i] -'0' ;
return (0) ;
}

/**************************************************/
/* fonction d'analyse de la proposition du joueur */
/**************************************************/
void analyse (int prop [], int tir [], int bpos [] , int bchif [])
{
int tirbis[NPOS], /* double de la combinaison secrète */
i, j ;

/* recopie de la combinaison secrète */


for (i=0 ; i<NPOS ; i++) tirbis[i] = tir[i] ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 153/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

III. Hasard et récréations 153

/* comptage bonnes positions */


*bpos = 0 ;
for (i=0 ; i<NPOS ; i++)
if (prop[i] == tirbis[i])
{ (*bpos)++ ;
tirbis[i] = prop[i] = 0 ;
}

/* comptage bons chiffres mal placés */


*bchif = 0 ;
for (i=0 ; i<NPOS ; i++)
for (j=0 ; j<NPOS ; j++)
if (prop[i] !=0 && prop[i] == tirbis[j])
{ (*bchif)++ ;
prop[i] = tirbis[j] = 0 ;
}
}

Commentaires

* L e n o m b r e d e p o s i ti o n s (N P O S ) e t l e n o m b r e d e c h i f fr e s (N C H IF ) o n t é t é d é f i n is p a r # d e f i n e , c e q u i e n f a c i l i t e
l ' é v e n t u e l le m o d i f ic a t i o n .

* L a f o n c t io n t i r a g e f a it a p p e l à l' a l g o r i th m e d e t ir a g e a u h a s a r d d ' u n e n t ie r , t e l q u e n o u s l ' a v o n s e x p o s é d a n s l ' e x e r c i c e


I I I -1 . T o u t e f o i s, i c i, l e n o m b r e t ir é d o i t a p p a r t e n i r à l' i n t e r v a ll e [1 , N C H IF ] e t n o n à l ' i n te r v a l le [ 0 , N C H IF ] . C ' e s t c e q u i
e x p l i q u e q u e l e n o m b r e r é e l t ir é d a n s l ' i n t e r v a ll e [ 0 , 1 [ so i t m u l ti p li é p a r N C H IF e t q u e l ' o n a j o u te 1 a u r é s u l ta t .

* L a f o n c t io n e n t r e e l it , c o m m e p r é v u , l a p r o p o s i t io n d u j o u e u r s o u s fo r m e d ' u n e c h a î n e . E l le e n e f f e c t u e le s c o n t r ô l es
r e q u i s e n r e s ti tu a n t l a v a l e u r 0 l o r s q u e l a r é p o n s e e s t v a l i d e e t l a r é p o n s e - 1 d a n s l e c a s c o n t ra i r e . N o t e z q u e l a d é c i si o n
d e d e m a n d e r , e n c a s d ' e r r e u r , u n e n o u v e l le p r o p o s i ti o n a u j o u e u r e s t p r i se d a n s l e p r o g r a m m e p r i n c i p a l e t n o n d a n s l a
f o n c t io n e l le - m ê m e .

* L e s a r g u m e n t s d e l a fo n c t i o n a n a l y s e so n t tr a n s m i s p a r l e u r a d r e s s e , a f in q u e l e u r v a l e u r p u i s se ê t r e m o d i f ié e . C ' e s t c e
q u i j u s ti fi e le u r d é c l a r a t io n s o u s fo r m e d e p o i n te u r s s u r d e s e n t ie r s . N ' o u b l ie z p a s q u e l e s n o m s d e t a b le a u x
c o r r e s p o n d e n t à l e u r a d r e s s e ; c ' e s t c e q u i j u s ti fi e q u e d a n s l ' a p p e l d e a n a l y s e , o n t r o u v e e f f e c ti v e m e n t le s sy m b o l e s p r o p
e t t ir , a l o r s q u e , p a r a i l le u r s , o n y t r o u v e & b p o s e t & b c h i f .

* D a n s l a bo u c l e su i v a n t e (d u p r o g r a m m e p r in c i p a l ) :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 154/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

154 Exercices en langage C


while (printf ("proposition ? : "), entree(&prop) )
printf ("\n** incorrect **\n") ;

l ' e x p r e s s i o n f ig u r a n t d a n s w h i l e u t il ise u n " o p é r a t e u r s é q u e n t ie l " , c e q u i p e r m e t a i n si d e s i m p l if ie r q u e l q u e p e u l ' é c r i tu r e .


A t i t r e i n d ic a t i f, v o i c i d e u x c o n s t r u c t i o n s é q u i v a l e n t e s , l' u n e p a r f a i te m e n t s t r u c t u r é e , l ' a u t r e b a s é e s u r l ' u t i l i sa t i o n d e
b r e a k ( le s v a l e u r s d e s sy m b o l e s V R A I e t F A U X é ta n t r es p e c ti v e m e n t 1 e t 0 ) :

ok = FAUX ;
while (!ok)
{ printf ("proposition ? : ") ;
if (entree(&prop)) ok = VRAI ;
else printf ("\n** incorrect **\n") ;
}

do
{ printf ("proposition ? : ") ;
if (entree(&prop)) break ;
else printf ("\n** incorrect **\n) ;
while(1) ;

DISCUSSION

e* l Ilec ia, ulat o sr aisiesi lee sd ec ol ra r pe cr ot io


p onssi, timo nê md ue jaopureèus r qeuset lp' au rt fa
il ii sa
te tme ue nr ta sfar tia psfpaéis laen dt ee,r nmi eê rm ceh pi fofru er . u n p r o g r a m m e " r é e l " . E n p a r t ic u l i e r ,

* P a r c o nt r e , te l q u ' i l e s t p r o p o s é i c i, c e p r o g r a m m e c h o i s i t t o u jo u r s l a m ê m e c o m b in a i so n , c e q u i e n l è v e q u e l q u e i n t é r ê t
à l a p r a t iq u e r é g u l i è r e d u j e u ( m a is q u i p e u t f a c il it e r la m i s e a u p o i n t du p r o g r a m m e ) . P o u r r é m é d i er à c e t t e l a c u n e , i l
s u f f i t d ' i n t r o d u i r e , d a n s l a f o n c t i o n t i r a g e , u n e i n it ia l i sa t io n d u g é n é r a t e u r d e n o m b r e s a l é a t o ir e s , l o r s d e s o n p r e m i e r
a p p e l , c o m m e n o u s l ' a v o n s f a i t d a n s l ' e x e r c i c e I I I- 2.

* L e p r o g ra m m e s u p p o r te , s a n s a u c u n e m o d i fic a t io n , d e s v a le u r s q u e lc o n q u e s d e N P O S e t d e s v a le u r s d e N C H IF
i n f é r i e u r e s à 1 0 . I l e s t fa c i l e d ' a l l e r a u - d e l à , e n m o d i f i a n t si m p l e m e n t l a f o n c t i o n e n t r e e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 155/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

IV : T R IS , F U S I O N S
ET R EC H ER C H E EN T A B L E

N o u s v o u s p r o p o s o n s i c i d e s e x e r c i c e s d e p r o g r a m m a t io n d ' a l g o r it h m e s c l a ss i q u e s a y a n t tr a i t a u x t r is e t fu s i o n s d e
t a b l e a u x , a i n si q u ' à l a r e c h e r c h e e n t a b le .

IV - 1 T r i p a r e x t r a c t i o n s im p l e

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e d e t r i p a r v a l e u r s d é c r o is s a n t es d ' u n t a b l e a u d ' e n t i e rs , e n u t il i sa n t l ' a l g o r it h m e d i t " p a r e x t r a c ti o n


s i m p l e " q u i s e d é f i n it d e l a m a n i è r e s u iv a n t e :

- On recherche le plus gra nd des n éléme nts du tableau.


- O n é c h a n g e c e t é l é m e n t a v e c l e p r e m i e r é lé m e n t d u t a b le a u .
- L e p l u s p e t it é lé m e n t s e tr o u v e a l o r s e n p r e m i è r e p o si t io n . O n p e u t a l o r s a p p l i q u e r l e s d e u x o p é r a t io n s p r é c é d e n t e s
a u x n - 1 é lé m e n t s r e st a n t s, p u i s a u x n - 2 , . . . e t c e l a ju s q u ' à c e q u ' i l n e r e s t e p l u s q u ' u n s e u l é l é m e n t ( le d e r n i e r - q u i
e s t a l o r s l e p l u s p e t it ) .
L e p r o g r a m m e a f fi c h e r a to u s l e s " r é s u lt a ts i n t e r m é d i a ir e s " , c ' e s t - à - di r e l e s v a le u r s d u t a b l e a u , a p r è s c h a q u e é c h a n g e d e
d e u x é lé m e n t s.

Exemple

combien de valeurs à trier : 8


donnez vos valeurs à trier

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 156/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

156 Exercices en langage C


3 9 2 7 11 6 2 8

---- valeurs à trier ----


3 9 2 7 11 6 2 8

11 9 2 7 3 6 2 8
11 9 2 7 3 6 2 8
11 9 8 7 3 6 2 2
11 9 8 7 3 6 2 2
11 9 8 7 6 3 2 2
11 9 8 7 6 3 2 2
11 9 8 7 6 3 2 2

---- valeurs triées ----


11 9 8 7 6 3 2 2

________________________________________________________________________________________

ANALYSE

L ' a l g o r i th m e p r o p o s é p a r l ' é n o n c é p e u t se f o r m a l i ser c o m m e s u i t, e n t e n a n t c o m p t e d e s c o n v e n t io n s d ' i n d i c e s p r o p r e s a u


langage C :

R é p é t e r , p o u r i v a r ia n t d e 0 à n - 2 :
- r e c h e r c h e r k t e l q u e t ( k ) so i t l e p l u s g r a n d d e s t ( k ) , p o u r k a l l a n t d e i à n - 1 ,
m m

- é c h a n g e r l e s v a l e u r s d e t ( k ) e t d e t ( i ).
m

Programme

#include <stdio.h>
#define NMAX 100 /* nombre maximal de valeurs à trier */

main()
{
int t [NMAX], /* tableau contenant les valeurs à trier */
nval, /* nombre de valeurs à trier */
kmax, /* position du maximum temporaire */
tempo, /* valeur temporaire pour échange valeurs */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 157/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 157

i, j, k ;

/* lecture des valeurs à trier */


printf ("combien de valeurs à trier : ") ;
scanf ("%d", &nval) ;
if (nval > NMAX) nval = NMAX ;
printf ("donnez vos valeurs à trier\n") ;
for (k=0 ; k<nval ; k++)
scanf ("%d", &t[k]) ;
printf ("\n ---- valeurs à trier ----\n") ;
for (k=0 ; k<nval ; k++)
printf ("%5d", t[k]) ;
printf ("\n\n") ;

/* tri des valeurs */


for (i=0 ; i<nval-1 ; i++) /* recherche maxi partiel pour chaque i */
{ kmax = i ; /* init recherche maxi partiel */
for (j=i+1 ; j<nval ; j++) /* recherche maxi partiel */
if (t[j] > t[kmax]) kmax = j ;
tempo = t[kmax] ; /* mise en place maxi partiel */
t[kmax] = t[i] ;
t[i] = tempo ;
for (k=0 ; k<nval ; k++) /* affichage intermédiaire */
printf ("%5d", t[k]) ;
printf ("\n") ;
}

/* affichage valeurs triées */


printf ("\n ---- valeurs triées ----\n") ;
for (k=0 ; k<nval ; k++)
printf ("%5d", t[k]) ;
printf ("\n") ;
}

Commentaires

C e p r o g ra m m e f o n c t io n n e p o u r to u t e s le s v a le u r s d e N M A X , e n p a r t ic u l ie r :

- p o u r N M A X i n fé r i e u r o u é g a l à 0 , i l n e f a i t r i e n ,
- pour NM A X = 1 , il li t u n e v a l e u r q u ' i l a f fi c h e te l le q u e l le .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 158/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

158 Exercices en langage C

IV - 2 T r i p a r p e r m u t a t i o n s im p l e

________________________________________________________________________________________

Enoncé

Ecrire une fonction réalisant le tri par valeurs croissantes d'un tableau d'entiers, en utilisant l'algorithme de tri par
p e r m u t a ti o n s i m p l e ( d it d e " l a b u l le " ) , q u i s e d é f in i t a in si ( n r e p r é s e n t a n t l e n o m b r e d ' é lé m e n t s d u t a b l e a u ) :
O n p a r c o u r t l' e n s e m b l e d u t a b le a u , d e p u i s sa f in j u s q u ' à s o n d é b u t , e n c o m p a r a n t d e u x é lé m e n t s c o n s é c u t if s , e n l es
i n v e r s a n t s' i l s s o n t m a l c l a s sé s . O n s e r e t r o u v e a i n si a v e c l e p l u s p e t it é l é m e n t p l a c é e n t ê t e d u t a b l e a u .
O n r e n o u v e l le u n e t e ll e o p é r a t io n ( d it e " p a s s e " ) a v e c l e s n - 1 é l é m e n t s r e st a n ts , p u i s a v e c l e s n - 2 é l é m e n t s r e s ta n t s , e t
a i n si d e su i t e . . . j u s q u ' à c e q u e :
- so i t l ' a v a n t - d e r n i e r é l é m e n t a i t é t é c l a s s é ( le d e r n i e r é t a n t a l o r s o b l i g a t o i r e m e n t à s a p l a c e ) ,
- so i t q u ' a u c u n e p e r m u t a t io n n ' a i t e u l ie u p e n d a n t la d e r n i è r e p a s s e ( c e q u i p r o u v e a l o r s q u e l ' e n s e m b l e d u t a b le a u
est conven ablem ent ordonné).
O n p r é v o ir a e n a r g u m e n t s :

- l' a d r e s s e d u t a b l e a u à t r i e r ,
- so n n o m b r e d ' é l é m e n t s ,
- u n in d ic a t e u r p r é c i s a n t si l ' o n so u h a i te q u e l a f o n c t i o n a f f ic h e l e s v a l e u r s d u t a b l e a u a p r è s c h a q u e p e r m u t a ti o n ( 0
pour non, 1 po ur oui).

Exemple

combien de valeurs à trier : 6


donnez vos valeurs à trier
2 8 4 7 0 8

---- valeurs à trier ----


2 8 4 7 0 8

2 8 4 0 7 8
2 8 0 4 7 8

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 159/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 159

2 0 8 4 7 8
0 2 8 4 7 8
0 2 4 8 7 8
0 2 4 7 8 8

---- valeurs triées ----


0 2 4 7 8 8

________________________________________________________________________________________

ANALYSE

L ' a l g o r i th m e n o u s e s t in d i q u é p a r l ' é n o n c é . N o u s u t i li ser o n s c e p e n d a n t u n e r é p é t it io n d e t y p e t a n t q u e ( i n s t r u c t i o n w h i l e )


q u i p e r m e t d e p r en d r e c o n v e n a b le m e n t e n c o m p t e le c a s o ù l ' o n a p p e l le l a f o n c t io n d e t r i e n l u i f o u r n i ss a n t e n a r g u m e n t
u n n o m b r e d e v a l e u r s i n f é r ie u r o u é g a l à 1 .

D a n s l a m i s e e n o e u v r e d e c e t a l g o r it h m e , n o u s f e r o n s a p p e l à u n e n t ie r i sp é c if ia n t l e r a n g à p a r t i r d u q u e l l e t a b l e a u
n ' e s t p a s e n c o r e t r ié . I n i ti a le m e n t , i l f a u d r a p r é v o i r q u ' a u c u n é l é m e n t n ' e s t e n c o r e à s a p l a c e , c e q u i c o n d u i r a à
l ' i n it ia l i sa t io n a r t if ic i e l le d e i à - 1 ( p u i s q u e e n C , l e p r e m i e r é lé m e n t d ' u n t a b le a u p o r t e le n u m é r o 0 ) . D ' a u t re p a r t , u n
i n dic a t e u r l o g iq u e n o m m é p e r m u t n o u s s e r v i ra à p r é c i se r si a u m o i n s u n e p e r m u t a ti o n a e u l i e u a u c o u r s d e l a d e r n i è r e
passe.

S i n o u s n o t o n s n v a l l e n o m b r e d e v a l e u r s d e n o t r e t a b le a u , l ' a l g o r i th m e d e t r i p e u t a l o r s s' é n o n c e r c o m m e s u i t :

T a n t q u e i n e d é si g n e p a s le d e r n i e r é l é m e n t d u t a b l e a u ( c ' e s t - à -d ir e i < n v a l - 1 ) e t q u e p e r m u t e s t V R A I , n o u s
e f fe c t u o n s u n e p a s se . C e tt e d e r n i è r e c o n s i st e e n u n e s u c c e s s i o n d e c o m p a r a i so n s d e s él é m e n t s d e r a n g j e t j +1 , j
d é c r i v a n t t o u s le s é l é m e n t s d ep u i s l' a v a n t - d er n i er j u s q u ' à c e l u i d e r a n g i +1 ( a u t r e m e n t d i t, j d é c r o is s a n t d e n v a l - 2 à
i +1 ) . A c h a q u e p e r m u t a ti o n , n o u s d o n n o n s à p e r m u t l a v a l e u r V R A I ; n o u s a u r o n s , b i e n s û r , p r i s s o i n d ' i n i t ia l i se r
p e r m u t à F A U X a u d éb u t d e c h a q u e p a s se .

N o t e z q u e l ' u t il i sa t io n d ' u n e r é p é t it io n d e t y p e t a n t q u e ( d a n s l a q u e l le l a c o n d i t io n d e p o u r s u i t e f a it in t e r v e n i r l ' i n d ic a t e u r


p e r m u t ) n o u s o b l i g e à i n i t ia l i ser a r t i f ic i e l l e m e n t p e r m u t à V R A I , e n to u t d é b u t d e tr a v a i l.

Programme

#include <stdio.h>
#define VRAI 1 /* pour "simuler" des ... */
#define FAUX 0 /* ... valeurs logiques */
#define NMAX 100 /* nombre maximal de valeurs à trier */
main()
{

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 160/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

160 Exercices en langage C


void bulle(int [], int, int ) ; /* prototype fonction de tri */
int t [NMAX], /* tableau contenant les valeurs à trier */
nval, /* nombre de valeurs à trier */
k ;

/* lecture des valeurs à trier */


printf ("combien de valeurs à trier : ") ;
scanf ("%d", &nval) ;
if (nval > NMAX) nval = NMAX ;
printf ("donnez vos valeurs à trier\n") ;
for (k=0 ; k<nval ; k++)
scanf ("%d", &t[k]) ;
printf ("\n ---- valeurs à trier ----\n") ;
for (k=0 ; k<nval ; k++)
printf ("%5d", t[k]) ;
printf ("\n\n") ;

/* tri des valeurs */


bulle (t, nval, 1) ;

/* affichage valeurs triées */


printf ("\n ---- valeurs triées ----\n") ;
for (k=0 ; k<nval ; k++)
printf ("%5d", t[k]) ;
printf ("\n") ;

/**************************************************/
/* fonction de tri par la méthode de la bulle */
/**************************************************/
void bulle (int t[], int nval, int affich)
/* t : tableau à trier */
/* nval : nombre de valeurs à trier */
/* affich : indicateur affichages intermédiaires */
{
int i, /* rang à partir duquel le tableau n'est pas trié */
j, /* indice courant */
tempo, /* pour l'échange de 2 valeurs */
k ;
int permut ; /* indicateur logique précisant si au moins une */
/* permutation a eu lieu lors de la précédente passe */
i = -1 ;
permut = VRAI ;
while (i < nval-1 && permut)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 161/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 161

{ permut = FAUX ;
for (j=nval-2 ; j>i ; j--)
{ if ( t[j] > t[j+1] )
{ permut = VRAI ;
tempo = t[j] ;
t[j] = t[j+1] ;
t[j+1] = tempo ;
if (affich)
{ for (k=0 ; k<nval ; k++)
printf ("%5d", t[k]) ;
printf ("\n") ;
}
}
}
i++ ;
}
}

Commentaires

D a n s l a fo n c t i o n b u l l l e , l a d é c l a r a t i o n :

int * t ;

est équivalente à :

int t[] ;

DISCUSSION

Les deux algorithmes proposés dans l'exercice précédent et dans celui-ci correspondent à ce que l'on appelle des
" m é t h o d e s d i r e c t e s " . D ' u n e m a n i è r e g é n é r a l e , c e s o n t d e s a l g o r it h m e s s im p l e s à p r o g r a m m e r , m a i s q u i n é c e s s i te n t u n
2
n o m b r e d e c o m p a r a iso n s d e l ' o r d r e d e n ( n o t e z q u ' i l e x i s te u n e t r o i si è m e m é t h o d e d i r e c t e d i t e " t r i p a r i n s e rt io n " ) .

E n f a it , il e x is t e d e s m é t h o d e s d i t e s " é v o l u é e s " q u i c o n d u i se n t à u n n o m b r e d e c o m p a r a i so n s d e l' o r d r e d e n * l o g n .


C e l le s - c i déb o u c h e n t su r d e s p r o g r a m m e s p l u s c o m p l e x e s e t le s o p é r a t i o n s q u ' e l l e s fo n t i n te r v e n i r so n t e l le s - m ê m e s p l u s
g o u r m a n d e s e n t e m p s q u e c e l le s d e s m é t h o d e s d i r e c t e s . A u s si , l e s m é t h o d e s é v o l u é e s n e p r e n n e n t v é r it a b le m e n t d ' i n t é r ê t
q u e p o u r d e s v a l e u r s é le v é e s d e n .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 162/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

162 Exercices en langage C


A t it r e in d ic a t if , n o u s v o u s f o u r n is s o n s i c i l' a l g o r i th m e r e l a ti f à l a m é t h o d e évoluée la plus perform ante, nom m ée "T ri
r a p i d e " ( Q u i c k so r t ) , in v e n t é e p a r C . A . R . H o a r e . C e t a lg o r i th m e , d é lic a t à p r o g r a m m e r , e s t b a s é s u r l' o p é r a t io n d e
" s e g m e n t a t io n " d ' u n t a b l e a u ; c e l le - c i c o n si s te à p a r t a g e r u n t a b l e a u e n d e u x p a r t i e s, n o m m é e s s e g m e n t s , te l le s q u e t o u t
é l é m e n t d e l ' u n e s o i t i n f é r ie u r o u é g a l à t o u t é l é m e n t d e l ' a u t r e . U n e t e l le s e g m e n t a t io n p e u t ê t r e r é a l i sé e p a r
l ' a l g o r it h m e s u i v a n t :

- P r e n d r e u n é l é m e n t a u h a s a r d ( o n p e u t p re n d r e l ' é l é m e n t d u m i li e u ) . S o it m s a v a l e u r .
- R e c h e r c h e r , d e p u i s le d é b u t d u t a b l e a u , le p r e m i e r é l é m e n t t( i) te l q u e t( i) > m .
- R e c h e r c h e r , d e p u i s la f in d u t a b l e a u , le p r e m i e r é l é m e n t t( j) t e l q u e t ( j) < m .
- P e r m u t e r t ( i ) e t t( j ).
- P o u r s u i v r e c e " p a r c o u r s " d u t a b le a u j u s q u ' à c e q u e i e t j s e r e n c o n t r e n t .
L e t r i p r o p r e m e n t d it s ' e f f e c tu e e n a p p l i q u a n t à n o u v e a u l ' o p é r a t io n d e s e g m e n t a ti o n à c h a q u e s e g m e n t o b t e n u , p u i s a u x
s e g m e n t s o b t e n u s p a r s eg m e n t a t io n d e c e s s e g m e n t s , . . . e t a in si d e su i t e j u s q u ' à c e q u e c h a q u e s e g m e n t n e c o n t ie n n e p l u s
q u ' u n s e u l é lé m e n t .

N o t e z q u ' u n e t e ll e m é t h o d e s e p r ê te p a r t ic u l i è re m e n t b i en à u n e p r o g r a m m a t io n r é c u r s i v e .

IV - 3 T r i d ' u n t a b le a u d e c h a în e s
________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t io n u t il i sa n t l a m é t h o d e d e t r i p a r e x t r a c t io n s i m p l e ( d é c r it e d a n s l ' e x e r c i c e I V -1 ) p o ur t r ie r u n t a b le a u d e
c h a î n e s , p a r o r d r e a l p h a b é ti q u e ( s a n s d i s ti n c ti o n e n t r e m a j u s c u le s e t m i n u s c u l e s) .

C e t te f o n c t io n r e c e v r a , e n a r g u m e n t :

- l' a d r e ss e d ' u n t a b l e a u d e p o i n te u r s s u r l e s c h a în e s c o n c e r n é e s ,
- le n o m b r e d e c h a î n e s à t r ie r .
L e t r i p r o p r e m e n t d i t p o r t e r a , n o n su r l e s v a le u r s d e s c h a î n e s e l le s - m ê m e s , m a i s u n i q u e m e n t su r l e ta b l e a u d e p o i n t e u r s .

O n t e s te r a c e t te f o n c t io n à l ' a i de d ' u n p r o g r a m m e p r i n c ip a l c r é a n t u n si m p l e ta b l e a u d e c h a î n e s ( a y a n t do n c c h a c u n e u n e
l o n g u e u r m a x im a l e d o n n é e ).

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 163/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 163

Exemple

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

L a m é t h o d e d e t r i a é t é d é c r i te d a n s l ' e x e r c ic e I V -1 . Il e s t c e p e n d a n t n é c e s s a i r e d e p r o c é d e r à p l u s ie u r s so r t e s
d ' a d a p t a t io n s :

- il faut en faire un e fonction,


- la r e l a ti o n d ' o r d r e q u i s e r t a u t r i n e p o r t e p lu s s u r d e s e n t ie r s , m a i s s u r d e s c h a î n e s d e c a r a c t è r e s ; c e l a i m p l iq u e d e
r e c o u r i r à la f o n c t i o n s t r i c m p ( e t n o n s t r c m p , p u i s q u e l ' o n so u h a i te n e p a s d i s ti n g u e r l e s m a j u s c u le s d e s m i n u s c u l es ) ,
- l e s é lé m e n t s à p e r m u t e r s e r o n t d es p o i n t e u r s e t n o n p l u s d e s e n t i e r s.

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 164/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

164 Exercices en langage C


Programme

#include <stdio.h>
#include <string.h>

#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 ; i<nch ; i++)
{ fgets (chaines[i], LGMAX+1, stdin) ; /* lit au maximum LGMAX caractères */

adr[i] = chaines[i] ;
}

/* tri des pointeurs sur les chaînes */


trichaines (adr, nch) ;

/* affichage des chaînes après tri */


/* attention aux chaînes de longueur maximum !! */
printf ("\n\nvoici vos chaînes triées\n") ;
for (i=0 ; i<nch ; i++)
printf ("%s", adr[i]) ;
}

void trichaines (char * * adr, int nch)


/* adr : adresse tableau de pointeurs sur chaînes à trier */
/* nch : nombre de chaînes */
{
char * tempo ; /* pointeur temporaire pour l'échange de 2 pointeurs */
int kmax,

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 165/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 165

i, j ;

for (i=0 ; i<nch-1 ; i++)


{ kmax = i ;
for (j=i+1 ; j<nch ; j++)
if ( stricmp (adr[kmax], adr[j]) > 0 ) kmax = j ;
tempo = adr[kmax] ;
adr[kmax] = adr[i] ;
adr[i] = tempo ;
}
}

Commentaires

* I c i , l e s c h a în e s à t r ie r o n t é t é p la c é e s ( p a r l e p r o g ra m m e p r i n c ip a l ) d a n s u n t a b le a u d e c a r a c t è r e s ( n o m m é c h a i n e s ) à
d e u x d i m e n s io n s. N o t e z b i e n q u ' i l n e s e r a i t p a s p o s si b l e d ' e n i n v e r s e r l ' o r d r e d e s d i m e n s i o n s ; il e s t e n e f f e t n é c e s s a i r e
q u e t o u s l e s c a r a c tè r e s d ' u n e m ê m e c h a î n e s o i e n t c o n s é c u t if s .

* B i e n q u e c e l a n ' a i t p a s é t é e x p l ic i t e m e n t d e m a n d é p a r l' é n o n c é , n o u s a v o n s p r é v u u n c o n t r ô le s u r l a l o n g u e u r d e s
c h a î n e s f o u r n i e s a u c l a v i e r ; p o u r c e f a i r e , n o u s a v o n s f a it a p p e l à l a f o n c t io n fg e ts , e n l ' a p p l i q u a n t a u f i c h i e r s t d i n .
L ' i n s tr u c t io n :

fgets (chaines[i], LGMAX+1, stdin) ;

l it a u m a x i m u m L G M A X c a r a c t è r e s s u r s t d i n e t l e s r a n g e à l ' a d r e s s e c h a i n e [ i ] , e n c o m p l é ta n t l e to u t p a r u n z é r o d e f i n d e
c h a î n e . A i n s i , o n é v i t e le s r is q u e s d e d é b o r d e m e n t m é m o i r e q u e p r é s e n t e g e t s .

T o u t e fo i s u n l é g e r in o n v é n i e n t a p p a r a î t. E n e f fe t , ta n t q u e l e n o m b r e d e c a r a c t è r e s m a x i m a l ( L G M A X ) n ' e s t p a s a t t e i n t ,
l e c a r a c t è re \ n q u i a s e r v i à d é l im i te r l a c h a î n e lu e e s t r a n g é e n m é m o i r e , a u m ê m e t it re q u e l e s a u t r e s . E n r e v a n c h e ,
l o r s q u e le n o m b r e m a x i m a l d e c a r a c t è r e s a é t é a t te i n t, a l o r s p r é c i s ém e n t q u e c e c a r a c t è r e \ n n ' a p a s é t é r e n c o n t r é , o n n e
t r o u v e p l u s c e c a r a c t è re e n m é m o i r e ( le c a r a c t è r e n u l d e f in d e c h a î n e , q u a n t à l u i , e s t b i en t o u j o u r s p r é s en t ) .

C e t i n c o n v é n i e n t e s t su r t o u t s e n s i b le l o r s q u e l ' o n a f fi c h e à n o u v e a u l e s c h a î n e s p a r p r i n t f a p r è s l e u r t r i : l e s c h a î n e s d e
l o n g u e u r m a x im a l e n e s e r o n t p a s s u iv i es d ' u n c h a n g e m e n t d e l ig n e . N o t e z b ie n q u ' e n e m p l o ya n t p u t s o n o b t i e n d r a i t , e n
r e v a n c h e , 1 c a r a c t è r e d e c h a n g e m e n t d e l ig n e p o u r l e s c h a î n e s d e lo n g u e u r m a x i m a l e (t r a n s m i s p a r l a fo n c t i o n p u ts
m ê m e ) e t 2 c a r a c t è r e s d e c h a n g e m e n t d e l i g n e p o u r l e s a u t r e s c h a î n e s ( c e l u i f ig u r a n t d a n s l a c h a î n e e t c e l u i tr a n s m i s p a r
p u ts) .

D a n s u n " p r o g r a m m e o p é r a t i o n n e l " , i l f a u d r a i t g é r e r c o n v e n a b le m e n t c e t te s i tu a t io n , c e q u e n o u s n ' a v o n s p a s f a it ic i .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 166/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

166 Exercices en langage C


* R a p p e l o n s q u e , a p r è s l a l e c tu r e p a r s c a n f d u n o m b r e d e c h a î n e s à tr a i te r , l e p o in t e u r r e st e (c o m m e à l ' a c c o u t u m é e )
p o s i ti o n n é s u r l e d e r n i e r c a r a c t è r e n o n e n c o r e u t i li s é ; d a n s l e m e i ll e u r d e s c a s , i l s' a g i t d e \ n ( m a i s i l p e u t y a v o i r
d'autres caractères avant si l'utilisateur a été distrait). Dans ces conditions, la lecture ultérieure d'une chaîne par gets
conduira à lire... une cha îne vide.

P o u r é v i te r c e p r o b l è m e , n o u s a v o n s p l a c é u n e i n s tr u c t io n g e t c h a r q u i a b so r b e c e c a r a c t è r e \ n . E n t o u t e r ig u e u r , s i l ' o n
s o u h a i t a i t t r a i te r c o r r e c t e m e n t l e c a s o ù l ' u t i l i sa t e u r a f o u r n i tr o p d ' i n f o r m a t i o n p o u r l e s c a n f p r é c é d e n t , i l s e r a i t
n é c e s s a i r e d ' o p ér e r u n e l e c tu r e d ' u n e c h a î n e p a r g e t s ( i l f a u d r a i t p r é v o i r u n e m p l a c e m e n t à c e t e ff e t !) .

* D a n s l a fo n c t i o n t r i c h a i n e s , l e p r e m i e r a r g u m e n t a d r a é t é d é c l a r é p a r :

char * * adr

I l s ' a g i t d ' u n p o i n t e u r s u r l e t a b l e a u d e p o i n t e u r s su r l es d i f fé r e n t e s c h a î n e s . N o u s a u r i o n s p u é g a l e m e n t l e d é c l a r e r p a r :

char * adr[]

N o t e z d ' a i ll e u r s q u e n o u s a v o n s u t i li s é le " f o r m a l i sm e " t a b l e a u a u s e i n d e l a fo n c t i o n e l le - m ê m e . A i n s i :

adr[i] = adr[j]

aurait pu se formu ler :

* (adr+i) = * (adr+j)

* N o u s v o u s r a p p e l o n s q u e l a f o n c t io n s t r i c m p c o m p a r e l e s d e u x c h a î n e s d o n t o n l u i fo u r n i t le s a d r e s s e s e t e l le f o u r n i t
u n e v a l e u r e n t i è r e d é f i n ie c o m m e é t a n t :

- p o s i ti v e s i la p r e m i è r e c h a î n e a r r i v e a p r è s l a s e c o n d e , a u s e n s d e l ' o r d r e d é f in i p a r l e c o d e d e s c a r a c t è r e s ( sa n s t e n i r
c o m p t e d e l a d i f fé r e n c e e n t r e m a j u s c u le s e t m i n u s c u l es p o u r l e s 2 6 l e t tr e s d e l ' a l p h a b e t ),
- nulle si les deux c haînes son t égales,
- n é g a t i v e s i la p r e m i è r e c h a î n e a r r i v e a v a n t l a s e c o n d e .

DISCUSSION

D ' u n e m a n i è r e g é n é r a le , i l n ' e s t p a s n é c e s s a ir e q u e l e s c h a î n e s à tr i e r so i e n t , c o m m e i c i, i m p l a n t é e s e n m é m o i r e d e
m anière consécutive.

D e m ê m e , la f o n c t io n t r i c h a i n e s p r o p o s é e p o u r r a i t to u t a u s si b i e n o p é r e r s u r d e s c h a î n e s d o n t l e s e m p l a c e m e n t s a u r a i e n t
é t é a l lo u é s " d y n a m i q u e m e n t " ( le c h a p i t r e V v o u s p r o p o se d ' a i ll e u r s u n e x er c i c e d a n s c e se n s) .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 167/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 167

IV - 4 F u s io n d e d e u x t a b l e a u x o r d o n n é s

L a f u s io n c o n si st e à ra s s e m b l e r e n u n s e u l t a b le a u o r d o n n é l e s é lé m e n t s d e d e u x t a b le a u x , e u x - m ê m e s o r d o n n é s .

________________________________________________________________________________________

Enoncé

R é a l i se r u n e f o n c t io n q u i f u si o n n e d e u x t a b le a u x d ' e n t ie r s o r d o n n é s p a r v a l e u r s c r o i s sa n t e s .

O n p r é v o ir a e n a r g u m e n t s :

- le s a d r e s s e s d e s t r o i s ta b l e a u x c o n c e r n é s ,
- le n o m b r e d e v a l e u r s d e c h a c u n d e s d e u x t a b l e a u x à f u si o n n e r .
P o u r t e s te r c e t te f o n c t io n , o n é c r i r a u n p r o g r a m m e p r i n c ip a l q u i l it a u c l a v ie r d e u x e n s e m b l e s d e v a l e u r s q u e l ' o n t r ie r a
a u p r é a l a b l e à l ' a i de d e l a f o n c t io n b u l l e r é a l i s ée d a n s l ' e x e r c ic e I V -2 .

Exemple

combien de valeurs pour le premier tableau ? 5


donnez vos valeurs
3 9 2 8 11
combien de valeurs pour le second tableau ? 7
donnez vos valeurs
12 4 6 3 1 9 6

premier tableau à fusionner


2 3 8 9 11
second tableau à fusionner
1 3 4 6 6 9 12

résultat de la fusion des deux tableaux


1 2 3 3 4 6 6 8 9 9 11 12
________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 168/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

168 Exercices en langage C


ANALYSE

L a d é m a r c h e , a s s e z s i m p l e , s ' i n sp i r e d e c e l le q u e l ' o n a d o p t e r a i t p o u r r é s o u d r e " à l a m a i n " u n t e l p r o b l è m e . I l su f f it , e n


e f f e t, d ' a v a n c e r e n p a r a l lè l e d a n s c h a c u n d e s d e u x t a b le a u x à f u si o n n e r ( t1 e t t 2 ), e n p r é l e v a n t , à c h a q u e f o is , l e p l u s
p e t i t d e s d e u x é lé m e n t s e t e n l' i n t r o d u i sa n t da n s l e ta b l e a u r é s u l ta n t t . P l u s p r é c i s ém e n t , n o u s s o m m e s a m e n é s à u t il i se r
trois indic es :

- i1 : p r e m i e r é lé m e n t d e t 1 n o n e n c o r e p r i s e n c o m p t e ,
- i2 : p r e m i e r é lé m e n t d e t 2 , n o n e n c o r e p r i s en c o m p t e ,
- i : e m p l a c e m e n t d u p r o c h a i n é lé m e n t à i n tr o d u i r e d a n s t.
N o u s i n i tia l i so n s c e s t r o is i n d i c e s à z é r o ( c o m p t e t e n u d e s c o n v e n t io n s d u C ) . N o u s r é p é t o n s a l o r s le t r a it e m e n t su i v a n t :

C h o i s i r le p l u s p e t i t d e s é l é m e n t s t 1 ( i1 ) e t t2 ( i 2 ) e t l e p l a c e r e n t ( i) . I n c r é m e n t e r d e 1 l a v a l e u r d e l ' i n d i c e
c o r r e s p o n d a n t à l' é l é m e n t e x t r a i t ( i 1 o u i 2 ) , a i n s i q u e c e l le d e i .
N o u s p o u r su i v o n s a i n si j u s q u ' à c e q u e l ' u n d e s d e u x t a b l e a u x so i t é p u i s é . I l n e r e s t e p l u s a lo r s q u ' à r e c o p i e r l a f in d e
l'autre tableau.

Programme

#include <stdio.h>
#define NMAX1 100 /* nombre maximal de valeurs du premier tableau */
#define NMAX2 100 /* nombre maximal de valeurs du second tableau */

main()
{
void fusion(int [], int [], int [], int, int ) ; /* proto fonction de fusion */
void bulle(int [], int) ; /* proto fonction servant à assurer l'ordre des tableaux
*/

int t1 [NMAX1], /* premier tableau à fusionner */


t2 [NMAX2], /* second tablleau à fusionner */
t [NMAX1+NMAX2] ; /* tableau résultant de la fusion */

int nval1, /* nombre de valeurs à prélever dans t1 */


nval2, /* nombre de valeurs à prélever dans t2 */
k ;

/* lecture des valeurs des deux ensembles à fusionner */


printf ("combien de valeurs pour le premier tableau ? ") ;
scanf ("%d", &nval1) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 169/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 169

if (nval1 > NMAX1) nval1 = NMAX1 ;


printf ("donnez vos valeurs\n") ;
for (k=0 ; k<nval1 ; k++)
scanf ("%d", &t1[k]) ;

printf ("combien de valeurs pour le second tableau ? ") ;


scanf ("%d", &nval2) ;
if (nval2 > NMAX2) nval2 = NMAX2 ;
printf ("donnez vos valeurs\n") ;
for (k=0 ; k<nval2 ; k++)
scanf ("%d", &t2[k]) ;

/* tri préalable et affichage des valeurs à fusionner */


bulle (t1, nval1) ;
bulle (t2, nval2) ;
printf ("\npremier tableau à fusionner\n") ;
for (k=0 ; k<nval1 ; k++)
printf ("%5d", t1[k]) ;
printf ("\nsecond tableau à fusionner\n") ;
for (k=0 ; k<nval2 ; k++)
printf ("%5d", t2[k]) ;

/* fusion et affichage résultats */


fusion (t, t1, t2, nval1, nval2) ;
printf ("\n\n résultat de la fusion des deux tableaux\n") ;
for (k=0 ; k<nval1+nval2 ; k++)
printf ("%5d", t[k]) ;
}

/********************************************************/
/* fonction de fusion de deux tableaux */
/********************************************************/

void fusion (int t[], int t1[], int t2[], int nval1, int nval2)
/* t1 et t2 : tableaux à fusionner */
/* t :tableau résultant */

/* nval1 : nombre de valeurs du premier tableau t1 */


/* nval2 : nombre de valeurs du second tableau t2 */
{
int i1, i2, /* indices courants dans les tableaux à fusionner */
i, /* indice courant dans le tableau résultant */
k ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 170/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

170 Exercices en langage C

i = 0 ; i1 = 0 ; i2 = 0 ;
while (i1 < nval1 && i2 < nval2)
{ if ( t1[i1] < t2[i2] ) t[i++] = t1[i1++] ;
else t[i++] = t2[i2++] ;
}
if (i1 == nval1)
for (k=i2 ; k<nval2 ; k++) t[i++] = t2[k] ;
else for (k=i1 ; k<nval1 ; k++) t[i++] = t1[k] ;
}

/*******************************************************/
/* fonction de tri d'un tableau (méthode de la bulle) */
/*******************************************************/

void bulle (int t[], int nval)


{
int i, j, tempo, k, permut ;

i = -1 ; permut = 1 ;
while (i < nval-1 && permut)
{ permut = 0 ;
for (j=nval-2 ; j>i ; j--)
if ( t[j] > t[j+1])

{ permut = 1 ;
tempo = t[j] ; t[j] = t[j+1] ; t[j+1] = tempo ;
}
i++ ;
}
}

Commentaires

* P o u r e f f e c t u e r l e tr i p r é a la b l e d e s d e u x t a b le a u x f o u r n is e n d o n n é e , n o u s a v o n s r e p r i s la f o n c t i o n b u l l e r é a l i s é e d a n s
l ' e x e r c i c e I V - 2 . N o u s en a v o n s t o u t e fo i s su p p r i m é l e s in s t ru c t i o n s p e r m e t ta n t d ' a f f ic h e r , s u r d e m a n d e , l e s im p r e s s io n s
i n te r m é d i a ir e s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 171/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 171

IV - 5 R e c h e rc h e d ic h o t o m iq u e

L ' e x e r c i c e I I - 4 de f a c t u ra t io n p a r c o d e f a i s a it in t e r v e n ir u n a l g o r it h m e s é q u e n t ie l d e r e c h e r c h e e n t a b l e . N o u s v o u s
p r o p o s o n s i c i d e r éa l iser u n a l g o r it h m e p l u s p e r f o r m a n t d e r e c h e r c h e p a r " d ic h o t o m i e " .

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i r e c h e r c h e , à p a r t ir d ' u n c o d e d ' a r t ic l e ( n u m é r i q u e ) , l' i n f o r m a t io n q u i l u i e s t a s s o c i é e , à s a v o i r


u n l i b e ll é ( c h a î n e ) e t u n p r i x u n i t a i r e ( r é e l ).
C o m m e d a n s l ' e x e r c i c e I I -4 , l e p r o g r a m m e u t il iser a u n t a b l e a u d e s t r uc t u r e s , d é c l a r é à u n n i v e a u g l o b a l , p o u r c o n s e r v e r
l e s in f o r m a t io n s r e q u i s e s . C e t te f o i s, p a r c o n t re , c e s d e r n iè r e s s e r o n t r a n g é e s p a r o r d r e c r o i s s a n t d u n u m é r o d e c o d e .

L a l o c a l i sa t io n d ' u n n u m é r o d e c o d e d o n n é se fe r a p a r u n e r e c h e r c h e d i c h o t o m i q u e . C e l le - c i c o n si s te à p r o f it e r d e l ' o r d r e
du tableau pour acc élérer la recherche en procédant com m e suit :

- O n c o n s i d è r e l ' é l é m e n t f ig u r a n t a u " m i li e u " d u t a b l e a u . S i l e c o d e c h e r c h é l u i e s t é g a l, l a r e c h e r c h e e s t te r m i n é e .


S ' i l lu i e s t i n fé r i e u r , o n e n c o n c l u t q u e l e c o d e r e c h e r c h é n e p e u t s e t r o u v e r q u e d a n s l a p r e m i è r e m o i ti é d u t a b le a u ;
d a n s l e c a s c o n t r a i re , o n e n c o n c l u t q u ' i l s e t r o u v e d a n s l a s e c o n d e m o i ti é .
- O n r e c o m m e n c e a l o r s l' o p é r a t io n s u r l a " m o i ti é " c o n c e r n é e , p u i s su r l a m o i ti é d e c e t t e m o i ti é , e t a i n si d e su i t e . . .
j u s q u ' à c e q u e l ' u n e d e s c o n d i t io n s s u i v a n t e s s o i t s a t i sf a i te :
* o n a t r o u v é l' é l é m e n t c h e r c h é ,
* on est sûr qu'il ne figure pas dans le tableau.

Exemples

code article recherché : 24


le code 24 n'existe pas

________________

code article recherché : 19


article de code 19
libellé : Balance de ménage
prix : 278.00

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 172/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

172 Exercices en langage C

ANALYSE

L ' a l g o r i th m e p r o p o s é p a r l ' é n o n c é s u g g è r e d ' u t i li se r t r o is v a r ia b l e s p e r m e t ta n t d e s p é c if ie r , à u n i n s t a n t d o n n é , l a p a r t ie


d u t a b l e a u d a n s l a q u e l le s ' e f fe c t u e l a r e c h e r c h e :

g a u c h e : d é b u t d e la p a r t i e r e s t a n t à e x p l o r e r ,

d r o i t e : f i n d e l a p a r t i e r e s ta n t à e x p l o r e r ,

m i l i e u : p o s i t io n c h o i si e p o u r l e " m i li e u " d e c e t t e p a r t ie r e s t a n t à e x p l o r e r .

N o t e z d é jà q u e c e t t e n o t io n d e m i li e u e s t q u e l q u e p e u a m b i g u ë . N o u s c o n v i e n d r o n s q u ' e l l e c o r re s p o n d à l a p a r t ie e n t i è r e
d e l a m o y e n n e d es i n d i c e s g a u c h e e t d r o i t e .

L ' a l g o r i th m e d e r e c h e r c h e p a r d ic h o t o m i e p e u t a lo r s s ' é n o n c e r a i n si ( t dési g n a n t l e t a b le a u , n l e n o m b r e d e c o d e s e t x


l'élém ent cherché) :

- I n i t i a l i s e r g a u c h e e t d r o i t e d e f a ç o n q u ' i ls d és i g n e n t l' e n s e m b l e d u t a b le a u .
- R é p é t e r l e t r a it e m e n t s u i v a n t :
* D é t e r m i n e r le m i li e u d e l a p a r ti e à e x p l o r e r :
m i l i e u = (g a u c h e + d r o it e ) / 2
* C o m p a r e r l' é l é m e n t c h e r c h é x a v e c t ( m i l i e u ) :
+ S ' i l s so n t é g a u x , l ' é l é m e n t c h e r c h é e s t l o c a l i sé en p o s i t io n m i l i e u ,
+ S i x e s t su p é r i eu r à t ( m i l i e u ) , l ' é l é m e n t c h e r c h é n e p e u t s e s i tu e r q u e d a n s l a p a r t ie d r o i t e ; o n r é a l i s e
l'affectation :
d eb u t = m i li e u + 1
+ d a n s l e c a s c o n t r a ir e , l ' é l é m e n t c h e r c h é n e p e u t s e si tu e r q u e d a n s la p a r t ie g a u c h e ; o n r é a l i s e l ' a f f e c ta t io n :
f in = m i li e u - 1
Il nous reste à spécifier la condition d'arrêt (ou de poursuite) de cette répétition. On peut déjà noter que, à chaque
p a r c o u r s d e l a b o u c l e , s o i t la v a l e u r d e g a u c h e a u g m e n t e , so i t c e l le d e d r o i t e d i m i n u e . A i n s i, o n e s t s û r q u ' a u b o u t d ' u n
n o m b r e f i n i d e t o u r s o n a b o u t ir a à l ' u n e d e s si t u a t io n s s u i v a n t e s :

- l' é l é m e n t a é t é lo c a l i sé .
- la v a l e u r d e g a u c h e e s t su p é r i e u r e à c e l l e d e d r o i t e .
E l l e s n o u s f o u r n i s s e n t do n c t o u t n a t u r e ll e m e n t l a c o n d it io n d e f i n d e n o t r e b o u c l e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 173/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

I V . T r i s , f u si o n s e t r e c h e r c h e e n t a b l e 173

N o t e z q u e , d a n s u n p r e m i e r te m p s , l a v a le u r d e g a u c h e d e v i e n t é g a l e à c e l l e d e d r o i t e ; m a i s , d a n s c e c a s , n o u s n e
s a v o n s p a s en c o r e si l e s e u l é lé m e n t r e s ta n t à e x a m i n e r e s t o u n o n é g a l à x ; a u s s i e s t- il n é c e s s a ir e d e f a ir e u n t o u r
su p p l é m e n t a i re p o u r s ' e n a s s u r e r .

Programme

#include <stdio.h>
/* ------ structure contenant les informations relatives aux */
/* différents articles -------------- */
#define NBART 6 /* nombre total d'articles */

typedef struct { int code ; /* code article */


char * lib ; /* libellé */
float pu ; /* prix unitaire */
} t_article ;

t_article article [NBART] =


{ 11, "Gaufrier", 268.0,
14, "Cafetière 12 T", 235.0,
16, "Grille-pain", 199.50,
19, "Balance de ménage", 278.0,
25, "Centrifugeuse", 370.0,
26, "Four raclette 6P", 295.25
} ;

/* ----------------------------------------------------------------------*/

#define VRAI 1 /* pour "simuler" des ..... */


#define FAUX 0 /* ..... valeurs logiques */

main()
{ int coderec, /* code article recherché */
codecour, /* code courant */
gauche, /* limite gauche de la recherche */
droite, /* limite droite de la recherche */
milieu, /* nouvelle limite (droite ou gauche */
trouve ; /* indicateur code trouvé/non trouvé */

printf ("code article recherché : ") ;


scanf ("%d", &coderec) ;

gauche = 0 ;
droite = NBART-1 ;
trouve = FAUX ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 174/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

174 Exercices en langage C


while (gauche <= droite && !trouve)
{ milieu = (gauche+droite) / 2 ;
codecour = article[milieu].code ;
if ( codecour == coderec ) trouve = VRAI ;
else if ( codecour < coderec)
gauche = milieu + 1 ;
else droite = milieu - 1 ;
}

if (trouve) printf ("article de code %d\nlibellé : %s\nprix : %10.2f",


coderec, article[milieu].lib, article[milieu].pu) ;
else printf ("le code %d n'existe pas", coderec) ;
}

Commentaires

* N o t e z b i e n l a c o n d it io n r é g i s s a n t l a b o u c l e while :

gauche <= droite && !trouve

- D ' u n e p a r t, c o m m e n o u s l ' a v o n s d i t da n s n o t r e a n a l y se, n o u s p o u r s u i v o n s n o t re e x p l o r a t io n , m ê m e q u a n d le s


v a l e u r s d e g a u c h e e t d r o i t e so n t é g a l e s, d e m a n i è re à s a v o i r si l e s e u l é l é m e n t r e s ta n t à e x a m i n e r c o n v i e n t o u n o n .

s lnas ibnotuecr lvee. n irT ou un tei fnodii s,c a tdeaunr s l ocge i q cu ae s ,( t ri ol u av ue )r .a iNt ofau sl lua u pr ir oé nv os ipr u, ne no u sf i ne n dpea s bs oe ur ,c làe ,c o un nd itt ioe snt
d- eD ' paluatcr ee r p au rnt , bnroeuask y d af an iso
su p p l é m e n t a i re p e r m e t ta n t d e s a v o i r si l a r e c h e r c h e a v a i t é t é f ru c t u e u s e o u n o n .

DISCUSSION

I l f a u t p r e n d r e g a r d e , d a n s l e d é r o u l e m e n t d e l' a l g o r i th m e , à n e p a s s e c o n t e n te r d e p r e n d r e c o m m e n o u v e l l e b o r n e d e la
p a r t ie d e t a b l e a u à e x p l o r e r l a v a l e u r d e m i l i e u , e n é c r iv a n t :

d eb u t = m ili eu
ou :

f in = m i l i e u
E n e f fe t , da n s c e c a s , o n n e p e u t p l u s p r o u v e r q u e l a b o u c l e s ' a c h è v e e n u n n o m b r e f in i d e t o u r s. C e r t a in e s s it u a ti o n s
c o n d u i s e n t d' a i ll e u r s à u n e b o u c l e i n fi n ie .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 175/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V : G ES T IO N D Y N A M IQ U E

L e s d o n n é es d ' u n p r o g r a m m e s e r é p a r ti s se n t e n t ro i s c a t é g o r i e s : s t a ti q u e s , a u t o m a t iq u e s e t d y n a m i q u e s . L e s d o n n é es
s t a ti q u e s s o n t d é f in i e s d è s l a c o m p i la t io n ; l a g e s t i o n d e s d o n n é es a u t o m a t iq u e s r e s t e t r a n sp a r e n t e a u p r o g r a m m e u r e t
s e u l e s le s d o n n é e s d y n a m i q u e s s o n t v é r it a b le m e n t c r é é e s ( da n s l e t a s) su r so n i n i t ia t i v e .

D ' u n e m a n i è r e g é n é r a l e , l' u t i li sa t io n d e d o n n é es d y n a m i q u e s f o u r n it d e s s o l u t io n s à d e s p r o b l è m e s t e ls q u e :
- g e s ti o n d e d o n n é es d o n t l ' a m p l e u r n ' e s t p a s c o n n u e l o r s d e l a r é a li sa t io n d u p r o g r a m m e ,
- m i s e en o e u v r e d e s t r uc t u r e s d i t e s d y n a m i q u e s , t e ll e s q u e l e s l i st e s c h a î n é e s o u l e s a r b r es b i n a i re s .
C e c h a p i tr e v o u s e n p r o p o s e q u e l q u e s e x e m p l e s .

V - 1 C r ib le d y n a m iq u e

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e q u i d é t e r m i n e le s p r e m i e r s n o m b r e s p re m i e r s p a r la m é t h o d e d u c r i bl e d ' E r a t o s th è n e , e x p o s é e
d a n s l ' e x e r c ic e I - 2 .

C e t te f o is , p a r c o n tr e , le n o m b r e d ' e n t ie r s à c o n si d é r er n e s er a p a s f ix é p a r l e p r o g r a m m e , m a i s fo u r n i e n d o n n é e . L e
p r o g r a m m e a l lo u e r a d y n a m i q u e m e n t l' e m p l a c e m e n t m é m o ir e n é c e s sa i re a u d é r o u le m e n t d e l' a l g o r it h m e . E n c a s d e
m é m o i r e in s u f fi sa n t e , i l d e m a n d e r a à l ' u t i li s a te u r d e f o r m u l e r u n e d e m a n d e m o i n s i m p o r t a n t e .

O n s ' a s t r e in d r a i c i à u t i l i se r l a f o n c t i o n m a l lo c .

Exemple

combien d'entiers voulez-vous examiner : 200

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 176/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

176 Exercices en langage C


entre 1 et 200 les nombres premiers sont :
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199

________________________________________________________________________________________

ANALYSE

L ' a l g o r i th m e l u i- m ê m e a d é j à é t é e x p o s é d a n s l ' e x e r c i c e I -2 . L a n o u v e a u t é r é s i d e i c i d a n s l' a l l o c a t io n d y n a m i q u e d e


l ' e s p a c e i m p a r t i a u t a b l e a u d ' e n t i e rs . P o u r c e f a ir e , l a d é m a r c h e l a p l u s c l a s si q u e c o n s i st e à f a i r e a p p e l à l a f o n c t io n
m a l l o c , c o m m e n o u s l e p r é c o n i se l ' é n o n c é .

Programme

#include <stdio.h>
#include <stdlib.h>
#define VRAI 1 /* pour simuler des ...*/
#define FAUX 0 /* ... valeurs "logiques" */

main()
{
unsigned n, /* nombre d'entiers à considérer */
* raye, /* pointeur sur tableau servant de crible */
prem, /* dernier nombre premier considéré */
i ;
int na ; /* compteur de nombres premiers affichés */

/* lecture du nombre d'entiers à considérer et


allocation dynamique du tableau correspondant */
do
{ printf ("combien d'entiers voulez-vous examiner : ") ;
scanf ("%u", &n) ;
raye = (unsigned *) malloc ( (n+1)*sizeof(unsigned) ) ;
if (raye == NULL)
printf ("** mémoire insuffisante ") ;
}
while (raye == NULL) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 177/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 177

/* initialisations du crible */
for (i=1 ; i<=n ; i++) /* mise à "zéro" du crible */
raye[i] = FAUX ;
raye[1] = VRAI ; /* on raye le nombre 1 */

/* passage au crible */
prem = 1 ;
while (prem*prem <= n)
{ while (raye[++prem] && prem<n ) {}
/* recherche premier nb prem non rayé */
for (i=2*prem ; i<=n ; i+=prem) /* on raye tous ses multiples */
raye[i] = VRAI ;
}

/* affichage résultats */
printf ("entre 1 et %u les nombres premiers sont :\n", n) ;
na = 0 ;
for (i=1 ; i<=n ; i++)
if ( !raye[i] )
{ printf ("%7u", i) ;
if (++na%10 == 0) printf ("\n") ; /* 10 nombres par ligne */
}
}

Commentaires

* L ' a l l o c a t io n d e l ' e s p a c e m é m o i r e n é c e s s a ir e a u t a b l e a u d ' e n t i e rs e s t ré a l i s ée p a r l ' i n s t ru c t i o n :

raye = (unsigned *) malloc ( (n+1)*sizeof(unsigned) ) ;

d a n s l a q u e l l e r a y e e s t u n p o i n te u r s u r d e s en t i e r s n o n si g n é s .

O r , l e p r o to t y p e d e m a l l o c e s t p r é c is é m e n t :

void * malloc (size_t) ;

L e r é s u l t a t fo u r n i p a r m a l l o c e s t u n " p o i n t e u r g é n é r i q u e " q u i p e u t ê t re c o n v e r t i im p l ic i t e m e n t e n u n p o i n t e u r d e n ' i m p o r t e


q u e l t y p e . A u s s i , l ' o p é r a t e u r d e " c a s t " ( u n s i g n e d * ) n ' e s t p a s i n d i sp e n s a b l e i c i . N o t r e i n s tr u c t io n d ' a l l o c a t io n m é m o i r e
a u r a i t p u s ' é c r ir e :

raye = malloc ( (n+1) * sizeof(unsigned) ) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 178/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

178 Exercices en langage C

E n c e q u i c o n c e r n e l ' a r g u m e n t d e malloc , celui-ci est a p riori d' un type size_t défini (par typedef) d a n s stdlib.h . L e t y p e
e x a c t c o r r e s p o n d a n t d é p e n d d e l ' i m p l é m e n t a t io n ( m a i s i l e s t t o u j o u r s n o n s i g n é - e n g é n é r a l , i l s ' a g i t d e u n s i g n e d i n t ) .
N o t e z q u e l e r é s u lt a t fo u r n i p a r s i z e o f e s t d u m ê m e ty p e s i z e _ t .

R a p p e lo n s q u e m a l l o c f o u r n it e n r é s u l ta t u n p o i n te u r s u r l e d é b u t d e l a z o n e c o n c e r n é e l o r s q u e l ' a l lo c a t io n a r é u s s i e t u n
p o i n t e u r n u l da n s l e c a s c o n t r a i re ( n o t e z q u e l e sy m b o l e N U L L e s t d é fi n i d a n s s t d l i b . h ) .

* E n c e q u i c o n c e r n e l ' a l g o r it h m e d e p a s s a g e a u c r i bl e , v o u s r e m a r q u e z q u e n o u s a v o n s e m p l o y é e x a c te m e n t le s m ê m e s
i n s tr u c t io n s q u e d a n s l e p r o g r a m m e d e l ' e x e r c i c e I - 2 . P o u r t a n t , d a n s c e d e r n i e r , le s y m b o l e r a y e d é s i g n a i t u n t a b l e a u
d ' e n t ie r s , ta n d i s q u ' i c i il d ési g n e u n p o i n t e u r s u r d e s e n t ie r s . C e l a e s t p o ss i b l e p a r c e q u ' e n l a n g a g e C , u n n o m d e t a b l e a u
est un pointeur (constan t).

DISCUSSION

* L e c h o i x d u t yp e u n s i g n e d p o u r n e s t q u e l q u e p e u a r b i tr a i r e ; il e s t g u i d é p a r l e f a i t q u e m a l l o c a d m e t g é n é ra l e m e n t u n
a r g u m e n t d e c e t y p e . E n s u p p o s a n t q u e t e l e s t l e c a s , o n c o n s t a t e q u ' a l o r s l' e x p r e s s i o n :

(n+1) * sizeof (unsigned)

c o n d u i t à d e s v a l e u r s e rr o n é e s d è s q u e l a v a l e u r d e n * s i z e o f ( i n t ) d é p a s s e l a c a p a c i té d u t y p e in t ( n ' o u b li e z p a s q u ' i l n ' y a


p a s d e d é t e c t io n d e d é p a s s e m e n t d e c a p a c i té p o u r l e s o p é r a t io n s p o r t a n t s u r d e s en t i e r s ). L e r é s u l t a t p e u t a l o r s ê t r e
c a t a s tr o p h i q u e c a r le n o m b r e d ' o c t e ts d e m a n d é s à m a l l o c s e t r o u v e ê t r e i n f é r i e u r à c e l u i r é e l l e m e n t u t i l i sé .

L e p r o b l è m e s e c o m p l iq u e e n c o r e u n p e u s i l' o n t i e n t c o m p t e d e c e q u e , d a n s c e r ta i n e s im p l é m e n t a t io n s , l e ty p e s i z e _ t
p e u c o r r e s p o n d r e à a u t r e c h o s e q u e u n s i g n e d i n t.

E n t o u t e ri g u e u r , i l f a u d r a i t d o n c s ' a s s u r e r q u e l e n o m b r e d e v a l e u r s d e m a n d é e s p a r l ' u t il i sa t e u r e s t e ff e c ti v e m e n t
i n f é r ie u r à u n e c e r ta i n e l im i te à f ix e r e n f o n c t io n d e l ' i m p l é m e n t a t io n c o n c e r n é e .

V -2 C r é a t io n d y n a m iq u e d e c h a în e s

L o r s q u ' u n p r o g r a m m e d o i t tr a i te r u n g r a n d n o m b r e d e c h a î n e s d e l o n g u e u r v a r i a b l e e t q u e c e n o m b r e n ' e s t p a s c o n n u a
p r i o r i, i l p e u t s ' a v é r e r i n té r e s s a n t d e f a i re a l lo u e r d y n a m i q u e m e n t (p a r l e p r o g r a m m e ) l ' e s p a c e m é m o i r e n é c e s s a ir e a u
s t oc k a g e d e s c h a î n e s . C ' e s t c e q u e v o u s p r o p o se c et e x e r c ic e q u i p e u t ê t re c o n s i d ér é c o m m e p r é a l a b l e à u n tr a i te m e n t
u l té r i e u r d e c e s c h a în e s ( p a r e x e m p l e u n t ri c o m m e v o u s l e p r o p o s e r a l' e x e r c ic e V - 3 ) .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 179/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 179

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i li t u n n o m b r e q u e l c o n q u e d e c h a î n e s a u c la v i e r e t q u i le s r a n g e e n m é m o i r e d a n s d e s
e m p l a c e m e n t s a l lo u é s d y n a m i q u e m e n t a u fu r e t à m e s u r e d e s b e so i n s . L e s a d r e s s e s d e c h a c u n e d e s c h a î n e s s e r o n t
c o n s e r v é e s d a n s u n t a b l e a u d e p o i n t e u r s . C e d e r n i e r s e r a r é s e rv é d a n s l e p r o g r a m m e ( e n c l a s s e a u t o m a t iq u e ) e t s a t a il le
( fi x e ) im p o s e r a d o n c u n e v a l e u r m a x i m a l e a u n o m b r e d e c h a î n e s q u ' i l s e r a a i n si p o s si b l e d e t ra i te r .

L ' u t il i sa t e u r si g n a l e r a q u ' i l a f o u r n i s a d e r n i è r e c h a î n e e n l a f a i s a n t su i v r e d ' u n e c h a î n e " v i d e " .

L e p r o g r a m m e a f f ic h e r a e n su i t e l e s c h a î n e s lu e s , à t i tr e d e s i m p l e c o n t r ô le .

R e m a r q u e : o n u t i li se r a l a f o n c t i o n m a l l o c e t o n su p p o ser a q u e l e s l ig n e s l u e s a u c l a v i e r n e p e u v e n t ja m a i s d é p a s s e r 1 2 7
caractères.

Exemple

----- chaîne numéro 1 (return pour finir)


C
----- chaîne numéro 2 (return pour finir)
Turbo C

----- chaîne numéro 3 (return pour finir)


Basic
----- chaîne numéro 4 (return pour finir)
Pascal
----- chaîne numéro 5 (return pour finir)
Turbo Pascal
----- chaîne numéro 6 (return pour finir)

fin création

liste des chaînes créées

------- chaîne numéro 1


C
------- chaîne numéro 2
Turbo C
------- chaîne numéro 3

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 180/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

180 Exercices en langage C


Basic
------- chaîne numéro 4
Pascal
------- chaîne numéro 5
Turbo Pascal

________________________________________________________________________________________

ANALYSE

L ' é n o n c é n o u s i m p o s e d o n c d e d é fi n ir , a u s e i n d u p r o g r a m m e , u n t a b l e a u d e p o i n t e u r s d e s ti n é à c o n t e n ir l e s a dr e s s e s d e s

chaînes à créer.
C h a q u e c h a î n e s e r a d ' a b o r d lu e d a n s u n e z o n e i n t e r m é d i a i r e (n o n d y n a m i q u e ) . O n l u i a l l o u e r a e n su i t e , d y n a m i q u e m e n t , à
l ' a i d e d e l a f o n c t i o n m a l l o c , u n e m p l a c e m e n t d o n t la t a il le c o r r e s p o n d e x a c t e m e n t à s a lo n g u e u r ; l' a d r e s s e a i n si o b t e n u e
s e r a m é m o r i sé e d a n s l e t a b le a u d e p o i n t e u r s.

L e t r a i te m e n t s e r a in t e r r o m p u :

- so i t q u a n d l e t a b l e a u d e p o i n t e u r s e s t p l e i n ,
- so i t q u a n d l ' u t i l i sa t e u r f o u r n i t u n e c h a î n e v i d e .
D e p l u s , à c h a q u e a l l o c a t io n r é a l i s ée p a r m a l l o c , o n s ' a s s u r e r a q u e l' e s p a c e m é m o i r e n é c e s sa i r e a p u ê tr e o b t e n u . D a n s l e
c a s c o n t r a ir e , o n p r é v o i r a d' i n t e r r o m p r e l e p r o g r a m m e .

Programme

#include <stdio.h>
#include <stdlib.h> /* pour la fonction exit */
#include <string.h>
#define NCHMAX 1000 /* nombre maximal de chaînes */
#define LGLIGNE 127 /* longueur maximale d'une ligne d'écran */

main()
{
char ligne [LGLIGNE+1], /* chaîne servant à lire une ligne écran */
* adr [NCHMAX], /* tableau de pointeurs sur les chaînes */
* ptr ; /* pointeur courant sur une chaîne */
int nch, /* compteur du nombre de chaînes */
i ;

/* mise à zéro du tableau de pointeurs */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 181/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 181

for (i=0 ; i<NCHMAX ; i++)


adr[i] = NULL ;

/* boucle de création dynamique des chaînes */


nch=0 ;
while (nch < NCHMAX) /* tant que nb max chaînes non atteint */
{ printf ("----- chaîne numéro %d (return pour finir)\n", nch+1) ;
gets (ligne) ;

if ( strlen(ligne) )
{ if ( (ptr = malloc (strlen(ligne)+1)) != NULL)
strcpy (adr[nch++]=ptr, ligne) ;
else
{ printf ("\n\n*** erreur allocation dynamique") ;
exit(-1) ; /* arrêt si erreur alloc dynam */
}
}
else break ; /* sortie boucle si réponse vide */
}
printf ("\nfin création\n") ;

/* liste des chaînes ainsi créées */


printf ("\n\nliste des chaînes crées\n\n") ;
i = 0 ;
for (i=0 ; i<nch ; i++)
printf ("------- chaîne numéro %d\n%s\n", i+1, adr[i]) ;
}

Commentaires

* I c i , c o m p t e t e n u d e c e q u e n o u s p r é c i sa i t l ' é n o n c é , n o u s a v o n s c h o i si d e l ir e n o s c h a î n e s d a n s u n t a b le a u d e 1 2 8
c a r a c t è r e s , à l ' a i de d e l a f o n c t io n g e t s .

* N o u s a v o n s r e m i s à " z é r o " l e t a b l e a u d e p o i n t e u r s su r n o s c h a î n e s . I l s' a g i t l à d ' u n e o p é r a t i o n su p er f l u e m a i s q u i p e u t


s ' a v é r e r u ti le p e n d a n t la p h a s e d e m i s e a u p o i n t du p r o g r a m m e . N o t e z l' u s a g e d u s y m b o l e N U L L ; p r é d é f in i d a n s l e
fichier stdlib.h , il corresp on d à la constante pointeur nulle.

* L a c r é a t io n d e s c h a î n e s e s t ré a l i s ée p a r u n e b o u c l e t a n t q u e ( i n s t r u c t i o n w h i l e ) , d a n s l a q u e l l e n o u s a v o n s p r é v u d e u x
autres sorties :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 182/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

182 Exercices en langage C


- u n e s o r t i e p a r b r e a k , d a n s l e c a s o ù l ' u t il i sa t e u r a f o u r n i u n e c h a î n e v i d e ,
- u n a r r ê t e x c e p t i o n n e l du p r o g r a m m e p a r e x i t , d a n s l e c a s o ù l ' a l lo c a t i o n d y n a m i q u e a é c h o u é . C e t te f o n c t io n ( d o n t
l e p r o t o t y p e f i g u r e d a n s s t d l i b . h ) r e q u i e r t u n a r g u m e n t ; s a v a l e u r e s t t r a n s m i s e a u s y s t è m e e t e l le p o u r r a i t
é v e n t u e l le m e n t ê tr e r é c u p é r é e p a r d ' a u t r e s p r o g ra m m e s . N o t e z q u e , e n l ' a b s e n c e d e l ' i n s tr u c t io n # i n c l u d e r e l a t i v e à
s t d l i b . h , l e c o m p i la t e u r a c c e p t e u n a p p e l d e e x i t s a n s a r g u m e n t ( il e s t in c a p a b l e d e d é te c t e r l ' e r r e u r - l a q u e l le n ' a
d ' a i l le u r s a u c u n e in c i de n c e s u r l' e x é c u t i o n du p r o g r a m m e lu i -m ê m e ) .
N a t u r e l le m e n t , b e a u c o u p d ' a u t r e s fo r m u l a ti o n s s e r a ie n t p o s si b l e s .

DISCUSSION

* L e f a i t d e r é s e r v e r le t a b le a u d a n s l e p r o g r a m m e ( e n c la s s e a u t o m a t iq u e ) i m p o s e u n e l im i te a u n o m b r e d e c h a î n e s q u ' i l
e s t a i n si p o s si b l e d e t r a i te r ; c e t t e l im i te e s t i n d é p e n d a n t e d e l a m é m o i r e r é e l le m e n t d i sp o n i b l e . O n p e u t a m é l io r e r
q u e l q u e p e u l a s i tu a t io n e n f a is a n t é g a l e m e n t a l lo u e r d y n a m i q u e m e n t l' e sp a c e n é c es s a ir e à ce t a b l e a u d e p o i n te u r s . I l
f a u t t o u t e fo i s e n c o n n a î tr e l a ta i ll e (o u d u m o i n s u n e v a l e u r m a x i m a l e ) lo r s d e l ' e x é c u t io n d u p r o g r a m m e . C e l a p e u t f a ir e
l ' o b j e t d' u n e d o n n é e f o u r n i e p a r l' u t i li s a te u r c o m m e d a n s l ' e x e r c i c e s u i v a n t .

V - 3 T r i d y n a m iq u e d e c h a în e s
________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e p e r m e t ta n t d e t r ie r p a r o r dr e a l p h a b é t iq u e d e s c h a î n e s f o u r n ie s e n d o n n é e . C o m m e d a n s l ' e x e r c i c e
p r é c é d e n t, o n a l l o u e r a d y n a m i q u e m e n t d e s e m p l a c e m e n t s m é m o ir e a u x c h a î n e s , a u f u r e t à m e s u r e d e l e u r le c t u r e , e t
l e u r s a d r e s s e s s e r o n t c o n s e r v é e s d a n s u n t a b l e a u d e p o i n t e u r s. P a r c o n tr e , i c i , c e d e r n i e r v e r r a , l u i a u s si , so n
e m p l a c e m e n t a ll o u é d y n a m i q u e m e n t e n d éb u t d e p r o g r a m m e ; p o u r c e f a ir e , o n d e m a n d e r a à l ' u t il i sa t e u r d e fo u r n i r u n e
v a l e u r m a x i m a l e d u n o m b r e d e c h a î n e s q u ' il s e r a a m e n é à f o u r n ir .

O n u t i li ser a l ' a l g o r it h m e d e " t r i p a r e x t r a c t io n s i m p l e " e x p o s é d a n s l ' e x e r c i c e V - 1 e t o n f e r a a p p e l à l a f o n c t io n m a l l o c .

Exemple

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 183/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 183

nombre maximal de chaînes ? 100


------- chaîne numéro 1 (return pour finir)
C
------- chaîne numéro 2 (return pour finir)
Turbo C
------- chaîne numéro 3 (return pour finir)
Basic
------- chaîne numéro 4 (return pour finir)
Pascal
------- chaîne numéro 5 (return pour finir)
Turbo Pascal
------- chaîne numéro 6 (return pour finir)
Fortran
------- chaîne numéro 7 (return pour finir)
ADA
------- chaîne numéro 8 (return pour finir)

fin création

liste triée des chaînes crées

ADA
Basic
C
Fortran
Pascal
Turbo C
Turbo Pascal

________________________________________________________________________________________

ANALYSE

I l n o u s s u ff it e n f a it d ' a d a p t e r le p r o g r a m m e d e l ' e x e r c ic e p r é c é d e n t , e n l u i a d jo i g n a n t :
- la r é s e r v a t io n d y n a m i q u e d u t a b l e a u d e p o i n t e u r s,
- l e tr i d u t a b l e a u d e c h a î n e s a i n si c r é é , p a r r é o r g a n i s a t io n d e s p o i n t e u r s. N o u s u t i li ser o n s p o u r c el a l ' a l g o r it h m e d e t r i
p a r e x t r a c ti o n si m p l e C e l u i- c i a é t é e x p o s é d a n s l' é n o n c é d e l ' e x e r c i c e V - 1 e t so n a d a p t a t io n a u t r i d e c h a î n e s a é t é
e x p l i q u é e d a n s l' a n a l y s e d e l' e x e r c ic e V - 2 .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 184/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

184 Exercices en langage C

Programme

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LGLIGNE 127 /* longueur maximale d'une ligne d'écran */
main()
{
char ligne [LGLIGNE+1], /* chaîne servant à lire une ligne écran */
* * adr, /* adresse tableau pointeurs sur les chaînes */

* ptr, /* pointeur courant sur une chaîne */


* tempo ; /* pointeur temporaire pour éch. 2 pointeurs */
unsigned nchmax, /* nombre maximal de chaînes */
nch, /* compteur du nombre de chaînes */
i, j, kmax ;

/* création et mise à zéro du tableau de pointeurs */


printf ("nombre maximum de chaînes ? ") ;
scanf ("%d", &nchmax) ;
getchar() ; /* pour sauter la validation */
if ( (adr = malloc (nchmax*sizeof(char*)) ) == NULL)
{ printf ("\n\n*** erreur allocation dynamique") ;
exit(-1) ; /* arrêt si erreur alloc dynam */
}
for (i=0 ; i<nchmax ; i++)
adr[i] = NULL ;

/* boucle de création dynamique des chaînes */


nch = 0 ;
while (nch < nchmax) /* tant que nb max de chaînes non atteint */
{ printf ("------- chaîne numéro %d (return pour finir)\n", nch+1) ;
gets (ligne) ;
if ( strlen(ligne) )
{ if ( ( ptr = malloc (strlen(ligne)+1)) != NULL)
strcpy (adr[nch++]=ptr, ligne) ;
else
{ printf ("\n\n*** erreur allocation dynamique") ;
exit(-1) ; /* arrêt si erreur alloc dynam */
}
}
else break ; /* sortie boucle si réponse vide */
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 185/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 185

printf ("\nfin création\n") ;

/* tri des chaînes par réarrangement des pointeurs */


for (i=0 ; i<nch-1 ; i++)
{ kmax = i ;
for (j=i+1 ; j<nch ; j++)
if ( stricmp (adr[kmax], adr[j]) > 0 ) kmax = j ;
tempo = adr[kmax] ;
adr[kmax] = adr[i] ;
adr[i] = tempo ;
}

/* liste triées des chaînes ainsi créées */


printf ("\n\nliste triée des chaînes crées\n\n") ;
for (i=0 ; i<nch ; i++)
puts ( adr[i] ) ;
}

Commentaires

* D a n s le p r o g ra m m e d e l ' e x e r c ic e V - 2 , le sy m b o l e a d r d é si g n a i t u n t a b l e a u d e p o i n t e u r s . I c i, c e m ê m e sy m b o l e d é si g n e
u n p o i n t e u r s u r u n t a b l e a u d e p o i n t e u r s. O r , m a l g r é c e t te d i f f é r e n c e a p p a r e n t e , v o u s c o n s t a te z q u e n o u s e m p l o y o n s

toujours la notation :
adr[i]
a v e c l a m ê m e s i g n if ic a t i o n d a n s l e s d e u x c a s .

E n f a it , d a n s le p r é c é d e n t p r o g r a m m e , a d r é t a i t u n e c o n s t a n t e p o i n t e u r d o n t la v a l e u r é t a i t c e l l e d e l ' a d r e s se d e d é b u t d u
t a b l e a u d e p o i n t e u r s . D a n s l e p r é s e n t p r o g r a m m e , a d r e s t u n e v a r i a b l e p o i n t e u r d o n t l a v a l e u r e s t é g a le m e n t c e l le d e
d é b u t d u t a b l e a u d e p o i n t e u r s. A i n si , d a n s le s d e u x c a s :

adr[i]
est équivalent à :

* (a d r + i)
N o t e z c e p e n d a n t q u e l ' é q u i v a l e n c e e n t r e le s d e u x p r o g r a m m e s n ' e s t p a s to t a le . E n e f fe t , d a n s le p r e m i e r c a s , a d r n ' e s t
p a s u n e l v a l u e ( m o t a n g l a i s d o n t u n e t r a d u c t io n a p p r o c h é e p o u r r a i t ê t r e : v a l e u r à g a u c h e ) ; p a r e x e m p l e , l ' e x p r e s s i o n
adr++ s e r a it in c o r r e c t e . D a n s l e s e c o n d c a s , p a r c o n t r e , a d r e s t b i e n u n e l v a l u e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 186/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

186 Exercices en langage C


* N o u s n ' a v o n s p r i s a u c u n e p r é c a u t io n p a r t ic u l i è r e e n c e q u i c o n c e r n e l e s le c t u r e s a u c l a v i e r q u i s o n t r é a l i s é es i c i p a r
g e t s e t s c a n f . I n d é p e n d a m m e n t d e s a n o m a l ie s h a b i t u e ll e s e n c o u r u e s e n c a s d e d o n n é es i n c o r r e c t e s (c h a î n e t r o p l o n g u e
p o u r g e t s , d o n n é e n o n n u m é r iq u e p o u r s c a n f ) , u n p r o b l è m e s u p p l é m e n t a i re a p p a r a î t , li é a u f a i t q u ' a p r è s u n e le c t u r e p a r
s c a n f , l e p o i n t e u r r e s t e p o s i t i o n n é s u r l e d e r n i e r c a r a c t è r e n o n e n c o r e u t i l i sé , à s a v o i r ic i l e \ n ( d u m o i n s s i l ' u t i l i sa t e u r a
v a l i d é n o r m a l e m e n t , s a n s f o u r n i r d ' i n f o r m a t io n s s u p p l é m e n t a i re s ) . S i la l e c t u r e s u iv a n t e e s t , à s o n t o u r , e f fe c t u é e p a r
s c a n f , a u c u n p r o b lè m e p a r t ic u l i e r n e s e p o s e , l e c a r a c tè r e \ n é t a n t si m p l e m e n t ig n o r é . I l n ' e n v a p l u s d e m ê m e l o r s q u e la
l e c t u r e s u i v a n t e e s t e f f e c t u é e p a r g e t s ; d a n s c e c a s , e n e f f e t, c e c a r a c t è r e e s t i n te r p r é t é c o m m e u n c a r a c t è r e d e " f i n " e t
g e t s f o u r n i t. . . u n e c h a î n e v i d e . C ' e st p o u r é v i te r c e p h é n o m è n e q u e n o u s a v o n s d û i n t r o d u i r e u n e i n s tr u c t io n g e t c h a r p o u r
absorber le \n.

DISCUSSION

P o u r p o u v o i r a l l o u e r c o n v e n a b l e m e n t l' e m p l a c e m e n t d u ta b l e a u d e p o i n te u r s , n o t r e p r o g r a m m e a b e so i n q u e l ' u t i li sa t e u r
l u i f o u r n i ss e u n e v a l e u r m a x i m a l e d u n o m b r e d e c h a î n e s . S i n o u s s o u h a i ti o n s q u ' i l e n s o i t a u tr e m e n t , i l se r a i t n é c e s s a i r e
d e p o u v o i r a l lo u e r p r o v i so i r e m e n t u n e m p l a c e m e n t à c e ta b l e a u , q u i t te à l ' é t e n d r e e n su i t e a u f u r e t à m e s u r e d e s b e s o i n s
à l ' a i de d e l a f o n c t io n r e a l l o c . U n e t e l le e x t e n si o n p o u r r a i t ê t r e r é a li s ée , s o i t à c h a q u e n o u v e l l e c h a î n e e n t r é e , s o i t p a r
b l o c s d e ta i l le f ix e ( p a r e x e m p l e t o u t e s l e s 1 0 0 c h a î n e s ) .

V - 4 C r é a t io n d ' u n e lis t e c h a în é e
O n a p p e l le l i st e c h a î n é e o u l i st e li é e u n e s u i te o r d o n n é e d ' é l é m e n t s d a n s l a q u e l le c h a q u e é l é m e n t , s a u f l e d e r n i e r ,
c o m p o r t e u n p o i n te u r su r l ' é l é m e n t su i v a n t .

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g ra m m e q u i c r é e u n e l i st e c h a î n é e d ' é l é m e n t s c o m p o r t a n t c h a c u n :

- u n n o m ( c h a î n e ) d ' a u m a x i m u m 1 0 c a ra c t è re s ,
- un âge.
L e s i n fo r m a t io n s c o r r e s p o n d a n t e s s e ro n t l u e s a u c l a v ie r e t l ' u t il i sa t e u r f ra p p e r a u n n o m " v i d e " a p r è s l e s d o n n é es r e l a ti v e s
a u d e r n i e r é lé m e n t .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 187/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 187

L e p r o g r a m m e a f f ic h e r a e n su i t e l e s in f o r m a t io n s c o n t e n u e s d a n s l a l i st e a i n si c r é é e , d a n s l ' o r d r e i n v e r s e d e c e l u i d a n s
lequel elles auront été fourn ies.

O n p r é v o i r a d e u x f o n c t io n s : l ' u n e p o u r l a c r é a t io n , l ' a u t r e p o u r l a l i st e . E l l e s p o s sé d e r o n t c o m m e u n i q u e a r g u m e n t
l ' a d r e s se d e d é b u t d e l a l i st e ( p o in t e u r su r l e p r e m i e r é lé m e n t ) .

Exemple

om : Laurence
age : 19
nom : Yvette
age : 35
nom : Catherine
age : 20
nom : Sebastien
age : 21
nom :

NOM AGE

Sebastien 21
Catherine 20

Yvette 35
Laurence 19

________________________________________________________________________________________

ANALYSE

C h a q u e é l é m e n t d e n o t r e l i st e s e r a r e p r é s e n té p a r u n e s t r uc t u r e . N o u s v o y o n s q u e c e l l e -c i d o i t c o n t e n i r u n p o i n t e u r su r u n
é l é m e n t d e m ê m e t y p e . C e l a f a it in t e r v e n i r u n e c e r ta i n e " r é c u r s i v it é " d a n s l a d é c l a r a ti o n c o r r e s p o n d a n t e , c e q u i e s t
a c c e p té e n C .

E n c e q u i c o n c e r n e l ' a l g o r it h m e d e c r é a t i o n d e l a l i st e , d e u x p o ssi b i li té s s ' o f f r e n t à n o u s :


- A j o u t e r c h a q u e n o u v e l é l é m e n t à l a f in d e l a l i st e . L e p a r c o u r s u l té r i e u r d e l a l i st e s e f e r a a l o r s d a n s l e m ê m e o r d r e
q u e c e l u i d a n s l e q u e l l es d o n n é es c o r r e s p o n d a n t e s o n t é t é i n t r o d u i te s .
- A j o u t e r c h a q u e n o u v e l é l é m e n t e n d é b u t d e l i st e . L e p a r c o u r s u l t é r ie u r d e l a l i st e s e f e r a a l o r s d a n s l ' o r d r e i n v e r s e
d e c e l u i da n s l e q u e l l es d o n n é es c o r r e s p o n d a n t e s o n t é t é i n t r o d u i te s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 188/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

188 Exercices en langage C


C o m p t e te n u d e c e q u e l ' é n o n c é n o u s d e m a n d e d ' a f fic h e r l a l i st e à l ' e n v e r s , a p r è s s a c r é a t io n , i l p a r a ît p l u s a p p o r tu n d e
c h o i si r l a se c o n d e m é t h o d e .

C o m m e d e m a n d é , l a c r é a ti o n d e la l i st e s e ra r é a l i s ée p a r u n e f o n c t io n . L e p r o g r a m m e p r i n c ip a l s e c o n t e n t e r a d e r é s e rv e r
u n p o i n t e u r ( n o m m é d e b u t ) d e s t in é à d é si g n e r l e p r e m i e r é l é m e n t d e l a l i st e . S a v a l e u r e f f e c t iv e s e r a f o u r n i e p a r l a
f o n c t io n d e c r é a t i o n .

L ' a l g o r i th m e d e c r é a t i o n , q u a n t à l u i, c o n s i s te r a à r é p é t e r l e t r a it e m e n t d ' i n s er t i o n d ' u n n o u v e l é l é m e n t e n d é b u t d e l i st e ,


à savoir :

- c r é e r dy n a m i q u e m e n t u n e m p l a c e m e n t p o u r u n n o u v e l é l é m e n t e t y r a n g e r l e s in f o r m a t io n s f o u r n i e s a u c l a v i e r ,
- a ff e c te r a u p o i n t e u r c o n t e n u d a n s c e n o u v e l é l é m e n t l' a n c i e n n e v a l e u r d e d e b u t ,

- a f f e c t e r à d e b u t l ' a d r e s s e d e c e n o u v e l é lé m e n t .
N o u s c o n v i e n d r o n s, d e p l u s , q u e l e d e r n i e r é lé m e n t d e l a l i st e p o s s è d e u n p o i n t e u r n u l , c e q u i n o u s f a c i li te r a
l ' i n i t ia l i s a t io n d e l ' a l g o r i t h m e ; e n e f f e t , c e l le - c i s e ra m è n e a l o r s à l' a f f e c t a t io n à d e b u t d ' u n e v a l e u r n u l le .

Programme

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LGNOM 20 /* longueur maximale d'un nom */

typedef struct element /* définition du type élément */


{ char nom [LGNOM+1] ; /* nom */
int age ; /* age */
struct element * suivant ; /* pointeur element suivant */
} t_element ;

main()
{
void creation (t_element * *) ; /* fonction de création de la liste */

void liste (t_element *) ; /* fonction de liste de la liste */

t_element * debut ; /* pointeur sur le début de la liste */

creation (&debut) ;
liste (debut) ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 189/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V . G e s ti o n dy n a m i q u e 189

/****************************************************/
/* fonction de création d'une liste chaînée */
/****************************************************/
void creation (t_element * * adeb)
{
char nomlu [LGNOM+1] ; /* pour lire un nom au clavier */
t_element * courant ; /* pour l'échange de valeurs de pointeurs */

* adeb = NULL ; /* liste vide au départ */

while (1) /* boucle de création apparemment infinie ... */


{ /* ... mais, en fait, interrompue sur "nom vide" */
printf ("nom : ") ;
gets (nomlu) ;
if (strlen(nomlu))
{ courant = (t_element *) malloc (sizeof(t_element)) ;
strcpy (courant->nom, nomlu) ;
printf ("age : ") ;
scanf ("%d", &courant->age) ;
getchar() ; /* pour sauter le \n */
courant->suivant = * adeb ;
* adeb = courant ;
}
else break ; /* sortie boucle si nom vide */
}
}

/******************************************************/
/* fonction de liste d'une liste chaînée */
/******************************************************/
void liste (t_element * debut)
{

printf ("\n\n NOM AGE\n\n") ;


while (debut)
{ printf ("%15s %3d\n", debut->nom, debut->age) ;
debut = debut->suivant ;
}
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 190/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

190 Exercices en langage C

Commentaires

* N o u s a v o n s i c i c h o i s i d e d é c l a r e r n o t re s t r u c tu r e à u n n i v e a u g l o b a l e t d e f a i r e a p p e l à t y p e d e f . C e t te d é c l a r a t io n à u n
n i v e a u g l o b a l é v i te d e d e v o i r d é c r ir e l a m ê m e s t r uc t u r e e n d i f fé r e n t s e n d r o i ts , c e q u i s e r a i t, n o n s e u l e m e n t l a b o r i e u x
m a i s , d e su r c r o î t , so u r c e d ' e r r e u r s . P a r c o n tr e , l e r e c o u r s à t y p e d e f n ' a p p o r t e q u ' u n e s i m p l if ic a t i o n d e s d é c l a r a t io n s d e s
é l é m e n t s d e c e t y p e ( d a n s l e c a s c o n t r a i r e , i l su f f ir a i t d e r e m p l a c e r t _ e l e m e n t p a r s t ru c t e l e m e n t ) .

N o t e z b i e n , p a r c o n t r e , q u ' i l n ' e s t p a s p o s si b l e d e r e m p l a c e r , a u s e i n d e l a d é f in i ti o n d e n o t r e s tr u c t u r e , l ' é c r i tu r e :

struct element * suivant

par :

t_element * suivant

* L a f o n c t i o n d e c r é a t io n r e ç o i t e n a r g u m e n t l ' a d r e s s e d u p o i n t e u r d e b u t , c a r e l l e d o i t p o u v o i r l u i a t t r i b u e r u n e v a l e u r .
L a f o n c t i o n d e l i s t e , q u a n t à e l l e , s e c o n t e n t e d e l a v a l e u r d e c e m ê m e p o i n t e u r . C e t te d i ff é r e n c e s e r é p e r c u te
n a t u r e l le m e n t su r l a m a n i è r e d ' u t i li se r c e t a r g u m e n t d a n s c h a c u n e d e s d e u x f o n c t io n s .

N o t e z d ' a i ll e u r s q u e n o u s a v o n s p u n o u s p e r m e t tr e , d a n s l a f o n c t io n d e l i st e , d e m o d i f ie r l a v a l e u r a i n si r e ç u e ( l e p o i n te u r
d e b u t y d é c r i t su c c e s s i v e m e n t l es d i f f é r e n t s é l é m e n t s d e l a l i st e ) .

* L à e n c o r e , l e s l e c t u r e s a u c l a v i e r o n t é t é r é a l i s ée s p a r s c a n f e t g e t s , d o n c s a n s p r o t e c ti o n s p a r t ic u l i è re s . C o m m e n o u s
l ' a v o n s d é j à si g n a l é d a n s l e p r é c é d e n t e x e r c i c e , l ' u t i li s a ti o n c o n j o i n t e d e c e s d e u x f o n c t i o n s p o se u n p r o b l è m e l i é a u f a i t
q u e , a p r è s u n e l e c t u r e p a r s c a n f, l e p o i n t e u r r e s t e p o s i t i o n n é s u r l e d e r n i e r c a r a c t è r e n o n e n c o r e u t i l i s é , à s a v o i r
( g é n é r a l e m e n t ) \ n . C ' e s t c e q u i j u s ti fi e l ' i n tr o d u c t i o n d ' u n e i n s t r u c ti o n g e t c h a r p o u r a b so r b er c e c a r a c t è r e i n t e m p e s t if .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 191/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I : R EC U R S I V IT E

L a r é c u r si v i té e s t u n e n o t i o n d é lic a t e m a i s q u i a l ' a v a n t a g e d e c o n d u ir e s o u v e n t à d es p r o g r a m m e s s im p l e s .

Ls ietus attrioo inss perne mv oi eu rs s f eo xr çe ar cn it c àe sé cd reir ce eu cn he a fpointrcet ios on nrt é pc luur tsiô vt ed, elsà "oeùx,e er cn i cp er sa t diq' ué ce o, loe n" nd ee sstie nr aé its àp avso au ms ef na éir eà el ex pf laoirr ee .r d i f fé r e n t e s

V I- 1 le c t u r e ré c u r s iv e (1 )

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t io n r é c u r s i v e d e l e c tu r e d ' u n e v a le u r e n t iè r e a u c l a v i e r . L a f o n c t i o n d e v r a s ' a p p e l e r e ll e -m ê m e d a n s l e
c a s o ù l ' i n f o r m a t io n f o u r n i e e s t in c o r r e c t e ( n o n n u m é r i q u e ) .

O n p r é v o i r a u n e f o n c t io n à u n a r g u m e n t ( l' a d r e s se d e l a v a r i a b le p o u r l a q u e l le o n v e u t l ir e u n e v a l e u r ) e t s a n s v a le u r d e
re to u r.

O n p o u r r a f a i r e a p p e l à f g e t s e t s s c a n f p o u r d é t e c te r c o n v e n a b l e m e n t l e s ré p o n s e s i n c o r r e c t e s .

Remarque

N o u s v o u s c o n s e i ll o n s d e c o m p a r e r c e t e x e r c i c e a u su i v a n t d a n s l e q u e l le m ê m e p r o b l è m e e s t r é s o l u p a r l ' e m p l o i d' u n e
f o n c t io n r é c u r si v e s a n s a r g u m e n t e t a v e c v a l e u r d e r e t o u r .

Exemple

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 192/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

192 Exercices en langage C


donnez un nombre entier : un
** réponse incorrecte - redonnez-la : 'à
** réponse incorrecte - redonnez-la : 40
-- merci pour 40

________________________________________________________________________________________

ANALYSE

A u se i n d e l a fo n c t io n ( q u e n o u s n o m m e r o n s l e c t u r e ) , n o u s l i r o n s la v a l e u r a t t e n d u e à l ' a i d e d e f g e t s ( . . . , s t d i n ) , a s s o c i é à

s s c a n f , c o m m e n o u s l ' a v o n s d é j à fa i t d a n s c e r t a i n s d e s e x e r c i c e s p r é c é d e n t s .
N o u s c o n s i d é re r o n s l a ré p o n s e d e l ' u t i li s a te u r c o m m e c o r r e c t e lo r s q u e l e c o d e d e r e t o u r d e s s c a n f s e r a é g a l à 1 . S i t e l
n ' e s t p a s l e c a s , n o u s f e r o n s à n o u v e a u a p p e l à la m ê m e f o n c t io n l e c t u r e .

Programme

#include <stdio.h>

#define LG_LIG 20 /* longueur maxi information lue au clavier */


main()
{
void lecture (int *) ; /* prototype fonction (récursive) de lecture */
int n ; /* entier à lire */

printf ("donnez un nombre entier : ") ;


lecture (&n) ;
printf ("-- merci pour %d", n) ;
}

void lecture (int *p)


{
int compte ; /* compteur du nb de valeurs OK */
char ligne[LG_LIG+1] ; /* 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 ("** réponse incorrecte - redonnez la : ") ;
lecture (p) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 193/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 193

}
}

Commentaires

* N o t e z b i e n q u ' a u s e i n d e l a f o n c t io n l e c t u r e , a u n i v e a u d e l ' a p p e l d e s s c a n f , n o u s v o y o n s a p p a r a î tr e p e t n o n & p ,


p u i s q u e i c i p e s t d é j à u n p o i n t e u r s u r l a v a r i a b l e d o n t o n v e u t li r e la v a l e u r .

* S i n o u s a v i o n s u t i li s é si m p l e m e n t g e t s ( c o m m e d a n s l ' e x e r c i c e V I . 5 d e l a p r e m i è r e p a r t ie ) a u li e u d e f g e t s ( . . . , s t d i n ) ,
n o u s a u r i o n s p u ég a l e m e n t n o u s p r o t é g e r d e m a u v a is e s r é p o n s e s d e l ' u t i li s a te u r , m a i s n o u s a u r i o n s d û d é fi n ir u n e t a i l le
m a x i m a l e p o u r la c h a î n e lu e a u c l a v i e r ; n o u s a u r i o n s c o u r u l e r is q u e d e " d é b o r d e m e n t m é m o i r e " , d a n s l e c a s o ù
l ' u t i l i sa t e u r a u r a i t f o u r n i u n e r é p o n s e t r o p lo n g u e .

DISCUSSION

C h a q u e n o u v e l a p p e l d e l e c t u r e e n t r a în e l ' a l l oc a t i o n a u t o m a t iq u e , s u r l a p i le , d ' e m p l a c e m e n t s p o u r :

- l' a r g u m e n t p ,
- l e s o b j e t s lo c a u x : c o m p t e e t l i g n e .
O r , e n f a i t , n e s o n t n é c e s s a i r e s q u e l e s v a l e u r s c o r r e s p o n d a n t a u d e r n i e r a p p e l d e lecture (celui où la lecture s' est
c o n v e n a b l e m e n t d é r o u l é e ) ; da n s c e s c o n d i ti o n s , l' e m p i le m e n t d e s d i f f é r e n ts e m p l a c e m e n t s a ll o u é s a u t a b le a u l i g n e e s t
su p e r f lu . S i l ' o n so u h a i te f a ir e q u e l q u e s é c o n o m i es d ' e sp a c e m é m o i r e à c e n iv e a u , o n p e u t s ' a r r a n g e r p o u r q u e c e t
e m p l a c e m e n t n e s o it ré s e r v é q u ' u n e s e u l e fo i s :

- so i t d a n s l e p r o g r a m m e a p p e l a n t (i c i le p r o g r a m m e p r i n c i p a l) ; d a n s c e c a s , i l f a u d r a e n t r a n s m e t tr e l ' a d r e s s e e n
a r g u m e n t , c e q u i e n tr a î n e l ' e m p i le m e n t d' u n e v a r i a b le s u p p l é m e n t a i re .
- so i t e n c l a s s e g l o b a l e ; d a n s c e c a s , o n p e u t é g a l e m e n t t r a it e r d e l a so r t e c o m p t e e t p ( c ' e s t - à - d i r e , e n f a i t , n ) , c e q u i
su p p r i m e d u m ê m e c o u p t o u s le s a r g u m e n t s e t l e s o b je t s lo c a u x d e l e c t u r e . N o t e z q u ' il r e s te r a q u a n d m ê m e , à c h a q u e
a p p e l , u n e a l l oc a t i o n a u t o m a t iq u e d ' e sp a c e p o u r l ' a d r e s s e d e r e t o u r .
- so i t e n c l a s s e s t a t i q u e ( s t a t i c ) a u s e in d e l a fo n c t i o n . L à e n c o r e , n o u s p o u v o n s t r a it e r d e l a m ê m e m a n i è r e l a v a r i a b le

c o m p t e , l a v a r i a b le p , q u a n t à e ll e , r e s ta n t so u m i s e a u x e m p i le m e n t s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 194/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

194 Exercices en langage C

V I- 2 L e c t u r e r é c u r s iv e ( 2 )

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t io n r é c u r s i v e d e l e c tu r e d ' u n e v a le u r e n t iè r e a u c l a v i e r . L a f o n c t i o n d e v r a s ' a p p e l e r e ll e -m ê m e d a n s l e
c a s o ù l ' i n f o r m a t io n f o u r n i e e s t in c o r r e c t e ( n o n n u m é r i q u e ) .

O n p r é v o i r a c e t t e fo i s u n e fo n c t i o n d a n s l a q u e l le l a v a l e u r d e r e t o u r e s t la v a l e u r l u e ( il n ' y a u r a d o n c p a s d ' a r g u m e n t s ).

L à e n c o r e , o n p o u r r a f a i r e a p p e l à f g e t s ( . . . , s t d i n ) e t s s c a n f p o u r d é t e c te r c o n v e n a b l e m e n t l e s ré p o n s e s i n c o r r e c t e s .

Remarque

C e t e x e r c ic e e s t su r t o u t d e s t in é à ê t r e c o m p a r é a u p r é c é d e n t d a n s l e q u e l le m ê m e p r o b l è m e e s t r é s o lu p a r l ' e m p l o i d ' u n e
f o n c t io n a v e c a r g u m e n t e t sa n s v a l e u r d e r e t o u r .

Exemple

donnez un nombre entier : un


** réponse incorrecte - redonnez la : 'à
** réponse incorrecte - redonnez la : 40
-- merci pour 40

________________________________________________________________________________________

ANALYSE

C o m m e p r é c éd e m m e n t , a u s e in d e n o tr e fo n c t io n ( n o m m é e l e c t u r e ) , n o u s l i r o n s l a v a l e u r a t t e n d u e à l ' a i d e d e fg e ts
a s s o c i é à s s c a n f . N o u s c o n si d é r e r o n s la r é p o n s e d e l ' u t i li s a te u r c o m m e c o r r e c t e lo r s q u e l e c o d e d e r e t o u r d e s s c a n f s e r a
é g a l à 1 . S i c e l a n ' e s t p a s l e c a s , n o u s f e r o n s d e n o u v e a u a p p e l à la m ê m e f o n c t io n l e c t u r e .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 195/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 195

Programme

#include <stdio.h>

#define LG_LIG 20 /* longueur maxi information lue au clavier */


main()
{
int lecture (void) ; /* fonction (récursive) de lecture */
int n ; /* entier à lire */

printf ("donnez un nombre entier : ") ;


n = lecture() ;
printf ("-- merci pour %d", n) ;
}

int lecture (void)


{
int compte, /* compteur du nb de valeurs OK */
p ; /* entier à lire */
char ligne[LG_LIG+1] ; /* pour lire une ligne au clavier par fgets */

fgets (ligne, LG_LIG, stdin) ;


compte = sscanf (ligne, "%d", &p) ;
if (!compte)
{ printf ("** réponse incorrecte - redonnez-la : ") ;
p = lecture() ;
}
return(p) ;
}

Commentaires

* C e t te f o i s , o n n o t e r a q u e p d é s i g n e u n e v a r ia b l e l oc a l e d e t y p e in t , d o n t l ' e m p l a c e m e n t e s t a l lo u é a u t o m a t iq u e m e n t à
c h a q u e a p p e l d e l a f o n c t i o n l e c t u r e , d e l a m ê m e m a n i è r e q u e p o u r l e s a u t r e s o b je t s l o c a u x c o m p t e e t l i g n e . P a r a il le u r s ,
s i a u c u n e m p l a c e m e n t n ' e s t a ll o u é ic i p o u r u n q u e l c o n q u e a r g u m e n t , il fa u t e n p r é v o i r u n p o u r l a v a l e u r d e r e t o u r . O n
r e m a r q u e d ' a i ll e u r s q u ' ic i c e t te v a l e u r s e tr o u v e " p r o p a g é e " d e p r o c h e e n p r o c h e , l o r s d u " d é p i l e m e n t " d e s a p p e l s .

* Pren ez garde à ne pas écrire :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 196/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

196 Exercices en langage C


if (!compte)
{ printf ("** réponse incorrecte - redonnez-la : ") ;
p = lecture() ;
}
else return (p) ;

c a r l a f o n c t io n n e r e n v e r r a i t u n e v a l e u r q u e l o r s q u e l a le c t u r e s e s e r a it d é r o u l é e c o n v e n a b le m e n t . N o t e z d ' a i ll e u r s q u e
d a n s c e c a s , b o n n o m b r e d e c o m p i la t e u r s v o u s p r é v i e n d r a i t p a r u n m e s s a g e d ' a v e r t i s se m e n t (" w a r n i n g " ) .

P a r c o n t r e , i l s e r a i t to u t à f a i t c o r r e c t ( e t é q u i v a l e n t ) d ' é c r i re :

if (!compte)
{ printf ("** réponse incorrecte - redonnez la : ") ;
return (lecture()) ;
}
else return (p) ;

DISCUSSION

L e s r e m a r q u e s f a it e s d a n s le p r é c é d e n t e x e r c i c e à p r o p o s d e s e m p i le m e n t s d e l i g n e ( e t é v e n t u e l le m e n t c o m p t e )
s ' a p p l i q u e n t e n c o r e i c i.

V I- 3 L e c t u r e r é c u r s iv e ( 3 )

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n r é c u r si v e d e l e c t u r e d ' u n e n t ie r a u c l a v i e r . L a f o n c t i o n d e v r a s ' a p p e l e r e l le - m ê m e d a n s l e c a s o ù
l ' i n f o rm a t io n f o u r n i e e s t i n c o r r e c t e .

C e t te f o i s, l a f o n c t io n p o s s é d e r a 3 a r g u m e n t s :
- l e m e s s a g e q u ' e l le d o i t im p r i m e r a v a n t d e l ir e u n e v a l e u r (l e m e s s a g e " d o n n e z u n n o m b r e e n t ie r : " n e s e r a d o n c
p l u s a f fic h é p a r l e p r o g r a m m e p r i n c ip a l ) ,
- l' a d r e s s e d e l a v a r i a b l e d a n s l a q u e l l e o n d o i t li r e u n e v a l e u r ,
- le n o m b r e m a x i m a l d ' e ss a is a u t o r is é s .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 197/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 197

E l l e f o u r n ir a u n c o d e d e r e t o u r é g a l à 0 s i la l e c t u r e a f in i p a r a b o u t ir e t à - 1 l o r s q u e l a l e c tu r e n ' a p a s p u a b o u t i r da n s l e
n o m b r e d ' e s sa i s i m p a r t i s.

C o m m e d a n s l e s d e u x p r é c é d e n ts e x e r c ic e s , o n f e r a a p p e l à fg e ts a s s o c i é e à s s c a n f .

Exemples

donnez un nombre entier : huit


** réponse incorrecte - redonnez-la : 8
-- merci pour 8

____________________

donnez un nombre entier : un


** réponse incorrecte - redonnez-la : deux
** réponse incorrecte - redonnez-la : trois
** réponse incorrecte - redonnez-la : quatre
** réponse incorrecte - redonnez-la : cinq
-- nombre d'essais dépassé

________________________________________________________________________________________

ANALYSE

L e m e s s a g e à i m p r i m e r s e ra t ra n s m i s s o u s fo r m e d e l ' a d r e s s e d ' u n e c h a î n e . L a f o n c t io n a f f ic h e r a c e m e s s a g e d è s s o n
appel. Son c ontenu devra donc être :

d o n n e z u n n o m b r e e n t ie r :

d a n s l ' a p p e l i n it ia l d e l a f o n c t io n ( r é a l i s é d a n s l e p r o g r a m m e p r i n c i p a l ), e t :

* * r é p o n s e i n c o r r e c te - r e d o n n e z - a :

d a n s l ' a p p e l d e la f o n c t io n p a r e l l e -m ê m e e n c a s d e r é p o n s e i n c o r r e c te .

E n c e q u i c o n c e r n e l e n o m b r e m a x i m a l d' a p p e l s , o n l e tr a n s m e t tr a p a r v a l e u r e t o n s ' a r r a n g e r a p o u r f a ir e d é c r o î tr e s a
valeur de 1 à chaque a ppel.

L a r é c u r si v i té d e s a p p e l s c e s s e r a l o r s q u e l ' u n e d e s d e u x c o n d it io n s s u i v a n t e s s e r a s a t i sf a it e :

- v a l e u r lu e c o r r e c te - o n f o u r n ir a a l o r s 0 c o m m e v a l e u r d e r e t o u r ,

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 198/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

198 Exercices en langage C


- n o m b r e m a x i m a l d' a p p e l s d é p a s s é - o n fo u r n ir a a l o r s -1 c o m m e v a l e u r d e re t o u r .

Programme

#include <stdio.h>
#define LG_LIG 20 /* longueur maxi information lue au clavier */
main()
{
int lecture (char *, int *, int) ; /* proto fonction (récursive) de lecture */
int n ; /* entier à lire */

const nessais = 5 ; /* nombre d'essais autorisés */

if ( lecture ("donnez un nombre entier : ", &n, nessais) != -1)


printf ("-- merci pour %d", n) ;
else printf ("-- nombre d'essais dépassés") ;
}

int lecture (char * mes, int * p, int nmax)


/* mes : adresse message à afficher avant lecture */
/* p : adresse de la valeur à lire */
/* nmax : nombre d'essais autorisés */
{
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 ("** réponse incorrecte - redonnez la : ",
p, nmax) ) ;
else return (-1) ;
else return (0) ;
}

Commentaires

* N o u s a v o n s c h o i si i c i d e f a i re a f f ic h e r l e m e s s a g e :

n o m b r e d ' e s s a i s d é p a s sé

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 199/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 199

d a n s l e p r o g r a m m e p r i n c ip a l . I l s' a g i t l à d ' u n c h o i x a r b i tr a i re p u i s q u e n o u s a u r i o n s to u t a u s si b i e n p u l e f a ir e a f f ic h e r p a r
l a fo n c t i o n e ll e -m ê m e .

V I- 4 P u is s a n c e e n t iè r e

________________________________________________________________________________________

Enoncé
k
E c r ir e u n e f o n c t i o n r é c u r s i v e p e r m e t ta n t d e c a l c u l e r l a v a l e u r d e x p o u r x r é e l q u e l c o n q u e e t k e n t i e r r e la t if q u e l c o n q u e .
O n e x p l o i te r a l e s p r o p r i é t é s s u i v a n t e s :

0
x = 1,
k
x = x p ou r k = 1 ,
-k k
x = 1 / x p o u r k p o s i ti f ,

x k = ( x k -1 ) x p o u r k p o s i ti f i m p a i r ,
k k/2
x = (x ) x pou r k positif pair.
O n t e s te r a c e t te f o n c t io n à l ' a i de d ' u n p r o g r a m m e p r i n c i p a l p e r m e t ta n t à l ' u t i li sa t e u r d e f o u r n i r e n d o n n é e s l e s v a l e u r s d e
x et de k.

Exemples

donnez une valeur réelle : 4

donnez une puissance entière : -2


4.000000e+000 à la puissance -2 = 6.250000e-002

_______________________

donnez une valeur réelle : 5.2

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 200/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

200 Exercices en langage C


donnez une puissance entière : 3
5.200000e+000 à la puissance 3 = 1.406080e+002

________________________________________________________________________________________

ANALYSE

L ' é n o n c é f o u r n i t l e s " d é f in i ti o n s r é c u r si v e s " à e m p l o y e r .

Programme

#include <stdio.h>

main()
{
double puissance(double, int) ; /* proto fonction d'élévation à la puissance */
double x ; /* valeur dont on cherche la puissance neme */
int n ; /* puissance à laquelle on veut élever x */

printf ("donnez une valeur réelle : ") ;


scanf ("%le", &x) ;
printf ("donnez une puissance entière : ") ;
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) ) ; /* puissance négative */


else if (n == 0) return (1) ; /* x puissance 0 égale 1 */

else if (n == 1) return (x) ; /* x puissance 1 égale x */


else if (n%2 == 0)
{ z = puissance (x, n/2) ; /* puissance paire */
return (z*z) ;
}
else return (x * puissance (x, n-1) ) ; /* puissance impaire */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 201/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 201

Commentaires

Il est préféra ble d' écrire :

z = puissance (x, n/2) ;


return (z*z) ;

plutôt que :

return (puissance (x,n/2) * puissance (x,n/2) ) ;

q u i p r o d u i r a i t d e u x f o i s p l u s d ' a p p e l s d e la f o n c t i o n p u i s s a n c e .

V I- 5 F o n c t io n d ' A c k e r m a n n

________________________________________________________________________________________

Enoncé
E c r ir e u n e f o n c t i o n r é c u r s iv e c a l c u l a n t la v a l e u r d e l a f o n c t i o n d ' A c k e r m a n n , d é f in i e p o u r m e t n , e n t i e r s p o si t if s o u
nuls, par :

A ( m , n ) = A ( m - 1, A (m , n -1 ) ) p ou r m > 0 e t n > 0 ,
A (0 , n ) = n + 1 p ou r n > 0 ,
A ( m , 0 ) = A ( m -1 ,1 ) p ou r m > 0 .
C e t te f o n c t io n p o s s é d e r a e n a r g u m e n t l e s v a le u r s d e m e t d e n e t fo u r n i ra e n r é s u l ta t la v a l e u r d e A c o r r e s p o n d a n t e .

O n v i su a l i ser a l ' e m p i le m e n t d e s a p p e l s e t le u r d é p i l e m e n t e n a f fic h a n t u n m e s s a g e a c c o m p a g n é d e l a v a le u r d e s d e u x


a r g u m e n t s lo r s d e c h a q u e e n t r é e d a n s l a fo n c t io n a i n si q u e j u s t e a v a n t s a s o r t i e ( da n s c e d e r n i e r c a s , o n a f fic h e r a
é g a l e m e n t l a v a l e u r q u e l a f o n c t io n s ' a p p r ê t e à r e t o u r n e r ).

O n t e s te r a c e t te f o n c t io n à l ' a i de d ' u n p r o g r a m m e p r i n c ip a l a u q u e l o n f o u r n i ra e n d o n n é e s l e s v a l e u r s d e m e t d e n .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 202/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

202 Exercices en langage C


Exemple

valeurs de m et n ? : 1 1
** entrée Acker (1, 1)
** entrée Acker (1, 0)
** entrée Acker (0, 1)
-- sortie Acker (0, 1) = 2
-- sortie Acker (1, 0) = 2
** entrée Acker (0, 2)
-- sortie Acker (0, 2) = 3
-- sortie Acker (1, 1) = 3

Acker (1, 1) = 3

________________________________________________________________________________________

Programme

#include <stdio.h>

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 récursive de calcul de la fonction d'Ackermann */
/***********************************************************/

int acker (int m, int n)


{
int a ; /* valeur de la fonction */

printf ("** entrée Acker (%d, %d)\n", m, n) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 203/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 203

if (m<0 || n<0)
a = -1 ; /* cas arguments incorrects */
else if (m == 0)
a = n+1 ;
else if (n == 0)
a = acker (m-1, 1) ;
else
a = acker (m-1, acker(m, n-1) ) ;
printf ("-- sortie Acker (%d, %d) = %d\n", m, n, a) ;
return (a) ;
}

V I- 6 T o u rs d e H a n o i

________________________________________________________________________________________

Enoncé

R é a l i se r u n e fo n c t i o n r é c u r si v e p r o p o s a n t u n e s o l u t io n a u p r o b l è m e d i t d e s to u r s d e H a n o i , l e q u e l s ' é n o n c e a i n si :

O n d i s p o s e d e t r o is p i q u e t s , n u m é r o t é s 1 , 2 e t 3 e t d e n d i s q u e s d e t a il le s d i f fé r e n t e s . A u d ép a r t , c e s d i s qu e s so n t
e m p i lé s p a r ta i ll e d é c r o i ss a n t e su r l e p iq u e t n u m é r o 1 . L e b u t d u j e u e s t d e d é p l a c e r c e s n d i sq u e s d u p i q u e t n u m é r o 1
su r l e p i q u e t n u m é r o 3 , e n r e s p e c t a n t l e s c o n t r a in t e s s u iv a n t e s :
- o n n e d é p l a c e q u ' u n s e u l d i s q u e à l a f o is ( d' u n p i q u e t à u n a u t r e ) ,
- u n d i sq u e n e d o i t j a m a i s ê tr e p l a c é a u - d e ss u s d ' u n d i sq u e p l u s p e t it q u e l u i .
O n t e s te r a c e t te f o n c t io n a v e c u n p r o g r a m m e p r in c i p a l p e r m e t ta n t d e c h o i si r , e n d o n n é e , l e n o m b r e t o t a l d e d i s qu e s à
d é p l a c e r ( n ).

S i v o u s n ' ê t e s p a s fa m i li a r is é a v e c c e t y p e d e p r o b l è m e , n o u s v o u s c o n s e i ll o n s d e t e n t e r t o u t d ' a b o r d d e l e r é s o u d r e
m a n u e l le m e n t a v a n t d e c h e r c h e r à p r o g ra m m e r l a fo n c t io n d e m a n d é e .

Exemple

combien de disques ? 4
déplacer un disque de 1 en 2

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 204/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

204 Exercices en langage C


déplacer un disque de 1 en 3
déplacer un disque de 2 en 3
déplacer un disque de 1 en 2
déplacer un disque de 3 en 1
déplacer un disque de 3 en 2
déplacer un disque de 1 en 2
déplacer un disque de 1 en 3
déplacer un disque de 2 en 3
déplacer un disque de 2 en 1
déplacer un disque de 3 en 1
déplacer un disque de 2 en 3
déplacer un disque de 1 en 2
déplacer un disque de 1 en 3
déplacer un disque de 2 en 3

________________________________________________________________________________________

ANALYSE

P o u r n = 1 , l a so l u t i o n e s t é v i d e n t e ; il su f f i t d e d é p l a c e r l ' u n i q u e d i sq u e d u p i q u e t n u m é r o 1 a u p i q u e t n u m é r o 3 .

D è s q u e n e s t su p ér i e u r à 1 , o n r e m a r q u e q u ' i l e s t n é c e s s a ir e d ' u t il i se r l e p i q u e t n u m é r o 2 p o u r d e s s to c k a g e s
i n te r m é d i a ir e s . O n p e u t c o n s i d é r e r q u e le p r o b l è m e c o n s i s te à d é p l a c e r n d i s q u e s d u p i q u e t n u m é r o 1 v e r s l e p i q u e t
n u m é r o 3 , e n u t i l i s a n t l e p i q u e t n u m é r o 2 c o m m e p i q u e t i n t e r m é d i a i r e . O n p e u t m o n t r e r q u e c e t te o p é r a t i o n s e
d é c o m p o s e e n t r o i s o p ér a t io n s p l u s si m p l e s :

- d é p l a c e r l e s n - 1 d i sq u e s s u p é r i e u r s d u p i q u e t n u m é r o 1 v e r s l e p i q u e t n u m é r o 2 ; p e n d a n t c e t te p h a s e , o n p e u t
u t il i se r l e p iq u e t n u m é r o 3 c o m m e p i q u e t in t e r m é d i a i re ,
- d ép l a c e r le s n - 1 d i sq u e s d u p i q u e t n u m é r o 2 v e r s l e p i q u e t n u m é r o 3 ; l à e n c o r e , o n p e u t u t il i se r l e p i q u e t n u m é r o 1
c o m m e p i q u e t i n te r m é d i a ir e ( le d i sq u e i n i t ia l e m e n t p r é s e n t su r c e p i q u e t é t a n t p l u s g r a n d q u e t o u s l e s d i s q u e s à
déplacer).
C e l a n o u s c o n d u i t à l a r é a li s a ti o n d ' u n e f o n c t i o n r é c u r si v e p o s s é d a n t c o m m e a r g u m e n t s :

- le n o m b r e d e d i s q u e s à d ép l a c e r ,
- le n u m é r o d u p i q u e t " d e d é p a r t " ,
- le n u m é r o d u p i q u e t " d ' a r r i v é e " ,
- le n u m é r o d u p i q u e t " i n te r m é d i a i re " .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 205/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VI. Récursivité 205

Programme

#include <stdio.h>

main()
{
void hanoi (int, int, int, int) ;
int nd ; /* nombre total de disques */

printf ("combien de disques ? ") ;


scanf ("%d", &nd) ;
hanoi (nd, 1, 3, 2) ;
}

/***********************************************/
/* fonction résolvant le pb des tours de hanoi */
/***********************************************/
void hanoi (int n, int depart, int but, int inter)
/* n : nombre de disques à déplacer */
/* depart : tour d'où l'on part */
/* but : tour où l'on arrive */
/* inter : tour intermédiaire */
{
if (n>0)
{ hanoi (n-1, depart, inter, but) ;
printf ("déplacer un disque de %d en %d\n", depart, but) ;
hanoi (n-1, inter, but, depart) ;
}
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 206/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 207/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V II : T R A IT EM EN T D E
FICHIERS

L e s e x e r c i c e s d e c e c h a p i t re v o u s f o u r n i s se n t d e s e x e m p l e s c l a ss i q u e s d e t r a i te m e n t d e f ic h i e r s c o r r e s p o n d a n t à d i ff é r e n ts
asp ects :

- tr a i t e m e n t s é q u e n t ie l ,
- accès direct,
- f ic h i e r s d e t y p e t e x t e .

V II- 1 C r é a t io n s é q u e n t i e lle d e f ic h i e r
________________________________________________________________________________________

Enoncé

E c r i r e u n p r o g r a m m e d e c r é a t i o n s é q u e n t i e l l e d ' u n f i c h i e r c o m p o r t a n t , p o u r u n c e r t a i n n o m b r e d e p e r so n n e s , l e s
i n f o rm a t io n s s u i v a n t e s , f o u r n i e s a u c l a v i e r :

- n o m ( a u m a x i m u m 2 0 c a r a c t è r es ) ,
- âge,
- n o m b r e d ' e n f a n t s,
- â g e d e c h a c u n d es d i f fé r e n t s e n fa n t s ; o n n e d e m a n d e r a ( e t do n c o n n ' e n r e g i s tr e r a ) q u e l ' â g e d e s 1 5 p r e m i e r s e n fa n t s
( m a i s le n o m b r e f ig u r a n t d a n s l e c h a m p p r é c é d e n t p o u r r a ê t r e s u p é r i e u r à 1 5 ) .
L ' u t il i sa t e u r f o u r n ir a u n n o m " v i d e " p o u r si g n a l e r q u ' i l n ' a p l u s d e p e r so n n e s à e n r e g i s tr e r .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 208/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

208 Exercices en langage C


O n n e p r é v o i r a a u c u n c o n t r ô le p a r t ic u l i e r a u n i v e a u d e l a s a i si e d e s d o n n é es

Exemple

donnez le nom du fichier à créer : person


----- pour terminer la saisie, donnez un nom 'vide' ---
nom : dubois
age : 32
nombre enfants : 1
age enfant no 1 : 7

nom : dunoyer
age : 29
nombre enfants : 0

nom : dutronc
age : 45
nombre enfants : 3
age enfant no 1 : 21
age enfant no 2 : 18
age enfant no 3 : 17

nom :

-------- FIN CREATION FICHIER ----------

________________________________________________________________________________________

ANALYSE

L a s t r u c t u r e d e c h a q u e e n r e g i s tr e m e n t d u fic h i e r d é c o u l e d e l ' é n o n c é . C e p e n d a n t , e n c e q u i c o n c e r n e l a m a n i è r e d e
r e p r é s e n t e r le n o m d e s p e r so n n e s , n o u s d e v o n s d é c i de r d e l a p r é s e n c e o u d e l ' a b s e n c e d u c a r a c t è r e d e f i n d e c h a î n e ( \ 0 ) .
I c i , n o u s a v o n s c h o i si , p a r f a c il it é , d ' i n t r o d u ir e c e c a r a c t è r e , c e q u i i m p l iq u e q u e l a z o n e c o r r e s p o n d a n t e s o i t d e l o n g u e u r
21.

P o u r c r é e r n o t r e f i c h i e r , n o u s u t i l i s e r o n s l e s f o n c t i o n s d e n i v e a u 2 , c ' e s t - à - d i r e i c i fopen e t fwrite. R a p p e l o n s q u e c e l l e s -


c i tr a v a i ll e n t a v e c u n p o i n te u r s u r u n e s t r u c tu r e d e t y p e F IL E ( p r é d é f in i d a n s s t d i o . h ) . L a v a l e u r d e c e p o i n te u r n o u s e s t
f o u r n i e p a r f o p e n ; c e t t e f o n c t io n r e s t i tu e u n p o i n t e u r n u l e n c a s d ' e r r e u r d ' o u v e r t u r e .

L a c r é a t io n d u f ic h i e r c o n s i s te s i m p l e m e n t à r é p é t e r l e s a c t io n s :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 209/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 209

- l e c tu r e d ' i n f o r m a t io n s a u c l a v i e r ,
- é c r i tu r e d e c e s i n f o r m a t i o n s d a n s l e f ic h i e r .
C e t te r é p é t i ti o n d o i t ê tr e i n te r r o m p u e à l a r e n c o n t r e d ' u n n o m v i d e .

Programme

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LGNOM 20 /* longueur maxi d'un nom */
#define NBENFMAX 15 /* nombre maxi d'enfants */
#define LNOMFICH 20 /* longueur maxi nom de fichier */

main()
{ char nomfich [LNOMFICH+1] ; /* nom du fichier à créer */
FILE * sortie ; /* descripteur fichier (niveau 2) */
struct { char nom [LGNOM+1] ;
int age ; /* description d'un enregistrement */
int nbenf ; /* du fichier */
int agenf [NBENFMAX] ;
} bloc ;
int i ;

/* ouverture fichier à créer */


/* attention : mode d'ouverture w au lieu de wb dans certains cas */
printf ("donnez le nom du fichier à créer : ") ;
gets (nomfich) ;
if ( (sortie = fopen (nomfich, "w")) == NULL )
{ printf ("***** erreur ouverture - abandon programme") ;
exit(-1) ;
}

/* création du fichier à partir d'informations */


/* fournies au clavier */
printf ("----- pour terminer la saisie, donnez un nom 'vide' ---\n") ;
do
{ printf ("nom : ") ; /* saisie nom */
gets (bloc.nom) ;
if ( strlen(bloc.nom) == 0) break ; /* sortie boucle si nom vide */
printf ("age : ") ;
scanf ("%d", &bloc.age) ; /* saisie age */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 210/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

210 Exercices en langage C


printf ("nombre enfants : ") ;
scanf ("%d", &bloc.nbenf) ; /* saisie nb enfants */
for (i=0 ; i < bloc.nbenf && i < NBENFMAX ; i++)
{ printf ("age enfant no %d : ", i+1) ; /* saisie age des */
scanf ("%d", &bloc.agenf[i]) ; /* différents enfants */
}
getchar() ; /* pour éliminer \n */
printf ("\n") ;
fwrite (&bloc, sizeof(bloc), 1, sortie) ; /* écriture fichier */
}
while (1) ;

/* fin création */
fclose(sortie) ;
printf ("\n -------- FIN CREATION FICHIER ----------") ;
}

Commentaires

* N o t e z le " m o d e d ' o u v e r t u re " w b :

w : o u v e r t u r e e n é c r i t u r e ; si l e fi c h i e r n ' e x i s t e p a s , i l e s t c r é é . S ' i l e x i s t e , so n a n c i e n c o n t e n u e s t p e r d u .

b : m o d e d i t " b in a i r e " o u " n o n t r a n s l a té " .


E n f a i t , l' i n d i c a t io n b n e s e j u s t if i e q u e d a n s le s i m p l é m e n t a t i o n s q u i d i s ti n g u e n t l e s fi c h i e r s d e t e x t e d e s a u t r e s . U n e t e l l e
d i s t in c t i o n e s t m o t i v é e p a r l e f a it q u e l e c a r a c t è r e d e f i n d e li g n e ( \ n ) p o s s è d e , s u r c e r t a i n s sy s t è m e s , u n e r e p r é s e n t a t i o n
p a r t ic u l i è re o b t e n u e p a r l a su c c e s s i o n d e d e u x c a r a c t è r e s. L a p r é s e n c e d e b é v i t e l e r i s q u e q u e l e f i c h i e r c o n c e r n é s o i t
c o n s i d ér é c o m m e u n f i c h i e r d e ty p e t e x t e , c e q u i a m è n e r a i t u n e i n t e r p r é ta t io n n o n so u h a i té e d e s c o u p l e s d e c a r a c t è r e s
r e p r é s e n t a n t u n e f i n d e l ig n e .

* I c i, n o u s a v o n s f a i t a p p e l à l a fo n c t i o n e x i t ( so n p r o t o t y p e f i g u r e d a n s s t d l i b . h ) p o u r in t e rr o m p r e l e p r o g r a m m e e n c a s
d ' e r r e u r d ' o u v e r t u r e d u f ic h i e r . I l s ' a g i t là d ' u n c h o i x a r b i tr a i re . N o u s a u r i o n s p u d e m a n d e r à l ' u t il i sa t e u r d e p r o p o s e r u n
a u t r e n o m d e f ic h i e r .

* E n c e q u i c o n c e r n e l a b o u c l e d e c r é a t i o n d u f ic h i e r , n o u s a v o n s c h o i si d e l a p r o g r a m m e r so u s fo r m e d ' u n e b o u c l e
infinie :

do
.......
.......

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 211/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 211

while (1) ;

q u e n o u s in t e r ro m p o n s a u m o m e n t o p p o r tu n p a r b r e a k . N o u s a u r i o n s p u é g a l e m e n t c h o i si r d ' i n t r o d u i r e le s p r e m i è r e s
i n s t r u c t i o n s d e l a b o u c l e d a n s l ' e x p r e s s i o n c o n d i t i o n n a n t u n e i n s t r u c t i o n w h i l e , d e c e tt e m a n i è r e :

while (printf("nom : "), gets(bloc.nom), strlen(bloc.mot) )

* C o m m e p r é v u p a r l ' é n o n c é , a u c u n c o n t r ô le p a r t ic u l i e r n ' e s t e f fe c t u é s u r le s d o n n é e s q u i s o n t d o n c l u e s p a r s c a n f e t
g e t s . L à e n c o r e s e p o s e l e p r o b l è m e d ' i g n o r e r l e \ n q u i s u b s i s te a p r è s u n e le c t u r e p a r s c a n f , c e q u i i m p o s e d ' i n t r o d u i r e
a r t i fi c i e l le m e n t u n e i n s t r u c t io n g e t c h a r ( p o u r p l u s d e d é t a i ls s u r c e p r o b lè m e , v o y e z l e s c o m m e n t a i re s d e l ' e x e r c i c e V - 3 ) .

* R a p p e l o n s q u e l a f o n c t io n d ' é c r it u r e d a n s l e f ic h i e r ( f w r i t e ) p o s s è d e 4 a r g u m e n t s :
- L ' a d r e s se d e d é b u t d ' u n e n s e m b l e d e b l o c s à é c r ir e ( n o te z b i e n l a n o ta t io n & b l o c e t n o n s i m p l e m e n t b l o c , d a n s l a
m e s u r e o ù l e n o m d ' u n e s t ru c t u r e d é s i g n e sa v a l e u r e t n o n so n a d r e s s e , c o m m e c e l a e s t l e c a s p o u r u n t a b l e a u ) .
- L a t a il le d ' u n b l o c . N o t e z q u ' i c i n o u s a v o n s u t i li s é la f o n c t i o n s i z e o f , c e q u i a s s u r e l a p o r ta b i l it é d u p r o g r a m m e .
- L e n o m b r e d e b l o c s d e c e t t e t a il le à é c r i re ( i c i, 1 ) .
- L ' a d r e s s e d e l a s tr u c t u r e d é c r i v a n t l e f ic h i e r (e l l e a é té f o u r n i e p a r f o p e n ) .

DISCUSSION

* C e p r o g r a m m e n ' e x a m i n e p a s l e c o d e d e r e to u r d e f w r i t e , l e q u e l p r é c i s e le n o m b r e d e b l o c s r é e ll e m e n t é c r i ts d a n s l e
f ic h i e r ( c e n o m b r e é t a n t in f é r ie u r a u n o m b r e s o u h a i t é e n c a s d ' e r r eu r d ' é c r i t u re ) . I l f a u t to u t e f o is n o t e r , à c e p r o p o s , q u e ,
g é n é r a l e m e n t , u n c e r ta i n n o m b r e d ' e r r e u r s so n t " r é c u p é r é e s " p a r l e s y s tè m e q u i a f fic h e a l o r s l u i- m ê m e s o n p r o p r e
m e s sa g e .

* C o m m e le p r é v o y a i t l ' é n o n c é , c e p r o g r a m m e n ' e s t p a s p r o t é g é d ' é v e n t u e ll e s e rr e u r s d a n s le s r é p o n s e s fo u r n i e s p a r


l ' u t i l i sa t e u r . A t i tr e i n d ic a t i f, v o i c i q u e l q u e s s i tu a t i o n s q u e l ' o n p e u t r e n c o n t r e r :

- S i l' u t i li s a te u r f o u r n i t u n n o m d e f ic h i e r d e p l u s d e 2 0 c a r a c t è r e s , il y a u r a é c r a s e m e n t d ' i n f o r m a t io n s e n m é m o i r e .
I c i , i l s e r a i t t o u t e fo i s a s s e z fa c i le d e r e m é d i er à c e p r o b l è m e e n a t tr i bu a n t a u s y m b o l e L N O M F I C H u n e v a l e u r
su p ér i eu r e a u n o m b r e d e c a r a c t è r e s q u e l' o n p e u t fr a p p e r a u c l a v i e r da n s l ' i m p l é m e n t a ti o n c o n c e r n é e . O n p o u r r a i t
é g a l e m e n t l ir e u n n o m b r e d e c a r a c t è r e s l im i té s e n u t il i sa n t , a u l i e u d e g e t s ( n o m f i c h ) , l ' i n s t r u c t i o n :
fgets (nomfich, LNOMFICH, stdin) ;

N o t e z t o u t e fo i s q u e , d a n s c e c a s , l e s c a r a c tè r e s s u p p l é m e n t a ir e s f ra p p é s é v e n t u e ll e m e n t p a r l ' u t i li sa t e u r su r l a m ê m e
" l i g n e " s e r a i e n t p r is e n c o m p t e p a r u n e p r o c h a i n e in s t ru c t i o n d e l e c t u r e s u r l ' e n t r é e s ta n d a r d .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 212/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

212 Exercices en langage C


D a n s c e r ta i n e s i m p l é m e n t a ti o n s ( n o t a m m e n t T u r b o / B o r l a n d C e t C / Q u i c k C M ic r o s o f t ), i l e s t p o s si b l e d e r é g l e r
c o m p l è te m e n t l e p r o b l è m e e n u t il i sa n t l ' i n s tr u c t io n c g e t s q u i a l e m é r i t e d e l i m i t e r , n o n s e u l e m e n t le n o m b r e d e
c a r a c t è r e s p r is e n c o m p t e , m a i s é g a le m e n t c e u x e f f e c ti v e m e n t f ra p p é s a u c l a v i e r .
- S i l ' u t i l i sa t e u r f o u r n i t p lu s d e c a r a c t è r e s q u e n ' e n a t t e n d s c a n f , c e u x - c i s e r o n t u t il i sé s ( a v e c p l u s o u m o i n s d e
b o n h e u r ) p a r u n e l e c tu r e s u iv a n t e . L à e n c o r e , l e p r o b l è m e n e p e u t ê tr e c o n v e n a b le m e n t r é g lé q u e d ' u n e fa ç o n
d é p e n d a n t d e l' i m p l é m e n t a t io n , p a r e x e m p l e a v e c la f o n c t io n c g e t s ( a s s o c i é e , c e t t e f o i s , à s s c a n f ) c i t é e
précédemment.
- S i l' u t i li s a t e u r f o u r n i t d e s c a r a c t è r e s n o n n u m é r i q u e s l à o ù s c a n f a t t e n d d e s c h i f f r e s , l e r é s u l t a t d e l a l e c t u r e s e r a
a r b i tr a i re ; l e p r o g r a m m e n e s ' e n a p e r c e v r a p a s p u i sq u ' i l n e t e s te p a s l e c o d e d e r e t o u r d e s c a n f ( q u i fo u r n i t le n o m b r e
d e v a l e u r s e f f e c t iv e m e n t l u e s ) . D e p l u s , l à e n c o r e , l e s c a r a c t è r e s n o n t r a i té s s e r o n t r e p r i s p a r u n e l e c tu r e u l t é r ie u r e .
L e p r e m i e r p o in t p e u t , là e n c o r e , ê t r e r é s o lu p a r l ' e m p l o i d e s s c a n f , a s s o c i é à f g e t s ( . . . , s t d i n ) . L à e n c o r e , d a n s

c e r t a in e s i m p l é m e n t a t io n s , c g e t s ( a s s o c i é e à s s c a n f ) p e r m e t d e r é g le r t o ta l e m e n t le p r o b l è m e .

V II- 2 L is t e s é q u e n t ie lle d ' u n f ic h i e r

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e p e r m e t ta n t d ' a f f ic h e r su c c e s s i v e m e n t c h a c u n d e s e n r e g is t re m e n t s d ' u n f ic h i e r a n a l o g u e à c e u x


c r é é s pa r l e p ro g r a m m e p r é c é d e n t. L e p r o g r a m m e p r é s e n te r a u n s e u l e n r e g i st re m e n t à l a f o i s, a c c o m p a g n é d ' u n n u m é r o
p r é c i s a n t so n r a n g d a n s l e f ic h i e r ( o n a t tr i b u e r a l e n u m é r o 1 a u p r e m i e r e n r e g i s tr e m e n t ) ; i l a t te n d r a q u e l ' u t il i sa t e u r
f r a p p e l a t o u c h e r e t u r n a v a n t d e p a s s e r à l ' e n r e g i s tr e m e n t su i v a n t .

L ' a f f ic h a g e d e s i n f o r m a t io n s s e r a r é a l i sé p a r u n e fo n c t i o n à l a q u e l le o n t r a n s m e t t r a e n a r g u m e n t l ' e n r e g i s tr e m e n t à
a f f ic h e r e t so n n u m é r o . L e m o d è l e m ê m e d e l a s tr u c t u r e c o r r e s p o n d a n t e s e r a , q u a n t à l u i, d é f in i à u n n i v e a u g l o b a l .

L e p r o g r a m m e d e v r a s ' a s s u r e r d e l' e x i s t e n c e d u f ic h i e r à l i st e r .

Exemple

donnez le nom du fichier à lister : person

enregistrement numéro : 1

NOM : dubois
AGE : 32
NOMBRE D'ENFANTS : 1

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 213/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 213

AGE ENFANT 1 : 7

enregistrement numéro : 2

NOM : dunoyer
AGE : 29
NOMBRE D'ENFANTS : 0

enregistrement numéro : 3

NOM : dutronc
AGE : 45
NOMBRE D'ENFANTS : 3
AGE ENFANT 1 : 21
AGE ENFANT 2 : 18
AGE ENFANT 3 : 17

-------- FIN LISTE FICHIER ----------

________________________________________________________________________________________

Programme

#include <stdio.h>
#include <string.h>

#define LGNOM 20 /* longueur maxi d'un nom */


#define NBENFMAX 15 /* nombre maxi d'enfants */
#define LNOMFICH 20 /* longueur maxi nom de fichier */

struct enreg { char nom [LGNOM+1] ;


int age ;
int nbenf ;
int agenf [NBENFMAX] ;
} ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 214/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

214 Exercices en langage C


main()
{
void affiche (struct enreg *, int) ; /* fonction d'affichage */
char nomfich [LNOMFICH+1] ; /* nom du fichier à lister */
FILE * entree ; /* descripteur fichier (niveau 2) */
struct enreg bloc ; /* enregistrement fichier */
int num ; /* numéro d'enregistrement */

/* ouverture fichier à lister */


/* attention : mode d'ouverture : r au lieu de rb dans certains cas */
do
{ printf ("donnez le nom du fichier à lister : ") ;
gets (nomfich) ;
if ( (entree = fopen (nomfich, "rb")) == 0 )
printf ("fichier non trouvé\n") ;
}
while (!entree) ;

/* liste du fichier */
num = 1 ;
while (fread(&bloc, sizeof(bloc), 1, entree), ! feof(entree) )
{ affiche (&bloc, num++) ;
getchar() ; /* attente frappe "return" */

/* fin liste */
fclose(entree) ;
printf ("\n\n -------- FIN LISTE FICHIER ----------") ;
}

/*************************************************/
/* fonction d'affichage d'un enregistrement */
/*************************************************/

void affiche (struct enreg * bloc, int num)


{
int i ;
printf ("\n\nenregistrement numéro : %d\n\n", num) ;
printf ("NOM : %s\n", bloc->nom) ;
printf ("AGE : %d\n", bloc->age) ;
printf ("NOMBRE D'ENFANTS : %d\n", bloc->nbenf) ;
for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 215/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 215

printf ("AGE ENFANT %2d : %2d\n", i+1, bloc->agenf[i]) ;


}

Commentaires

* N o t e z l e m o d e d ' o u v e r t u re r b :

r : o u v e r t u r e e n l e c t u r e . S i l e fi c h i e r n ' e x i s t e p a s , f o p e n f o u r n i t u n p o i n t e u r n u l .

b : o u v e r t u r e e n m o d e " b i n a i r e " o u " n o n t r a n s la t é " ( p o u r p l u s d ' i n f o r m a t io n s s u r l a d i ff é r e n c e e n t r e le s m o d e s


t ra n s l a té e t n o n t r a n s la t é , v o y e z l e s c o m m e n t a i re s d e l ' e x e r c i c e V I I -1 ) .

* R a p p e l o n s q u e l a f o n c ti o n d e l e c t u r e f r e a d p o s s è d e 4 a r g u m e n t s, c o m p a r a b le s à c e u x d e f w r i t e :

- l' a d r e ss e d e d é b u t d ' u n e n s e m b l e d e b l o c s à l ir e ,
- l a ta i l le d ' u n b l o c ( e n o c t e t s ),
- le n o m b r e d e b l o c s d e c e t te t a i ll e à l ir e ,
- l' a d r e s s e d e l a s t r u c t u r e d é c r i v a n t le f ic h i e r ( e ll e a é t é f o u r n i e p a r f o p e n ) .

fe o f
s* u Lf fia t f po ansc, t iop on u r d é tpe rcet ne dr lal a fvi an l ed u' ur nv rf aici h(i 1e )r , lodr' sa qvuoei rl as i fmi np l de em fe icn th il eur sao né tdé e re nf fi er
e c tio vcetme te ;n ti lr ee nstc,o nd te r ép el .u sA, unt ér ce ems es na it r de i dt ,' ai vl oni er
t e n t é d e l i re a u - d e là . C ' e s t c e q u i j u s ti fi e q u e c e t te c o n d i ti o n s o i t e x a m i n é e a p r è s f r e a d e t n o n a v a n t .

* V o y e z l a f a ç o n d o n t n o u s a v o n s p r o g r a m m é l a b o u c l e d e l e c t u re d e s d i f fé r e n t s e n r e g is tr e m e n t s d u f ic h i e r . C e l a n o u s
é v i t e u n e s o r t ie e n c o u r s d e b o u c l e p a r b r e a k , c o m m e d a n s :

do
{ fread (&bloc, sizeof(bloc), 1, entree) ;
if (feof(entree)) break ;
affiche (&bloc, num++) ;
getchar() ;
}
while (1) ;

o u u n t e s t su p p l é m e n t a i re d a n s l a b o u c l e c o m m e d a n s :

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 216/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

216 Exercices en langage C

do
{ fread (&bloc, sizeof(bloc), 1, entree) ;
if (!feof(entree))
{ affiche (&bloc, num++) ;
getchar ;
}
}
while (!feof(entree)) ;

DISCUSSION

* C e p r o g ra m m e n ' e x a m i n e p a s le c o d e d e r e to u r d e f r e a d ( c e l u i- c i p r é c i s e le n o m b r e d e b l o c s r é e l le m e n t l u s ).

* N o t r e p r o g r a m m e n ' e s t p a s p r o t é g é c o n t r e la f o u r n i tu r e p a r l ' u t i li sa t e u r d ' u n n o m d e f ic h i e r d e p l u s d e 2 0 c a r a c t è r e s .


V o y e z l a d i s c u ss i o n d e l' e x e r c ic e p r é c é d e n t .

* L e p a s s a g e à l ' e n r e g i s tr e m e n t su i v a n t e s t d é c l e n c h é p a r l a f r a p p e d e r e t u r n . M a i s si l ' u t i li sa t e u r f r a p p e u n o u p l u si e u r s
c a r a c t è r e s (v a l i d é s p a r r e t u r n ), i l v e r r a d é f il e r p lu s i eu r s en r e g i st re m e n t s d e s u i t e . L a s o l u t io n à c e p r o b l è m e d é p e n d , i c i
e n c o re , d e l ' i m p l é m e n t a t i o n . P a r e x e m p l e , da n s u n e n v ir o n n e m e n t D O S , a v e c T u rb o / B o rl a n d C / C + + o u Q u i c k C / C
M i c r o so f t , i l s u f fi r a d e " v i d e r le t a m p o n d u sy st è m e " p a r :

while (kbhit()) getch ;

avant chaq ue attente.

V II-3 C o r re c t i o n d e f ic h ie r

________________________________________________________________________________________

Enoncé

R é a l iser u n p r o g r a m m e p e r m e t ta n t d ' e ff e c tu e r d e s c o r r e c ti o n s su r u n f ic h i e r a n a l o g u e à c e u x c r é é s p a r le p r o g r a m m e d e
l ' e x e r c i c e V I I -1 .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 217/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 217

L ' u t il i sa t e u r d é s ig n e r a u n e n r e g i s t re m e n t p a r so n n u m é r o d ' o r d r e d a n s le f ic h i e r . L e p r o g r a m m e s ' a s s u r e r a d e s o n


e x i s te n c e e t l ' a f f ic h e r a d ' a b o r d t e l q u e l a v a n t d e d e m a n d e r l e s m o d i f ic a t i o n s à l u i a p p o r t e r . C e s d e r n i è r e s s e r o n t
e f f e c t u é e s c h a m p p a r c h a m p . P o u r c h a q u e c h a m p , l e p r o g r a m m e e n a f f ic h e r a à n o u v e a u l a v a l e u r , p u is i l d e m a n d e r a à
l ' u t il i sa t e u r d ' e n t r e r u n e é v e n t u e l le v a l e u r d e r e m p l a c e m e n t . S i a u c u n e m o d i f ic a t i o n n ' e s t so u h a i té e , i l su f f ir a à c e
d e r n i e r d e r é p o n d r e d i r ec t e m e n t p a r l a fr a p p e d e r e t u r n .

O n p r é v o i r a d e u x f o n c t io n s :

- u n e p o u r l ' a f fi c h a g e d ' u n en r eg i s tr e m e n t ( o n p o u r r a r e p r e n d r e l a f o n c t io n a f f i c h e d e l ' e x e r c ic e p r é c é d e n t ),


- u n e p o u r l a m o d i f ic a t i o n d ' u n e n r e g i s tr e m e n t .

Exemple

donnez le nom du fichier à modifier : person

numéro enregistrement à modifier (0 pour fin) : 14

numéro enregistrement à modifier (0 pour fin) : 2

enregistrement numéro : 2

NOM : dunoyer
AGE : 29
NOMBRE D'ENFANTS : 0

entrez vos nouvelles infos (return si pas de modifs)


NOM : Dunoyer
AGE :
NOMBRE D'ENFANTS : 1
AGE ENFANT 1 : 15

numéro enregistrement à modifier (0 pour fin) : 0

-------- FIN MODIFICATIONS FICHIER ----------

________________________________________________________________________________________

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 218/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

218 Exercices en langage C


ANALYSE

A p a r t ir d u m o m e n t o ù l ' o n s o u h a it e r e tr o u v e r u n e n r e g i st r e m e n t p a r so n r a n g d a n s l e f ic h i e r , i l p a r a ît l o g iq u e d e r é a l i se r
u n " a c c è s d i r e c t " . R a p p e l o n s q u ' e n l a n g a g e C c e l u i- c i s ' o b t ie n t e n a g i ss a n t su r l a v a l e u r d ' u n p o i n t e u r d a n s l e f ic h i e r à
l ' a i d e d e l a f o n c t i o n fseek. L a l e c t u r e e t l ' é c r i t u r e , q u a n t à e l l e s , r e s t e n t t o u j o u r s r é a l i s é e s p a r l e s f o n c t i o n s fread e t
fwrite.

L ' é n o n c é n e n o u s i m p o s e p a s d e c o n t r ô le s u r l ' i n fo r m a t io n l u e a u c l a v i e r . N é a n m o i n s , n o u s d e v o n s ê t r e e n m e s u r e
d ' a c c e p t e r e t d e r e c o n n a î t re c o m m e te l le u n e " r é p o n s e v i d e " . D a n s c e s c o n d i ti o n s , n o u s n e p o u v o n s p a s em p l o y e r s c a n f
q u i r i s q u e r a it d e c o n d u i r e à u n b o u c l a g e s u r l e c a r a c t è re \ n .

pUenr em se ot l du et iod né càe leu rn ctoenl vpernoab bl èlemmee nc to nl es


s i s rteé p ào nl sirees tvoi ud te s.d' aS ib ol r' od n l sa o ruéhpaoitn es eu nd ee sl o' ul ut ilti iosan t de éu pr e so
n dua sn tfoe rdme el ' di m' upnl eé mc eh na tî an teio, nc,e c qe luai
p e u t s e f a ir e s o i t a v e c g e t s , s o i t (s i l' o n so u h a i te l i m i t e r le n o m b r e d e c a r a c t è r e s p r is e n c o m p t e ) a v e c f g e t s ( . . . , s t d i n ) . I c i ,
n o u s u t i li se r o n s l a p r e m i è r e p o ss ib i l it é , e n f a i sa n t a p p e l à u n e z o n e d e 1 2 8 c a r a c t è r e s (d a n s b o n n o m b r e
d ' i m p l é m e n t a t io n s , o n n e p e u t p a s f r a p p e r a u c l a v ie r d e " l i g n e s " p l u s lo n g u e s ! ) .

L o r s q u ' u n e i n fo r m a t io n n u m é r i q u e e s t a t te n d u e , i l n o u s s u f f it a lo r s d e " d é c o d e r " l e c o n t e n u d e c e t te c h a î n e . C e l a p e u t s e


f a i r e , so i t a v e c l a f o n c t i o n s s c a n f a s s o r ti e ( ic i ) d ' u n f o r m a t % d , s o i t a v e c l a f o n c t i o n s t a n d a r d a t o i . P a r so u c i d e d i v e r si t é ,
n o u s a v o n s c h o i si i c i l a s e c o n d e .

Programme

#include <stdio.h>
#include <string.h>

#define VRAI 1 /* pour simuler ..... */


#define FAUX 0 /* ..... des booléens */
#define LGNOM 20 /* longueur maxi d'un nom */
#define NBENFMAX 15 /* nombre maxi d'enfants */
#define LNOMFICH 20 /* longueur maxi nom de fichier */

struct enreg { char nom [LGNOM+1] ;


int age ;
int nbenf ;
int agenf [NBENFMAX] ;
} ;

main()
{

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 219/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 219

void affiche (struct enreg *, int) ; /* fonction d'affichage */


void modifie (struct enreg *) ; /* fonction de modif d'un enreg */
char nomfich [LNOMFICH+1] ; /* nom du fichier à lister */
FILE * fichier ; /* descripteur fichier (niveau 2) */
struct enreg bloc ; /* enregistrement fichier */
int num, /* numéro d'enregistrement */
horsfich ; /* indicateur "logique" */
long nb_enreg, /* nbre d'enregistrements du fichier */
pos ; /* position courante (octets) dans fich */

/* ouverture (en mise à jour) fichier à modifier et calcul de sa taille */


/* attention, mode d'ouverture r+ au lieu de r+b dans certains cas */

do
{ printf ("donnez le nom du fichier à modifier : ") ;
gets (nomfich) ;
if ( (fichier = fopen (nomfich, "r+b")) == 0 )
printf ("fichier non trouvé\n") ;
}
while (! fichier) ;

fseek (fichier, 0, 2) ;
nb_enreg = ftell (fichier) / sizeof(bloc) ;

/* boucle de corrections d'enregistrements */


/* jusqu'à demande d'arrêt */
do
{ do
{ printf ("\nnuméro enregistrement à modifier (0 pour fin) : ");
scanf ("%d", &num) ;
getchar() ; /* pour sauter le dernier \n" */
horsfich = num < 0 || num > nb_enreg ;
}
while (horsfich) ;

if (num == 0 ) break ; /* sortie boucle si demande arrêt */


pos = (num-1) * sizeof(bloc) ; /* calcul position courante */

fseek (fichier, pos, 0) ; /* positionnement fichier */


fread (&bloc, sizeof(bloc), 1, fichier) ; /* lecture enreg */
affiche (&bloc, num) ; /* affichage enreg */
modifie (&bloc) ; /* modif enreg */
fseek (fichier, pos, 0) ; /* repositionnement fichier */
fwrite (&bloc, sizeof(bloc), 1, fichier) ; /* réécriture enreg */

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 220/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

220 Exercices en langage C


}
while (1) ;

/* fin modifications */
fclose(fichier) ;
printf ("\n\n -------- FIN MODIFICATIONS FICHIER ----------\n") ;
}

/*************************************************/
/* fonction d'affichage d'un enregistrement */
/*************************************************/

void affiche (struct enreg * bloc, int num)


{
int i ;
printf ("\n\nenregistrement numéro : %d\n\n", num) ;
printf ("NOM : %s\n", bloc->nom) ;
printf ("AGE : %d\n", bloc->age) ;
printf ("NOMBRE D'ENFANTS : %d\n", bloc->nbenf) ;
for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)
printf ("AGE ENFANT %2d : %2d\n", i+1, bloc->agenf[i]) ;
}

/***************************************************/

/* fonction de modification d'un enregistrement */


/***************************************************/

void modifie (struct enreg * bloc)


{
char ligne[127] ; /* chaîne de lecture d'une ligne d'écran */
int i ;

printf ("\n\n\entrez vos nouvelles infos (return si pas de modifs)\n") ;

printf ("NOM : ") ;


gets (ligne) ;
if (strlen(ligne)) strcpy (bloc->nom, ligne) ;

printf ("AGE : ") ;


gets (ligne) ;
if (strlen(ligne)) bloc->age = atoi(ligne) ;

printf ("NOMBRE D'ENFANTS : ") ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 221/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 221

gets (ligne) ;
if (strlen(ligne)) bloc->nbenf = atoi(ligne) ;

for (i=0 ; i < bloc->nbenf && i < NBENFMAX ; i++)


{ printf ("AGE ENFANT %2d : ", i+1) ;
gets (ligne) ;
if (strlen(ligne)) bloc->agenf[i] = atoi(ligne) ;
}
}

Commentaires

* N o u s a v o n s o u v e r t l e fic h i e r d a n s l e m o d e r + b , l e q u e l a u t o r is e l a m i s e à j o u r (l e c tu r e e t é c r i tu r e e n u n e m p l a c e m e n t
q u e l c o n q u e d u f i c h i e r ) . N o t e z q u ' i l f a u t é v i t e r d ' é c r i r e i c i r b + , c e q u i n e p r o v o q u e r a it g é n é r a l e m e n t p a s d ' er r eu r
d ' o u v e r t u r e , m a i s q u i e m p ê c h e r a i t to u t e é c r i tu r e d a n s l e f ic h i e r ( ic i , n o t r e p r o g r a m m e n e s ' a p e r c e v r a it p a s d e c e t t e
a n o m a l ie p u i s q u ' i l n e t e s te p a s l e c o d e d e r e t o u r d e f w r i t e ) . E n c e q u i c o n c e r n e l ' i n d i c a t i o n b , r a p p e l o n s q u e c e l l e - c i
n ' e s t i n d i s p en s a b l e q u e d a n s l e s i m p l é m e n t a t io n s q u i d i st in g u e n t l e s f ic h i e r s d e t y p e t e x te d e s a u t r e s . R e v o y e z
é v e n t u e l le m e n t le s c o m m e n t a i re s d e l ' e x e r c i c e V I I . 1 .

* A p r è s l ' o u v e r t u r e d u f i c h ie r , n o u s e n d é t e r m i n o n s l a t a il le ( d a n s l a v a r i a b le n b _ e n r e g ) à l ' a i de d e s f o n c t io n s f s e e k e t
fte ll . P l u s p r é c i sé m e n t :

fseek (fichier, 0, 2)

n o u s p l a c e à 0 o c t e t d e l a f in ( c o d e 2 ) d u f i c h i e r e t :

ftell (fichier)

nous donne la position courante du pointeur associé au fichier (qui pointe ici sur la fin). Il nous est alors facile de la
t r a n s fo r m e r e n u n n o m b r e d ' e n r e g i st r e m e n t s , e n l a d iv i s a n t p a r l a ta i ll e d ' u n e n r e g i st r e m e n t .

* N ' o u b l ie z p a s q u ' a p r è s a v o i r l u u n e n r e g i s tr e m e n t , i l es t n é c e s s a ir e , a v a n t d e l e r é é c r ir e , d e p o si t io n n e r à n o u v e a u l e
p o i n t e u r d a n s l e fi c h i e r .

DISCUSSION

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 222/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

222 Exercices en langage C


* C o m m e d a n s l e s p r é c é d e n t s p r o g r a m m e s , n o u s n ' a v o n s p a s i n t r o d u i t d e p r o t e c t io n s p a r t ic u l i è re s v i s- à - v i s d es r é p o n s e s
f o u r n i e s p a r l ' u t il i sa t e u r (v o y e z l e s d i s c u s si o n s d es p r é c é d en t s p r o g r a m m e s ) . T o u t e fo i s , ic i , l a m a n i è r e m ê m e d o n t n o u s
a v o n s p r o g r a m m é l a s a is i e d e s c o r re c t io n s , i l n ' e x i s te p a s , à c e n i v e a u , d e r i s q u e d e " p l a n g a g e " c o n s é c u t if à u n e
m a u v a i s e r é p o n s e p u i s q u e n o u s n ' a v o n s p a s f a it a p p e l à s c a n f .

V II- 4 C o m p t a g e d e le t t r e s e t m o t s d ' u n f ic h ie r t e x t e

________________________________________________________________________________________

Enoncé

E c r ir e u n p r o g r a m m e q u i , à p a r t ir d ' u n f i c h ie r t e x te , d é te r m i n e :

- le n o m b r e d e c a r a c t è r e s q u ' i l c o n ti e n t,
- le n o m b r e d e c h a c u n e d e s le t tr e s d e l ' a l p h a b e t ( o n n e c o n s i d ér e r a qu e l e s m i n u s c u l es ) ,
- le n o m b r e d e m o t s,
- le n o m b r e d e l i g n e s .
L e s f i n s d e l ig n e s n e d e v r o n t p a s ê t re c o m p t a b i li s é e s d a n s l e s c a r a c t è r e s . O n a d m e t tr a q u e d e u x m o t s s o n t to u j o u r s
s é p a r é s p a r u n o u p l u si e u r s d e s c a r a c t è r e s s u iv a n t s :
- fin de ligne
- espace
- p o n c t u a t io n : : . , ; ? !

- parenthèses : ( )

- guillem ets : "


- apostrophe : '
O n a d m e t tr a é g a le m e n t , p o u r si m p l if ie r , q u ' a u c u n m o t n e p e u t ê t r e c o m m e n c é s u r u n e l ig n e e t s e p o u r su i v r e s u r la
suivante.

I l es t c o n s e i ll é d e r é a l i se r u n e fo n c t i o n p e r m e t ta n t d e d é c i d e r si u n c a r a c t è r e d o n n é , t r a n s m i s en a r g u m e n t , e s t u n d e s
s é p a r a t e u r s m e n t io n n é s c i -d e s su s . E l le r e s t it u e r a l a v a l e u r 1 l o r s q u e l e c a r a c t è r e e s t u n s é p a r a t e u r e t l a v a l e u r 0 d a n s l e
c a s c o n t r a i re .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 223/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 223

Exemple

donnez le nom du fichier à examiner : b:letfic.c


votre fichier contient 87 lignes, 371 mots
et 3186 caractères dont :
69 fois la lettre a
6 fois la lettre b
74 fois la lettre c
36 fois la lettre d
163 fois la lettre e

........

110 fois la lettre t


63 fois la lettre u
7 fois la lettre v
3 fois la lettre w
6 fois la lettre x
0 fois la lettre y
1 fois la lettre z

et 1979 autres caractères

________________________________________________________________________________________

ANALYSE

C o m m e n o u s a v o n s d é j à e u l' o c c a s io n d e le v o i r d a n s le s e x e r c i c e s I -5 e t I -6 , c e t y p e d e p r o b lè m e p e u t ê t r e ré s o l u d ' a u
m o i n s d e u x m a n i è re s :

- e n e f f e c tu a n t u n e r é p é t it io n d u t r a it e m e n t d ' u n c a r a c t è r e ,
- e n e f f e c t u a n t u n e r é p é t it io n d u t r a it e m e n t d ' u n e l ig n e , l u i - m ê m e c o n s t i tu é d e l a r é p é t it io n d u t r a it e m e n t d e c h a c u n
d e s c a r a c t è re s q u ' e l l e c o n t i e n t .

T o u t e fo i s , ic i , n o u s a v o n s à f a i r e à u n f ic h i e r d a n s l e q u e l la l o n g u e u r m a x i m a l e d ' u n e li g n e n ' e s t p a s c o n n u e a p r i o ri , c e
q u i r e n d l a s e c o n d e m é t h o d e d i f fi c il e à m e t tr e e n o e u v r e . N o u s c h o i si r o n s d o n c l a p r e m i è r e ; c h a q u e c a r a c t è r e d u f i c h i e r
s e r a d o n c l u p a r fg e tc .

R a p p e l o n s q u e c e r t a in e s i m p l é m e n t a t io n s d i s t in g u e n t l e s f ic h i e r s d e t y p e t e x te d e s a u t r e s . D a n s c e c a s, u n e t e ll e
d i s ti n c t io n n ' e s t p a s li é e a u c o n t e n u m ê m e d u f ic h i e r ( e n f a i t, o n p e u t t o u j o u r s c o n s i d ér e r q u ' u n f ic h i e r , q u e l q u e s o i t so n
c o n t e n u , e s t fo r m é d ' u n e su i t e d ' o c t e ts , d o n c , f i n a le m e n t , d ' u n e s u i te d e c a r a c t è r e s ). E l l e a si m p l e m e n t p o u r o b j e c t if d e

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 224/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

224 Exercices en langage C


f a ir e e n s o r t e q u e , p o u r l e p r o g r a m m e , l e s " f in s d e l i g n e " a p p a r a is s e n t to u j o u r s m a t é r ia l i s ée s p a r u n c a r a c t è r e u n i q u e , à
s a v o i r \ n (a l o r s q u e , p r é c i s é m e n t , c e r t a i n e s i m p l é m e n t a t io n s , D O S n o ta m m e n t , r e p r é s e n t e n t u n e f i n d e l ig n e p a r u n
" c o u p e " d e c a r a c t è r e s) . L o r s q u ' u n e t e l le d i s t in c t i o n e s t n é c e s s a i r e , i l e s t p r é v u d ' i n t r o d u ir e l ' i n di c a t i o n t , a u n i v e a u d u
m o d e d ' o u v e r t u r e d u f ic h i e r ( d e m ê m e q u ' o n y i n t r o d u i sa i t l ' i n di c a t i o n b p o u r s ig n a l e r q u ' i l n e s ' a g i s s a it p a s d ' u n f ic h i e r
de type texte).

B i e n e n t e n d u , i c i , n o u s a v o n s t o u t i n t é r ê t à p r o f i t e r d e c e t t e p o s si b i l i t é , d e m a n i è r e à n o u s f a c il i te r l a d é t e c t i o n d e s f i n s
d e l i g n e e t , su r t o u t , à o b t e n ir u n p r o g r a m m e p o r t a b l e ( à l' e x c e p t i o n , é v e n t u e l le m e n t , d e l' i n d ic a t io n t ) .

L e s c o m p t a g e s à e f fe c t u e r a u n iv e a u d e s c a r a c t è r e s (n o m b r e d e c a r a c t è r e s , n o m b r e d e c h a c u n e d e s m i n u s c u le s ) p e u v e n t
ê t r e r é a li s é s d e fa ç o n n a t u r e ll e , à c o n d i ti o n t o u t e fo i s d e n e p a s c o m p t a b i li ser \ n c o m m e u n c a r a c t è r e ( a u c o n t ra i r e , à s a
r e n c o n t r e , i l fa u d r a i n c r é m e n t e r l e c o m p t e u r d e l ig n e s ) .

E n c e q u i c o n c e r n e l e s c o m p t a g es d e m o t s, n o u s p r o c é d e r o n s c o m m e d a n s l e p r e m i e r p r o g r a m m e d e l ' e x e r c ic e I - 6 e n
e m p l o ya n t :

- u n e f o n c t io n p e r m e t ta n t d e t e s te r si u n c a r a c t è r e e s t u n s é p a r a t e u r ,
- u n i n d ic a t e u r l o g iq u e : m o t _ e n _ c o u r s .

Programme

#include <stdio.h>
#define LNOMFICH 20 /* longueur maximale d'un nom de fichier */

#define VRAI 1 /* pour "simuler" des ..... */


#define FAUX 0 /* ..... valeurs logiques */

main()
{
int sep (char) ; /* fonction test "caractère séparateur?" */
char nomfich [LNOMFICH+1] ; /* nom du fichier à examiner */

FILE * entree ; /* descripteur du fichier à examiner */


char c ; /* caractère courant */
int compte [26], /* pour compter les différentes lettres */
numl, /* rang lettre courante dans l'alphabet */
ntot, /* compteur nombre total de caractères */
nautres, /* compteur carac autres que minuscules */
nmots, /* compteur du nombre de mots */
nlignes, /* compteur du nombre de lignes */
mot_en_cours, /* indicateur logique : mot trouvé */
i ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 225/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 225

/* entrée du nom de fichier à examiner et ouverture */


/* attention, mode r au lieu de rt, dans certains cas */
do
{ printf ("donnez le nom du fichier à examiner : ") ;
gets (nomfich) ;
if ( (entree = fopen (nomfich, "rt")) == NULL)
printf ("***** fichier non trouvé\n") ;
}
while (entree == NULL) ;

/* initialisations */
for (i=0 ; i<26 ; i++)
compte[i] = 0 ;
ntot = 0 ; nautres = 0 ;
nmots = 0 ;
nlignes = 0 ;
mot_en_cours = FAUX ;

/* boucle d'examen de chacun des caractères du fichier */


while ( c = fgetc (entree), ! feof (entree) )
{
if (c == '\n') nlignes++ ; /* comptages au niveau caractères */
else
{ ntot++ ;
numl = c -'a' ;
if (numl >= 0 && numl < 26) compte[numl]++ ;
else nautres++ ;
}

if (sep(c)) /* comptages au niveau mots */


{ if (mot_en_cours)
{ nmots++ ;
mot_en_cours = FAUX ;
}
}

else mot_en_cours = VRAI ;


}

/* affichage résultats */
printf ("\nvotre fichier contient %d lignes, %d mots\n",
nlignes, nmots) ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 226/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

226 Exercices en langage C


printf ("et %d caractères dont :\n", ntot) ;
for (i=0 ; i<26 ; i++)
printf ("%d fois la lettre %c\n", compte[i], 'a'+i) ;
printf ("\net %d autres caractères\n", nautres) ;
}

/*********************************************************/
/* fonction de test "caractère séparateur" */
/*********************************************************/

int sep (char c)


{
char sep[12] = {'\n', /* fin de ligne */
' ', /* espace */
',', ';', ':', '.', '?', '!', /* ponctuation */
'(', ')', /* parenthèses */
'"', '\'' } ; /* guillemets, apostr*/
int nsep=12, /* nbre séparateurs */
i ;

i = 0 ;
while ( c!=sep[i] && i<nsep ) i++ ;
if (i == nsep) return (0) ;
else return (1) ;
}

Commentaires

Le fichier a été ouvert en mo de r t :

r : o u v e r t u r e e n l e c t u r e . S i l e fi c h i e r n ' e x i s t e p a s , f o p e n f o u r n i t u n p o i n t e u r n u l .
t : o u v e r t u r e e n m o d e t r a n s la t é (v o y e z à c e p r o p o s , l e p r e m i e r c o m m e n t a i re d e l ' e x e r c i c e V I I -1 ) .
N o t e z q u e l e c h o i x d u m o d e t r a n s la t é n ' e s t j a m a i s a b s o l u m e n t in d i s p en s a b l e . T o u te f o i s, c o m m e n o u s l ' a v o n s d i t d a n s
l ' a n a l y s e, i l n o u s f a c i li te l a d é t e c t io n d e f i n d e l ig n e e t , d e p l u s , i l r e n d l e p r o g r a m m e t r a n sp o r t a b le ( p a r e x e m p l e s o u s
U N I X , o ù u n e f i n d e li g n e e s t r e p r é s e n t é e p a r \ n ).

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 227/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

VII. Traitement de fichiers 227

DISCUSSION

N o u s a v o n s s u p p o s é ( im p l ic i te m e n t ) q u e n o t r e p ro g r a m m e t r a it a it u n v é r i ta b l e f ic h i e r t e x t e , a u t re m e n t d i t q u e c e d e r n ie r
s e t e r m i n a i t p a r u n e f i n d e li g n e . S i c e l a n ' é t a i t p a s l e c a s :

- la d e r n i è r e l ig n e n e s e r a i t p a s c o m p t a b i l i s é e,
- le d e r n i e r m o t n e s e r a it p a s c o m p t a b i li s é, à m o i n s d ' ê t r e su i v i d' a u m o i n s u n s ép a r a t e u r .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 228/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 229/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V III : A N A L Y S E
N U M E R IQ U E

C e c h a p i tr e v o u s p r o p o s e q u e l q u e s a p p l ic a t i o n s d u l a n g a g e C à l ' a n a l y s e n u m é r i q u e . N o u s a v o n s c h e r c h é à y i n t r o d u i r e
l e s t e c h n i q u e s d e p r o g r a m m a t io n q u i in t e r v ie n n e n t f ré q u e m m e n t da n s c e d o m a i n e . C i t o n s , p a r e x e m p l e :

- l a r e p r é s e n t a ti o n e t l e s m a n i p u l a ti o n s d e m a t r ic e s ,
- la r e p r é s e n t a ti o n d e n o m b r e s c o m p l e x e s ,
- la r é a l i sa t io n d e m o d u l e s s u s c e p t ib l e s d e t r a v a i l le r a v e c u n e f o n c t io n q u e l c o n q u e o u a v e c d e s t a b l e a u x d e d i m e n s i o n s
quelconques.

V III- 1 P r o d u it d e m a t ric e s r é e lle s

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t io n c a l c u l a n t le p r o d u i t d e d e u x m a t r ic e s r é e l le s . O n su p p o ser a q u e l e p r e m i e r in d ic e d e c h a q u e t a b le a u
r e p r é s e n t a n t u n e m a t r ic e c o r r e s p o n d à u n e l i g n e .

O n p r é v o ir a e n a r g u m e n t s :

- l e s a d r e ss e s d e s d e u x m a t r ic e s à m u l ti p li e r e t c e ll e d e l a m a t r ic e p r o d u i t,
- le n o m b r e d e l ig n e s e t le n o m b r e d e c o l o n n e s d e l a p r e m i è r e m a t r i c e ,
- l e n o m b r e d e c o l o n n e s d e l a s e c o n d e m a t r ic e ( so n n o m b r e d e l i g n e s é t a n t o b li g a to i r e m e n t é g a l a u n o m b r e d e
c o l o n n e s d e l a p r e m i è r e ).
U n p r o g r a m m e p r i n c ip a l p e r m e t tr a d e t e st e r c e t t e fo n c t i o n .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 230/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

230 Exercices en langage C

Exemple

MATRICE A
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7

MATRICE B
0 1 2
1 2 3
2 3 4
3 4 5

PRODUIT A x B
14 20 26
20 30 40
26 40 54
32 50 68
38 60 82

ANALYSE

R a p p e l o n s q u e s i A e s t u n e m a t r ic e n , p ( n l i g n e s e t p c o l o n n e s ) e t si B e s t u n e m a t r ic e p , q , l a m a t r ic e p r o d u i t :

C = A x B
e s t u n e m a t r ic e n , q d é f i n i e p a r :

c = a b
ij ik kj

Programme

#define N 5
#define P 4
#define Q 3

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 231/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 231

main()
{
void prod_mat(double *, double *, double *, int, int, int) ;
double a[N][P], b[P][Q], c[N][Q] ;
int i, j ;
/* initialisation matrice a */
for (i=0 ; i<N ; i++)
for (j=0 ; j<P ; j++)
a[i][j] = i+j ;
/* initialisation matrice b */
for (i=0 ; i<P ; i++)
for (j=0 ; j<Q ; j++)
b[i][j] = i+ j ;

/* calcul produit a x b */
/* les "cast" (int *) sont facultatifs */
prod_mat ( (double *) a, (double *) b, (double *) c, N, P, Q) ;

/* affichage matrice a */
printf (" MATRICE A\n") ;
for (i=0 ; i<N ; i++)
{ for (j=0 ; j<P ; j++)
printf ("%4.0f", a[i][j]) ;
printf ("\n") ;
}
printf ("\n") ;
/* affichage matrice b */
printf (" MATRICE B\n") ;
for (i=0 ; i<P ; i++)
{ for (j=0 ; j<Q ; j++)
printf ("%4.0f", b[i][j]) ;
printf ("\n") ;
}
printf ("\n") ;

/* affichage produit */

printf (" PRODUIT A x B\n") ;


for (i=0 ; i<N ; i++)
{ for (j=0 ; j<Q ; j++)
printf ("%4.0f", c[i][j]) ;
printf ("\n") ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 232/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

232 Exercices en langage C

void prod_mat ( double * a, double * b, double * c,


int n, int p, int q)
{
int i, j, k ;
double s ;
double *aik, *bkj, *cij ;

cij = c ;
for (i=0 ; i<n ; i++)
for (j=0 ; j<q ; j++)
{ aik = a + i*p ;
bkj = b + j ;
s = 0 ;
for (k=0 ; k<p ; k++)
{ s += *aik * *bkj ;
aik++ ;
bkj += q ;
}
* (cij++) = s ;
}
}

Commentaires

* D a n s l a f o n c t io n p r o d _ m a t , n o u s n ' a v o n s p a s p u u t i li s er l e " f o r m a l i sm e " d e s ta b l e a u x p o u r l e s m a t r ic e s a , b e t c c a r


c e l le s - c i p o s s è d e n t d eu x d i m e n si o n s n o n c o n n u e s l o r s d e l a c o m p i la t io n d u p r o g r a m m e . R a p p e l o n s q u ' u n t e l p r o b lè m e n e
s e p o s e p a s l o r s q u ' i l s ' a g i t d e t a b l e a u x à u n e s e u l e d i m e n si o n ( c a r u n e n o t a ti o n t e l le q u e t[ i] a t o u j o u r s u n s e n s , q u e l l e
q u e s o i t l a ta i ll e d e t ) o u l o r s q u ' i l s ' a g i t d' u n t a b l e a u à p l u si eu r s d i m e n s io n s d o n t s e u l e l a p r e m i è r e e s t in c o n n u e ( c o m p t e
t e n u d e l a m a n i è re d o n t le s é l é m e n t s d ' u n t a b l e a u so n t r a n g é s e n m é m o i r e ).

D a n s c e s c o n d i ti o n s , n o u s so m m e s o b l ig é d e f a ir e a p p e l a u f o r m a l i sm e d e s p o i n t e u r s p o u r r e p é r e r u n é l é m e n t q u e l c o n q u e
d e n o s m a t ri c e s . P o u r c e f a ir e , n o u s t r a n s m e t to n s à l a f o n c t io n p r o d m a t l ' a d r e s se d e d é b u t d e s tr o i s m a t r ic e s c o n c e r n é e s .
N o t e z q u ' e n to u t e r ig u e u r ( d u m o i n s d ' a p r è s la n o r m e A N S I ), d a n s l e p r o g r a m m e m a i n , u n s y m b o l e t e l q u e a e s t d u t y p e
( d o u b l e [ P ] ) * ( c ' e s t -à - d ir e q u ' i l r e p r é s e n t e u n p o i n t e u r s u r d e s b l o c s d e P é l é m e n t s d e t y p e d o u b l e ) , e t n o n p a s
si m p l e m e n t d u t y p e d o u b l e * . I l d o i t d o n c ê t r e c o n v e r t i d a n s l e t y p e d o u b l e * , c e t t e c o n v e r si o n n e m o d i f ia n t p a s , e n f a it ,
l ' a d r e s s e c o r r e s p o n d a n t e (r e v o y e z é v e n t u e l le m e n t le s c o m m e n t a i re s d e l ' e x e r c i c e V . 5 d e la p r e m i è r e p a r ti e d e c e t
o u v r a g e ) . C e t te c o n v e r s io n q u e l q u e p e u f ic t i v e p e u t so i t ê tr e m i s e e n p l a c e a u t o m a t iq u e m e n t p a r l e c o m p i la t e u r , a u v u d u

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 233/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 233

p r o t o t yp e , so i t ê t r e e x p l ic i t é e à l ' a i d e d ' u n o p é r a t e u r d e " c a s t " ; c e t te d e r n iè r e f a ç o n d e f a i re a s o u v e n t l e m é r i te d ' é v it e r


d e s m e s s a g e s d ' a v e r t i s se m e n t in t e m p e s t if s ( " w a r n i n g s " ) .

* N o t e z q u e , d a n s l a d é fi n it io n d e l a f o n c t io n p r o d m a t , n o u s a v o n s d û t e n ir c o m p t e d e l a m a n i è r e d o n t l e la n g a g e C r a n g e
e n m é m o ir e l e s é lé m e n t s d ' u n t a b l e a u à d eu x d i m e n s i o n s ( su i v a n t c e q u ' o n n o m m e a b u s i v e m e n t l e s " li g n e s " d u t a b le a u ,
c ' e s t - à - di r e s u i v a n t l' o r d r e o b t e n u e n f a is a n t v a r i e r e n p r e m i e r le d e r n ie r i n d ic e ) . P l u s p r é c i s ém e n t :

- L e s y m b o l e a ik r e p r é s e n t e u n p o i n t e u r c o u r a n t s u r l e s é l é m e n t s a . P o u r c h a q u e v a l e u r d e i , a ik e s t i n i t i a l i s é à
ik
l ' a d r e s s e d u p r e m i e r é lé m e n t d e l a li g n e i d e la m a t r ic e a ( a+i*p) e t i l e s t in c r é m e n t é d ' u n e c o l o n n e , e n m ê m e t e m p s
q u e l ' i n d ic e k ( d ' o ù l a p r é s e n c e d e a i k ++ d a n s l a b o u c l e e n k ) .

- D e m ê m e , b k j r e p r é s e n t e u n p o i n t e u r c o u r a n t su r l e s é lé m e n t s b k j . P o u r c h a q u e v a l e u r d e j , b k j e s t i n i t i a l i s é à
l ' a d r e s s e d u p r e m i e r é lé m e n t d e l a c o l o n n e j d e l a m a t r ic e b ( b+j) e t il e s t in c r é m e n t é d ' u n e l i g n e e n m ê m e te m p s
q u e l ' i n d ic e k ( d ' o ù l a p r é s e n c e d e bkj=bkj+q d a n s l a b o u c l e e n k ) .

- E n f in , c ij r e p r é s e n t e u n p o i n t e u r c o u r a n t s u r l e s é l é m e n t s c . I l e s t in i t ia l i s é à l ' a d r e s s e d u p r e m i e r é l é m e n t d e l a
ij
m a t r ic e c . I l p r o g r e s s e d e 1 à c h a q u e t o u r d e l a bo u c l e la p l u s i n t e r n e e n j ( n o t e z q u ' i l n ' e n a u r a i t p a s é t é a i n si si n o u s
a v i o n s i n v e r s é l e s d e u x b o u c l e s e n i e t j ).

DISCUSSION

* O n a so u v e n t t e n da n c e à d ir e q u ' u n e f o n c t io n c o m m e p r o d _ m a t t ra v a i l le s u r d e s m a t r ic e s d e d i m e n s i o n s v a r i a b le s . E n
f a it , le t e rm e e s t q u e l q u e p e u a m b i g u . A i n s i , d a n s n o t r e e x e m p l e , l e s m a t r ic e s d o n t o n t r a n s m e t l' a d r e s s e e n a r g u m e n t à
p r o d _ m a t o n t u n e t a i ll e b i e n d é t e r m i n é e d a n s le p r o g r a m m e p r i n c ip a l . I l n ' e n r e s te p a s m o i n s q u e :

- d ' u n e p a r t, l a m ê m e f o n c t i o n p e u t t r a v a i ll e r su r d e s m a t r ic e s d e t a i ll es d i f f é r e n te s ,
- d ' a u t r e p a r t, r i e n n ' e m p ê c h e r a i t q u ' a u s e i n d u p r o g r a m m e p r i n c ip a l , l e s m a t r ic e s a , b e t c v o i e n t l e u r ta i ll e d é f in i e
u n i q u e m e n t lo r s d e l ' e x é c u t i o n e t l e u r s e m p l a c e m e n t s a l lo u é s d y n a m i q u e m e n t .

* A u s ei n d ' u n e f o n c t io n c o m m e p r o d _ m a t , i l es t p o s si b l e d ' e m p l o y e r l e f o r m a l i sm e d e s t a b l e a u x à l a p l a c e d e c e l u i d e s
p o i n t e u r s e n f a is a n t a p p e l à u n a r t if ic e . C e l u i- c i c o n s i st e à c r é e r , p o u r c h a q u e m a t r ic e , u n t a b l e a u d e p o i n t e u r s c o n t e n a n t
l ' a d r e s se d e d é b u t d e c h a q u e l i g n e . A i n si , p a r e x e m p l e , p o u r la m a t r ic e a , o n p o u r r a i t r é s e r v e r u n ta b l e a u n o m m é a d a
par :

double * * ada ;

I l s e ra i t re m p l i d e l a m a n i è r e s u i v a n t e :

for (i=1 ; i<n ; i++)


ada[i] = a + i*p ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 234/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

234 Exercices en langage C

D a n s c e s c o n d i ti o n s , e n e f f e t , l a n o t a ti o n a d a [ i ] [ j ] c o r r e s p o n d r a i t (c o m p t e t e n u d e l ' a s s o c i a t iv i té d e g a u c h e à d r o i te d e
l'op érateur []) à :

(ada [i]) [j]

c ' e s t - à - d ir e à :

* (ada [i] + j)

A u t re m e n t d i t , c e t te n o t a ti o n a d a [ i ] [j ] d ési g n e r a i t si m p l e m e n t l a v a l e u r d e l ' é l é m e n t s i tu é à l ' i n t e r s e c t i o n d e l a l ig n e i e t


d e l a c o l o n n e j d e l a m a t r ic e a .

O n n o t e r a q u e p o u r q u e c e t a r ti fi c e s o it u t il i sa b l e a u s e i n d ' u n e f o n c t io n c o m m e p r o d _ m a t , c e n s é e t r a v a i l l e r s u r d e s
m a t r ic e s d e t a i ll e q u e l c o n q u e , i l e s t n é c e s s a ir e q u e l e s e m p l a c e m e n t s d e s t a b le a u x d e p o i n t e u r s t e ls q u e a d a s o i e n t a l l o u é s
dynamiquement.

V III- 2 A r it h m é t iq u e c o m p l e x e

________________________________________________________________________________________

Enoncé

E c r ir e d e u x f o n c t i o n s c a l c u l a n t l a s o m m e e t l e p r o d u i t d e d e u x n o m b r e s c o m p l e x e s . C e s d e r n i e r s s e r o n t r e p r é s e n t é s p a r
u n e s t r u c tu r e c o m p o r t a n t d e u x é lé m e n t s d e ty p e d o u b l e , c o r r e s p o n d a n t à la p a r t i e r é e l l e e t à l a p a r t ie i m a g i n a i r e .

C h a c u n e d e c e s fo n c t i o n s c o m p o r t e r a tr o i s a r g u m e n t s :

- l' a d r e ss e d e s d e u x n o m b r e s c o m p l e x e s ( st r u c tu r e s ) c o n c e r n é s ,
- l ' a d r e s s e d u r é s u l t a t ( s tr u c t u r e ) .
U n p r o g r a m m e p r i n c ip a l p e r m e t tr a d e t e st e r c e s d e u x f o n c t i o n s a v e c le s v a l e u r s c o m p l e x e s :

0,5 + i
1 + i

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 235/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 235

Exemple

0.500000 + 1.000000 i et 1.000000 + 1.000000 i


ont pour somme 1.500000 + 2.000000 i
et pour produit -0.500000 + 1.500000 i

________________________________________________________________________________________

ANALYSE

S o i t d eu x n o m b r e s c o m p l e x e s :

x = a + ib
y = c + id
O n sait que :

x + y = (a + c ) + i ( b + d )
et que :

x y = (a c - bd) + i (a d + bc )

Programme

typedef struct
{ double reel ;
double imag ;
} complexe ;
main()
{
void somme (complexe *, complexe *, complexe *) ;
void produit (complexe *, complexe *, complexe *) ;
complexe z1, z2, s, p ;
z1.reel = 0.5 ; z1.imag = 1.0 ;
z2.reel = 1.0 ; z2.imag = 1.0 ;
somme (&z1, &z2, &s) ;
produit (&z1 ,&z2, &p) ;
printf ("%lf + %lf i et %lf + %lf i \n",

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 236/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

236 Exercices en langage C

z1.reel, z1.imag, z2.reel, z2.imag) ;


printf ("ont pour somme %lf + %lf i \n", s.reel, s.imag) ;
printf ("et pour produit %lf + %lf i \n", p.reel, p.imag) ;
}

void somme (complexe * x, complexe * y, complexe * som)


{
som->reel = x->reel + y->reel ;
som->imag = x->imag + y->imag ;
}

void produit (complexe * x, complexe * y, complexe * prod)


{
prod->reel = x->reel * y->reel - x->imag * y->imag ;
prod->imag = x->reel * y->imag + x->imag * y->reel ;
}

Commentaires

* N o u s a v o n s d é f in i , à u n n i v e a u g lo b a l , u n m o d è l e d e s tr u c tu r e n o m m é c o m p l e x e .

c* a Nr oz 1t e dz é bsiieg nn eq iucei , l da a vn as l el eu r p ro
d ' ug rnaems mt r ue c pt ur in
r e c ;i ppaal r, cl'oa nc tcr èe s, dà a un ns e l es st rufocnt cu tr ieo ns se , fai l i st ep af ar i tl ' op pa ré rla' ot epué rr a"t.e"u r( c-> ( c eo md amn es dza1n. rs e xe -
om m l)
>r e e l ) c a r x d é s i g n e a l o r s l ' a d r e s s e d ' u n e s t ru c t u r e . O n p e u t t o u te f o i s é v i te r l' e m p l o i d e c e t o p é r a t e u r , e n r e m a r q u a n t
q u e x -> r e el e s t é q u i v a l e n t à ( * x ) . r e e l .

* E n t o u te r ig u e u r , d ' a p r è s la n o r m e A N S I , il e st p o ss i b le d e t r a n s m e t tr e , e n a r g u m e n t d ' u n e f o n c t io n , l a v a l e u r d ' u n e


s t ru c t u r e . A u ssi , a u r i o n s- n o u s p u p r é v o i r q u e s o m m e e t p r o d u i t r e ç o i v e n t l e s v a l e u r s d e s c o m p l e x e s s u r l e s q u e l s p o r t e
l ' o p é r a t i o n . E n r e v a n c h e , l e r é s u l ta t d e v r a i t to u j o u r s ê t re t r a n s m i s p a r v a l e u r p u i s q u e d é t e rm i n é p a r l a f o n c t io n e l le -
m ê m e . P a r e x e m p l e , la d é f in i ti o n d e s o m m e a u r a i t p u ê t r e :

void somme (complexe x, complexe y, complexe * som)


{

prod->reel = x.reel + y.reel ;


prod->imag = x.imag + y.imag ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 237/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 237

DISCUSSION

D a n s l a p r a t iq u e , l e s f o n c t i o n s s o m m e e t p r o d u i t s e r a i e n t c o m p i lé e s s é p a r é m e n t d e s f o n c t io n s l e s u t i li s a n t. P o u r c e f a ir e ,
i l e s t n é c e s s a i r e q u ' e l l e s d i s p o s e n t d e l a d e s c r i p t i o n d e l a s t r u c t u r e c o m p l e x e . O n v o i t q u ' o n r i sq u e a l o rs d ' ê t r e a m e n é à
d é c r i r e u n e m ê m e s t ru c t u r e à d i f fé r e n t e s r e p r is e s . C e r t e s , ic i l a c h o s e n ' e s t p a s b i en g r a v e , d a n s l a m e s u r e o ù c e t te
d é f i n it io n e s t s im p l e . D ' u n e m a n i è r e g é n é r a l e , t o u t e fo i s , o n a t o u t i n té r ê t à r é g l e r c e ty p e d e p r o b l è m e e n p l a ç a n t u n e f o i s
p o u r t o u t e s u n e t e l le d é f i n it io n d a n s u n f i c h i e r ( d' e x t e n si o n h , p a r e x e m p l e ) q u ' o n i n c o r p o r e p a r # i n c l u d e d a n s t o u s l e s
p r o g r a m m e s e n a y a n t b eso i n .

V III- 3 P ro d u i t d e m a t r ic e s c o m p l e x e s

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c tio n c a l c u l a n t l e p r o d u i t d e d e u x m a t r ic e s c o m p l e x e s . C h a q u e m a t r ic e s e r a d é f in i e c o m m e u n t a b l e a u à
d e u x d i m e n s io n s d a n s le q u e l c h a q u e é l é m e n t s e r a u n e s tr u c t u r e r e p r é s e n ta n t u n n o m b r e c o m p l e x e ; c e t te s t r u c tu r e s e r a
c o n s t it u é e d e d e u x é l é m e n t s d e ty p e d o u b l e c o r r e s p o n d a n t à l a p a r t ie r é e l le e t à l a p a r t ie i m a g i n a i re d u n o m b r e . O n
su p p o ser a q u e l e p r e m i e r in d ic e d u t a b le a u r e p r é s e n t a n t u n e m a t r ic e c o r r e s p o n d à une ligne.

O n p r é v o ir a e n a r g u m e n t s :

- l e s a d r e ss e s d e s d e u x m a t r ic e s à m u l ti p li e r ,
- l ' a d r e s s e d e l a m a t r ic e p r o d u i t,
- le n o m b r e d e l i g n e s e t d e c o l o n n e s d e l a p r e m i è r e m a t r ic e ,
- l e n o m b r e d e c o l o n n e s d e l a d eu x i è m e m a t r ic e ( so n n o m b r e d e l ig n e s é t a n t o b li g a to i r e m e n t é g a l a u n o m b r e d e
c o l o n n e s d e l a p r e m i è r e ).
O n r é a l i ser a u n p r o g r a m m e p r i n c ip a l p e r m e t ta n t d e t e s te r c e t te f o n c t io n .
O n p o u r r a é v e n t u e ll e m e n t f a ir e a p p e l a u x f o n c t io n s s o m m e e t p r o d u i t r é a l i s é e s d a n s l ' e x e r c i c e V I I I - 2 p o u r c a l c u l e r l a
so m m e e t le p r o d u it d e d e u x n o m b r e s c o m p l e x e s .

Exemple

MATRICE A
0+ 0i 1+ 2i 2+ 4i 3+ 6i

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 238/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

238 Exercices en langage C

1+ 1i 2+ 3i 3+ 5i 4+ 7i
2+ 2i 3+ 4i 4+ 6i 5+ 8i
3+ 3i 4+ 5i 5+ 7i 6+ 9i
4+ 4i 5+ 6i 6+ 8i 7+ 10i

MATRICE B
0+ 0i 1+ 2i 2+ 4i
1+ 1i 2+ 3i 3+ 5i
2+ 2i 3+ 4i 4+ 6i
3+ 3i 4+ 5i 5+ 7i

PRODUIT A x B
-14+ 42i -32+ 66i -50+ 90i
-14+ 54i -36+ 90i -58+ 126i
-14+ 66i -40+ 114i -66+ 162i
-14+ 78i -44+ 138i -74+ 198i
-14+ 90i -48+ 162i -82+ 234i

________________________________________________________________________________________

ANALYSE

L e s f o r m u l e s d e d é f in i ti o n d u p r o d u i t d e m a t r ic e s c o m p l e x e s r e s te n t c e l le s p r o p o s é e s d a n s l ' a n a l y s e d e l ' e x e r c i c e V I I I -1
p o u r l e s m a t r ic e s r é e l le s ; il su f f it d ' y r e m p l a c e r le s o p é r a t i o n s + e t x p o r t a n t su r d e s r é e ls p a r l e s o p é r a t io n s s o m m e e t
p r o d u i t d e d eu x c o m p l e x e s ( le s r è g l e s d e c e s d e u x o p é r a t io n s o n t é t é e x p o s é e s d a n s l ' a n a l y s e d e l ' e x e r c i c e V I I I- 2) .

Programme

#define N 5
#define P 4

#define Q 3

typedef struct
{ double reel ;
double imag ;
} complexe ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 239/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 239

main()
{
void prod_mat (complexe *, complexe *, complexe *, int, int, int) ;
complexe a[N][P], b[P][Q], c[N][Q] ;
int i, j ;

/* initialisation matrice a */
for (i=0 ; i<N ; i++)
for (j=0 ; j<P ; j++)
{ a[i][j].reel = i+j ;
a[i][j].imag = i+2*j ;
}
/* initialisation matrice b */
for (i=0 ; i<P ; i++)
for (j=0 ; j<Q ; j++)
{ b[i][j].reel = i+j ;
b[i][j].imag = i+2*j ;
}

/* calcul produit a x b */
/* les "cast" (complexe *) sont facultatifs */
prod_mat ((complexe *) &a, (complexe *) &b, (complexe *) &c, N, P, Q) ;

/* affichage matrice a */
printf (" MATRICE A\n") ;
for (i=0 ; i<N ; i++)
{ for (j=0 ; j<P ; j++)
printf ("%4.0lf+%4.0lfi ", a[i][j].reel, a[i][j].imag) ;
printf ("\n") ;
}
printf ("\n") ;

/* affichage matrice b */
printf (" MATRICE B\n") ;
for (i=0 ; i<P ; i++)

{ for (j=0 ; j<Q ; j++)


printf ("%4.0lf+%4.0lfi ", b[i][j].reel, b[i][j].imag) ;
printf ("\n") ;
}
printf ("\n") ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 240/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

240 Exercices en langage C

/* affichage produit */
printf (" PRODUIT A x B\n") ;
for (i=0 ; i<N ; i++)
{ for (j=0 ; j<Q ; j++)
printf ("%4.0lf+%4.0lfi ", c[i][j].reel, c[i][j].imag) ;
printf ("\n") ;
}
}
/*********************************************************/
/* fonction de calcul de produit de 2 matrices complexes */
/*********************************************************/

void prod_mat ( complexe * a, complexe * b, complexe * c,


int n, int p, int q)
{
void produit() ;
int i, j, k ;
complexe s, pr ;
complexe *aik, *bkj, *cij ;

cij = c ;
for (i=0 ; i<n ; i++)
for (j=0 ; j<q ; j++)
{ aik = a + i*p ;
bkj = b + j ;
s.reel = 0 ; s.imag = 0 ;
for (k=0 ; k<p ; k++)
{ produit (aik, bkj, &pr) ;
s.reel += pr.reel ; s.imag += pr.imag ;
aik++ ;
bkj += q ;
}
* (cij++) = s ;
}
}

void produit (x, y, prod)

complexe *x, *y, *prod ;


{
prod->reel = x->reel * y->reel - x->imag * y->imag ;
prod->imag = x->reel * y->imag + x->imag * y->reel ;
}

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 241/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 241

Commentaires

L a f o n c t i o n p r o d _ m a t p e u t ê t re c o n s i d é r é e c o m m e u n e a d a p t a ti o n d e l a fo n c t i o n p r o d _ m a t d e l ' e x e r c i c e V I I I- 1. C e t te
f o i s, l e s s y m b o l e s a i k , b k j e t c ij d é si g n e n t , n o n p l u s d e s p o i n t e u r s s u r d e s r é e l s , m a i s d e s p o i n t e u r s s u r u n e s t ru c t u r e
r e p r é s e n t a n t u n n o m b r e c o m p l e x e . L a s o u p l e ss e d u l a n g a g e C e n m a t iè r e d ' o p é r a t i o n s a r it h m é t iq u e s s u r l e s p o i n t e u r s fa i t
q u e l e s in s t r u c t i o n s d ' i n c r é m e n t a t i o n d e c e s q u a n t i té s r e s t e n t l e s m ê m e s ( l' u n i t é é t a n t i c i l a s tr u c t u r e c o m p l e x e - s o i t 2
élém en ts d e ty p e double , au lieu d ' u n e v aleu r d e ty p e double ).

DISCUSSION

L e s r e m a r q u e s f a i te s d a n s l ' e x e r c i c e V I I I -2 , à p r o p o s d e l a d e s c r ip t io n d e l a s t r u c t u re c o m p l e x e r e s te n t n a t u r e ll e m e n t
valables ici.

V III- 4 R e c h e r c h e d e z é r o d ' u n e f o n c t io n p a r d ic h o t o m ie

________________________________________________________________________________________

Enoncé

E c r ir e u n e f o n c t i o n d é t e r m i n a n t , p a r d i c h o t o m i e , le z é r o d ' u n e f o n c t i o n q u e l c o n q u e ( r é e ll e d ' u n e v a r i a b le r é e l l e e t
c o n t i n u e ) . O n su p p o ser a c o n n u u n i n t e r v a ll e [ a , b ] su r l e q u e l l a f o n c t io n c h a n g e d e s i g n e , c ' e st -à - d ir e t e l q u e f ( a ). f ( b ) so i t
négatif.

O n p r é v o ir a e n a r g u m e n t s :

- l e s v a le u r s d e s b o r n e s a e t b ( d e t y p e d o u b l e ) d e l ' i n t e r v a l l e d e d é p a r t ,
- l ' a d r e s s e d ' u n e f o n c t io n p e r m e t ta n t d e c a l c u l e r la v a l e u r d e f p o u r u n e v a l e u r q u e l c o n q u e d e l a v a r ia b l e . O n
su p p o ser a q u e l ' e n - tê t e d e c e t t e f o n c t io n e s t d e l a f o r m e :
double fct (x)
double x ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 242/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

242 Exercices en langage C

- l' a d r e ss e d ' u n e v a r i a bl e d e t y p e d o u b l e d e s t in é e à r e c u e i ll ir l a v a l e u r a p p r o c h é e d u z é r o d e f ,
- la v a l e u r d e l a p r é c i si o n ( a b so l u e ) s o u h a i t é e ( d e ty p e d o u b l e ) .
L e c o d e d e r e t o u r d e l a f o n c t io n s e r a d e - 1 l o rs q u e l ' i n t e r v a ll e f o u r n i e n a r g u m e n t n e c o n v i e n t p a s , c ' e s t -à - d ir e :

- so i t l o r s q u e la c o n d it io n a < b n ' e st p a s s a ti s fa i te ,
- so i t l o r s q u e l a c o n d it io n f ( a ) . f( b ) < 0 n ' e s t p a s s a t i sf a it e .
D a n s l e c a s c o n t r a i re , l e c o d e d e r e t o u r s e r a é g a l à 0 .

U n p r o g r a m m e p r i n c ip a l p e r m e t tr a d e t e st e r c e t t e fo n c t i o n .

Exemple

zéro de la fonction sin entre -1 et 1 à 1e-2 près = 0.000000e+000


zéro de la fonction sin entre -1 et 2 à 1e-2 près = 1.953125e-003
zéro de la fonction sin entre -1 et 2 à 1e-12 près = -2.273737e-013

________________________________________________________________________________________

ANALYSE

L a d é m a r c h e c o n s i s te d o n c , a p r è s a v o i r v é r i fi é q u e l ' i n t e rv a l le r e ç u e n a r g u m e n t é t a it c o n v e n a b le , à r é p é t e r l e t ra i te m e n t
suivant :

- p r e n dr e le m i l ie u m d e [ a , b ] : m = ( a + b ) / 2
- c a l c u l e r f( m ) ,
- si f ( m ) = 0 , l e z é r o e s t e n m ,
- si f (a ) . f (m ) < 0 , i l e x is te u n z é r o s u r [ a , m ] ; o n r e m p l a c e d o n c l ' i n te r v a l le [ a , b ] p a r [a , m ] e n f a is a n t :
b = m

- si f (a ) . f (m ) > 0 , i l e x is te u n z é r o s u r [ b , m ] ; o n r e m p l a c e d o n c l ' i n te r v a l le [ a , b ] p a r [ b , m ] , e n f a i s a n t :
a = m
L e t r a it e m e n t e s t in t e r r o m p u s o i t lo r s q u e l ' i n t e r v a ll e [ a , b ] a u ra é t é s u f fi s a m m e n t r éd u i t , c ' e s t -à - d ir e l o r s q u e | b - a | e s t
i n f é r ie u r à l a p r é c i si o n so u h a i té e , s o i t l o rs q u e l e z é r o a é t é l oc a l i s é ex a c t e m e n t ( f( m ) = 0 ) .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 243/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 243

Programme

#include <stdio.h>
#include <math.h> /* pour la fonction sin */
main()
{ /* fonction de recherche d'un zéro par dichotomie */
int dichoto ( double (*(double)(), double, double, double *, double) ;
double z, /* zéro recherché */
a, b, /* bornes de l'intervalle de recherche */
eps ; /* précision souhaitée */

dichoto (sin, -1.0, 1.0, &z, 1.0e-2) ;


printf ("zéro de la fonction sin entre -1 et 1 à 1e-2 près = %le\n",z);

dichoto (sin, -1.0, 2.0, &z, 1.0e-2) ;


printf ("zéro de la fonction sin entre -1 et 2 à 1e-2 près = %le\n",z);

dichoto (sin, -1.0, 2.0, &z, 1.0e-12) ;


printf ("zéro de la fonction sin entre -1 et 2 à 1e-12 près = %le\n",z);
}
/*************************************************************/
/* fonction de recherhce dichotomique du zéro d'une fonction */
/*************************************************************/

int dichoto ( double (* f)(double), double a, double b, double * zero, double eps)

/* f : fonction dont on cherche le zéro */


/* a, b : bornes de l'intervalle de recherche */
/* zero : zéro estimé */
/* eps : précision souhaitée) */
{
double m, /* milieu de l'intervalle courant */
fm, /* valeur de f(m) */
fa, fb ; /* valeurs de f(a) et de f(b) */

fa = (*f)(a) ;

fb = (*f)(b) ;
if (fa*fb >= 0 || a >= b) return (-1) ; /* intervalle incorrect */

while (b-a > eps)


{ m = (b+a) / 2.0 ;

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 244/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

244 Exercices en langage C

fm = (*f)(m) ;
if (fm == 0) break ; /* zéro atteint */
if (fa*fm < 0) { b = m ;
fb = fm ;
}
else { a = m ;
fa = fm ;
}
}
* zero = m ;
return (0) ;
}

Commentaires

* N o t e z , d a n s l a f o n c t io n d i c h o t o :

- la d é c la r a t io n d e l ' a r g u m e n t c o r r e s p o n d a n t à l ' a d r e ss e d e l a f o n c t i o n d o n t o n c h e r c h e l e z é r o :
d o u b l e ( * f ) (d o u b l e )

C e l le - c i s' i n t e r p r è te c o m m e s u i t :
( * f ) e s t u n e f o n c ti o n r e c e v a n t u n a r g u m e n t d e t y p e d o u b l e e t f o u r n i s s a n t u n r é s u l t a t d e t y p e d o u b l e ,
* f e s t d o n c u n e f o n c t io n r e c e v a n t u n a r g u m e n t d e t yp e d o u b l e e t f o u r n i s s a n t u n r é s u l t a t d e t y p e d o u b l e ,
f e s t do n c u n p o i n t e u r su r u n e f o n c t io n r e c e v a n t u n a r g u m e n t d e t y p e d o u b l e e t f o u r n i s s a n t u n r é s u l t a t d e t y p e
double .

- l ' u t i l i sa t i o n d u s y m b o l e f ; a i n s i ( * f ) (a ) r e p r é s e n t e l a v a l e u r d e l a f o n c t io n ( * f ) ( f o n c t i o n d ' a d r e s s e f ) , à l a q u e l le o n
fournit l'argum ent a.
L e s m ê m e s r é f le x i o n s s ' a p p l i q u e n t a u p r o t o ty p e s e r v a n t à d é c l a r e r d i c h o t o .

* L a f o n c t io n d i c h o t o r e c e v a n t e n a r g u m e n t le s v a l e u r s d e s a r g u m e n t s a e t b ( e t n o n d e s a d r e s s e s ) , n o u s p o u v o n s n o u s
p e r m e t tr e d e l e s m o d i f ie r a u s e i n d e l a f o n c t i o n , s a n s q u e c e l a a i t d' i n c i d e n c e s u r l e s v a l e u r s e f f e c ti v es d e s b o r n e s
d é f i n ie s d a n s l e p r o g r a m m e p r i n c ip a l .

* V o y e z c o m m e n t , d a n s le p r o g r a m m e p r in c i p a l, u n s y m b o l e c o m m e si n e s t in t e r p r é té p a r l e c o m p i la t e u r c o m m e
l ' a d r e s s e d ' u n e f o n c t io n p r é d é f i n ie ; i l e s t to u t e f o is n é c e s s a ir e d ' a v o i r i n c o r p o r é s o n p r o t o t y p e ( si t u é d a n s m a t h . h ) ; e n

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 245/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

V I I I. A n a l y s e n u m é r iq u e 245

l ' a b s e n c e d e l ' i n s tr u c t io n # i n c l u d e c o r r e s p o n d a n t e , l e c o m p i la t e u r d é t e c t e ra i t u n e r r e u r p u i s q u e a l o r s l e sy m b o l e si n n e
s e r a i t p a s d é f in i .

DISCUSSION

E n t h é o r ie , l a m é t h o d e d e d i c h o t o m i e c o n d u i t t o u j o u r s à u n e s o l u t io n , a v e c u n e p r é c i si o n a u s si g r a n d e q u ' o n l e d é si r e , à
p a r t ir d u m o m e n t o ù l a f o n c t io n c h a n g e e f fe c t iv e m e n t d e si g n e su r l ' i n te r v a l le d e d é p a r t . E n p r a t i q u e , t o u t e fo i s , l e s
c h o s e s n e s o n t p a s t o u j o u r s a u s si i d y l l iq u e s , c o m p t e t e n u d e l a l i m i t a ti o n d e l a p r é c i si o n d e s c a lc u l s .

T o u t d ' a b o r d , s i o n i m p o s e u n e p r é c i si o n t r o p f a i b le p a r r a p p o r t à la p r é c i si o n d e l' o r d i n a t e u r , o n p e u t a b o u t i r à c e q u e :
m = (a+b)/2

so i t é g a l à l ' u n e d es d eu x b o r n e s a o u b . I l e s t a l o r s fa c i le d e m o n t r e r q u e l ' a l g o r i th m e p e u t b o u c l e r i n d é fi n im e n t .

D ' a u t r e p a r t , le s v a l e u r s d e f (a ) e t d e f ( b ) so n t n é c e s s a ir e m e n t é v a l u é e s d e m a n i è r e a p p r o c h é e . D a n s le c a s d e f o r m u l e s
q u e l q u e p e u c o m p l e x e s , o n p e u t tr è s b i e n a b o u t ir à u n e s i t u a t io n d a n s l a q u e l l e f (a ) . f ( b ) e s t p o s i t i f.

L a p r e m i è r e s i tu a t i o n e s t a s s e z f a c il e à é v i t e r : i l su f f i t d e c h o i s ir u n e p r é c i si o n r e l a t i v e (a t t e n t i o n , i c i , n o t r e f o n c t io n
t ra v a i l le a v e c u n e p r é c i si o n a b so l u e ) in f é r ie u r e à c e l l e d e l ' o r d in a t e u r . I l n ' e n v a p a s d e m ê m e p o u r l a s e c o n d e d a n s l a
m e s u r e o ù i l n ' e s t p a s t o u j o u r s p o s si b l e d e m a î tr is e r l a p r é c i si o n d e s c a lc u l s d e s v a l e u r s d e f .

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 246/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com

http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 247/247

Você também pode gostar