begin process at 2008 07 04 12:04:15
1 204 587 membres
128 nouveaux aujourd'hui
14 116 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : notation polonaise [ Divers / Débutant(e) ] (cleopatre1988)

notation polonaise le 13/05/2008 22:24:21

cleopatre1988


salut   ,j'aimerai avoir un programme qui donne la notation polonaise d'une expression
en langage c,j'ai fais un programme pour ceci mais il ne fonctionne pas correctement
j'ai cherche dans le site et je l'ai trouve en java.
bon merci.

Re : notation polonaise le 14/05/2008 11:29:32

DeAtHCrAsH
Salut,
Peux tu nous donner plus d'explications et nous dire en quoi ton programme ne fonctionne pas.
Un extrait de code peut etre utile.

Shell

Re : notation polonaise le 14/05/2008 23:44:44

cleopatre1988
salut bon voila mon programme ;le probleme reside dans la fonction d'affichage
car quand je fais le test sur les elements a affiche il bloque et quand
j'enleve le test il marche.


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

typedef struct ElementListe
{
  char  *donnee;
  struct ElementListe *suivant;
} Element;

typedef struct ListeRepere
{
  Element *debut;
  int taille;
} Pile;

main ()
{int n,i,p;
char name;
/* initialisation */
void initialisation (Pile *tas);

/* EMPILER*/
int empiler (Pile *tas, char *donnee);


/* DEPILER*/
int depiler (Pile *tas);

/* Affichage de élément en haut de la pile (LastInFirstOut) */
#define pile_donnee(tas)  tas->debut->donnee

/* Affiche la pile */
void affiche (Pile *tas);


  Pile *tas;
  char *nom;
if ((tas = (Pile *) malloc (sizeof (Pile))) == NULL)
    return -1;
if ((nom = (char *) malloc (50 * sizeof (char))) == NULL)
    return -1;
initialisation (tas);


printf ("Entrez un mot : ");
scanf ("%s", nom);
empiler (tas,nom);
printf ("La pile (%d elements): \n",tas->taille);
printf("\n********** Haut de la PILE 1 **********\n");
affiche(tas);
printf("__________ Bas de la PILE 1__________\n\n");
printf("\n********** Haut de la PILE  **********\n");

printf("__________ Bas de la PILE __________\n\n");
printf ("Entrez un mot : ");
scanf ("%s", nom);
empiler (tas,nom);
printf ("La pile (%d éléments): \n",tas->taille);
printf("\n********** Haut de la PILE **********\n");
printf("__________ Bas de la PILE  __________\n\n");
            
printf ("Entrez un mot : ");
scanf ("%s", nom);
empiler (tas,nom);
printf ("La pile (%d éléments): \n",tas->taille);
printf("\n********** Haut de la PILE **********\n");
affiche(tas);
printf("__________ Bas de la PILE __________\n\n");
printf ("\nLe dernier entré (LastInFirstOut)  %s sera supprimé",
                  pile_donnee(tas));
  printf ("\nLe dernier entré est supprime\n");
  depiler (tas);/* suppression de dernier element entre */
  printf ("La pile (%d éléments): \n",tas->taille);
  printf("\n********** Haut de la PILE **********\n");
  affiche(tas);
  printf("__________ Bas de la PILE __________\n\n");
system ("pause");
  return 0;
}
void initialisation (Pile *tas)
{
     tas->debut = NULL;
     tas->taille=0;
}

int empiler (Pile *tas, char *donnee)
{
  Element *nouveau_element;
  if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
    return -1;
//nouveau_element->donnee = (char) malloc (50 * sizeof (char));
  if (nouveau_element->donnee == NULL)
    return -1;
  strcpy (nouveau_element->donnee, donnee);
  nouveau_element->suivant = tas->debut;
  tas->debut = nouveau_element;
  tas->taille++;
}
int empiler2 (Pile *tas2, char *donnee)
{
  Element *nouveau_element;
  if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
    return -1;
//nouveau_element->donnee = (char) malloc (50 * sizeof (char));
  if (nouveau_element->donnee == NULL)
    return -1;
  strcpy (nouveau_element->donnee, donnee);
  nouveau_element->suivant = tas2->debut;
  tas2->debut = nouveau_element;
  tas2->taille++;
}


//depiler
int depiler (Pile *tas)
{
  Element *supp_element;
  if (tas->taille == 0)
    return -1;
  supp_element = tas->debut;
  tas->debut = tas->debut->suivant;
  free (supp_element->donnee);
  free (supp_element);
  tas->taille--;
  return 0;
  
  
}

/* affichage de la pile */
void affiche (Pile * tas)
{
  Element *courant;
  int i;
  courant = tas->debut;
  
do {
  for(i=0;i<tas->taille;++i)
  { printf("\t\t%s\n", courant->donnee);
    courant = courant->suivant;
  }
}
while (courant->donnee!='(' && courant->donnee!=')');
}


Re : notation polonaise le 15/05/2008 01:31:58

jfrancois
Bonsoir,

1) courant->donnee est une chaîne de caractères donc pas de comparaison avec un caractère !
Il faut courant->donnee[0] != '(' à condition que le caractère soit bien en première position dans donnee !

2) Dans la fonction empiler() :
//nouveau_element->donnee = (char)malloc(50 * sizeof(char)); 
devient :
nouveau_element->donnee = (char*)malloc((strlen(donnee) + 1) * sizeof(char)); 
 

3) Il faudra ajouter la libération mémoire de toute la pile à la fin.

4) On ne met pas de prototypes de fonctions dans une fonction (au début de main()).

Jean-François



Classé sous : programme, notation, polonaise

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS