[C con Clase] operaciones combinadas en c

estudiante arturoz2008 en hotmail.com
Vie Mayo 14 21:34:06 CEST 2010


GCR> Bueno, básicamente es eso para la conversión de la notación infija a
GCR> la postfija, que es donde nos quitamos de encima el dolor de cabeza de
GCR> la precedencia de los operadores y de los paréntesis, usando para ello
GCR> una pila para guardar los operadores. Luego que ya está todo en un
GCR> arreglo o vector, como quieras, entonces habría que aplicarle la
GCR> operación de evaluación de la expresión, que hay que usar otra pila,
GCR> pero esta vez para los operandos.
GCR> > alguna vez yo trabaje con pilas pero estaticas(es decir usando un
GCR> > vector simple en ves de una lista enlzada) ya que aun no trabajo con
GCR> > pilas dinamicas y no las domino aun(aun soy principiante en progrmacion).
GCR> Bueno, si el caso es un ejercicio sencillo, no me parece que el
GCR> problema sea una pila estática, porque no se me ocurre que alguien
GCR> ponga más de 1000 operandos o algo por el estilo, que sería sencillo
GCR> declararlo en una variable local. De otro modo, puedes utilizar la
GCR> clase stack de la librería stl.
GCR> > Entiendo la logica pero no tengo claro como hacer el codigo ya que
GCR> > me hago la idea que pasaria si la operacion tiene varios parentesis agrupados:
GCR> > xejemplo:
GCR> >  5+6*(4+(5+7)*(6-(5*4)))

GCR> Bueno, lo más difícil en esto es el algoritmo de solución, la
GCR> programación es basura siempre, por eso a mí me gusta más esta parte.
GCR> Por ejemplo, en tu nuevo ejemplo este serían los pasos de donde pienso
GCR> que puedar generalizar el algoritmo y sacar ya un código que puedas
GCR> compartir con todos nosotros :), anda y así lo veo por primera vez en
GCR> c/c++.

