0% ont trouvé ce document utile (0 vote)
109 vues3 pages

Pointeurs et fonctions en C : TD 2

Ce document contient plusieurs exercices sur les pointeurs et les tableaux en C. Les exercices portent sur des fonctions utilisant des pointeurs pour manipuler des chaînes de caractères et des tableaux multidimensionnels.

Transféré par

ihsen gasmi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
109 vues3 pages

Pointeurs et fonctions en C : TD 2

Ce document contient plusieurs exercices sur les pointeurs et les tableaux en C. Les exercices portent sur des fonctions utilisant des pointeurs pour manipuler des chaînes de caractères et des tableaux multidimensionnels.

Transféré par

ihsen gasmi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Université de Savoie, UFR SFA INFO523

L3 INFO 2013–2014

TD 2, Pointeurs et passage de paramètres en C

On rappelle qu’un pointeur p peut être affiché avec l’option %p dans la chaı̂ne de caractère donnée à
printf.

Exercice 1 : Longueur d’une chaı̂ne


Ecrire la fonction strlen avec des pointeurs : celle-ci retourne la longueur d’une chaı̂ne de caractères
terminée par 0.

Exercice 2 : Fonction permutation de trois variables


Faire la fonction permute, l’équivalent de x, y, z 7→ y, z, x. Ecrire l’appel avec les variables i, j, k.
Est-ce que le code suivant sera autorisé ?

int tab[ 5 ];
permute( tab[ 0 ], tab[ 2 ], tab[ 4 ] );

Ou celui-ci :

int tab[ 5 ];
permute( tab, tab + 2, tab + 4 );

Ou encore

int tab[ 5 ];
permute( &tab[ 0 ], &tab[ 2 ], &tab[ 4 ] );

Exercice 3 : Comparaison de deux chaı̂nes de caractères


Ecrire la fonction int compare( char* p, char* q, int n ) qui calcule l’ordre lexicographique
des chaı̂nes p et q, mais limité aux n premiers caractères des chaı̂nes. La fonction retourne 0 si les
chaı̂nes sont égales (sur les n premiers caractères), un nombre strictement positif si p > q et strictement
négatif si p < q. Ne se servir que de pointeurs.

Exercice 4 : Pointeurs et tableaux


Que fait le code suivant ?

#include <stdio.h>
#include <string.h>

int compare( char* p, char* q, int n );

int h( char* p, char* q )


{
int s = 0;
while ( p != q )
s += *p++;
return s;
}

int trouve( char p1[], char p2[] )


{

1
char* p = p1;
int l = strlen( p );
int l2 = strlen( p2 );
l -= l2;
if ( l < 0 ) return -1;
int h1 = h( p, p + l2 );
int h2 = h( p2, p2 + l2 );
while ( l >= 0 )
{
if ( ( h1 == h2 ) && ! compare( p, p2, l2 ) )
return p - p1;
h1 -= *p;
h1 += *(p+l2);
++p;
--l;
}
return -1;
}

int main()
{
char s1[] = "youpi";
char s2[] = "entropie";
char s3[] = "mecanique";
char s4[] = "piyou";

printf( "h(%s) = %d\n", s1, h( s1, s1 + 5 ) );


printf( "h(%s) = %d\n", s2, h( s2, s2 + 8 ) );
printf( "h(%s) = %d\n", s3, h( s3, s3 + 9 ) );
printf( "h(%s) = %d\n", s4, h( s4, s4 + 5 ) );

char s[] = "Il n’est d’entropie que dans l’allegresse : youpi, s’exclame la belle mecanique, je v

printf( "%s\n", s );
printf( "i(%s) = %d\n", s1, trouve( s, s1 ) );
printf( "i(%s) = %d\n", s2, trouve( s, s2 ) );
printf( "i(%s) = %d\n", s3, trouve( s, s3 ) );
printf( "i(%s) = %d\n", s4, trouve( s, s4 ) );
return 0;
}

Ce programme s’exécute ainsi :

h(youpi) = 566
h(entropie) = 870
h(mecanique) = 952
h(piyou) = 566
Il n’est d’entropie que dans l’allegresse : youpi, s’exclame la belle mecanique, je vais pouvoir ap
i(youpi) = 44
i(entropie) = 11
i(mecanique) = 70
i(piyou) = -1

Que fait donc ce programme ? Marchera-t-il pour n’importe quelle chaı̂ne de caractères ?

Exercice 5 : Tableaux de pointeurs

2
Les arguments donnés à un programme sont fournis sous forme d’un tableau de pointeurs vers des
chaı̂nes de caractères.

int main( int argc, char* argv[] )


{
}

Le paramètre argc donne la taille du tableau lui-même.


Ecrire une fonction qui crée une nouvelle chaı̂ne de caractères, allouée dynamiquement, qui est la
concaténation de toutes les chaı̂nes données en paramètres (sous forme de tableau de chaı̂ne).

char* create_concat( int n, char* strs[] ) ...

Appeler cette fonction dans le main sur les paramètres sauf le premier (c’est le nom du programme),
afficher la chaı̂ne, et désallouer-là correctement.

Exercice 6 : Structures et pointeurs


On définit la structure Point ainsi :

struct SPoint {
double x;
double y;
};
typedef struct SPoint Point;

Ecrire la fonction creer qui retourne un Point initialisé aux deux coordonnées passées en paramètres.
Ecrire maintenant la fonction reinitialiser qui modifie un Point pour mettre ses coordonnées
à zéro.
Ecrire la fonction qui calcule la distance entre deux points. Faut-il un passage par valeur ou par
adresse ?
Ecrire la fonction qui réalise la translation d’un point. Faut-il un passage par valeur ou par adresse
?

Exercice 7 : Tableaux à deux dimensions


Que vaut le tableau à l’issue de ces lignes ?

int tab[3][5];
int *a = *tab, i, j;
for (i=0 ; i<15 ; *a++ = i++);
**tab = 15;
**(tab+1) = 16;
*(tab[0]+1) = 17;
*(*tab+8) = 18;
*(tab[2]+3) = 21;
*(*(tab+2)+2) = 22;

Vous aimerez peut-être aussi