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