Évaluation de calculs en polonaise inverse #
On propose de réaliser un programme qui prend en entrée un chaîne de caractères entrée par l’utilisateur et l’évalue en tant qu’expression en polonaise inverse. On se limitera aux 4 opérations arithmétiques.
Par exemple, entrer 5 1 + 3 4 + *
donnera 42
.
Pour mener à bien ce travail, il sera nécessaire de manipuler des chaînes de
caractères, des tableaux de chaînes (char * []
), des pointeurs (y compris
vers des fonctions), d’allouer de la mémoire (malloc
)
On fournit la structure du code, et il reste les fonctions à compléter :
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define SMAX 256 // taille max des chaînes
#define TKMAX 100 // Nombre de tokens max
int isoperator(char s[]) {
// renvoie vrai indique si la chaîne s contient un opérateur
}
int tokenize(char input[], char * data[]) {
// La fonction lit une chaîne de caractère contenant l'expression et
// la découpe en tokens. Chaque token est un opérateur ou une opérande.
// La fonction renvoie le nombre de tokens trouvés.
// Si input est la chaîne "5 31 +", par exemple, la valeur de retour sera 3 et on aura
// data[0] qui pointe vers la chaîne "5"
// data[1] qui pointe vers la chaîne "31"
// data[2] qui pointe vers la chaîne "+"
// Le tableau data est déjà alloué, mais les chaînes vers lesquelles il point ne le sont pas.
}
void printstack(char * data[], int n) {
// Affiche des données produites par tokenize
}
void freedata(char * data[], int n) {
// Libère la mémoire allouée par la structure de données renvoyée par tokenize
}
float evaluation(char * data[], int n) {
// data est un tableau contenant chaque élément de l'expression (opérante ou opérateur) sous forme de chaîne.
// et n est le nombre d'éléments utiles du tableau.
// data et n sont les informations calculées par la fonction tokenize
// La fonction renvoie le résultat de l'évaluation si l'expression ne contient pas d'erreur.
// Si l'expression contient des erreurs, le comportement est à définir.
}
int main(void) {
char input[SMAX];
char *data[TKMAX];
while(1) {
fgets(input, SMAX, stdin);
if (strlen(input) == 1) break; // On sort si on a juste tapé entrée.
int n = tokenize(input, data); // découpe la chaîne en tokens
printstack(data, n); // pour contrôle
float res = evaluation(data, n); // calcul de l'expression
freedata(data, n); // libération de l'espace mémoire alloué dans tokenize
printf("Résultat : %f\n", res);
}
return 0;
}
Entre autres, vous aurez probablement besoin de ces fonctions :