TD 3, Calculette Notation polonaise - Lama

Transcription

TD 3, Calculette Notation polonaise - Lama
Université Savoie Mont Blanc, UFR SceM
L3 ESET/TRI
INFO510
2016–2017
TD 3, Calculette
Notation polonaise
Une expression arithmétique est habituellement présentée de sous la forme suivante :
hexpression 1i hoperateuri hexpression 2i
Par exemple : 2+2, 2-1, etc.
Évidemment, les expressions 1 et 2 peuvent elles aussi contenir des opérateurs. Par exemple :
“2+1 + 3-2”. De manière générale, cette notation peut être ambigüe. Par exemple l’expression :
“3-2-1” Peut être interprétée comme étant “(3-2)-1” ce qui vaut 0 ou encore comme étant “3-(2-1)”
qui vaut 2. Pour éviter ces ambigüités, on utilise des parenthèses : (2+4)/(3-1), ( (40-2) + 4 ) / (6-5),
etc.
Le principe de la notation polonaise consiste à mettre d’abord l’opérateur et ensuite les deux
expressions :
hoperateuri hexpression 1i hexpression 2i
Cette notation a l’avantage de ne jamais être ambigüe. Considérons l’expression :
/ + - 80 3 7 - 6 4
On remarque tout de suite que l’opérateur principal est une division. L’expression est donc de la
forme : / hexpression 1i hexpression 2i.
On peut évaluer cette expression en calculant récursivement la valeur de hexpression 1i et hexpression 2i :
ˆ
Expression principale : / hexpression 1i hexpression 2i.
ˆ
hexpression 1i : + hexpression 3i hexpression 4i.
ˆ
hexpression 3i : - hexpression 5i hexpression 6i.
ˆ
hexpression 5i : 80
ˆ
hexpression 6i : 3.
ˆ
On conclut alors que hexpression 3i vaut (80 − 3) = 77
ˆ
hexpression 4i : 7.
ˆ
On conclut alors que hexpression 1i vaut (77 + 7) = 84
ˆ
hexpression 2i : - hexpresssion 7i hexpression 8i.
ˆ
hexpression 7i : 6.
ˆ
hexpression 8i : 4.
ˆ
On conclut alors que hexpression 2i vaut (6 − 4) = 2
ˆ
On conclut alors que l’expression principale vaut (84/2) = 42.
1
En cours, nous avons vu les fonctions suivantes que nous réutiliserons pendant ce TD :
ˆ
Prend en entrée un caractère de '0' à '9' et retourne l’entier de 0 à 9 correspondant.
Fonction carVersEntier( x : E Caractère ) : Entier
ˆ
Teste si le caractère en position pos dans la chaine c est un opérateur arithmétique (+,-,*,/).
Fonction estOp( c : E Chaine, pos : E Entier ) : Booléen
ˆ
Teste si le caractère en position pos dans la chaine c est un chiffre ('0', '1', . . . , '9').
Fonction estNb( c : E Chaine, pos : E Entier ) : Booléen
ˆ
Retourne la valeur du nombre inscrit dans la chaine c, à partir de la position pos et de longueur
lng.
Fonction lireNombre( c : E Chaine, pos : E Entier, lng : E Entier ) : Entier
Exercice 1 : lireNombre, version récursive
Réécrivez la fonction lireNombre de manière récursive.
Exemple :
Code
Affichage
Variable : x : Entier
Début
x := lireNombre( “abc123456efg”, 3, 6 )
Affiche ( x )
x := lireNombre( “abc123456efg”, 5, 2 )
Affiche ( x )
Fin
123456
34
Exercice 2 : Longueur d’un entier Écrivez la fonction suivante qui prend en entrée une chaine de
caractère c et un entier pos et qui retourne la longueur (le nombre de chiffres) de l’entier donc l’écriture
commence à la position pos dans c.
Fonction lngNb( c : E Chaine, pos : E Entier ) : Entier
Exemple :
Code
Affichage
Variable : x : Entier
Début
x := lngNb( “abc123efg”, 3 )
Affiche ( x )
x := lngNb( “abc123efg”, 5 )
Affiche ( x )
x := lngNb( “1001”, 0 )
Affiche ( x )
Fin
3
1
4
2
Exercice 3 : Évaluation d’une expression arithmétique.
Écrivez la fonction eval dont l’entête est :
Fonction eval( c : E Chaine, pos : ES Entier ) : Entier
Cette fonction évalue récursivement une expression arithmétique sous la notation polonaise. L’expression
à évaluer est située à la position pos dans la chaine c. Votre fonction doit respecter le principe suivant :
ˆ
La valeur de pos est modifiée de manière à ce que lorsque la fonction termine, pos est l’indice
du caractère situé après le dernier caractère de l’expression lue.
ˆ
Si le caractère situé à la position pos est un chiffre, c’est que l’expression à évaluer est un entier.
Il faut alors évaluer la longueur de cet entier ainsi que sa valeur.
ˆ
Si le caractère situé à la position pos est un opérateur ('+', '-', '*' ou '/') alors
(a) Évaluer et stocker dans une variable la valeur de l’expression située juste après pos.
(b) Évaluer et stocker dans une variable la valeur de l’expression située juste après l’expression
calculée en (a).
(c) Combiner les deux valeurs obtenues en utilisant l’opérateur approprié parmi +, −, ∗, /.
ˆ
Si le caractère situé à la position pos n’est ni un chiffre, ni un opérateur, alors on évalue ce qui se
trouver à la position pos + 1. On pourra ainsi évaluer des expression contenant plusieurs espaces
consécutifs.
Parenthésage
Exercice 4 : Parenthésage.
Écrivez la fonction estBienParenthésée qui prend en entrée une chaine et retourne un booléen
indiquant si elle est bien parenthésée.
Note :
ˆ
On considère trois types de parenthèses : '(' et ')', '[' et ']', '{' et '}'.
ˆ
Une parenthèse ouvrante doit être fermée par le symbole correspondant.
ˆ
Une parenthèse fermante doit fermer une parenthèse ouvrante située avant celle-ci.
ˆ
À l’intérieur d’une paire de parenthèses, toutes les parenthèses ouvrantes être refermées.
Remarque : tout caractère autre que '(', ')', '[', ']', '{' et '}' est ignoré.
Exemples :
ˆ
“( { [ ] } )” −→ ok.
ˆ
“( { ) } )” −→ pas ok.
ˆ
“( { [ ] }” −→ pas ok.
3