Université de Xidian Université de Xidian
Polytech’Sophia 2020–2021
Examen de Langage C
(V. Granet)Durée : 1h30
Aucun document autorisé Mobiles interdits
On lit sur l’entrée standard une suite d’entiers quelconques pris sur le type (int). Parmi les entiers lus, on veut mémoriser dans un tableau uniquement ceux qui sont positifs et pairs. Le tableau a une taille maximale donnée par la constanteNB_MAX_VALEURS.
I 1. Écrivez la procédure lireValeursqui fait le traitement précédent. Le nombre d’entiers effec- tivement mémorisés sera conservé dans le premier élément du tableau. Note : la fonction scanf renvoieEOFquand la fin de fichier est atteinte.
Cette procédure possède l’en-tête (que vous devez respecter) suivant :
// conséquent : ...
v o i d l i r e V a l e u r s (i n t t V a l [])
/*
* A n t é c é d e n t : x un e n t i e r q u e l c o n q u e
* C o n s é q u e n t : r e n v o i e 1 si x p a i r et positif , 0 s i n o n
*/
i n t v a l i d e (c o n s t i n t x ) { r e t u r n x >=0 && ( x & 1 ) = = 0 ; }
/*
* C o n s é q u e n t : t V a l c o n t i e n t t V a l [0] ( < N B _ M A X _ V A L E U R S ) e n t i e r s
* p o s i t i f s et p a i r s lus sur l ’ ES
*/
v o i d l i r e V a l e u r s (i n t t V a l []) { i n t x , n b V a l =0;
w h i l e ( s c a n f (" % d ", & x )!= EOF ) { // ∀k∈[1;nbV al], tV al[k]contient
// un entier pair et positif lu sur l’E/S
i f ( nbVal < N B _ M A X _ V A L E U R S -1 && v a l i d e ( x )) t V a l [++ n b V a l ] = x ;
}
// nbVal est le nombre (<NB_MAX_VALEURS) d’entiers valides lus sur l’E/S // et enregistrés dans le tableau t => mémoriser nbVal dans tVal[0]
t V a l [ 0 ] = n b V a l ; }
. . . . I 2. Déclarez le type énuméréLesStats qui contient les valeurs, dans cet ordre, EFFECTIF, MIN,MAX,
MOYENNE, ECART_TYPE.
enum L e s S t a t s { E F F E C T I F , MIN , MAX , MOYENNE , E C A R T _ T Y P E };
. . . . Maintenant, on souhaite faire quelques calculs statistiques : conserver l’effectif, et calculer le minimum, le maximum, la moyenne, ainsi que l’écart-type (σ=
q1 n
Pn
i=1(xi−¯x)2) des entiers 1
mémorisés dans le tableau.
I 3. Écrivez la procédure statsqui, à partir d’un tableau (initialisé avec la procédure lireValeurs précédente), remplit un second tableau avec les statistiques précédentes aux indices donnés par le type énuméréLesStats. Cette procédure possède l’en-tête (que vous devez respecter) suivant :
// Antécédent : ...
// Conséquent : ...
v o i d s t a t s (c o n s t i n t t V a l [] , d o u b l e t S t a t [])
/*
* A n t é c é d e n t : le t a b l e a u t V a l c o n t i e n t d e t S t a t e n t i e r s p o s i t i f s et p a i r s .
* l e u r nombre , éventuellement 0, est m é m o r i s é d a n s t V a l [0]
* C o n s é q u e n t : le t a b l e a u t S t a t c o n t i e n t aux i n d i c e s d o n n é e s par e n u m L e s S t a t s
* l ’ e f f e c t i f , le minimum , le maximum , la m o y e n n e et l ’ écart - t y p e
* si l ’ e f f e c t i f = 0 , les v a l e u r s du minimum , du maximum , de
* la m o y e n n e et de l ’ écart - t y p e s o n t i n d é f i n i e s
*/
v o i d s t a t s (c o n s t i n t t V a l [] , d o u b l e t S t a t []) { // mémoriser l’effectif
t S t a t [ E F F E C T I F ]= t V a l [ 0 ] ; i f ( t V a l [0] >0) {
// calculer les statistiques i n t min , max , som ;
min = max = som = t V a l [ 1 ] ;
// calculer le minimum, le maximum, la moyenne f o r (i n t i =2; i <= t V a l [ 0 ] ; i ++) {
// ∀k∈[1;i−1] min = minimum des tVal[k]
// max = maximum des tVal[k], et som = somme des tVal[k]
som += t V a l [ i ];
i f ( t V a l [ i ] < min ) min = t V a l [ i ];
e l s e
i f ( t V a l [ i ] > max ) max = t V a l [ i ];
}
// calculer la moyenne
d o u b l e m o y e n n e = som /(d o u b l e) t V a l [ 0 ] ; // calculer l’écart-type
d o u b l e s o m D i f f C a r r e = 0 . 0 ;
f o r (i n t i =1; i <= t V a l [ 0 ] ; i ++) {
s o m D i f f C a r r e += ( moyenne - t V a l [ i ] ) * ( moyenne - t V a l [ i ]);
}
d o u b l e e c a r t T y p e = s q r t ( s o m D i f f C a r r e / t V a l [ 0 ] ) ; // mémoriser les statistiques dans tStat
t S t a t [ MIN ]= min ; t S t a t [ MAX ]= max ;
t S t a t [ M O Y E N N E ]= m o y e n n e ; t S t a t [ E C A R T _ T Y P E ]= e c a r t T y p e ; }
}
. . . . I 4. Écrivez la procédureecrireStatsqui écrit sur la sortie standard les statistiques calculées.
/*
* R ô l e : é c r i t sur la s o r t i e s t a n d a r d les s t a t i s t i q u e s c o n t e n u e s
* d a n s le t a b l e a u t S t a t
*/
2
v o i d e c r i r e S t a t s (c o n s t d o u b l e t S t a t []) { i f ( t S t a t [ E F F E C T I F ] = = 0 )
p r i n t f (" E f f e c t i f é g a l à 0 = > pas de s t a t i s t i q u e s \ n ");
e l s e {
p r i n t f (" s t a t i s t i q u e s sur %.0 f v a l e u r s : ", t S t a t [ E F F E C T I F ]);
p r i n t f (" min = %.0 f , max = %.0 f , m o y e n n e = %.2 f , écart - t y p e = %.2 f \ n ", t S t a t [ MIN ] , t S t a t [ MAX ] , t S t a t [ M O Y E N N E ] , t S t a t [ E C A R T _ T Y P E ]);
} }
. . . . I 5. Écrivez la fonctionmainqui teste les procédures précédentes. Vous prendrez soin de bien déclarer
les tableaux. Par exemple, si l’entrée standard contient les valeurs suivantes :
12 34 -39 100 399 432 -8 19 34 56
l’exécution du programme fournira le résultat suivant :
statistiques sur 6 valeurs : min = 12, max = 432,
moyenne = 111.33, écart-type = 145.97
#d e f i n e N B _ M A X _ V A L E U R S 20
#d e f i n e N B _ S T A T S 5 i n t m a i n (v o i d) {
i n t l e s V a l e u r s [ N B _ M A X _ V A L E U R S ];
d o u b l e l e s S t a t s [ N B _ S T A T S ];
l i r e V a l e u r s ( l e s V a l e u r s );
s t a t s ( l e s V a l e u r s , l e s S t a t s );
e c r i r e S t a t s ( l e s S t a t s );
r e t u r n E X I T _ S U C C E S S ; }
. . . . Une matrice de m lignes et n colonnes contient des caractères (type char). On veut écrire fonctionlgMaxSuitequi renvoie la taille de la plus longue suite formée de caractèrescconsécutifs sur toutes les lignes de la matrice. Par exemple, la plus longue suite de caractères’*’se trouve à la 5eligne (en rouge) dans la matrice 7×15 ci-dessous et est égale à 9 :
o *
*** o o *****
*******
********* o
***
*-- *** --*
I 6. Écrivez la fonctionlgMaxSuitecomme indiqué précédemment :
// Antécédent : m>0 et n>0, c caractère de la plus longue suite dans mat // Rôle : renvoie la longueur de la plus longue suite de c
i n t l g M a x S u i t e (i n t m , i n t n , c h a r mat [][ n ] , c h a r c ) {
3
i n t l g M a x S u i t e (c o n s t i n t m , c o n s t i n t n , c o n s t c h a r mat [][ n ] , c o n s t c h a r c ) { i n t l g S u i t e M a x =0;
f o r (i n t i =0; i < m ; i ++) {
// calculer le nombre de caractères c consécutives de la ligne i i n t n b S t a r =0;
c h a r p r e d = mat [ i ] [ 0 ] ; f o r (i n t j =1; j < n ; j ++) {
i f ( mat [ i ][ j ]== c )
n b S t a r = ( p r e d != c ) ? 1 : n b S t a r +1;
//
p r e d = mat [ i ][ j ];
}
i f( nbStar > l g S u i t e M a x ) l g S u i t e M a x = n b S t a r ; }
r e t u r n l g S u i t e M a x ; }
. . . .
4