• 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 2020–2021

Examen de Langage C

(V. Granet)

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

I1.Sans utiliserles fonctions standard destring.h, et uniquement à l’aide de la notation de pointeur (donc pas de tableau), écrivez la procédureinverserqui inverse une chaîne de caractères.

Cette procédure a un paramètre « donnée » qui est la chaîne à inverser, et un paramètre « résultat » qui est la chaîne inversée. L’en-tête de cette procédure est le suivant :

// antécédent : à compléter // conséquent : à compléter

void inverser (c o n s t char *s1 , char *s2)

Par exemple, sis1est égale à"hellow", après inversion,s2est égale à"wolleh". // antécédent : s1 chaîne de caractères à inverser

// conséquent : s2 chaîne de caractères inversion de s1 void inverser (c o n s t char *s1 , char *s2) {

c o n s t char *p = s1;

// se placer à la fin de s1 w h i l e (* s1) s1 ++;

// parcourir la chaîne en sens inverse et copier // ses caractères dans s2

w h i l e (--s1 >=p)

*s2 ++ = *s1;

// écrire le caractères de fin de chaîne dans s2

*s2 = ’\0 ’;

}

. . . . I2. Toujours sans utiliser les fonctions standard destring.h, et uniquement à l’aide de la notation de pointeur, on veut maintenant récrire la procédureinverserprécédente sous forme d’une fonction, c’est-à-dire qui renvoie la chaîne inversée. Il faudra donc créer une nouvelle chaîne (malloc). Écrivez la fonctioninverserdont l’en-tête est le suivant :

// antécédent : à compléter // conséquent : à compléter

char * inverser (c o n s t char *s)

// antécédent : s chaîne de caractères à inverser // rôle : renvoie l’inverse de s

char * inverser (c o n s t char *s) { i n t lg = 0;

c o n s t char *p = s;

// calculer la longueur de s w h i l e (*s++) lg ++;

// allouer la nouvelle chaîne de longueur lg char *si = malloc (lg +1);

char *q = si;

1

// parcourir la chaîne en sens inverse et copier // ses caractères dans si

s--;w h i l e (--s >=p)

*si ++ = *s;

// écrire le caractères de fin de chaîne dans si

*si = ’\0 ’;

r e t u r n q;

}

Il est également possible d’utiliser la première version deinversercomme suit : // antécédent : s chaîne de caractères à inverser

// rôle : renvoie l’inverse de s

char * inverser2 (c o n s t char *s) { i n t lg = 0;

c o n s t char *p = s;

// calculer la longueur de s w h i l e (*s++) lg ++;

// allouer la nouvelle chaîne de longueur lg char *si = malloc (lg +1);

// inverser p inverser (p, si );

r e t u r n si;

}

. . . . I 3. Écrivez un programme qui prend en paramètre deux noms de fichier. Le premier nom correspond à un fichier de texte qui contient une suite (éventuellement vide) de mots. Les mots ont une longueur maximale de 10 caractères, et sont placés un par ligne.

Votre programme devra lire tous les mots dans le premier fichier, et les écrire de façon inversée (à l’aide de la fonctioninverserprécédente) dans un second fichier de texte dont le nom est le second paramètre programme. Par exemple, si un fichierf1contient :

aerthello bonjour maitenant

L’exécution du programmeinverserFich f1 f2produira le fichier f2 : treaolleh

ruojnob tnanetiam

Note : votre programme devra faire toutes les vérifications nécessaires.

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

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

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

#d e f i n e LGMAXMOT 10

i n t main (i n t argc , char * argv []) {

// vérifier le bon nombre de paramètres programme 2

(2)

i f ( argc !=3) {

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

exit ( EXIT_FAILURE );

}

// le nombre de paramètres est correct // ouvrir le fichier de mots argv[1] en lecture FILE *in;

i f (( in = fopen ( argv [1] , "r")) == NULL ) { perror ( argv [1]);

exit ( errno );

}// ouvrir le fichier de mots inversés argv[2] en écriture FILE *out;

i f (( out = fopen ( argv [2] , "w")) == NULL ) { perror ( argv [2]);

exit ( errno );

}

// lire le fichier de mots in et écrire les mots de façon inversée dans out char mot[ LGMAXMOT +1];

w h i l e ( fscanf (in , "%s", mot ) >0) fprintf (out , "%s\n", inverser (mot ));

// fermer les fichiers fclose (in );

fclose (out );

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

Écrivez la fonction main dans laquelle vous déclarerez une variable jour de type lesJours et à laquelle vous affecterez la valeur samedi..

É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