Programación General > C/C++
evaluar expresion postfija
(1/1)
antlcn:
hola, necesito hacer un programa en C al que le introduzcas una expresion postfija y te devuelva el resultado la expresion se guarda en una cadena con expacios entre cada dato introducido con un caracter final de parada "f", y no me funciona el programa, a ver si alguien sabe en que fallo.
--- Código: C ---#include<stdio.h>#include<stdlib.h>#include<string.h> struct pila{ int n; struct pila *sig;}; void apilar(struct pila **cabeza, int n);struct pila *nuevoElemento();int desapilar(struct pila **cabeza);int pilaVacia(struct pila *cabeza);int operacion(int n1, int n2, char caract);void conversion(struct pila *cabeza, char cad[]);void mostrarPila(struct pila **cabeza); intmain(void){ int res; struct pila *operandos=NULL; char expresion[15]; printf("nIntroduce la expresion separada por espacios: "); gets(expresion); printf("nOk...getsn"); conversion(operandos, expresion); mostrarPila(&operandos); printf("nOk..conversionn"); res=desapilar(&operandos); printf("nOk...resultadon"); printf("nEl resultado de la expresion es: %dn", res); return 0;} struct pila *nuevoElemento(){ return (struct pila *)malloc(sizeof(struct pila));} void apilar(struct pila **cabeza, int n){ struct pila *nuevo=NULL; nuevo=nuevoElemento(); nuevo->n=n; nuevo->sig=*cabeza; *cabeza=nuevo;} int desapilar(struct pila **cabeza){ int n; struct pila *aux=NULL; n=(*cabeza)->n; aux=*cabeza; *cabeza=aux->sig; free(aux); return n;} int pilaVacia(struct pila *cabeza){ if(cabeza==NULL) return 0; return 1;} int operacion(int n1, int n2, char caract){ int r; if(caract=='*') r= n1*n2; if(caract=='-') r= n1-n2; if(caract=='+') r= n1+n2; if(caract=='/') r= n1/n2; return r;} void conversion(struct pila *cabeza, char cad[]){ int n1, n2, nuevo, i=0; while(cad[i]!='f'){ if(cad[i]>47 && cad[i]<57) apilar(&cabeza, cad[i]); if(cad[i]>41 && cad[i]<47){ n1=desapilar(&cabeza); n2=desapilar(&cabeza); nuevo=operacion(n1, n2, cad[i]); apilar(&cabeza, nuevo); } i++; } } void mostrarPila(struct pila **cabeza){ struct pila *aux=NULL; aux=*cabeza; while(aux!=NULL){ printf("n%d",aux->n); }}
un saludo.
gracias de antemano.
czealt:
..Los errores que hacen que el programa no funcione estan en la funcion conversion():
--- Código: C --- void conversion(struct pila *cabeza, char cad[]) /* esta funcion modifica la pila asi que el argumento cabeza deberia ser declarado como struct pila **cabeza */ { int n1, n2, nuevo, i=0; while(cad[i]!='f'){ if(cad[i]>47 && cad[i]<57) apilar(&cabeza, cad[i]); /* Aqui se esta apilando el codigo ASCII del digito en lugar de su valor */ if(cad[i]>41 && cad[i]<47){ n1=desapilar(&cabeza); /* El operando que se desapila primero debe ser n2*/ n2=desapilar(&cabeza); nuevo=operacion(n1, n2, cad[i]); apilar(&cabeza, nuevo); } i++; }}
Tambien se deberia verificar si el segundo operando de la operacion / es cero para evitar dividir por 0.
El programa corregido:
--- Código: C --- #include<stdio.h>#include<stdlib.h>#include<string.h> enum{DIVCERO=1}; const char *msjerror[]={"Division por cero"}; int erroreval=0; struct pila{ int n; struct pila *sig;}; void apilar(struct pila **cabeza, int n);struct pila *nuevoElemento();int desapilar(struct pila **cabeza);int pilaVacia(struct pila *cabeza);int operacion(int n1, int n2, char caract);void conversion(struct pila **cabeza, char cad[]);void mostrarPila(struct pila **cabeza); int main(void){ int res; struct pila *operandos=NULL; char expresion[15]; printf("nIntroduce la expresion separada por espacios: "); gets(expresion); printf("nOk...getsn"); conversion(&operandos, expresion); mostrarPila(&operandos); if(erroreval) { printf("Error de evaluacion: %sn",msjerror[erroreval-1]); } else { printf("nOk..conversionn"); res=desapilar(&operandos); printf("nOk...resultadon"); printf("nEl resultado de la expresion es: %dn", res); } return 0;} struct pila *nuevoElemento(){ return (struct pila *)malloc(sizeof(struct pila));} void apilar(struct pila **cabeza, int n){ struct pila *nuevo=NULL; nuevo=nuevoElemento(); nuevo->n=n; nuevo->sig=*cabeza; *cabeza=nuevo;} int desapilar(struct pila **cabeza){ int n; struct pila *aux=NULL; n=(*cabeza)->n; aux=*cabeza; *cabeza=aux->sig; free(aux); return n;} int pilaVacia(struct pila *cabeza){ if(cabeza==NULL) return 0; return 1;} int operacion(int n1, int n2, char caract){ int r; erroreval=0; if(caract=='*') r= n1*n2; if(caract=='-') r= n1-n2; if(caract=='+') r= n1+n2; if(caract=='/')// verificar que n2 no sea 0 { if(n2!=0) r= n1/n2; else erroreval=DIVCERO; } return r;} void conversion(struct pila **cabeza, char cad[]){ int n1, n2, nuevo, i=0; while(cad[i]!='f'){ if(cad[i]>='0' && cad[i]<='9') // es digito? apilar(cabeza, cad[i]-'0'); // convertir a entero antes de apilar if(cad[i]=='+' || cad[i]=='-' || cad[i]=='*' || cad[i]=='/'){// es operacion? n2=desapilar(cabeza); n1=desapilar(cabeza); nuevo=operacion(n1, n2, cad[i]); apilar(cabeza, nuevo); } i++; }} void mostrarPila(struct pila **cabeza){ struct pila *aux=NULL; aux=*cabeza; while(aux!=NULL){ printf("n%d",aux->n); aux=aux->sig; }}
Navegación
Ir a la versión completa