Université de Xidian Université de Xidian
Polytech’Sophia 2017–2018
Examen de Langage C
(V. Granet)Durée : 1h30 Aucun document autorisé Mobiles interdits
I1. En utilisant une notation de tableau, écrivez en C la fonctionsansLesChiffresqui prend en paramètre deux chaînes de caractèress1ets2. Cette fonction copies2danss1en enlevant tous les chiffres présents danss2. De plus, elle renvoie le nombre de chiffres supprimés. Par exemple, l’appel sansLesChiffres(s,"lundi 6 juin 2018")renvoie la valeur5etsest égale à"lundi juin".
/*
* Rôle : affecte à s1 la chaîne s2 dans laquelle les
* chiffres ont été supprimés . De plus , elle renvoie le
* nombre de chiffres supprimés .
*/
i n t sansLesChiffres (char s1 [] , c o n s t char s2 []) { i n t i=0 , j=0 , n =0;
w h i l e ( s2 [i ]!=’\0 ’) { i f (! isdigit ( s2 [i ]))
// ce n’est pas un chiffre => le mémoriser s1 [j ++]= s2 [i ];
e l s e
// un chiffre => on le compte et on le saute n ++;
// on passe au caractère suivant sans s2 i ++;
}
// ne pas oublier le caractère de fin de chaîne s1 [i ]=’\0 ’;
r e t u r n n;
}
. . . . I2. Donnez la déclaration d’une structure pour représenter uneduréeformée de 3 champs entiers :
heures(>0),minutes(06minutes659), etsecondes(06secondes659).
t y p e d e f s t r u c t { i n t h; /* h>0 */
unsigned s h o r t i n t m; /* 06m659*/
unsigned s h o r t i n t s; /* 06s659*/
} duree ;
. . . . I3. Écrivez la fonctioninitDuréequi renvoie une valeur de typedureeinitialisée à partir de son paramètre qui indique un nombre de secondes. Par exemple, l’appelinitDuree(8000)renvoie une durée de 2 heures, 13 minutes et 20 secondes.
/*
* Antécédent : t >=0
1
* Rôle : renvoie une durée initialisée à partir du nombre de secondes n
*/
duree initDuree (i n t t) { assert (t >=0);
duree d;
d.s = t %60; t /= 60;
d.m = t %60; t /= 60;
d.h = t;
r e t u r n d;
}
. . . . I 4. Écrivez la fonctioncomparequi compare deux duréesd1etd2. Cette fonction renvoie0si les deux durées sont égales, une valeur entière négative sid1<d2, et une valeur entière positive si d1>d2.
/*
* Rôle : compare deux durées .
*/
i n t egal ( duree d1 , duree d2 ) { // convertir les 2 durées en secondes i n t s1 = d1 .h *3600+ d1 .m *60+ d1 .s;
i n t s2 = d2 .h *3600+ d2 .m *60+ d2 .s;
// compararer le nombre de secondes r e t u r n s1 - s2 ;
}
. . . . I 5. Expliquez ce que calcule la fonctionfsuivante :
i n t f(char s[] , c o n s t char c) { i n t i =0;
w h i l e (s[i ]!=’\0 ’) i ++;
w h i l e (i >=0) {
i f (s[i] == c) r e t u r n i;
i - -;
}r e t u r n -1;
}
Cette fonction renvoie l’indice de la dernière occurrence du caractère c dans la chaîne s, si elle existe, sinon elle renvoie -1.
. . . . I 6. Exclusivement à l’aide de la notation de pointeur, récrivez la fonction précédente. Cette fonction
devra rendre un pointeur surchar. char *f(char *s , c o n s t char c) {
char *p = s;
w h i l e (* s) s ++;
w h i l e (s >= p) {
i f (* s == c) r e t u r n s;
s - -;
}
r e t u r n NULL ; }
. . . . 2