#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

#include "nodo.h"

int main(void)
{
    Nodo  *pila[100];
    int   ptr= 0;
    Nodo  *x, *y; 
    double v;
    int   c;
    double X, Y;

    do {
      if (ptr>0)
         cout << "# " << pila[ptr-1]->P(false) << endl;

      cout << " <number> x + - * / ^ L f\n";

      while ( (c=cin.get())!=EOF && isspace(c) )
          ;
      switch (c)
        {
         case '0': case '1': case '2': case '3': case '4':
         case '5': case '6': case '7': case '8': case '9':
                  cin.putback(c);
                  cin >> v;
                  pila[ptr++]= new Cte(v);
                  break;

         case 'x':
                  pila[ptr++]= new VarX(&X);
                  break;

         case '+':
                  y= pila[--ptr];
                  x= pila[--ptr];
                  pila[ptr++]= new Sum(x,y);
                  break;

         case '-':
                  y= pila[--ptr];
                  x= pila[--ptr];
                  pila[ptr++]= new Sub(x,y);
                  break;
         case '*':
                  y= pila[--ptr];
                  x= pila[--ptr];
                  pila[ptr++]= new Mul(x,y);
                  break;
         case '/':
                  y= pila[--ptr];
                  x= pila[--ptr];
                  pila[ptr++]= new Div(x,y);
                  break;
         case '^':
                  y= pila[--ptr];
                  x= pila[--ptr];
                  pila[ptr++]= new Pow(x,y);
                  break;
         case 'L':
                  x= pila[--ptr];
                  pila[ptr++]= new Log(x);
                  break;
         case 'f': 
                  break;
        }
    }  while( c!='f' );

   
   cout << "Dar a:\n"; 
   double a;
   cin >> a;
   cout << "Dar b:\n"; 
   double b;
   cin >> b;
   cout << "Dar n:\n"; 
   int n;
   cin >> n;

   for (int k=0; k<=n; k++)
     {
      X= a+ k*(b-a)/n;
      Y= pila[ptr-1]->E(); 
      cout << X << "\t" << Y << endl; 
     }
   return EXIT_SUCCESS;
}

