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

[0] Índice de Mensajes

Ir a la versión completa