Notation polonaise

cleopatre1988 Messages postés 4 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 19 mai 2008 - 13 mai 2008 à 22:24
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 15 mai 2008 à 01:31
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.

3 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
14 mai 2008 à 11:29
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
0
cleopatre1988 Messages postés 4 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 19 mai 2008
14 mai 2008 à 23:44
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!=')');
}
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
15 mai 2008 à 01:31
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
0
Rejoignez-nous