Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // g++ -std=c++11 -o calculadora calculadora_rpn.cpp
- // g++ -std=gnu++0x -o calculadora calculadora_rpn.cpp
- // OJO No COMPILA !!! g++ -o calculadora calculadora_rpn.cpp
- // Calculadora RPN terminal Antonio Villanueva Segura
- #include <iostream>
- #include <vector>
- #include <string>
- #include <cmath>
- using namespace std;
- class calc {
- public://interface publico de la clase
- calc ();//constructor de la clase
- void start();//arranca la calculadora
- private:
- vector <double> pila;//almaceno los valores numericos a operar
- string lee();//lectura datos del teclado
- char procesa(string str);// procesa dato u operador
- #if defined (__WIN32__)
- double stod(string str);//stof stod no existen en mingw Windows !!!!!!
- #endif
- bool operador (char c);//gestiona las distintas operaciones + - * ...
- void verPila()const;//muestra el estado de la pila
- };
- //----------------------------------------------------------------------
- calc::calc(){cout<<"--- CALCULADORA RPN Notacion polaca inversa ---"<<endl;
- cout <<"Introduzca cifra u operador + - * / p (potencia) r (raiz) o Q (salir) "<<endl<<endl;
- };
- //----------------------------------------------------------------------
- void calc::start(){
- char operacion('\0');//operacion + - * / cuadrado raiz ...
- while (operacion!='Q' && operacion!='q'){
- operacion =procesa(lee());
- if (operacion !='\0') {operador(operacion);} //si no es NUMERO es op.
- }
- verPila();
- }
- //----------------------------------------------------------------------
- string calc::lee(){//lectura datos del teclado
- string str("");
- while (str.empty()){
- cout <<"cifra u operacion (Q salir) "<<endl;
- cin>>str;
- }
- return str;
- }
- //----------------------------------------------------------------------
- char calc::procesa(string str){// procesa dato u operador
- if (!isdigit(str[0])){return str[0];}//si no es numero es operador
- pila.push_back(stod(str));//guarda en pila y transforma el str en float
- verPila();
- return '\0';// es un numero , no una operacion
- };
- //----------------------------------------------------------------------
- // Funcion inexistente con mingw windows , asi que se define solo para WIN
- // En Linux esta definida
- #if defined (__WIN32__)
- double calc::stod(string str){
- double tmp(0);
- size_t pos(1);
- for ( string::iterator it=str.end()-1; it>str.begin()-1; --it){
- tmp+=(((*it-'0'))*pos);
- pos*=10;//unidad 1 ... decenas 10 centenas 100 ....
- }
- return tmp;
- }
- #endif
- //----------------------------------------------------------------------
- bool calc::operador(char op){//gestiona las distintas operaciones + - * /
- float tmp(0);
- //pila esta llena ?
- if ( pila.empty()){verPila();return false;};//pila vacia
- //operacion unaria imposible + - * /
- if ((op>='*' && op<='/')&& pila.size()==1){verPila();return false;}
- tmp=pila.back();
- pila.pop_back();//elimina ultimo valor
- switch (op){
- case 'c' :pila.clear();break;
- case '+': pila.back()+=tmp ;break;
- case '-': pila.back()-=tmp ;break;
- case '*': pila.back()*=tmp ;break;
- case '/': pila.back()/=tmp ;break;
- case 'p': pila.push_back(tmp*tmp) ;break;//cuadrado ^
- case 'r': pila.push_back(sqrt(tmp)) ;break;//raiz cuadrada
- default :pila.push_back(tmp) ;break;// operador indisponible ('"'
- }
- verPila();
- return true;//operacion realizada
- }
- //----------------------------------------------------------------------
- void calc::verPila()const{//muestra el estado de la pila
- size_t index(0);
- cout <<endl<<" --- pila --- size :"<< pila.size()<<endl;
- for (auto i: pila){
- cout <<"["<<index++<<"] = "<< i <<endl;
- }
- }
- //----------------------------------------------------------------------
- //----------------------------------------------------------------------
- int main (){
- calc calculadora;
- calculadora.start(); // Run
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement