Évaluation de calculs en polonaise inverse

É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 :