Está en la página 1de 7

TRABAJO ENCARGADO DE PROGRAMACION LINEAL

TEMA: CALCULADORA CON OPERACIONES MULTIPLES


ALUMNO: AHUE RIMACHE RUBEN

CODIGO: 16125755

CODIGOS C++ :

#include <iostream>

#include <limits>

#include <stdexcept>

using namespace std;

//declaracion de clases

class token

public:

char kind;

double value;

token (char ch)

:kind(ch), value(0) {}

token (char ch, double val)

:kind(ch), value(val) {}

};

class token_stream

public:

token_stream();

token token_get();

void putback(token t);

private:

bool full;

token buffer;
};

// clases de la function miembro token_stream

token_stream::token_stream()

:full(false), buffer(0) {}

void token_stream::putback(token t)

if (full==true) throw runtime_error ("VOLVER A PONER DATOS COMPLETOS");

buffer = t;

full=true;

token token_stream::token_get()

if (full) {

full=false;

return buffer;

char ch;

cin >> ch;

switch (ch) {

case 'c':

case 's':

case '(': case ')': case '+': case '-': case '*': case '/': case '{': case '}': case'!':

return token(ch);

case '.':

case '0': case '1': case '2': case '3': case '4':

case '5': case '6': case '7': case '8': case '9':

cin.putback(ch);

double val;
cin >> val;

return token ('8',val);

default:

throw runtime_error("SIMBOLO INCORRECTO");

//declaracion de funciones

token_stream ts;

double expression();

double term();

double primary();

int factorial(int number);

//funciones

double primary()

token t = ts.token_get();

switch (t.kind) {

case '{':

double d = expression();

t = ts.token_get();

if (t.kind != '}') throw runtime_error ("']' esperado");

return d;

case '(':

double d = expression();
t = ts.token_get();

if (t.kind != ')') throw runtime_error("')' esperado");

return d;

case '!':

t = ts.token_get();

double d = factorial(t.value);

return d;

case '8':

return t.value;

case 's':

cout << "salir";

return 0;

default:

throw runtime_error("primera esperado");

double term()

double left = primary();

token t = ts.token_get();

while (true) {

switch (t.kind) {

case '*':

left *= primary();

t = ts.token_get();

break;

case '/':

{
double d = primary();

if (d==0) throw runtime_error("division por cero");

left /=d;

t = ts.token_get();

break;

default:

ts.putback(t);

return left;

double expression()

double left = term();

token t = ts.token_get();

while(true) {

switch(t.kind) {

case '+':

left+=term();

t = ts.token_get();

break;

case '-':

left-=term();

t = ts.token_get();

break;

default:

ts.putback(t);

return left;

}
}

int factorial(int number)

int solution = 1;

for (int i=number; i>1; i--) {

solution= solution*i;

return solution;

int main()

try

double n1, n2;

system ("cls");

cout << " ************************************************************** \n"

<<" * CALCULADORA QUE REALIZA OPERACIONES MULTIPLES DE (+,-,*,/) *


\n"

<<"
************************************************************** "

<<endl

<<endl

<<endl

<< "EN LA PARTE INFERIOR INGRESE LA OPERACION MULTIPLE QUE DESEA REALIZAR
LUEGO PRESIONE (c) PARA CALCULAR Y (s) PARA SALIR"

<<endl

<<endl

<<endl

<< '\n';

cout << "OPERACIONES MULTIPLES:";


//bucle principal

while (cin) {

token t = ts.token_get();

if (t.kind == 's') {

cout << " GRACIAS POR USAR ESTA CALCULADORA" << '\n';

break; //'q' for quit

if (t.kind == 'c') // ';' for "print now"

cout << "RESULTADO = " << expression() << '\n'<< "FUE UNA OPERACION MUY
CENSILLA";

else {

ts.putback(t);

cout << "RESULTADO = " << expression() << '\n' << "FUE UNA OPERACION
SENCILLA";

catch (exception& e) {

cerr << "error: " << e.what() << '\n';

return 1;

catch (...) {

cerr << " INGRESO DESCONOCIDO!\n";

return 2;