• Aucun résultat trouvé

Université de Xidian Université de Xidian

N/A
N/A
Protected

Academic year: 2022

Partager "Université de Xidian Université de Xidian"

Copied!
4
0
0

Texte intégral

(1)

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

(2)

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;i1] 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

(3)

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

(4)

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

Références

Documents relatifs

En utilisant la fonction compter précédente, écrivez en C le programme myprog qui affiche sur la sortie standard le nombre de lettres et de chiffres d’une chaîne de caractères

Écrivez la fonction lireJour qui lit sur l’entrée standard un entier (∈ [0; 6]) et qui renvoie la valeur correspondante dans le type lesJours. Écrivez la fonction main dans

Écrivez la fonction lireReel qui lit sur l’entrée standard caractère à caractère (uniquement à l’aide de la fonction scanf(&#34;%c&#34;,...) , à l’exclusion de toute

Écrivez la fonction lireReel qui lit sur l’entrée standard caractère à caractère (uniquement à l’aide de la fonction scanf(&#34;%c&#34;,...) , à l’exclusion de toute

Écrivez un programme C qui lit un grade sur l’entrée standard, et qui écrit sur la sortie standard l’avis correspondant.. Vous utiliserez

Écrivez un programme C qui lit un grade sur l’entrée standard, et qui écrit sur la sortie standard l’avis correspondant. Vous utiliserez

Sachant que l’entier le plus grand sur le type long est donné par la constante LONG_MAX , écrivez un programme qui détermine le plus grand entier n dont on peut calculer n!. sur le

Écrivez la fonction initDurée qui renvoie une valeur de type duree initialisée à partir de son paramètre qui indique un nombre de secondes.. Écrivez la fonction compare qui compare