Lycée Victor Hugo IPT 2ème année 2016-17
TP : Utilisation des piles
On présente ici divers exercices de programmation utilisant les piles.
Ouvrir le fichier TPPiles.py et valider la partie nommée "Primitives". Vous venez ainsi de
définir sous Python une nouvelle classe autonome d’objets : la classe Pile.
Rappelons le plus important : les six fonctionnalités de cette classe seront les seuls outils de
base que l’on s’autorisera sur ce TP. Voici le fonctionnement de ces méthodes :
1. Création d’une pile vide nommée MaPile :
MaPile = Pile ()
2. Test de la vacuité d’une pile
Mapile . estvide () # pour savoir si la pile est vide
3. Empiler une donnée sur MaPile :
Mapile . empil er ( donn ée)
4. Dépiler : (Attention : s’assurer que la pile est non vide !)
element = MaPile . depiler () # on d é pile la pile et on stocke le
ré sultat dans element
5. Consultation de l’élément en haut de la pile : (Attention : s’assurer que la pile est non vide !)
element = MaPile . sommet () # on consulte le sommet de la pile
sans la d é piler et on stocke le r é sultat dans element
6. Afficher la pile :
MaPile . affiche ()
1
Lycée Victor Hugo IPT 2ème année 2016-17
Par conséquent, seules les piles pourront être utilisées en tant que structure de données évo-
luée au sein des codes des fonctions (et donc pas de recours aux listes, tableaux ou tuples).
Script 1 H
Créer dans le Shell une pile nommée pipile dont l’affichage produit :
In [] : pipile . affiche ()
2016
True
12
lvh
34
Dans les exercices suivants les algorithmes ne sont pas toujours donnés. C’est volontaire !
Le but de ce TP est aussi (et surtout) de vous faire réfléchir aux algorithmes que vous utilisez
(parfois inconsciemment) pour réaliser certaines tâches.
I Manipulations d’une pile
1 Copie
Script 2 H
Écrire une fonction copy qui prend en argument une pile Pet qui renvoie une copie de P.
Attention la pile Pdoit être conservée !
Tester votre fonction sur pipile et vérifier que pipile n’est pas modifiée.
2 Inverse
Script 3 H
Écrire une fonction inverse qui prend en entrée une pile Pet qui renvoie une pile dont les
éléments sont dans l’ordre inverse de ceux de la pile P.
Attention , la pile Pdoit être conservée !
Question 4 H
Complexité : Quel est le nombre d’opérations effectuées par inverse ? On notera Lle nombre
d’éléments de la pile P.
3 Permutation Circulaire
Script 5 H
Écrire une fonction permcirc qui prend en entrée une pile Pet un entier net qui effectue sur
la pile npermutations circulaires successives.
Ici, la pile Pest donc modifiée.
Par exemple avec n= 2 :
7 98
11 2
98 sera transformée en 103
2 7
103 11
2
Lycée Victor Hugo IPT 2ème année 2016-17
Question 6 H
Complexité : Quel est le nombre d’opérations effectuées par permcirc ? On notera Lle nombre
d’éléments de la pile P.
II Un peu de galanterie
On considère une pile de dossiers sur un bureau.
Un dossier est en fait un enregistrement sur un as-
suré social et chaque enregistrement est constitué d’infor-
mations concernant le nom, le sexe, la date de naissance
d’une personne.
On désire réarranger les enregistrements de telles ma-
nière que les enregistrements de personnes de sexe féminin
précèdent ceux de sexe masculin.
L’ensemble des enregistrements sera donné sous la forme d’une liste de tuples (nom,sexe,
date) nom est une chaîne de caractères, sexe est un entier (1 pour homme, 2 pour femme),
et date est une chaîne de caractères "JJMMAAAA" codant la date de naissance. Les tuples
ne sont pas au programme, mais leur utilisation est simple : on récupère le premier élément du
tuple MonTuple par MonTuple[0], le second élément par MonTuple[1] etc.
Un tri a déjà été effectué sur la pile d’enregistrements puisqu’ils ont été empilés par ordre
décroissant de date de naissance (le plus âgé est au sommet et le plus jeune en bas de la pile).
Valider la suite d’instructions présentes dans le fichier TPPiles.py permettant de construire
la pile nommée virtuoses. Afficher cette pile !
Script 7 H
Écrire la fonction galanterie qui, lorsque virtuoses sera placé en argument, retourne une
pile des enregistrements de virtuoses dans laquelle les femmes précèdent les hommes.
On conservera le tri suivant la date de naissance pour les femmes d’une part et pour les hommes
de l’autre.
Enfin, on utilisera une seule pile comme intermédiaire(afin de ne pas encombrer le bu-
reau ! ! ! !).
Ne pas oublier de tester votre fonction !
III Analyseur syntaxique : expressions bien parenthésées
L’analyse syntaxique est une phase indispensable de la compilation des programmes. Les
piles sont particulièrement bien adaptées à ce genre de traitements. On va se limiter à la recon-
naissance des mots bien parenthésés.
Nous devons écrire un programme qui :
accepte les expressions comme (a),(a b)((c d e)) ou (((a)(b c d))(e)) a,b,
etc. sont des expressions quelconques sans parenthèse ;
rejette les expressions comme a )(,(a b)((c) ou (((a b)(c d e f)))) ;
3
Lycée Victor Hugo IPT 2ème année 2016-17
Comme les expressions a,bqui apparaissent n’ont aucune importance pour savoir si l’expres-
sion est bien parenthésée, on donnera l’expression à tester sous forme d’une chaîne de caractères
dont on rappelle qu’on peut la parcourir comme une liste. Par exemple
expr ession = " ((( a) (b c d ))( e)) "
Question 8 H
Élaborer un algorithme utilisant une pile pour déterminer si une expression est bien parenthésée.
Script 9 H
Écrire la fonction balanced qui rend True ou False suivant que l’expression expr donnée en
argument est bien parenthésée ou non.
Tester votre fonction sur de petits exemples.
Question 10 H
Ci dessous se trouvent écrits en LISP deux programmes. Tester votre fonction balanced sur
les deux expressions imposantes correspondantes déjà écrites dans le fichier TPPiles.py .
Sont-elles bien parenthésées ?
Tout d’abord, un programme dit de "tri rapide" :
( defun qsort - list (l & key ( test # <) ( key # ’ identity ) )
(if ( null l)
()
( macr ol et (( k ( x ) ( fu nc all key , x))
( less ( x y) ( funcall test ,x ,y )))
( loop with pivot = (k ( elt l ( floor ( length l) 2)))
with smaller = ’ ()
with equal = ’ ()
with larger = ’()
for rest = ( cdr l ) then ( cdr l )
while l
do ( cond (( less ( k ( car l) ) pivot )
( setf ( cdr l) smaller
smaller l ))
(( less pivot ( k ( car l )))
( setf ( cdr l) larger
larger l))
(t
( setf ( cdr l) equal
equal l)) )
(setf l rest)
finally (return ( nconc ( qsort - list smaller)
equal
(qsort -list larger )))) )))
4
Lycée Victor Hugo IPT 2ème année 2016-17
Ensuite un programme dit de "tri par paquets" :
( defun buc ke tsort ( vector & key ( key # ’ ide nt ity ) )
( macr ol et (( k ( x ) ( fu nc all key , x))
(s ( x) ‘( aref start ,x) )
(e ( x) ( aref end ,x))
(v ( x) ( aref vector ,x )))
( let * (( min ( v 0) )
(max min) )
;; compute min and max elements
(loop for ifrom 1 below ( length vector )
do ( setf min (min min (k (v i)))
max (max max (k (v i)))))
( let (( start ( make - array ( list (1+ ( - max min )))
: initial - e lement 0) )
( end ( make - array ( list (1+ (- max min)))
: initial - e lement 0) ))
;; count the number of elements of each key
(loop for elem across vector
do ( incf ( e (- ( k elem ) min))))
;; compute end positions
(loop for ifrom 1 below ( length end )
do ( incf ( e i) (e (1 - i) ) ))
;; compute start positions
(loop for ifrom 1 below ( length start )
do ( setf ( s i) (e (1 - i) ) ))
;; sort the elements
(loop for ifrom 0 below ( length start )
do ( loop while (< (s i) (e i))
do ( let (( pos ( - (k ( v ( s i) ) )
min)))
( rotatef ( v ( s i) )
(v ( s pos )) )
( incf ( s pos ) ))) ))) )
vector)
IV Calculatrice en Notation Polonaise Inversée
On souhaite écrire un simulateur de calculatrice utilisant la notation polonaise inversée selon
le principe décrit en cours. Le programme demandera la saisie par la fonction input des opéra-
teurs et des opérandes. À chaque saisie le programme affichera l’état de la pile : après la saisie
d’un nombre on affiche la pile avec simplement ce nouveau nombre au sommet, après la saisie
d’un opérateur on affiche l’état de la pile après application de l’opération sur les opérandes.
On se limitera aux quatres opérations +,-,*,/. On précise que ab-calcule a-b et que
ab/calcule a/b.
On tapera &pour indiquer la fin du calcul au simulateur qui affichera alors le sommet de la
pile.
Petit Rappel : la fonction input renvoie une chaîne de caractères.
Script 11 H
Coder la fonction calculatriceNPI() que l’on doit appeler pour lancer le simulateur.
5
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !