Besoin d'aide en langage C

Fermé
zabana - 15 avril 2007 à 10:28
 Billy - 12 juin 2008 à 12:28
J'ai besoin de votre aide pour résordre l'exercice en langace c
Objectif:
Obtenir la notation post-fixée d’une expression arithmetique à partir de sa notation symétrique habituelle .dans cette méthode la notation post-fixée est obtenue de la façon
Suivante :
1- l’expression arithmétique est representé par un arbre binaire .
2- un parcours de l’arbre en pré-ordre permet d’afficher l’expession en notation post-fixée.

Etapes à réaliser :
1- mémoriser une expression donnée en notation post-fixée dans une file représenter par chainage.chaque maillon de la file aura pour valeur un opérande de type réel ou un opérateur binaire (+,-,*,/).
2- parcourir cette file pour afficher l’expression post-fixée .
3- Evaluer l’expression en utilisant une pile représentée par contiguïté. Afficher la trace de l’évaluation.

Exemple :
L’expression (5*3/(1+4))-(7*2) s’écrit en notation post-fixée : 53*14+/72*-

Trace de son évaluation :
Empiler5 , empiler 3 , dépiler 3 , dépiler 5 , empiler 15 (5*3) , empiler 1 , empiler 4,
Dépiler 4 , dépiler 1, empiler 5 (1+4) , dépiler 5 , dépiler 15 , empiler 3 (15/5) , empiler 7 ,
Empiler 2 , dépiler 7 , dépiler 14 (7*2) , dépiler 14 ,dépiler 3 ,, empiler -11 (3-14) .
thank's
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
15 avril 2007 à 12:53
Salut,


L’expression (5*3/(1+4))-(7*2) s’écrit en notation post-fixée : 53*14+/72*-

Je pense qu'il vaut mieux un séparateur (un espace par exemple) pour ne pas croire qu'il s'agit de 53 mais de 5 et 3 ( si tu as 534 on va choisir quoi? 5 et 34 ou 53 et 4? :-))

Voilà une aproche pour la 2ème partie de ton exo
Le code
/*--------------------------------------------------*\
  dim 15 avr 2007 calculatrice.c
Sujet:L'expression (5*3/(1+4))-(7*2) 
      s'écrit en notation post-fixée : 5 3 * 1 4 + / 7 2 * -
\*--------------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>

#define TAILLE    100
#define NUMERIQUE 0

int lire_op(char *);
void empiler(double);
double depiler(void);

int main()
{
 int nb;
 double op2;
 char s[TAILLE];

 while((nb = lire_op(s)) != EOF){
  switch(nb) {
   case NUMERIQUE:
    empiler(atof(s));
    break;
   case '+':
    empiler(depiler() + depiler());
    break;
   case '-':
    op2 = depiler();
    empiler(depiler() - op2);
    break;
   case '*':
    empiler(depiler() * depiler());
    break;
   case '/':
    op2 = depiler();
    if (op2 != 0.0)
     empiler(depiler() / op2);
    else
     printf("erreur: division par zéro\n");
    break;
   case '\n':
    printf("\nresultat = %.2f\n",depiler());
    break;
   default:
    printf("erreur: commande inconnue\n");
    break;
  }
 }
 return 0;
}

#define TAILLEPILE 100
int i = 0;
char pile[TAILLEPILE];

void empiler(double p){
 if (i < TAILLEPILE){
  pile[i++] = p;
  printf("empiler %.2f ",p);
 }else
  printf("error: il n'y a plus de place dans la pile\n");
}

double depiler(void){
 if(i > 0){
  printf("depiler %.2f ",(double) pile[--i]);
  return pile[i];
 }else{
  printf("erreur: la pile est vide\n");
  return 0.0;
 }
}

#include <ctype.h>
int lire_op(char *s){
 int i=0,c;

 while((s[0] = c = getchar()) == ' ')
  ;
 s[1] = '\0';
 if(!isdigit(c))
  return c;
 if(isdigit(c))
  while(isdigit(s[++i] = c = getchar()))
   ;
 s[i] = '\0';
 return NUMERIQUE;
}

Le résultat
langagec@debian:~/langagec_k_r$ ./calculatrice
5 3 * 1 4 + / 7 2 * -
empiler 5.00 empiler 3.00 depiler 3.00 depiler 5.00 empiler 15.00 empiler 1.00 empiler 4.00 depiler 4.00 depiler 1.00 empiler 5.00 depiler 5.00 depiler 15.00 empiler 3.00 empiler 7.00 empiler 2.00 depiler 2.00 depiler 7.00 empiler 14.00 depiler 14.00 depiler 3.00 empiler -11.00 depiler -11.00
resultat = -11.00
1
S.V.P j'ai un devoir qui consiste a prendre une expression postfixée ou prefixée et de renvoyer sa notation sous forme fonctionnelle à remettre vendredi à 8heures précise pouvez vous m'aidez?
0