\(\def\ab#1#2{\llbracket #1\,,\,#2\rrbracket}\)
Examen de TP [2020-2021] - Évaluation avec une pile.

Le barème est donné à titre indicatif et est sus­cep­tible d'être adapté. Lisez at­ten­ti­ve­ment les explications. Commentez vos fonctions.

L'objectif de cet examen est d'écrire un programme en langage C qui évalue une expression sous forme postfixe à l'aide d'une pile.

Sauvez le fichier source prérempli RPN.c. Une fois que vous aurez complété les fonctions de ce fichier source et que vous l'aurez compilé à l'aide de la commande

gcc -o RPN RPN.c -Wall

L'appel
./RPN 3 2 3.1 - 2 _ x +
affichera la valeur
5.2

Les arguments 3 2 3.1 − 2 _ × + codent en postfixe l'expression infixe 3 + (2 − 3.1) × (−2) et le symbole _ code l'opérateur unaire de changement de signe.

Une première structure TJETON contient trois champs :

  1. nombre (un flottant),
  2. op (un caractère),
  3. type (un opérateur unaire, binaire ou un nombre).
pour coder un jeton. Seul un des deux champs nombre ou op sera utilisé selon le type du jeton.

Une deuxième structure TCELL contient deux champs : 

  1. nombre (un flottant),
  2. struct tcell *suiv (un pointeur vers une cellule).
est utilisée pour définir une structure de liste chaînée TPILE pour gérer la pile. Si P est une variable de type TPILE, on rappelle que l'on accède à un champ de l'enregistrement pointé grâce à P->nombre ou P->suiv.
Question 1 [+6] Complétez la fonction TJETON Chaine2Jeton(char *chaine) qui convertit une chaîne en jeton et la fonction TEXPR Arg2Expr(char *arguments[], int n) qui convertit les \(n\) arguments de la ligne de commande en tableau de jetons. Indication: Utilisez la fonction sscanf(), dont le premier paramètre est la chaîne à convertir, le second, la chaîne décrivant le format de conversion (comme pour printf), et le troisième, un pointeur vers la variable qui va contenir la conversion (donc du type spécifié dans le format). Par exemple sscanf(chaine, "%f", &nombre) convertit la chaîne de caractère chaine en un flottant nombre.
Question 2 [+4] Complétez la fonction TPILE Empiler(TPILE pile, float nombre) qui empile le nombre en paramètre au sommet de la pile et renvoie cette nouvelle pile. Complétez la fonction TPILE Depiler(TPILE pile, float *nombre) qui récupère le nombre au sommet de la pile, élimine la cellule correspondante en libérant l'espace mémoire et renvoie la pile ainsi mise à jour. Le nombre est récupéré par le passage par adresse. 
Question 3 [+2] Complétez la fonction void AfficherPile(TPILE pile) qui affiche le contenu de la pile (horizontalement) sur le terminal (cela vous sera utile pour vérifier votre programme).
Question 4 [+2] Complétez la fonction float Operer(float x, float y, char op) qui renvoie le résultat de l'opération (x op y) si op est un opérateur binaire (addition +, soustraction −, multiplication ×, division /) et (op x) s'il s'agit d'un opérateur unaire (changement de signe _ ).
Question 5 [+6] Complétez la fonction float Evaluer(TEXPR expr, uint n) qui evalue l'expression passée en paramètre (n est la taille de cette expression) et renvoie le résultat de l'évaluation.