[C con Clase] Obtener color de pixel

Steven Richard Davidson stevenrichard.davidson en gmail.com
Jue Ene 10 12:12:19 CET 2008


Hola Manuel,

On Jan 10, 2008 5:14 AM, manuel escobedo escareño
<beat_galactic en hotmail.com> wrote:
> tengo dudas con una clase para convertir expresiones infijas en postfijas
> segui paso a paso un algoritmo y falla en el parentesis derecho
>

Veamos el código fuente.

> enum simbolo {operando, pIzq, pDer,
>      SumResta, MultDiv, Pow};
> class polaca
>   {
>   private:
>     String lexema;
>     simbolo precedencia (char c)
>     {
>       simbolo aux;
>       switch (c)
>       {
>         case '+':
>         case '-': aux = SumResta; break;
>         case '*':
>         case '/': aux =MultDiv; break;
>         case '^': aux = Pow; break;
>         case '(': aux = pIzq; break;
>         case ')': aux = pDer; break;
>         default : aux = operando; break;
>       }
>       return aux;

No hacía falta usar una variable auxiliar. Podrías haber escrito algo
parecido a lo siguiente:

switch( c )
{
  case '+': case '-': return SumResta;
  case '*': case '/': return MultDiv;
  ...
}
return operando;  // Por defecto, se trata de un operando

>     }
>     stack <char> s;
>   public:
>     polaca (String s)
>     {
>       lexema = s;
>     }

Aconsejaría usar la lista inicializadora del constructor. Esto es,

polaca( String s ) : lexema( s )  {}

>     String convertir ()
>     {
>         String salida = "";
>         for (int i = 1; i <= lexema.Length(); i++)

En estos momentos no tengo Builder instalado ni recuerdo todos los
detalles de su clase 'String'. Sin embargo, no estoy seguro de si
aceptaba índices a partir de 1, y no a partir de 0. Sugiero que lo
revises, por si estoy en lo cierto.

>         {
>           char c = lexema[i];
>           simbolo simb = precedencia(c);
>           switch (simb)
>           {
>             case operando: salida = salida + c; break;
>             case pIzq:     s.push(c);           break;
>             case pDer:     {
>                     while(!s.isempty() && s.top() != '(')
>                                salida = salida + s.pop();
>                              s.pop();
>                             }

Aquí tienes algunos problemas. La función miembro 'pop()' no retorna
ningún valor. Si quieres el valor, usar 'top()'. Tu código sería algo
como,

while( !s.isempty() && s.top() != '(' )
{
  salida = salida + s.top();
  s.pop();
}
s.pop();

>                            break;
>             case SumResta:
>             case MultDiv:
>             case Pow:      {
>                              while (s.isempty() == false && precedencia(s.top()) >= c)

No se suele comparar explícitamente valores booleanos. Aconsejo, para
este caso, usar el operador !. Esto es,

while( !s.isempty() && ... )

>                              {
>                                salida = salida + s.pop();

Aquí tienes el mismo problema. La función 'pop()' no retorna ningún
valor; usa 'top()'. Esto sería,

salida = salida + s.top();
s.pop();

>                              }
>                              s.push(c);
>                            }
>                            break;
>           }
>         }
>           while(s.isempty() == false)
>             salida = salida + s.pop();

Nuevamente, tenemos el mismo error.

>           return salida;
>     }
>   };
>
> podrian orientarme al menos? gracias...
> la clase stack es un pila de listas enlazadas y el programa esta hecho en c++ builder 6

La clase-plantilla 'stack' no es una pila de listas enlazadas, sino un
pila que internamente y por defecto usa una cola especial: 'deque<>'.


Espero que todo esto te sirva.

Steven




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