• 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 2017–2018

Examen de Langage C

(V. Granet)

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

I1. En utilisant uniquement la notation de pointeur et à l’exclusion de toute autre fonction, écri- vez en C la fonctionnIemeOccurrencequi renvoie un pointeur sur la neoccurrence d’un carac- tère dans une chaîne. Si la neoccurrence n’existe pas, la fonction renverraNULL. Par exemple, l’appel nIemeOccurrence("abcaaer",’a’, 2), renvoie l’adresse du 2èmea, et l’appel suivant : nIemeOccurrence("abcaaer",’a’, 10)renvoieNULL. Cette fonction possède l’en-tête suivant :

char * nIemeOccurrence (char *s , c o n s t char c , c o n s t i n t n)

/*

* Antécédent : n >=0

* Rôle : renvoie l ’ adresse de la n\ ieme occurrence du caractère c

* dans s , ou NULL si non présente

*/

char * nIemeOccurrence (char *s , c o n s t char c , c o n s t i n t n) { assert (n >=0);

i n t i=n;

w h i l e (* s) { i f (* s == c)

// on a trouvé la nième occurrence i f (--i ==0) r e t u r n s;

s ++;

}

// pas de nième occurrence r e t u r n NULL ; }

. . . . On souhaite représenter une liste d’éléments de typeTde façon circulaire (le dernier élément est lié au premier) par une structure simplement chaînée. Pour cela, on définit le typeLISTE_CIR suivant :

t y p e d e f i n t T; // par exemple s t r u c t noeud {

T elt ;

s t r u c t noeud * suivant ; };

t y p e d e f s t r u c t {

s t r u c t noeud * first , * last ; } LISTE_CIR ;

I2. En utilisant cette déclaration deLISTE_CIR, dessinez une liste à0élément, une liste à1élément, une liste à2éléments, et enfin une liste à3éléments.

1

liste circulaire à 2 elts

last

suivant liste circulaire à 0 elt

first last first

liste circulaire à 1 elt

last

suivant

first

liste circulaire à 3 elts

last

suivant first

. . . . I 3. Écrivez la procéduretournerqui prend en paramètre une listeliet un entiernet qui faitnfois

le tour de la liste de façon circulaire.

i n t estVide ( LISTE_CIR l) {

r e t u r n l. first == NULL && l. last == NULL ; }

/*

* Antécédent : n >=0

v oi d*/ tourner ( LISTE_CIR l , i n t n) { assert (n >=0);

i f (! estVide (l ))

// faire n tours de la liste circulaire f o r (i n t i =0; i <n; i ++) {

s t r u c t noeud *q = l. first ; do

q = q -> suivant ; w h i l e (q != l. first );

} }

. . . . I 4. Écrivez la procédureajouterEnTetequi ajoute un élément au début de la liste circulaire. Cette

procédure possède l’en-tête suivant (que vous devez respecter) : v oi d ajouterEnTete ( LISTE_CIR *li , T e)

v oi d ajouterEnTete ( LISTE_CIR *li , T e) { // créer un nouveau noeud

s t r u c t noeud *p = malloc (s i z e o f(s t r u c t noeud ));

p -> elt = e;

i f ( estVide (* li )) {

// cas particulier d’une liste circulaire vide (* li ). first = (* li ). last = p;

2

(2)

p -> suivant = p;

}e l s e { // cas général

p -> suivant = (* li ). first ; (* li ). first = p;

(* li ). last -> suivant = (* li ). first ; }

}

. . . . I5. Donnez la déclaration d’une structureDatepour représenter une date formée de 3 entiers :jour,

moisetannée.

t y p e d e f s t r u c t { i n t jour , mois , annee } Date ;

. . . . I6. Un fichier de caractères contient un suite d’entiers séparés par un ou plusieurs espaces. Trois entiers consécutifs représentent une date. Écrivez la fonctioncreerFichDatesqui lit un fichier de caractères contenant la suite d’entiers, et qui crée un fichier de dates valides (de typeDate). Sans l’écrire, vous pourrez utiliser la fonction booléennedateValidequi teste si la date (de typeDate) passée en paramètre correspond à une date valide ou pas. La fonctioncreerFichDatesprend les noms des deux fichiers en paramètre. Son en-tête est le suivant :

v oi d creerFichDates (char *in , char * out );

v oi d creerFichDates (char *in , char * out ) { FILE * fdIn , * fdOut ;

// ouvrir le fichier d’entrée en lecture i f (( fdIn = fopen (in , "r")) == NULL ) {

perror ( in );

exit ( errno );

}

// ouvrir le fichier de sortie en écriture i f (( fdOut = fopen (out , "w")) == NULL ) {

perror ( out );

exit ( errno );

}

// ok : les 2 fichiers sont ouverts // fabriquer le fichier de Date Date d;

w h i l e ( fscanf ( fdIn , "%d %d %d", &d. jour , &d. mois , &d. annee )==3) { // on a lu 3 entiers

i f ( dateValide (d ))

fwrite (&d , s i z e o f( Date ), 1, fdOut );

}

// fermer les fichiers

fclose ( fdIn ); fclose ( fdOut );

}

. . . .

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