Calculatrice en C

cs_tototiti Messages postés 5 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 6 janvier 2006 - 6 janv. 2006 à 15:56
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 7 janv. 2006 à 15:14
Bonjour,


j' ai un projet à rendre qui consiste à faire un calculatrice en C en utilisant une pile.
Il faut entrer toute l' expression d'un coup et completement parenthésée:

ex: (((1+5)*7)+(3/9))

J' ai commencé à faire un petit programme mais je n 'arrive pas à gerer les entiers avec scanf("%s", exp) donc j' ai tous mis en char.
Le probleme c'est que mon programme compile mais quand je l' execute il n' y a aucune operation qui marche: ça me revoie des codes ASCII ou autres...

S' il vous plait si il y' a quelqu' un pour m' aider ou me corriger ça serait sympa.

PS: desolé si il y'a des fautes de frappes.

********************
*******CODE********
********************

#include <stdio.h>
#include <math.h>
#define N 256


typedef struct pile /*definition du type pile*/
{
char tab[N];
char h;
}pile;


pile empiler(pile *p, char n) /*fonction empiler*/
{
p->tab[p->h]=n ;
p->h= p->h+1 ;
return *p ;
}


pile depiler(pile *p) /*fonction depiler*/
{
p ->h = p->h-1 ;
return *p ;
}


char sommet (pile p) /*fonction qui donne le sommet => element le plus en haut de la pile*/
{
return p.tab [p.h-1]
}


pile pilenouv ( ) /*fonction pile vide */
{
pile p;
p.h=0;
return p;
}


main ( )
{
int i;
char exp[N]; /* tableau qui contiendra les element à empiler càd operateur et operande */


printf(“entrez une expression completement parenthésée:\n ») ;
scanf("%s ", exp) ;


pile p;
p=pilenouv();


for (i=0 ; exp[N] != ’\0’; i++)
{


char op1, op2, op3;


if(exp[i] != ')' ) /* si l' element parcouru dans le tableau n'est pas une ) l' empiler */
{
empiler(&p, exp[i]);
}


else
{
op3=sommet(p); /*le sommet est un operande */
depiler(&p); /* on depile */
op2=sommet(p); /*le sommet est un operateur */
depiler(&p); /* on depile */
op1=sommet(p); /*le sommet est un operande */
depiler(&p); /* on depile */


switch (op2)
{
case ‘+’: /* si op2 est un + on empile le resultat de op1+op3 */
empiler(&p, op1+op3);
break;


case ‘-’: /* si op2 est un - on empile le resultat de op1-op3 */
empiler(&p, op1-op3);
break;


case ‘*’: /* si op2 est un * on empile le resultat de op1*op3 */
empiler(&p, op1*op3);
break;


case ‘/’:


if(op3==0)
printf("erreur div impossible \n ") ;


else /* si op2 est un / et op3 !=0 on empile le resultat de op1/op3 */
empiler(&p, op1+op3);
break;


default :
printf("erreur \n ") ;
break ;


}
}
}
printf("resultat: %s = %c \n" , exp , sommet(p) ); /*affiche le resultat*/
}

2 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
7 janv. 2006 à 14:46
Pourquoi ne pas demander pas à ton prof? Pas besoin de pile pour ce calcul.

PS les profs aussi ont internet.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
7 janv. 2006 à 15:14
NB: pour récupérer un entier, ce n'est pas scanf("%s",..) mais scanf("%d",...)

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous