• 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

I1. À l’aide de la notation de pointeur, écrivez en C la fonctionstrdupqui renvoie la duplication de la chaîne de caractères passée en paramètre. Cette fonction possède l’en-tête suivant, et que vous devez respecter :char*strdup(const char*s);

/*

* Rôle : renvoie la duplication de s

*/

char * strdup (c o n s t char *s) { // allouer l’espace pour tous les caractères de s char * s1 = malloc ( strlen (s) + 1);

r e t u r n s1 ? strcpy (s1 , s) : NULL ; }

. . . . I2. Une liste d’entiers est représentée par une structuresimplementchaînée et par la déclaration

suivante :

t y p e d e f s t r u c t noeud { i n t elt ;

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

Écrivez en C la fonctionajouterEnFinqui ajoute un entier à la fin d’une liste d’entiers. La liste et l’entier sont passés en paramètres. L’en-tête de cette fonction,que vous devez respecter, est le suivant :

v oi d ajouterEnFin ( Liste *le , i n t x)

c o n s t Liste listeVide = NULL ; /*

* Rôle : ajoute à la fin de liste * le l ’ entier x

*/

v oi d ajouterEnFin ( Liste *le , i n t x) { // créer le nouvel élément

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

p -> elt =x;

p -> suivant = NULL ; // l’ajouter en fin de liste

i f (* le == listeVide ) * le =p;

e l s e {

// la liste contient au moins 1 élément =>

// se placer sur le dernier élément s t r u c t noeud *q = * le ; w h i l e (q -> suivant != NULL )

q = q -> suivant ;

1

// ajouter le nouvel élément à la fin q -> suivant = p;

} }

. . . . I 3. Un fichier contient une suite, éventuellement vide, de trames. Une trame est formée d’un entier (int) dont la valeurnindique le nombre d’octets qui forment le reste de la trame. En octets, quelle est la taille d’une trame ?

sizeof(int)+n

. . . . I 4. Écrivez en C le programmetrames.cqui prend sur la ligne de commandes un nom de fichier et qui affiche le nombre de trames nulles qu’il contient. Une trame nulle est une trame dont les n(>0) octets sont égaux à0.Vous ferez les vérifications de validité nécessaires. Toutefois, on considère que les trames sont correctement formées.

#i n c l u d e < stdlib .h >

#i n c l u d e < stdio .h >

#i n c l u d e < errno .h >

/*

* Rôle : renvoie le nombre de trames nulles contenues

* dans le fichier s

*/

i n t compterTramesNulles (char *s) { // ouvrir le fichier en lecture

FILE * fd ;

i f (( fd = fopen (s , "r"))== NULL ) { perror (s );

exit ( errno );

}

// ok, le fichier est bien ouvert en lecture i n t NbTramesNulles =0 , n =0;

w h i l e ( fread (&n , s i z e o f(i n t), 1, fd ) >0) i f (n >0) {

// lire n octets et vérifier s’ils sont égaux à 0 // Note : il faut lire toute la trame

i n t octetNul = 1;

f o r (i n t i =0; i <n; i ++) {

char o;

fread (&o , s i z e o f(char), 1, fd );

i f ( octetNul && o !=0) // un octet non nul octetNul =0;

}

i f ( octetNul ) NbTramesNulles ++;

}

// fin de fichier fclose ( fd );

r e t u r n NbTramesNulles ; }

i n t main (i n t argc , char * argv []) { i f ( argc !=2) {

fprintf ( stderr , " Usage : %s file \n", argv [0]);

exit ( EXIT_FAILURE );

2

(2)

}

// afficher le nombre de trames nulles

printf (" nb trames nulles = %d\n", compterTramesNulles ( argv [1]));

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

É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