Algorithmique et Programmation – Examen (dur´ ee 3 heures) CORRECTION de la premi` ere session du 9 juin 2021
Remarque : Ce document ne pr´ esente que des ´ el´ ements de correction. Les variantes possibles sont nombreuses.
Exercice 1 : Inclusion mutuelle d’objets communicants a)
1 c h a r i n c l u s i o n _ c e r c l e s (int c1x , int c1y , int c1r , int c2x , int c2y , int c2r ) { 2 d o u b l e d i s t = s q r t (( c1x - c2x ) * ( c1x - c2x ) + ( c1y - c2y ) * ( c1y - c2y ) ) ; 3 c h a r res = 0 ;
4
5 if ( d i s t < c1r && d i s t < c2r ) {
6 res = 3 ;
7 }
8 e l s e if ( d i s t < c1r || d i s t < c2r ) {
9 res = 2 ;
10 }
11 e l s e if ( d i s t - c1r - c2r > 0) {
12 res = 1 ;
13 }
14
15 r e t u r n res ; 16 }
ou encore :
1 c h a r i n c l u s i o n _ c e r c l e s (int c1x , int c1y , int c1r , int c2x , int c2y , int c2r ) { 2 d o u b l e d i s t = s q r t (( c1x - c2x ) * ( c1x - c2x ) + ( c1y - c2y ) * ( c1y - c2y ) ) ; 3
4 if ( d i s t < c1r && d i s t < c2r ) 5 r e t u r n 3 ;
6
7 if ( d i s t < c1r || d i s t < c2r ) 8 r e t u r n 2 ;
9
10 if ( d i s t - c1r - c2r > 0) 11 r e t u r n 1 ;
12
13 r e t u r n 0 ; 14 }
b)
1 int m a i n () {
2 int d1 , d2 ;
3
4 p r i n t f (" D o n n e z le p r e m i e r r a y o n : ") ; 5 s c a n f (" % d ", & d1 ) ;
6
7 p r i n t f (" D o n n e z le d e u x i e m e r a y o n : ") ; 8 s c a n f (" % d ", & d2 ) ;
9
10 if ( i n c l u s i o n _ c e r c l e s ( -2 , 3 , d1 , 2 , 3 , d2 ) >= 2) { 11 p r i n t f (" Les o b j e t s p e u v e n t c o m m u n i q u e r .\ n ") ;
12 }
13 e l s e {
14 p r i n t f (" Les o b j e t s ne p e u v e n t pas c o m m u n i q u e r .\ n ") ;
15 }
16
17 r e t u r n 0 ; 18 }
ou encore :
1 int m a i n () {
2 int d1 , d2 ;
3 c h a r c o m m u n i c a t e ; 4
5 p r i n t f (" D o n n e z le p r e m i e r r a y o n : ") ; 6 s c a n f (" % d ", & d1 ) ;
7
8 p r i n t f (" D o n n e z le d e u x i e m e r a y o n : ") ; 9 s c a n f (" % d ", & d2 ) ;
10
11 c o m m u n i c a t e = i n c l u s i o n _ c e r c l e s ( -2 , 3 , d1 , 2 , 3 , d2 ) ; 12
13 if ( c o m m u n i c a t e == 3 || c o m m u n i c a t e == 2) { 14 p r i n t f (" Les o b j e t s p e u v e n t c o m m u n i q u e r .\ n ") ;
15 }
16 e l s e {
17 p r i n t f (" Les o b j e t s ne p e u v e n t pas c o m m u n i q u e r .\ n ") ;
18 }
19
20 r e t u r n 0 ; 21 }
c)
1 int m a i n () {
2 int bx [8] = { -2 , 3 , -4 , 5 , -5 , 1 , 0 , 2 } ; 3 int by [8] = { 5 , 5 , -2 , -2 , 5 , 3 , -1 , 2 } ;
4 int br [8] = { 2 , 1 , 1 , 1 , 4 , 2 , 2 , 4 } ;
5 int x , y , r , i , c p t 2 =0 , c p t 3 =0 ; 6 c h a r e t a t ;
7
8 p r i n t f (" D o n n e z l ’ a b s c i s s e : ") ; 9 s c a n f (" % d ", & x ) ;
10
11 p r i n t f (" D o n n e z l ’ o r d o n n e e : ") ; 12 s c a n f (" % d ", & y ) ;
13
14 p r i n t f (" D o n n e z le r a y o n : ") ; 15 s c a n f (" % d ", & r ) ;
16
17 for ( i =0 ; i <8 ; i ++) {
18 e t a t = i n c l u s i o n _ c e r c l e s ( bx [ i ] , by [ i ] , br [ i ] , x , y , r ) ; 19
20 if ( e t a t == 3) {
21 c p t 3 ++ ;
22 }
23 e l s e if ( e t a t == 2) {
24 c p t 2 ++ ;
25 }
26 }
27
28 p r i n t f (" Cet o b j e t p e u t c o m m u n i q u e r :\ n ") ;
29 p r i n t f (" en bi - d i r e c t i o n n e l a v e c % d o b j e t s .\ n ", c p t 3 ) ; 30 p r i n t f (" en uni - d i r e c t i o n n e l a v e c % d o b j e t s .\ n ", c p t 2 ) ; 31
32 r e t u r n 0 ; 33 }
E Etre capable d’´ ˆ ecrire des fonctions et des programmes simples
Exercice 2 : Paquetage d’objets communicants a)
13 c h a r o b j e t _ r e a d ( T O b j e t * b , F I L E * d e s c ) {
14 int x , y , r ;
15 c h a r res = 0 ; 16
17 if (! f e o f ( d e s c ) && f s c a n f ( desc , " % d % d % d ", & x , & y , & r ) == 3) { 18 b - > x = x ;
19 b - > y = y ; 20 b - > r = r ;
21 res = 1 ;
22 }
23
24 r e t u r n res ; 25 }
ou encore :
13 c h a r o b j e t _ r e a d ( T O b j e t * b , F I L E * d e s c ) { 14 c h a r res = 0 ;
15
16 if (! f e o f ( d e s c ) && f s c a n f ( desc , " % d % d % d ", &( b - > x ) , &( b - > y ) , &( b - > r ) ) == 3) {
17 res = 1 ;
18 }
19
20 r e t u r n res ; 21 }
ou encore :
13 c h a r o b j e t _ r e a d ( T O b j e t * b , F I L E * d e s c ) {
14 r e t u r n ! f e o f ( d e s c ) && f s c a n f ( desc , " % d % d % d ", &( b - > x ) , &( b - > y ) , &( b - > r ) ) == 3) ; 15 }
b)
27 c h a r o b j e t _ c o m m u n i c a t e ( T O b j e t * b1 , T O b j e t * b2 ) {
28 r e t u r n i n c l u s i o n _ c e r c l e s ( b1 - > x , b1 - > y , b1 - > r , b2 - > x , b2 - > y , b2 - > r ) ; 29 }
D Etre capable de lire dans des fichiers texte et de manipuler une structure de donn´ ˆ ees
Exercice 3 : Programme d’analyse des communications entre objets communicants
1 /* F i l e : m a i n . c */
2 # i n c l u d e < s t d i o . h >
3 # i n c l u d e < s t d l i b . h >
4
5 # i n c l u d e " T O b j e t . h "
6
7 # d e f i n e F O P E N ( _d , _f , _m ) {\
8 if (!( _d = f o p e n ( _f , _m ) ) ) {\
9 p e r r o r (" E r r o r : c a n n o t o p e n f i l e . ") ;\
10 e x i t (1) ;\
11 }}
12
13 # d e f i n e M A L L O C ( _p , _t , _n ) {\
19 int m a i n () { 20 T O b j e t * o b j e t s ; 21 int * c o m m u n i q u e ;
22 int N , i ;
23 c h a r f i l e n a m e [ 2 5 6 ] ; 24 F I L E * d e s c ;
25
26 int j , cpt =0 ;
27 c h a r e t a t ; 28
29 p r i n t f (" D o n n e z le nom du f i c h i e r de p r e v i s i o n s : ") ; 30 s c a n f (" % s ", f i l e n a m e ) ;
31
32 F O P E N ( desc , f i l e n a m e , " r ") ; 33
34 f s c a n f ( desc , " % d ", & N ) ; 35
36 M A L L O C ( objets , TObjet , N ) ; 37 M A L L O C ( c o m m u n i q u e , int, N ) ; 38
39 i = 0 ;
40 w h i l e (! f e o f ( d e s c ) ) {
41 o b j e t _ r e a d ( o b j e t s + i , d e s c ) ; 42 c o m m u n i q u e [ i ] = 0 ;
43 i ++ ;
44 }
45
46 f c l o s e ( d e s c ) ; 47
48 for ( i =0 ; i < N ; i ++) { 49 for ( j = i +1 ; j < N ; j ++) {
50 e t a t = o b j e t _ c o m m u n i c a t e ( o b j e t s + i , o b j e t s + j ) ; 51
52 if ( e t a t == 3) {
53 p r i n t f (" Ces d e u x o b j e t s p e u v e n t c o m m u n i q u e r en bi - d i r e c t i o n n e l :\ n ") ; 54 o b j e t _ p r i n t ( o b j e t s + i ) ;
55 o b j e t _ p r i n t ( o b j e t s + j ) ; 56 c o m m u n i q u e [ i ] = 1 ; 57 c o m m u n i q u e [ j ] = 1 ;
58 }
59 e l s e if ( e t a t == 2) {
60 p r i n t f (" Ces d e u x o b j e t s p e u v e n t c o m m u n i q u e r en uni - d i r e c t i o n n e l :\ n ") ; 61 o b j e t _ p r i n t ( o b j e t s + i ) ;
62 o b j e t _ p r i n t ( o b j e t s + j ) ; 63 c o m m u n i q u e [ i ] = 1 ; 64 c o m m u n i q u e [ j ] = 1 ;
65 }
66 }
67 }
68
69 for ( i =0 ; i < N ; i ++) { 70 cpt += ! c o m m u n i q u e [ i ] ;
71 }
72
73 p r i n t f (" % d o b j e t % s h o r s a t t e i n t e :\ n ", cpt , cpt ==1 ? " est " : " s s o n t ") ; 74
75 for ( i =0 ; i < N ; i ++) { 76 if (! c o m m u n i q u e [ i ]) { 77 o b j e t _ p r i n t ( o b j e t s + i ) ;
78 }
79 }
80
81 r e t u r n 0 ; 82 }
ou encore :
19 int m a i n () { 20 T O b j e t * o b j e t s ; 21 int * c o m m u n i q u e ;
22 int N , i ;
23 c h a r f i l e n a m e [ 2 5 6 ] ; 24 F I L E * d e s c ;
25
26 int j , cpt =0 ;
27 c h a r e t a t ; 28
29 p r i n t f (" D o n n e z le nom du f i c h i e r de p r e v i s i o n s : ") ; 30 s c a n f (" % s ", f i l e n a m e ) ;
31
32 F O P E N ( desc , f i l e n a m e , " r ") ; 33
34 f s c a n f ( desc , " % d ", & N ) ; 35
36 M A L L O C ( objets , TObjet , N ) ; 37 M A L L O C ( c o m m u n i q u e , int, N ) ; 38
39 i = 0 ;
40 w h i l e (! f e o f ( d e s c ) ) {
41 o b j e t _ r e a d (&( o b j e t s [ i ]) , d e s c ) ; 42 c o m m u n i q u e [ i ] = 0 ;
43 i ++ ;
44 }
45
46 f c l o s e ( d e s c ) ; 47
48 for ( i =0 ; i < N ; i ++) { 49 for ( j = i +1 ; j < N ; j ++) {
50 e t a t = o b j e t _ c o m m u n i c a t e (&( o b j e t s [ i ]) , &( o b j e t s [ j ]) ) ; 51
52 if ( e t a t == 3) {
53 p r i n t f (" Ces d e u x o b j e t s p e u v e n t c o m m u n i q u e r en bi - d i r e c t i o n n e l :\ n ") ; 54 o b j e t _ p r i n t (&( o b j e t s [ i ]) ) ;
55 o b j e t _ p r i n t (&( o b j e t s [ j ]) ) ; 56 c o m m u n i q u e [ i ] = 1 ;
57 c o m m u n i q u e [ j ] = 1 ;
58 }
59 e l s e if ( e t a t == 2) {
60 p r i n t f (" Ces d e u x o b j e t s p e u v e n t c o m m u n i q u e r en uni - d i r e c t i o n n e l :\ n ") ; 61 o b j e t _ p r i n t (&( o b j e t s [ i ]) ) ;
62 o b j e t _ p r i n t (&( o b j e t s [ j ]) ) ; 63 c o m m u n i q u e [ i ] = 1 ;
64 c o m m u n i q u e [ j ] = 1 ;
65 }
66 }
67 }
68
69 for ( i =0 ; i < N ; i ++) { 70 cpt += ! c o m m u n i q u e [ i ] ;
71 }
72
73 p r i n t f (" % d o b j e t % s h o r s a t t e i n t e :\ n ", cpt , cpt ==1 ? " est " : " s s o n t ") ; 74
75 for ( i =0 ; i < N ; i ++) { 76 if (! c o m m u n i q u e [ i ]) {
77 o b j e t _ p r i n t (&( o b j e t s [ i ]) ) ;
78 }
79 }
80
81 r e t u r n 0 ; 82 }