• 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!
2
0
0

Texte intégral

(1)

Université de Xidian Université de Xidian

Polytech’Sophia 2016–2017

Examen de Langage C

(V. Granet)

Durée : 1h30 Aucun document autorisé Mobiles interdits

Notez que les affirmations (antécédents, conséquents, rôles, et invariants) dans vos codes C entreront pour partie dans la note finale.

I1. En utilisant la notation de tableau, écrivez la fonctionstrRchrqui renvoie l’indice de la dernière occurrence d’un caractèrecdans une chaîne de caractères. Si le caractère n’est pas présent dans la chaîne, la fonctionstrRchrrenvoie−1.

/*

* Rôle : renvoie l ’ indice de la dernière d ’ occurrence de c dans s

* et -1 si non trouvée

i n t*/ strRchr (c o n s t char s[] , c o n s t char c) { i n t i =0;

w h i l e (s[i ]!=’\0 ’) i ++;

assert (* s ==’\0 ’);

w h i l e (--i >=0) i f (s[i ]== c)

// dernière occurrence de c dans s r e t u r n i;

// c n’appartient pas à s r e t u r n -1;

} /*

* Rôle : renvoie l ’ indice de la dernière d ’ occurrence

* de c dans s et -1 si non trouvée i n t*/ strRchr (char s[] , c o n s t char c) {

i n t i=0 , d_occ = -1;

w h i l e (s[i ]!=’\0 ’) {

// d_occ est l’indice de la dernière // occurrence c de s[0] à s[i-1], ou -1

i f (s[i ]== c) d_occ = i;

i ++;

}

r e t u r n d_occ ; }

. . . . I2. Récrivez la fonctionstrRchrprécédente, mais cette fois-ci, en utilisant la notation de pointeur.

La fonctionstrRchr2renverra l’adresse de la dernière occurrence d’un caractèrecdans une chaîne 1

de caractères. Si le caractère n’est pas présent dans la chaîne, la fonctionstrRchr2renvoieNULL.

/* Rôle : renvoie l ’ adresse de le dernière d ’ occurrence de c dans s

* et NULL si non trouvée

*/

c o n s t char * strRchr2 (c o n s t char *s , c o n s t char c) { c o n s t char * s1 = s;

w h i l e (* s) s ++;

assert (* s ==’\0 ’);

w h i l e (--s >= s1 ) i f (* s == c)

// dernière occurrence de c dans s r e t u r n s;

// c n’appartient pas à s r e t u r n NULL ; }

/* Rôle : renvoie l ’ adresse de le dernière d ’ occurrence de c dans s et NULL si non trouvée

*/

c o n s t char * sstrRchr2 (c o n s t char *s , c o n s t char c) {

c o n s t char * d_occ = NULL ; w h i l e (* s) {

// d_occ est l’adresse de la dernière // occurrence c de s[0] à s-1, ou NULL

i f (* s == c) d_occ =s;

s ++;

}

r e t u r n d_occ ; }

. . . . I 3. Écrivez une fonctionmainqui donne plusieurs exemples d’utilisation de vos deux fonctions

strRchrprécédentes.

i n t main (v oi d) {

printf ("%d\n", strRchr (" hello ",’l ’)); // => 3 printf ("%d\n", strRchr (" hello ",’y ’)); // => -1 printf ("%s\n", strRchr2 (" hello ",’e ’)); // => "ello"

printf ("%c\n", * strRchr2 (" hello ",’e ’)); // => ’e’

printf ("%s\n", strRchr2 (" hello ",’x ’)); // => error: segmentation fault ! r e t u r n EXIT_SUCCESS ;

}

. . . . I 4. Écrivez la déclaration du typeDate, une structure formée de 3 champs entiers,jour,moiset

anneepour représenter une date.

2

(2)

s t r u c t Date {

i n t jours , mois , annee ; };

. . . . I5. Écrivez la déclaration du typePersonne, une structure, pour représenter une personne. Elle sera formée de 3 champs :nom(une chaîne de caractères),sexe(homme ou femme, un type énuméré) etnaissance(la date de naissance, de typeDate).

#d e f i n e MAXALPHA 20 s t r u c t Personne {

char nom [ MAXALPHA ];

enum { homme , femme } sexe ; s t r u c t Date naissance ; };

. . . . I6. Écrivez la déclaration de type d’un tableautpersdeMAXPERSONNES Personne. Vous définirez la

constanteMAXPERSONNES, par exemple, égale à100

#d e f i n e MAXPERSONNES 100

s t r u c t Personne tpers [ MAXPERSONNES ];

. . . . I7. On considère que le tableau dePersonne tpersest entièrement initialisé (i.e. lesMAXPERSONNES personnes). Écrivez un programme qui écrit sur la sortie standard le nom et l’âge de toutes les femmes qui sont nées avant1999. On considère que l’année courante est2017. Pour calculer l’âge d’une personne, vous définirez la macroAGEavec une date en paramètre.

#d e f i n e ANNEECOURANTE 2017

#d e f i n e AGE (d) ( ANNEECOURANTE -( d. annee )) i n t main (v oi d) {

s t r u c t Personne tpers [ MAXPERSONNES ];

// intialiser la tableau tpers // ....

// parcourir tout le tableau de Personne f o r (i n t i =0; i < MAXPERSONNES ; i ++)

i f ( tpers [i ]. sexe == femme && tpers [i ]. naissance . annee <1999)

printf (" nom : %s - âge : %d\n", tpers [i ]. nom , AGE ( tpers [i ]. naissance ));

// assert: le nom et l’âge de toutes les femmes nées avant 1999 // sont écrits sur la sortie standard

r e t u r n EXIT_SUCCESS ; }

. . . . 3

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

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

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