TD,TP-07_Algo_June.2018 - Corrigé--
TD,TP-07_Algo_June.2018 - Corrigé--
TD,TP-07_Algo_June.2018 - Corrigé--
Solution :
A B C P1 P2
Init. 1 2 3/ /
P1=&A 1 2 3 &A /
P2=&C 1 2 3 &A &C
*P1=(*P2)++ 3 2 4 &A &C
P1=P2 3 2 4 &C &C
P2=&B 3 2 4 &C &B
*P1-=*P2 3 2 2 &C &B
++*P2 3 3 2 &C &B
*P1*=*P2 3 3 6 &C &B
A=++*P2**P1 24 4 6 &C &B
P1=&A 24 4 6 &A &B
*P2=*P1/=*P2 6 6 6 &A &B
Exercice 2. TD
Soient i une variable de type int, p et q des pointeurs sur int.
On suppose que :
― i se trouve à l’adresse 4830000,
― p à l’adresse 4830010, et
― q à l’adresse 4830020.
Exercice 3. TD
Considérons un tableau d’entiers tab avec des valeurs dont certaines seront nulles.
1. Écrire un programme qui parcoure le tableau tab et qui imprime les indices des éléments
nuls du tableau, sans utiliser aucune variable de type entier.
Solution :
Algo parcours_tab_pointeur
Const N =10 ;
Var tab : tableau [N] d’entier
P : pointeur d’entier
ASD (1st MI)/TD,TP - 07 Page 2 / 10 DJOUABRI(June.2018)
Begin
P = tab ;
For (p =tab ; p<tab + N ; P++) do
If ( *p = 0) then
Writeln(p-tab));
endFor
end.
Exercice 4.
Ecrire un programme qui lit deux tableaux A et B et leurs dimensions N et M au clavier et qui
ajoute les éléments de B à la fin de A. Utiliser le formalisme pointeur à chaque fois que cela est
possible.
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
int A[100], B[50]; /* tableaux */
int N, M; /* dimensions des tableaux */
int I; /* indice courant */
Exercice 5. TD
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
Exercice 6. TP
Ecrire un programme 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 */
Exercice 7. TD
Ecrire un programme qui lit une chaîne de caractères CH au clavier et qui compte les occurrences
des lettres de l'alphabet en ne distinguant pas les majuscules et les minuscules. Utiliser un tableau
ABC de dimension 26 pour mémoriser le résultat et un pointeur PCH pour parcourir la chaîne CH
et un pointeur PABC pour parcourir ABC. Afficher seulement le nombre des lettres qui
apparaissent au moins une fois dans le texte.
Exemple:
Exercice 8. TD
a) la matrice A
b) la transposée de A
c) la matrice A interprétée comme tableau unidimensionnel
Solution :
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice */
int N, M; /* dimensions de la matrice */
int I, J; /* indices courants */
/* Saisie des données */
printf("Nombre de lignes (max.50) : ");
scanf("%d", &N );
printf("Nombre de colonnes (max.50) : ");
scanf("%d", &M );
/* Lecture de la matrice au clavier */
for (I=0; I<N; I++)
for (J=0; J<M; J++)
{
printf("Elément[%d][%d] : ",I,J);
scanf("%d", (int *)A+I*50+J);
}
/* a) Affichage de la matrice */
printf("Matrice donnée :\n");
for (I=0; I<N; I++)
{
for (J=0; J<M; J++)
printf("%7d", *((int *)A+I*50+J));
printf("\n");
}
/* b) Affichage de la transposée de A */
printf("Matrice transposée :\n");
for (J=0; J<M; J++)
{
for (I=0; I<N; I++)
printf("%7d ", *((int *)A+I*50+J));
printf("\n");
}
Exercice 9.
Ecrire un programme qui lit deux matrices A et B de dimensions N et M respectivement M et P au
clavier et qui effectue la multiplication des deux matrices. Le résultat de la multiplication sera
affecté à la matrice C, qui sera ensuite affichée. Utiliser le formalisme pointeur à chaque fois que
cela est possible.
Solution :
ASD (1st MI)/TD,TP - 07 Page 6 / 10 DJOUABRI(June.2018)
#include <stdio.h>
main()
{
/* Déclarations */
int A[50][50]; /* matrice donnée */
int B[50][50]; /* matrice donnée */
int C[50][50]; /* matrice résultat */
int N, M, P; /* dimensions des matrices */
int I, J, K; /* indices courants */
/* Edition du résultat */
printf("Matrice résultat C :\n");
for (I=0; I<N; I++)
{
for (J=0; J<P; J++)
printf("%7d", *((int *)C+I*50+J));
printf("\n");
}
return 0;
}
b)
Pour trier les chaînes du tableau de pointeurs, il faut uniquement changer les pointeurs. La durée d'une
opération d'échange est constante, peu importe la longueur des chaînes.
Pour trier le tableau de chaînes de caractères, il faut changer tous les caractères des chaînes un à un. La durée
d'une opération d'échange est dépendante de la longueur des chaînes de caractères.
Pour des chaînes de caractères d'une longueur 'normale', le tri d'un tableau de pointeurs est donc certainement
plus rapide que le tri d'un tableau de chaînes de caractères.
Exercice 11. TP
Ecrire un programme qui lit 10 mots au clavier (longueur maximale: 50 caractères) et attribue leurs
adresses à un tableau de pointeurs MOT. Copier les mots selon l'ordre lexicographique en une
seule 'phrase' dont l'adresse est affectée à un pointeur PHRASE. Réserver l'espace nécessaire à la
PHRASE avant de copier les mots. Libérer la mémoire occupée par chaque mot après l'avoir copié.
Utiliser les fonctions de <string>.
Solution :
ASD (1st MI)/TD,TP - 07 Page 8 / 10 DJOUABRI(June.2018)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
/* Déclarations */
char INTRO[51];/* chaîne pour l'introduction des données */
char *MOT[10]; /* Tableau de pointeurs sur les 10 chaînes */
char *PHRASE; /* Pointeur cible */
int MAX; /* indice du prochain candidat à copier */
int I,J; /* indices courants */
int L; /* Longueur de la phrase */
Solution :
En traitant des tableaux à l'aide de pointeurs, nous utilisons souvent des expressions de la forme:
{ {
... ...
} }
Dans ces boucles, le pointeur P est incrémenté à la fin du bloc d'instruction et comparé ensuite à la condition de
la boucle. Au moment où la condition est remplie, P pointe déjà à l'extérieur du tableau; plus précisément sur le
premier élément derrière le tableau.
Exemple:
#include <stdio.h>
main()
{
/* Déclarations */
int A[10]; /* tableau */
int *P; /* pointeur dans A */
A la fin des boucles, P contient l'adresse A+10 et pointe donc sur l'élément A[10] qui ne fait plus partie du
tableau.