| Gattuso | Bonjour,
 j'aurais besoin d'aide car mon programme ne fonctionne pas .
 
 Est ce que vous pourriez m'aider.
 
 Merci
 
 
 
 | Code : 
 #include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <float.h>#include <string.h>enum Type  {    Operateur,    Constante,    Variable  };union Info {  char *nom;  double cte;  char op;};typedef struct noeud{  enum Type type;  union Info info;  struct noeud *gauche;  struct noeud *droit;}Noeud,*Arbre;void espace (char **ligne){  while(**ligne == ' ') (*ligne)++;}int EstDouble(char *ligne, double *val){  double v;  char *endptr = NULL;  v = strtod(ligne,&endptr);   /* la chaine ne contient pas que des chiffres */  if(*endptr != '\0')    {      fprintf(stderr,"le chiffre n'est pas correctement ecrit\n" );      return 1;    }   /* verification si debordements */  if(v<=(-DBL_MAX) || v>=DBL_MAX)    {      fprintf(stderr,"debordement\n" );      return 1;    }   /* on recupere la valeur */  *val = v;   return 0;}/* Analyse d'une expression : creation de l'arbre */Arbre CreerArbre(char **ligne){  double val;  char operateur;  char *chiffre;  char *nom;   Arbre a = malloc(sizeof(Noeud));  if(a == NULL)    {      fprintf(stderr,"erreur allocation de l'arbre\n" );      return NULL;    }   if(**ligne == '\0')    return NULL;  while(**ligne != '\0')    {      /* c'est un chiffre */      if(isdigit(**ligne))	{	  chiffre = *ligne;	  int i = 0;	  while(isdigit(**ligne) || **ligne =='.')	    {	      chiffre[i] = **ligne;	      (*ligne)++;	      i++;	    }	  chiffre[i] = '\0';	 	  if(**ligne != ' ' || **ligne != '\0')	    return NULL;	 	  if(EstDouble(chiffre,&val))	    {	   	      fprintf(stderr,"le chiffre : '%s' n'est pas correctement ecrit\n",chiffre);	      return NULL;	    }	 	  a->type = Constante;	  a->info.cte = val;	 	  chiffre = NULL;	  espace(ligne);	}           else	{	  /* c'est une lettre -> variable*/	  if(isalpha(**ligne))	    {	      nom = *ligne;	      int j = 0;	      while(isalpha(**ligne))  {    nom[j] = **ligne;    (*ligne)++;    j++;  }	      nom[j] = '\0';	     	      if(**ligne != ' ' || **ligne != '\0')  return NULL;	     	      a->type = Variable;	      a->info.nom = malloc(strlen(nom)+1);	      if(a->info.nom == NULL)  {    fprintf(stderr,"erreur allocation" );    return NULL;  }	      strcpy(a->info.nom,nom);     	     	      nom = NULL;	      espace(ligne);	    }	 	  else	    {	      /* le caractere est un operateur */	      operateur = *((*ligne)++);	      if(operateur == '+' || operateur  == '-' ||   operateur == '*' || operateur == '/')  {    a->type = Operateur;    a->info.op = operateur;    a->gauche = CreerArbre(ligne);    a->droit = CreerArbre(ligne);  }	     	      else  {    if(operateur == '@' || operateur == '~')      {        a->type = Operateur;        a->info.op = operateur;        a->gauche = NULL;        a->droit = CreerArbre(ligne);      }       else      printf("Erreur,'%c' n'est pas un operateur prevu\n",operateur);  }	    }	}    }  return a;}void Infixe(Arbre a){   switch(a->type)    {    case Constante:      printf("%f",a->info.cte);      break;         case Variable:      printf("%s",a->info.nom);      break;         case Operateur:      switch(a->info.op)	{	  case'+':	    case'-':/* affichage infixe sans () */	    Infixe(a->gauche);	  if(a->info.op == '+') printf("+" );	  else printf("-" );	  Infixe(a->droit);	  break;	  case'*':	    case'/':/* affichage infixe avec () */	    if(a->gauche->type != Operateur)	      Infixe(a->gauche);	    else	      {  printf("(" );  Infixe(a->gauche);  printf(" )" );	      }	  if(a->info.op == '*') printf("*" );	  else printf("/" );	 	  if(a->droit->type != Operateur)	    Infixe(a->droit);	  else	    {	      printf("(" );	      Infixe(a->droit);	      printf(" )" );	    }	  break;	  case'@':/* affichage prefixe */	    printf("@" );	  Infixe(a->gauche);	  break;	  case'~':	    printf("~" );	  Infixe(a->gauche);	  break;	}    }}int main(void){  char *ligne = "+ * premier deuxieme 25";  Arbre a = CreerArbre(&ligne);  Infixe(a);  return 0;}
 | 
 
   |