Académique Documents
Professionnel Documents
Culture Documents
PROBLEMATIQUE
Activité 1 :
On considère un tableau d’entiers T de n éléments. On veut écrire un algorithme qui
permet d’insérer un élément x saisie à partir du clavier, juste après le premier
élément positif de T.
Commentaires
(i) Dans le cas où le premier élément positif est rencontré, le décalage du reste des
éléments de T d’une case à droite est coûteux en terme de temps d’exécution.
(ii) Si le dernier élément de T s’avère le premier élément positif, il y a risque de
débordement puisque l’insertion de x se fera hors tableau ?!
(iii) On peut alors conclure que la structure de données utilisée n’est appropriée.
Activité 2 :
On dispose d’un fichier Etudiant comportant entres autres la rubrique Moyenne. On
désire réaliser un traitement qui consiste à lire à partir de ce fichier toutes les
moyennes supérieures à 10 et de les mémoriser dans un tableau en vue de réaliser
certaines statistiques.
Commentaires
(i) Comme le nombre d’éléments du tableau T est connu à l’avance, cela risque de
poser un problème : dans le cas où le nombre de moyennes lues à partir du fichier
s’avère supérieur à la taille de T, il sera alors impossible de réaliser le traitement.
Dans ce cas, on va se dire que partant du Fichier Etudiant, on commence par trouver
le nombre d’enregistrements et on déclarera alors un tableau dont la taille serait la
valeur du nombre d’enregistrements. Il y aura alors un surdimensionnement du
tableau T étant donné que les moyennes des différents enregistrements ne sont pas
toutes supérieures à 10. D’où gaspillage de l’espace mémoire qui un espace coûteux.
(ii) On peut alors conclure que la structure de données tableau n’est pas la plus
appropriée pour cet exemple.
Définition
Un pointeur est une variable spéciale pouvant contenir l’adresse d’une autre
variable.
Remarque :
(i) Le rôle d'un pointeur est de permettre l'accès à une structure qui serait créée avant
ou lors de l'exécution.
(ii) La déclaration doit spécifier le type de base de l'objet qui pourra être accessible à
l'aide du pointeur.
(iii) Un pointeur est toujours une valeur absolue.
(iv) Les adresses admissibles pouvant être prises par un pointeur : ce sont les entiers
de longueur fixe (uniformité => référence uniforme et homogène).
(vi) Le type pointeur est considéré comme étant un type de base.
Convention :
(i) P désigne la variable qui contient l’adresse.
(ii) P@ désigne l’objet dont l’adresse est rangée dans P.
Applications
Application 1 :
On considère deux variables P1 et P2 de type pointeur permettant d’accéder
respectivement aux informations a et b. Que donnera l’exécution de l’action P1P2 ?
Situation initiale :
P1 P2
P1@ P2@
aa b
P1@, P2@
a
b
Constat : l’information a n’est plus accessible car on a perdu son adresse qui se
trouvait dans P1 avant l’affectation. Autre chose, l’information b peut être atteinte
soit par P1 soit par P2.
Application 2 :
On considère deux variables P1 et P2 de type pointeur permettant d’accéder
respectivement aux informations a et b. Que donnera l’exécution de l’action
P1@P2@ ?
Situation initiale :
P1 P2
P1@ P2@
aa b
2018-2019 Page : 3 ISET de Radès
Algorithmique & Structures de données II
P1@ P2@
ba b
Remarque :
Si un pointeur P ne correspond à aucune adresse d’objet, on notera cette situation
comme suit :
PNIL ou PNULL ou bien schématiquement : ou -1
Pour les variables de type pointeur, qui ont l’aspect d’être dynamique, la réservation
de l’espace mémoire se fait au cours de l’exécution du programme à l’aide de la
primitive Allouer. Au cours de cette même exécution, si on juge ne plus avoir besoin
de cette variable, on peut s’en passer (la libérer), on utilise alors la primitive Libérer.
Schématiquement, et si P est un pointeur, Allouer (P) signifie qu’on va trouver un
emplacement mémoire libre suffisant pour contenir un objet pointé par P.
P@
Objet
Libérer(P) consiste à supprimer l’objet pointé par P (P@) : cela veut dire que l’objet
n’est plus accessible et l’espace libéré sera rajouté à la mémoire.
P1 P2
P1@, P2@
a b
On désire que P1 ne pointe vers plus rien, cela veut dire que P1 serait égale à NIL. Si
on se permettra d’effectuer la primitive Libérer(P1), l’objet b disparaîtra. Donc, pour
garder b on doit avoir la figure suivante :
P1 P2
P2@
b
Pointeurs d’Enregistrement
Type
Pointeur_Elem = @Elem_Tab
Elem_Tab = Enregistrement
Info : entier
Suiv : Pointeur_Elem
Fin
Variable
Q,P : Pointeur_Elem
Initialement
Q
QNIL : NIL
I=3
P, Q
1 er élément de T : -4 NIL
I=2
2 ème élément de T : 6 @ -4 NIL
I=1
Conclusion
On a pu implémenter un tableau de N entiers en utilisant un pointeur
d’enregistrement. Cette application n’est pas générale car dans certains problèmes,
on peut ne pas connaître à l’avance le nombre d’éléments à créer et ce n’est qu’au
cours de l’exécution que l’on va découvrir.
Si on revient à l’énoncé de l’activité 2 présentée dans la problématique (paragraphe
1), on a dit : qu’on dispose d’un fichier Etudiant comportant entres autres la rubrique
Moyenne et on désire réaliser un traitement qui consiste à lire à partir de ce fichier
toutes les moyennes supérieures à 10 et de les mémoriser dans un tableau en vue de
réaliser certaines statistiques.
On voit clairement, que le nombre d’étudiant ayant la moyenne ne peut pas être
connu à l’avance. Bien sûr l’utilisation d’un tableau puis l’implémentation de ce
tableau avec un pointeur d’enregistrement restera possible mais n’est plus
recommandée.
On doit utiliser alors une structure dynamique capable de représenter des éléments
au cours de l’exécution d’un programme tout en assurant les liens entre eux ; une
telle structure existe : il s’agit de la structure de données LISTE. C’est l’objet du
chapitre suivant.
Exercice 1
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Réel
Variable P : Pointeur
A : Réel
Début
Allouer(P)
A5
P@ A
P@ P@ + 1
A P@
Fin
Faites la table d’exécution de cet algorithme et donnez les valeurs finales de A et P@.
Exercice 2
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P : Pointeur
A, B : Entier
Début
A10
B50
PA
BP@
P@ 20
Fin
2.1. Corrigez cet algorithme si vous jugez que c’est nécessaire ?
2.2. Faites la table d’exécution de cet algorithme et donnez les valeurs finales de A, de
B, de P et de P@.
Exercice 3
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P, Q : Pointeur
Début
Allouer(P)
QNIL
P@ 10
QP
Q@ Q@ + 2
Libérer(P)
Fin
Exercice 4
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P1, P2 : Pointeur
A, B, C : Entier
Début
A1
B2
C3
P1A
P2C
P2@ B
P1@ (P2@ + 1)
P1P2
P2B
P2@ P2@ + 1
(P@)@ P2@
A ((P2@)@ * P1@) + 1
P1A
Fin
Exercice 5
En utilisant les pointeurs, écrivez un algorithme permettant de calculer à l’aide d’un
pointeur la longueur d’une chaine de caractère saisie à partir du clavier.
Exercice 6
Ecrivez un algorithme qui range les éléments d’un tableau A d’entiers dans l’ordre
inverse. On utilisera deux pointeurs P1 et P2 et variable numérique pour réaliser la
permutation des éléments.
Exercice 7
En utilisant les pointeurs, écrivez un algorithme qui permet de supprimer toutes les
voyelles d’une chaine de caractères donnée.