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