#include <stdio.h>
#include <stdlib.h>

#define ERREUR_ARGUMENTS 1

/////////////////////////////////////////////////////
//  LES DECLARATIONS DE TYPES
/////////////////////////////////////////////////////

// --------------------------------------------
// Un entier non-signé
// --------------------------------------------
typedef unsigned int uint;

// --------------------------------------------
// Structure pour les jetons. Selon le type
// (operateur unaire/binaire ou nombre), c'est
// le champ <op> ou <nombre> qui sera exploité
// --------------------------------------------
typedef struct{
  float nombre;
  char op;
  enum{OPUNR,OPBIN,NOMBRE} type;
} TJETON;

//---------------------------------------------
// Une expression postfixe est définie comme
// un tableau de jetons.
//---------------------------------------------
typedef TJETON *TEXPR;

// --------------------------------------------
// Structure de cellule pour définir la
// structure de pile qui suit sous forme de
// liste chaînée. Contient deux champs:
// 1. le <nombre> sur la pile
// 2. le pointeur <suiv> vers la cellule suiv.
// --------------------------------------------
typedef struct tcell{
  float nombre;
  struct tcell *suiv;
} TCELL;

typedef TCELL *TPILE; 


/////////////////////////////////////////////////////
//  LES FONCTIONS
/////////////////////////////////////////////////////

//---------------------------------------------
// Renvoie la pile après y avoir empilé une
// nouvelle cellule contenant le <nombre>.
//---------------------------------------------
TPILE Empiler(TPILE pile, float nombre){

}

//---------------------------------------------
// Renvoie la pile étêtée. Le <nombre> présent 
// sommet de la pile est traité par "adresse"
// pour être récupéré.
//---------------------------------------------
TPILE Depiler(TPILE pile, float *nombre){

}

//---------------------------------------------
// Convertit une chaîne de caracteres en jeton
//---------------------------------------------
TJETON Chaine2Jeton(char *chaine){

}

//---------------------------------------------
// Convertit les arguments (tableau de chaînes
// de caractères) en expression (tableau de
// jetons). 
//---------------------------------------------
TEXPR Arg2Expr(char *arguments[], int n){

}

//----------------------------------------------
// Affiche les jetons d'une expression postfixe
//----------------------------------------------
void AfficherExpr(TEXPR expr, uint n){
  printf("JETONS : |");
  for (int i = 0; i < n; i++)
    {
      TJETON jeton = expr[i];
      if ((jeton.type == OPUNR) || (jeton.type == OPBIN))
	printf(" %1c |", jeton.op);
      else
	printf(" %3.2f |",jeton.nombre);
    }
  printf("\n");
}

//---------------------------------------------
// Renvoie (x <op> y) si <op> est binaire
// ou (<op> x) si <op> est unaire
//---------------------------------------------
float Operer(float x, float y, char op){

}

//---------------------------------------------
// Affiche le contenu de la pile
//---------------------------------------------
void AfficherPile(TPILE pile){

}

//---------------------------------------------
// Renvoie l'évaluation d'une expression
// postfixe <expr> calculée à l'aide d'une pile
//---------------------------------------------
float Evaluer(TEXPR expr, uint n){

}

/////////////////////////////////////////////////////
// FONCTION MAIN
/////////////////////////////////////////////////////
int main(int argc, char* argv[]){
  uint n = argc - 1;  // Le nombre de jetons
  TEXPR expr = NULL;  
  
  if (n < 1)
    // Si aucun argument sur la ligne de commande: arrêt
    {
      printf("Syntaxe: %s expr\n",argv[0]); 
      return ERREUR_ARGUMENTS;
    }
  else
    // Sinon: on convertit les arguments en tableau de jetons
    expr = Arg2Expr(argv + 1, n);

  AfficherExpr(expr, n);
  printf("\n%f\n", Evaluer(expr, n));
  return 0;
}
