Escolar Documentos
Profissional Documentos
Cultura Documentos
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 .
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 */
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 = .
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
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 .
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é
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 )
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 ) .
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
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
___________________________________________________________________________
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 :
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 :
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
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
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") ;
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
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 :
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 :
ou :
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 :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 21/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
___________________________________________________________________________
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
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<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
___________________________________________________________________________
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 :
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) ;
#include <stdio.h>
#include <math.h>
main()
{ double x ;
do
{ printf ("donnez un nombre positif : ") ;
scanf ("%le", &x) ;
Remar que :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 29/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
___________________________________________________________________________
Enoncé
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
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
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é
combien de lignes ? 10
*
***
*****
*******
*********
***********
*************
***************
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 31/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
___________________________________________________________________________
Solution
#include <stdio.h>
main()
{ int nlignes ; /* nombre total de lignes */
int nl ; /* compteur de ligne */
int nesp ; /* nombre d'espaces précédent une étoile */
int j ;
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
___________________________________________________________________________
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
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) ;
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
_______________________________________________________________
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 */
}
}
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é
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 ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 37/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 :
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
_______________________________________________________________
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() ;
}
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
Solution
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>
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 ;
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
main()
{
float oper (float, float) ; /* prototype de oper */
float x, y ;
printf ("donnez deux nombres réels : ") ;
Remar que :
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>
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
___________________________________________________________________________
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>
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 (adt = t ; adt < t+3 ; adt++) printf ("%d ", *adt) ; /* 4 */
printf ("\n") ;
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 .
/ * 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 ].
/ * 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 :
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] ;
#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] ;
max = min = *t ;
for (i=1 ; i<NVAL ; i++)
{ if (*(t+i) > max) max = *(t+i) ;
if (*(t+i) < min) min = *(t+i) ;
}
Ex e rc ic e V . 3
___________________________________________________________________________
Enoncé
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 à :
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é
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 .
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 é ) .
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 .
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 :
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 ;
}
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 ) :
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 :
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] ;
}
}
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 .
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 :
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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 63/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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++)) ;
}
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
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 :
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
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 :
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) */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 67/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
Remarques
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
ne = 0 ;
i = 0 ;
while (ligne[i]) if (ligne[i++] == '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
_______________________________________________________________
Solution
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 é 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") ) ;
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
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>
main()
{
char ligne [LG_LIG+1] ; /* pour lire une ligne +1 pour \0 */
char * adr ; /* pointeur à l'intérieur de la 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
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 ;
} ;
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>
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 :
E x e r c ic e V II. 2
___________________________________________________________________________
Enoncé
_______________________________________________________________
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 ;
} ;
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 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
#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 ;
}
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 :
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 :
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
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) ;
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>
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 :
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
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
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 :
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 :
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é
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
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 ) .
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 */
}
}
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 .
* 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
* 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
________________________________________________________________________________________
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
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
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()
{
/* 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 */
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 :
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 :
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 .
prem < N
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 97/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
* 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
_________________
________________________________________________________________________________________
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 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 ;
/* 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
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
________________________________________________________________________________________
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 .
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.
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 102/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 ;
/* 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 ;
}
}
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
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 ) .
* 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 []
ou même :
char * mot
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 104/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
- 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
* 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
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
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
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 */
/* initialisations */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 107/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* 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
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 ;
/* affichage résultats */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 109/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 : ( )
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
_______________________________________________________________________________________
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
- 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()
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
/*******************************************/
/* 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 ).
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
* 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 :
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 */
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
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 :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 116/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
Exemples
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
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 :
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 é .
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 :
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
* 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é
- 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
Exemple
donnez votre message (1 ligne maxi) :
LE LANGAGE C, CONCU EN 1972, EST L'OEUVRE DE DENIS RITCHIE.
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', "..-.",
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 122/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
{ 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 :
DISCUSSION
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
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
________________________________________________________________________________________
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', ".-..",
int i, j ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 126/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 " .
* 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 :
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).
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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 128/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
FACTURE
TOTAL 16375.50
________________________________________________________________________________________
ANALYSE
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>
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 ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 130/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* 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
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
* 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.
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
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
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 */
main()
{
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 135/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/********************************************************/
/* 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
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 .
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 )
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 137/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
________________________________________________________________________________________
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
#include <stdio.h>
#include <stdlib.h> /* pour la fonction rand */
#include <time.h> /* pour la fonction time */
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 ;
/********************************************************/
/* 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 */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 139/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* 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 .
________________________________________________________________________________________
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 140/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 .
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 141/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 142/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/*******************************************************/
/* fonction de tirage aléatoire d'un nombre dans [0,n] */
/*******************************************************/
int aleat (int n)
{
int i ;
Commentaires
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 143/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 144/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 ;
{ 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
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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 146/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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.
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
Programme
#include <stdio.h>
#include <stdlib.h>
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 ;
/* 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
/* 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
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
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 :
- 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
main()
{
void tirage (int []) ; /*****************************/
int entree (int []) ; /* prototypes fonctions */
void analyse(int [], int[], int[], int []) ; /*****************************/
/* 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
/*************************************************/
/* 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 ;
/* contrôles */
if (strlen (&ch[2]) != NPOS) return(-1) ;
/**************************************************/
/* 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 ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 153/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 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
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
* 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é
Exemple
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 156/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
________________________________________________________________________________________
ANALYSE
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 ;
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
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
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
________________________________________________________________________________________
ANALYSE
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 .
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
/**************************************************/
/* 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 " ) .
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 162/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
- 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
________________________________________________________________________________________
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 :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 164/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
#include <stdio.h>
#include <string.h>
adr[i] = chaines[i] ;
}
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 ;
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 :
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) .
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 166/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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[]
adr[i] = adr[j]
* (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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 168/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
- 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
*/
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
/********************************************************/
/* 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 */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 170/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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) */
/*******************************************************/
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é
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 :
Exemples
________________
________________________________________________________________________________________
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 172/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
ANALYSE
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 .
- 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 */
/* ----------------------------------------------------------------------*/
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é */
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
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 :
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
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 176/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
________________________________________________________________________________________
ANALYSE
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 */
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
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 :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 178/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 :
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 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
fin création
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 180/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
________________________________________________________________________________________
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 ;
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
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") ;
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 .
* 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
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 .
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
fin création
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
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 */
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
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
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 .
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 188/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 .
- 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>
main()
{
void creation (t_element * *) ; /* fonction de création 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 */
/******************************************************/
/* fonction de liste d'une liste chaînée */
/******************************************************/
void liste (t_element * debut)
{
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 190/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 ) .
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
________________________________________________________________________________________
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>
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 193/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
}
}
Commentaires
* 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
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
________________________________________________________________________________________
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
Programme
#include <stdio.h>
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 .
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 196/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
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
____________________
________________________________________________________________________________________
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
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 */
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
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
_______________________
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 200/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
________________________________________________________________________________________
ANALYSE
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 */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 201/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
Commentaires
plutôt que :
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 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
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 */
/***********************************************************/
/* fonction récursive de calcul de la fonction d'Ackermann */
/***********************************************************/
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 203/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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
________________________________________________________________________________________
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
Programme
#include <stdio.h>
main()
{
void hanoi (int, int, int, int) ;
int nd ; /* nombre total de disques */
/***********************************************/
/* 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
Exemple
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 :
________________________________________________________________________________________
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.
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
- 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 ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 210/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* fin création */
fclose(sortie) ;
printf ("\n -------- FIN CREATION FICHIER ----------") ;
}
Commentaires
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 .
* 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
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 :
* 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 .
- 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
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 .
________________________________________________________________________________________
Enoncé
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
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
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
________________________________________________________________________________________
Programme
#include <stdio.h>
#include <string.h>
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 214/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* 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 */
/*************************************************/
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 215/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 .
* 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
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 ).
* 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 :
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
O n p r é v o i r a d e u x f o n c t io n s :
Exemple
enregistrement numéro : 2
NOM : dunoyer
AGE : 29
NOMBRE D'ENFANTS : 0
________________________________________________________________________________________
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 218/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 .
Programme
#include <stdio.h>
#include <string.h>
main()
{
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 219/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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) ;
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 220/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* fin modifications */
fclose(fichier) ;
printf ("\n\n -------- FIN MODIFICATIONS FICHIER ----------\n") ;
}
/*************************************************/
/* fonction d'affichage d'un enregistrement */
/*************************************************/
/***************************************************/
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 221/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
gets (ligne) ;
if (strlen(ligne)) bloc->nbenf = 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
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 : ( )
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
Exemple
........
________________________________________________________________________________________
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
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 */
main()
{
int sep (char) ; /* fonction test "caractère séparateur?" */
char nomfich [LNOMFICH+1] ; /* nom du fichier à examiner */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 225/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* initialisations */
for (i=0 ; i<26 ; i++)
compte[i] = 0 ;
ntot = 0 ; nautres = 0 ;
nmots = 0 ;
nlignes = 0 ;
mot_en_cours = FAUX ;
/* 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
/*********************************************************/
/* fonction de test "caractère séparateur" */
/*********************************************************/
i = 0 ;
while ( c!=sep[i] && i<nsep ) i++ ;
if (i == nsep) return (0) ;
else return (1) ;
}
Commentaires
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
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.
________________________________________________________________________________________
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
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 */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 232/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 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
* 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 :
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 234/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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 []) à :
c ' e s t - à - d ir e à :
* (ada [i] + j)
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
________________________________________________________________________________________
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
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 .
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
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++)
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 240/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
/* 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 */
/*********************************************************/
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 ;
}
}
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
- 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
________________________________________________________________________________________
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 */
int dichoto ( double (* f)(double), double a, double b, double * zero, double eps)
fa = (*f)(a) ;
fb = (*f)(b) ;
if (fa*fb >= 0 || a >= b) return (-1) ; /* intervalle incorrect */
http://slidepdf.com/reader/full/exercices-en-langage-c-delannoy 244/247
5/10/2018 Exercicesen LangageCDelannoy-slidepdf.com
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