/* rat-calc.cpp  (c) 2005 adolfo@di-mare.com */

/** \file rat-calc.cpp La calculadora polimórfica de Adolfo
*/

/** \mainpage

    \section rat-calc La calculadora polimórfica de Adolfo

    Este programa es una calculadora polimórfica muy simple
    que funciona con los siguientes objetos:

    - <code> long, int</code>: números enteros
    - \c rational:  números rationales
    - \c poly:      polinomios

    La calculadora funciona de la siguiente manera:

    - Al principio el valor acumulado es <code> [ 0 ] </code>
    - Se puede usar cualquier de los 4 operadores aritméticos
    - Para terminar se usa el operador de salida punto "."

    Traza de ejecución:
    \code
    [0] > + [ 2 / 3 ]
    [2/3] > / [ 6 / 2 ]
    [2/9] > * [ 18 ]
    [4] > - [ 45 / 9 ]
    [-1] > / [ 13 / 8 ]
    [-8/13] > * [ 2 ]
    [-16/13] > + [ 7 ]
    [75/13] > .
    [75/13] >
    \endcode

    \author Adolfo Di Mare <adolfo@di-mare.com>
    \date    2004

    - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04
*/

#include "rational.h"
#include <limits.h>

USING_namespace(ADH);     // ADH_port.h ==> using namespace ADH;

/// Función principal en la que empieza la ejecución del programa
int main() {

    rational r,        // último valor ingresado
             acum;     // acumulador de la calculadora
    char     op;       // operación a efectuar

    // inicializa el acumudador
    acum = 0; // acum.op=( 0 );

    // despliega el valor inicial del acumulador
    std::cout << acum << " > ";
    std::cin  >> op;


    // ciclo para leer la siguiente operación a efectuar
    while (op != '.') {
        // valor a operar con el acumulador
        std::cin >> r;             // operator>> (cin, r);

        // selección de la operación a realizar
        switch (op) {
            case '+': acum += r;          break; // acum.op += ( r ); // op += (acum, r)
            case '-': acum  = acum - r;   break; // acum.op  = (op- (acum, r));
            case '*': acum *= r;          break; // acum.op *= ( r );
            case '/': acum  = acum / r;   break; // acum.op  = (op/ (acum, r));
        default:
            // operación inválida
            std::cout << "\n(" << op << ")==> Operación inválida\n";
        }

        // despliega el nuevo valor del acumulador
        std::cout << acum << " > ";
        std::cin.ignore(INT_MAX, '\n');
        std::cin >> op;
    }

    // despliega el valor final del acumulador
    std::cout << acum << " > ";
    return 0;
}  // main()

/* EOF: rat-calc.cpp */