Rechercher : dans
Par :

Calculatrice rpn en langage c

Dernière réponse le 24 fév 2009 à 19:46:13 khaled, le 24 fév 2009 à 18:15:45 
 Signaler ce message aux modérateurs

Bonjour,
Debutant en programmation je doit pogrammer une calculatrice rpn et je ne sait comment m'y prendre.
de ce fait j'espere que uelu'un poura me venir en aide en me donnant un petit code source où je pourai m'inspirer
Coordialement

Configuration: Linux
Firefox 3.0.6

Meilleures réponses pour « calculatrice rpn en langage c » dans :
Langage C++ - Les types de données Voir Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données Voir Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...

1

lami20j, le 24 fév 2009 à 19:05:16

Salut,

Voici un algo

DEBUT

TANT QUE il y a un opérande ou un opérateur 
  SI nombre ALORS
     empiler 
  SINON SI opérateur ALORS
    dépiler opérande
    effectuer l'opération
    empiler le résultat
  SINON SI caractère fin ligne ALORS
    dépiler la valeur du sommet et afficher
  SINON
    erreur
  FIN SI
FIN TANT QUE

FIN
Exemple

Si j'écris au clavier
3 4 + 5 3 - * pour (3+4)*(5-3)

Suivant l'algo
3 - empiler
4 - empiler
+ - je depile 4, je depile 3 et je fais l'opération 3+4 =7 (ou 4+3 commutativité) j'empile le résultat
5 - empiler
3 - empiler
- - je depile 3 dans une variable temp , je depile 5 et je fais l'opération 5 - 3 (temp - à cause de non commutativité) et j'empile le résultat 2
* - je depile 2, je depile 7 et je fait le calcul 2*7 et j'empile
accéder au sommet et affiché le résultat = 14 106485010510997108

Répondre à lami20j

2

 khaled, le 24 fév 2009 à 19:46:13
  • +1

Re bonjour,
en fait j'avais compris le fait ue je devait utiliser une pile et je l'ai fait mais g des erreurs de segmentations et je n'arrive pas à les enlever, meme avec la commande valgrind j'arrive pas à bien comprendre.
Voilà le code de mon programme en esperant que vous pouriez me venir en aide.



#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define TAILLE_PILE 100
typedef int data;
typedef struct{

data tab[TAILLE_PILE];
int sommet;/*sommet de la pile*/
}Pile;


void InitialiserPile(Pile* P)
{int i;
P=(Pile*)malloc(sizeof(Pile));
if(P!=NULL)
{
P->sommet=0;
for(i=0;i<TAILLE_PILE;i++)
P->tab[i]=0;
}
}

int Empiler(Pile *P,data d)
{
if(P->sommet==TAILLE_PILE)
return 0;
else
{
P->tab[P->sommet]=d;
(P->sommet)++;
return 1;
}

}

int Depiler(Pile *P, data *d)
{data rec;

if(P->sommet==0)
return 0;
else
{
(P->sommet)--;
rec=P->tab[P->sommet];
P->tab[P->sommet]=0;
return rec;
}
}


int EstVidePile(Pile *P)
{
if(P->sommet==0)
return 1;
else
return 0;

}


int EstOperateur(char* ch)
{int i;
if(sscanf(ch,"%d",&i)==1)
/*if('0'<=ch[0] && ch[0]<='9')*/
return 1;

/*if(ch[0]=='*' ||ch[0]=='-'||ch[0]=='/' ||ch[0]=='+')
return 2;*/
else return 0;

}
void Operation(data x,data y, char c, data *resultat)
{

if(c=='+')
*resultat=(x+y);
if(c=='*')
*resultat=(x*y);
if(c=='-')
*resultat=(x-y);

if(c=='/')
{
if(y!=0)
*resultat=(x/y);
else
printf("division par zero impossible: erreur ");
}

}

data Evaluation(char* ch,Pile* P)
{int i=0;

data temp,temp1;
data resultat='\0';

if(EstOperateur(ch)==1)
{
if(Empiler(P,ch[0])==0)
printf("Erreur, la pile est pleine");
else
while(ch[i]!='\0')
ch[i]=ch[i+1];
}
i=0;
if(EstOperateur(ch)==0)
{
if((temp=Depiler(P,&(P->tab[P->sommet-1])))==0)
printf("Erreur, la pile est vide");

else
{ if((temp1=Depiler(P,&(P->tab[P->sommet-1])))==0)
printf("Erreur, la pile est vide");
else
{
Operation(temp1,temp,ch[0],&resultat);
Empiler(P,resultat);
}
}

while(ch[i]!='\0')
ch[i]=ch[i+1];
}
i=0;

free(ch);
printf("le resultat est : %d ",resultat);return resultat;
}


int main(void)
{
Pile P;
char* chaine;
chaine=(char*)malloc(sizeof(char)*TAILLE_PILE);
if(chaine!=NULL)
{
scanf("%s",chaine);
InitialiserPile(&P);
Evaluation(chaine,&P);

free(chaine);
free(&P);
}
return 0;
}

Répondre à khaled
Collection CommentÇaMarche.net