Advertisement
AntonioVillanueva

Calculadora RPN (Reverse Polish Notation)

Feb 17th, 2016
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.16 KB | None | 0 0
  1. //  g++ -std=c++11 -o calculadora calculadora_rpn.cpp
  2. //  g++ -std=gnu++0x -o calculadora calculadora_rpn.cpp
  3. //  OJO No COMPILA !!! g++ -o calculadora calculadora_rpn.cpp
  4. // Calculadora RPN terminal Antonio Villanueva Segura
  5.  
  6. #include <iostream>
  7. #include <vector>
  8. #include <string>
  9. #include <cmath>
  10.  
  11. using namespace std;
  12.  
  13. class calc {
  14.     public://interface publico de la clase
  15.     calc ();//constructor de la clase
  16.     void start();//arranca la calculadora
  17.    
  18.     private:
  19.     vector <double>  pila;//almaceno los valores numericos a operar
  20.     string lee();//lectura datos del teclado
  21.     char procesa(string str);// procesa dato u operador
  22.      
  23. #if defined (__WIN32__)  
  24.     double stod(string str);//stof stod no existen en mingw Windows !!!!!!
  25. #endif  
  26.  
  27.     bool operador (char c);//gestiona las distintas operaciones + - * ...
  28.     void verPila()const;//muestra el estado de la pila
  29. };
  30. //----------------------------------------------------------------------
  31. calc::calc(){cout<<"--- CALCULADORA RPN Notacion polaca inversa ---"<<endl;
  32.             cout <<"Introduzca cifra u operador + - * / p (potencia) r (raiz) o Q (salir) "<<endl<<endl;
  33.     };
  34. //----------------------------------------------------------------------
  35. void calc::start(){
  36.     char operacion('\0');//operacion + - * / cuadrado raiz ...
  37.     while (operacion!='Q' && operacion!='q'){      
  38.         operacion =procesa(lee());        
  39.         if (operacion !='\0') {operador(operacion);} //si no es NUMERO es op.    
  40.     }  
  41.     verPila();
  42. }
  43. //----------------------------------------------------------------------
  44. string calc::lee(){//lectura datos del teclado
  45.     string str("");
  46.     while (str.empty()){
  47.         cout <<"cifra u operacion  (Q salir) "<<endl;
  48.         cin>>str;
  49.     }
  50.     return str;
  51. }
  52. //----------------------------------------------------------------------
  53. char calc::procesa(string str){// procesa dato u operador
  54.    
  55.     if  (!isdigit(str[0])){return str[0];}//si no es  numero es operador
  56.     pila.push_back(stod(str));//guarda en pila y transforma el str en float
  57.  
  58.     verPila();
  59.    
  60.     return '\0';// es un numero , no una operacion
  61. };
  62. //----------------------------------------------------------------------
  63. // Funcion inexistente con mingw windows , asi que se define solo para WIN
  64. // En Linux esta definida
  65.  
  66. #if defined (__WIN32__)  
  67.  
  68.     double calc::stod(string str){
  69.         double tmp(0);
  70.         size_t pos(1);
  71.        
  72.         for ( string::iterator it=str.end()-1; it>str.begin()-1; --it){
  73.             tmp+=(((*it-'0'))*pos);
  74.             pos*=10;//unidad 1 ... decenas 10 centenas 100 ....        
  75.         }
  76.         return tmp;
  77.     }
  78. #endif    
  79.  
  80. //----------------------------------------------------------------------  
  81. bool calc::operador(char op){//gestiona las distintas operaciones + - * /
  82.  
  83.     float tmp(0);
  84.     //pila esta llena ?
  85.     if ( pila.empty()){verPila();return false;};//pila vacia
  86.     //operacion unaria imposible + - * /  
  87.     if ((op>='*' && op<='/')&& pila.size()==1){verPila();return false;}
  88.  
  89.     tmp=pila.back();
  90.     pila.pop_back();//elimina ultimo valor
  91.    
  92.     switch (op){
  93.         case 'c' :pila.clear();break;
  94.         case '+': pila.back()+=tmp  ;break;
  95.         case '-': pila.back()-=tmp  ;break;
  96.         case '*': pila.back()*=tmp  ;break;
  97.         case '/': pila.back()/=tmp  ;break;
  98.         case 'p': pila.push_back(tmp*tmp)  ;break;//cuadrado ^
  99.         case 'r': pila.push_back(sqrt(tmp))  ;break;//raiz cuadrada  
  100.         default :pila.push_back(tmp)  ;break;// operador indisponible ('"'  
  101.     }
  102.    
  103.    verPila();
  104.     return true;//operacion realizada
  105. }
  106. //----------------------------------------------------------------------
  107. void calc::verPila()const{//muestra el estado de la pila
  108.     size_t index(0);
  109.     cout <<endl<<" --- pila --- size :"<< pila.size()<<endl;
  110.    
  111.     for (auto i: pila){
  112.         cout <<"["<<index++<<"] = "<< i <<endl;
  113.     }
  114. }
  115. //----------------------------------------------------------------------
  116. //----------------------------------------------------------------------
  117.  
  118. int main (){
  119.     calc calculadora;
  120.     calculadora.start(); // Run  
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement