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;
- }
|
|