GCR> Para el análisis, voy a llevar tres elementos, el primero es la
GCR> descripción del paso, que ojalá no se me olvide alguno, el segundo es
GCR> el estado de la pila de los operadores que le llamaré PO, y el tercero
GCR> la expresión en notación postfija de cómo va quedando, que le
GCR> llamaremos NP.
GCR> Lo primero que hacemos es agregar un ( a la pila, a partir de ahora
GCR> push, y le agrego al final de la cadena de la expresión en notación
GCR> infija un ), quedando esta como: 5+6*(4+(5+7)*(6-(5*4)))), y ahora si
GCR> empezamos, promete ser largo esto. :)
GCR> 1. tomo el número 5 y lo pongo en NP.
GCR> PO: (
GCR> NP: 5
GCR> 2. tomo el operador aritmético +, y entonces analizo la cima de la
GCR> pila, si en ella hay otros operadores de menos prioridad o igual los
GCR> voy sacando y colocando en la expresión NP y al final lo coloco en la
GCR> pila, sino lo coloco en la pila.
GCR> PO: (,+
GCR> NP: 5
GCR> 3. tomo el número 5 y lo pongo en NP.
GCR> PO: (,+
GCR> NP: 5,6
GCR> 4. tomo el operador aritmético *, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*
GCR> NP: 5,6
GCR> 5. tomo el paréntesis ( y lo agrego a la pila.
GCR> PO: (,+,*,(
GCR> NP: 5,6
GCR> 6. tomo el número 4 y lo pongo en NP.
GCR> PO: (,+,*,(
GCR> NP: 5,6,4
GCR> 7. tomo el operador aritmético +, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*,(,+
GCR> NP: 5,6,4
GCR> 8. realizo la misma operación que en 5.
GCR> PO: (,+,*,(,+,(
GCR> NP: 5,6,4
GCR> 9. tomo el número 5 y lo pongo en NP.
GCR> PO: (,+,*,(,+,(
GCR> NP: 5,6,4,5
GCR> 10. tomo el operador aritmético +, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*,(,+,(,+
GCR> NP: 5,6,4,5
GCR> 11. tomo el número 7 y lo pongo en NP.
GCR> PO: (,+,*,(,+,(,+
GCR> NP: 5,6,4,5,7
GCR> 12. tomo el paréntesis ), y analizo la pila, sacando operadores y
GCR> colocandolos en la cadena hasta que encuentre el paréntesis abierto, y
GCR> al final, quito el paréntesis abierto de la pila.
GCR> PO: (,+,*,(,+,
GCR> NP: 5,6,4,5,7,+
GCR> 13. tomo el operador aritmético *, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*,(,+,*
GCR> NP: 5,6,4,5,7,+
GCR> 14. realizo la misma operación que en 5.
GCR> PO: (,+,*,(,+,*,(
GCR> NP: 5,6,4,5,7,+
GCR> 15. tomo el número 6 y lo pongo en NP.
GCR> PO: (,+,*,(,+,*,(
GCR> NP: 5,6,4,5,7,+,6
GCR> 16. tomo el operador aritmético -, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*,(,+,*,(,-
GCR> NP: 5,6,4,5,7,+,6
GCR> 17. realizo la misma operación que en 5.
GCR> PO: (,+,*,(,+,*,(,-,(
GCR> NP: 5,6,4,5,7,+,6
GCR> 18. tomo el número 5 y lo pongo en NP.
GCR> PO: (,+,*,(,+,*,(,-,(
GCR> NP: 5,6,4,5,7,+,6,5
GCR> 19. tomo el operador aritmético *, y entonces realizo la misma
GCR> operación que en 2.
GCR> PO: (,+,*,(,+,*,(,-,(,*
GCR> NP: 5,6,4,5,7,+,6,5
GCR> 20. tomo el número 4 y lo pongo en NP.
GCR> PO: (,+,*,(,+,*,(,-,(,*
GCR> NP: 5,6,4,5,7,+,6,5,4
GCR> 21. tomo el paréntesis ), y entonces realizo la misma operación que
GCR> en 12.
GCR> PO: (,+,*,(,+,*,(,-
GCR> NP: 5,6,4,5,7,+,6,5,4,*
GCR> 22. tomo el paréntesis ), y entonces realizo la misma operación que
GCR> en 12.
GCR> PO: (,+,*,(,+,*,
GCR> NP: 5,6,4,5,7,+,6,5,4,*,-
GCR> 23. tomo el paréntesis ), y entonces realizo la misma operación que
GCR> en 12.
GCR> PO: (,+,*,
GCR> NP: 5,6,4,5,7,+,6,5,4,*,-,*,+
GCR> 24. tomo el paréntesis ) final, el que añadimos al principio, y entonces
GCR> realizo la misma operación que en 12.
GCR> PO:
GCR> NP: 5,6,4,5,7,+,6,5,4,*,-,*,+,*,+
GCR> Y hemos terminado. Sin embargo, en este ejemplo hay casos que no
GCR> se han visto, como por ejemplo en el paso 2, qué pasaría si:
GCR> ...
GCR> PO: (,*
GCR> NP: 5,6
GCR> 2. tomo el operador aritmético +, y entonces analizo la cima de la
GCR> pila, si en ella hay otros operadores de menos prioridad o igual los
GCR> voy sacando y colocando en la expresión NP y al final lo coloco en la
GCR> pila, sino lo coloco en la pila.
GCR> PO: (,+
GCR> NP: 5,6,*
GCR> ...
GCR> > bueno espero respuesta amigo(s)
GCR> Ufff... esta me consumió tiempo, pero me resultó agradable. Cuando
GCR> resulvas esta parte hablamos de como evaluarla, esta sí es más fácil, y
GCR> pon ejemplos más cortos :)
GCR> > saludos.
GCR> -- 
GCR> Salu2,
GCR>  Gilbert
GCR>
Ya veo amigo, quizas el ejemplo que puse fue muy largo (es que me puse en el lugar de mi profesor y como el tiene que probar el programa supongo que
ingresara las operaciones mas enredadas:-p)

pero creo que empezemos por algo sencillo para poder entender lo mas complejo
Con la misma idea que me diste he ido haciendo lo basico haber si podemos irlo armando de a poco :-)

#include<stdio.h>
#include<conio.h>
#define MAX 10


struct stack{
  
  char elementos[MAX];
  
  int indicetop;   /*INDICE DEL ELEMENTO SUPERIOR*/
};


void SALIDA(struct stack* PIL)
{

  int i;

  for(i=PIL->indicetop;i>=0;i--)
  {
      printf("\n\nELEMENTO %d :%d", i+1, PIL->elementos[i]);


  }
}
int stackfull(struct stack* PIL)
{
  int retorno;

  if(PIL->indicetop==MAX-1)
    
    retorno=1;

  else  
   
    retorno=0;

  
  return retorno;
}
  



int stackempty(struct stack* PI)
{
  int retorno;


   if(PI->indicetop==-1)

    retorno=1;

  else  
   
    retorno=0;

  
  return retorno;
}


char pop(struct stack *PIL)
 {
   char elementoquitado;
   int estad;
   

   estad=stackempty(PIL);  /*SI RETORNA VALOR 1 ES VERDADERO(OSEA PILA VACIA) Y VALOR 0 ES FALSO(PILA NO VACIA)*/

   if(estad==1){
      printf("OPERACION IMPOSIBLE, LA PILA ESTA VACIA");

      return -1;
    }

   else  {

     elementoquitado=PIL->elementos[PIL->indicetop];
     PIL->indicetop =  PIL->indicetop  - 1;


     return elementoquitado;
     }
  }

void push(struct stack* PIL, char caracter){

  PIL->indicetop = PIL->indicetop + 1;
  PIL->elementos[ PIL->indicetop] = caracter;

}
    



main()
{
  struct stack PILA;
  char *infija;   /*cadena inicial*/
  char *posfija;
  int i;
  int compruebadig;
  int estado;



  v=0;      /*recorre a postfija*/
  PILA.indicetop=-1;


  clrscr();

  printf("\nIngrese expresion entrefija : ");
  fflush(stdin);
  gets(infija);


 for(i=0;i<(strlen(infija)-2);i++){
   printf("caracter %d : %c",i+1,infija[i] );

   if(infija[i]=='(') { /*SI EL SIMBOLO ES PARENTESIS IZQUIERDO*/

     estado=stackfull(&PILA);  /*SI RETORNA VALOR 1 ES VERDADERO(OSEA PILA LLENA) Y VALOR 0 ES FALSO(PILA NO LLENA)*/

     if(estado==1){
       printf("OPERACION IMPOSIBLE, LA PILA ESTA LLENA");

       return -1;
      }

     else

      push(&PILA, infija[i]);
     }
   }


   else{
     if(infija[i]==')'){  /*SI ES SIMBOLO ES PARENTESIS DERECHO*/
                       

 /*aqui no se como hacerlo :S */




      }

      else{
          compruebadig=isdigit(infija[i]);
 
         if(compruebadig==1){   /*SI EL SIMBOLO ES UN OPERANDO*/
                                
           postfija[v]=postfija[v] + infija[i];   /*AGREGAR SIMBOLO A postfija*/
             v++;

         }else{ /*si el simbolo es el operador*/
          
           aqui viene lo rico......... :s
	
        }

 getch();

 return 0;

}

bueno tengo qe ir a casa ya que ando sin internet jeje haber si porfavor ves el codigo y me dices si ando mal o bien

saludos :-)


 _______________________________________________
GCR> Lista de correo Cconclase Cconclase en listas.conclase.net
GCR> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
GCR> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase