Exercice
1 :
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresses fournissent ces expressions:
a)
*P+2
b)
*(P+2)
c)
&P+1
d)
&A[4]-3
e)
A+3
f)
&A[7]-P
g)
P+(*P-10)
h)
*(P+*(P+8)-A[7])
Solution :
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Quelles valeurs ou adresse
s fournissent ces expressions:
a)
|
*P+2
|
=>
|
la valeur
14
|
b)
|
*(P+2)
|
=>
|
la valeur
34
|
c)
|
&P+1
|
=>
|
l'adresse
du pointeur derrière le pointeur P
|
(rarement
utilisée)
|
|||
d)
|
&A[4]-3
|
=>
|
l'adresse
de la composante A[1]
|
e)
|
A+3
|
=>
|
l'adresse
de la composante A[3]
|
f)
|
&A[7]-P
|
=>
|
la valeur
(indice) 7
|
g)
|
P+(*P-10)
|
=>
|
l'adresse
de la composante A[2]
|
h)
|
*(P+*(P+8)-A[7])
|
=>
|
la valeur
23
|
Exercice
2 :
Ecrire un programme en langage C qui lit un entier X et un tableau A du type int au clavier et élimine toutes les occurrences de X dans A en tassant les
éléments restants. Le programme utilisera les pointeurs P1 et P2 pour parcourir le tableau.
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau
donné */
int N; /* dimension du
tableau */
int X; /* valeur à
éliminer */
int *P1, *P2; /* pointeurs d'aide */
/* Saisie des données */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (P1=A;
P1<A+N; P1++)
{
printf("Elément %d : ", P1-A);
scanf("%d", P1);
}
printf("Introduire l'élément X à éliminer du tableau : ");
scanf("%d", &X );
/* Affichage du tableau */
for (P1=A; P1<A+N; P1++)
printf("%d ", *P1);
printf("\n");
/* Effacer toutes les occurrences de X et comprimer : */
/* Copier tous les éléments de P1 vers P2 et augmenter */
/* P2 pour tous les éléments différents de
X. */
for
(P1=P2=A; P1<A+N; P1++)
{
*P2 = *P1;
if (*P2 != X)
P2++;
}
/* Nouvelle dimension de A */
N = P2-A;
/* Edition du résultat */
for (P1=A; P1<A+N; P1++)
printf("%d ", *P1);
printf("\n");
return 0;
}
Exercice
3 :
Ecrire un programme en langage C qui range les éléments d'un tableau A du type intdans l'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une
variable numérique AIDE pour la permutation des éléments.
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
int A[50]; /* tableau
donné */
int N; /* dimension du
tableau */
int AIDE; /* pour la permutation */
int *P1, *P2; /* pointeurs d'aide */
/* Saisie des données */
printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (P1=A;
P1<A+N; P1++)
{
printf("Elément %d : ", P1-A);
scanf("%d", P1);
}
/* Affichage du tableau */
for (P1=A; P1<A+N; P1++)
printf("%d ", *P1);
printf("\n");
/* Inverser la tableau */
for (P1=A,P2=A+(N-1);
P1<P2; P1++,P2--)
{
AIDE = *P1;
*P1 = *P2;
*P2 = AIDE;
}
/* Edition du résultat */
for (P1=A; P1<A+N; P1++)
printf("%d ", *P1);
printf("\n");
return 0;
}
Exercice
4 :
Ecrire un programme en langage C qui lit deux tableaux d'entiers A et B et leurs dimensions N et M au
clavier et qui ajoute les éléments de B à la fin de A. Utiliser deux pointeurs
PA et PB pour le transfer et afficher le tableau résultant A.
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
int A[100], B[50]; /* tableaux */
int N, M; /* dimensions des tableaux */
int *PA,*PB; /* pointeurs
d'aide */
/* Saisie des données */
printf("Dimension du tableau A (max.50) : ");
scanf("%d", &N );
for (PA=A;
PA<A+N; PA++)
{
printf("Elément %d : ", PA-A);
scanf("%d", PA);
}
printf("Dimension du tableau B (max.50) : ");
scanf("%d", &M );
for (PB=B;
PB<B+M; PB++)
{
printf("Elément %d : ", PB-B);
scanf("%d", PB);
}
/* Affichage des tableaux */
printf("Tableau donné A :\n");
for (PA=A; PA<A+N; PA++)
printf("%d ", *PA);
printf("\n");
printf("Tableau donné B :\n");
for (PB=B; PB<B+M; PB++)
printf("%d ", *PB);
printf("\n");
/* Copier B à la fin de A */
for (PA=A+N,PB=B ; PB<B+M ;
PA++,PB++)
*PA = *PB;
/* Nouvelle dimension de A */
N += M;
/* Edition du résultat */
printf("Tableau résultat A :\n");
for (PA=A; PA<A+N; PA++)
printf("%d ", *PA);
printf("\n");
return 0;
}
Exercice
5 :
Ecrire de deux façons différentes, un programme en langage C
qui vérifie sans utiliser une fonction de <string>, si une
chaîne CH introduite au clavier est un palindrome:
a) en utilisant uniquement le formalisme tableau
b) en utilisant des pointeurs au lieu des indices numériques
Rappel: Un palindrome est un mot qui reste le même qu'on le lise de gauche à droite
ou de droite à gauche:
Solution :
a) en utilisant uniquement le formalisme tableau
#include <stdio.h>
main()
{
/* Déclarations */
char CH[101]; /* chaîne donnée */
int I,J; /* indices courants */
int PALI; /* indicateur
logique: */
/* vrai si CH est un palindrome */
/* Saisie des données */
printf("Entrez une ligne de texte (max.100 caractères)
:\n");
gets(CH);
/* Placer J sur la dernière lettre de la chaîne */
for(J=0; CH[J]; J++)
;
J--;
/* Contrôler si CH est un palindrome */
PALI=1;
for (I=0 ;
PALI && I<J ; I++,J--)
if (CH[I] != CH[J])
PALI=0;
/* Affichage du résultat */
if (PALI)
printf("La chaîne \"%s\" est un
palindrome.\n", CH);
else
printf("La chaîne \"%s\" n'est pas un
palindrome.\n", CH);
return 0;
}
b) en utilisant des pointeurs au lieu des indices numériques :
#include <stdio.h>
main()
{
/* Déclarations */
char CH[101]; /* chaîne donnée */
char *P1,*P2; /* pointeurs d'aide */
int PALI; /* indicateur
logique: */
/* vrai
si CH est un palindrome */
/* Saisie des données */
printf("Entrez une ligne de texte (max.100 caractères)
:\n");
gets(CH);
/* Placer P2 sur la dernière lettre de la chaîne */
for (P2=CH; *P2; P2++)
;
P2--;
/* Contrôler si CH est un palindrome */
PALI=1;
for (P1=CH ;
PALI && P1<P2 ; P1++,P2--)
if (*P1 != *P2) PALI=0;
/* Affichage du résultat */
if (PALI)
printf("La chaîne \"%s\" est un
palindrome.\n", CH);
else
printf("La chaîne \"%s\" n'est pas un
palindrome.\n", CH);
return 0;
}
Exercice
6 :
Ecrire un programme en langage C qui lit une chaîne de
caractères CH et détermine la longueur de la chaîne à l'aide d'un pointeur P.
Le programme n'utilisera pas de variables numériques.
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
char CH[101]; /* chaîne donnée */
char *P; /* pointeur d'aide */
/* Saisie des données */
printf("Entrez une ligne de texte (max.100 caractères)
:\n");
gets(CH);
/* Placer P à la fin de la chaîne */
for (P=CH; *P; P++)
;
/* Affichage du résultat */
printf("La chaîne \"%s\" est formée de %d
caractères.\n",
CH, P-CH);
return 0;
}