• Aucun résultat trouvé

Université de Nice-Sophia Antipolis POLYTECH

N/A
N/A
Protected

Academic year: 2022

Partager "Université de Nice-Sophia Antipolis POLYTECH"

Copied!
2
0
0

Texte intégral

(1)

Nom : Prénom :

Université de Nice-Sophia Antipolis POLYTECH

ELEC3 2016–2017

Examen de Langage C

Durée : 1h

Aucun document autorisé

Mobiles interdits Documents non autorisés

Note : la qualité des commentaires, avec notamment la présence d’affirmations significatives et d’invariant, ainsi que les noms donnés aux variables, et la bonne indentation rentreront pour une part importante dans l’appréciation du travail.

I1. Soit le programme C suivant :

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

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

v oi d p(char *t , i n t *i) { t [++* i] = ’a ’;

}

i n t main (v oi d) {

char a [] = { ’t ’, ’z ’};

i n t b = 0;

p(a ,& b );

printf ("%c - %c - %d\n", *a , *( a +1) , b );

r e t u r n EXIT_SUCCESS ; }

1. Est-ce quegcccompile ce programme sans erreur ? 2. Si oui, qu’est-ce qu’est écrit sur la sortie standard ?

1. oui 2.t - a - 1

. . . . I2. En utilisant la notation de pointeur, écrivez en C la fonctionremplacerChiffres

qui prend en paramètre une chaîne de caractères, et qui remplace chaque chiffre par le caractère’_’dans celle-ci. La fonction renvoie un pointeur sur le 1er caractère de la chaîne modifiée. Vous pourrez utiliser la fonction isdigit, à l’exclusion de toutes les autres.

1

/*

* Rôle : renvoie un pointeur sur le premier caractère de

* la chaîne s dans laquelle les chiffres ont été remplacés

* par le caractère ’-’

*/

char * remplacerChiffres (char *s) { char * p = s;

w h i l e (* s) { i f ( isdigit (* s ))

*s = ’-’;

s ++;

}r e t u r n p;

}

. . . . I 3. Écrivez en C une fonctionmainqui donne un exemple d’utilisation de votre

fonctionremplacerChiffres. i n t main (v oi d) {

char t [] = " hello 06 qssdf 98 ";

printf ("s = %s\n", remplacerChiffres (t ));

r e t u r n EXIT_SUCCESS ; }

. . . . On veut représenter une suite d’entiers par une structure de liste dynamique doublement chaînée. Pour cela, les éléments de typenoeudseront chaînés entre eux par deux liens, un pointeur qui pointe sur l’élément suivant et un autre qui pointe sur l’élément précédent. On considérera que chaque élément mémorise une valeur entière.

I 4. Complétez la déclaration de type suivante pour qu’elle soit conforme aux indications précédentes.

s t r u c t noeud { ... };

s t r u c t noeud { i n t elt ;

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

. . . . Les éléments d’une liste pourront être accessibles par le début (le premier nœud) ou par la fin (le dernier nœud).

I 5. Complétez la déclaration suivante pour définir une liste conforme aux indica- tions précédentes.

t y p e d e f ... Liste ;

2

(2)

t y p e d e f s t r u c t { s t r u c t noeud * premier ; s t r u c t noeud * dernier ; } Liste ;

. . . . I6. Selon la structure précédente, dessinez précisément : (1) une liste vide, (2)

une liste contenant les trois entiers -8, 20, et 5.

premier dernier

dernier premier

20

−8 5

suivant

precedent

(1) liste vide (2) liste −8, 20 5

. . . . I7. Écrivez en C la procédureallerRetourqui prend uneListeen paramètre, et qui effectue son parcours aller et retour (i.e. du premier au dernier, et du dernier au premier).

/*

* Rôle : parcourt la liste du premier au dernier élément

* et du dernier au premier v oi d*/ allerRetour ( Liste l) {

s t r u c t noeud *p = l. premier ; // l’aller

w h i l e (p != NULL ) p=p -> suivant ; // le retour

p = l. dernier ;

w h i l e (p != NULL ) p=p -> precedent ; }

. . . . I8. Écrivez en C la procédureajouterALaFinqui ajoute dans une listel, après le dernier élément, un nouvel entierx. La liste et l’entier sont les deux seuls paramètres de la procédure.

/*

* Rôle : ajoute en fin de liste *l l ’ entier x v oi d*/ ajouterALaFin ( Liste *l , i n t x) {

// créer le nouveau nœud

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 ; // insérer le nouveau nœud

i f (l -> premier == NULL ) { 3

// la liste est vide p -> precedent = NULL ; l -> premier =p;

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

p -> precedent = l -> dernier ; l -> dernier -> suivant =p;

}

// accrocher le nouveau nœud à l->dernier l -> dernier =p;

}

. . . .

4

Références

Documents relatifs

Avec la notation de pointeur, écrivez en C la fonction somme qui prend en paramètre une chaîne de caractères qui représente un entier naturel et qui renvoie la somme de ses

Écrivez de façon itérative la fonction itos qui renvoie la conversion d’un entier positif ou nul passé en paramètre, en sa représentation sous forme d’une chaîne de

Écrivez un programme qui lit sur l’entrée standard une opération arithmétique formée de 2 entiers et d’un caractère ( ’+’ , ’-’ , ’*’ ou ’/’ ) et qui écrit sur

Écrivez la fonction creerFichDates qui lit un fichier de texte contenant la suites d’entiers, et qui crée un fichier de dates valides (de type Date ).. Sans l’écrire, vous

Lors d’un appel de fonction ou de procédure, la transmission par valeur consiste à affecter, après évaluation, la valeur du pa- ramètre effectif à son paramètre formel

Au lieu de retirer, à chaque itération, 1 diviseur au dividende et d’incrémenter de 1 le quotient, le diviseur est multiplié successivement par 2 pour trouver son plus grand

Il est nécessaire d’écrire un destructeur pour libérer explicitement la mémoire occupée par le tableau et les 3 points du triangle

En utilisant, la classe std::ifstream et ses méthodes is_open , get , eof et close , écrivez la classe FileInputStream qui permet de lire un fichier d’octets (et uniquement