Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include "expression.h"
- Expression::Expression()
- {
- saPile = new std::stack<double>();
- }
- Expression::~Expression()
- {
- delete saPile;
- }
- double Expression::chiffresEnNombre(std::vector<int>* unTab)
- {
- unsigned int i, j=unTab->size();
- double n=0.;
- for (i=0; i < unTab->size(); i++)
- {
- if ((*unTab)[i] < 0)
- {
- if (j < unTab->size()) throw 4;
- j = i;
- }
- }
- for (i=0; i < unTab->size(); i++)
- {
- if (i == j) continue;
- n += (*unTab)[i] * pow(10., (int)j - (int)i - (i < j));
- }
- return n;
- }
- double Expression::evaluer(std::vector<char>* unTab)
- {
- while (!saPile->empty())
- {
- saPile->pop();
- }
- std::vector<int>* leTabChiffres = new std::vector<int>();
- for (std::vector<char>::iterator it = unTab->begin(); it != unTab->end(); it++)
- {
- if (((*it) >= '0' && (*it) <= '9') || (*it) == '.')
- {
- leTabChiffres->push_back(conversionCharEnInt((*it) == '.' ? -1 : (*it)));
- }
- else
- {
- if (!leTabChiffres->empty())
- {
- saPile->push(chiffresEnNombre(leTabChiffres));
- //std::cout << "Empile: " << saPile->top() << std::endl;
- leTabChiffres->resize(0);
- }
- switch (*it)
- {
- case ' ':
- continue;
- default:
- saPile->push(traiterOperation(*it));
- //std::cout << "Empile: " << saPile->top() << std::endl;
- break;
- }
- }
- }
- if (!leTabChiffres->empty())
- {
- saPile->push(chiffresEnNombre(leTabChiffres));
- }
- delete leTabChiffres;
- if (saPile->size() != 1) throw 3;
- return saPile->top();
- }
- int Expression::conversionCharEnInt(char unChar)
- {
- return unChar - '0';
- }
- double Expression::traiterOperation(char uneOp)
- {
- double a, b;
- if (saPile->empty()) throw(2);
- b = saPile->top();
- saPile->pop();
- //std::cout << "Dépile: " << b << std::endl;
- if (saPile->empty()) throw(2);
- a = saPile->top();
- saPile->pop();
- //std::cout << "Dépile: " << a << std::endl;
- switch (uneOp)
- {
- case '+':
- return a+b;
- case '-':
- return a-b;
- case '*':
- return a*b;
- case '/':
- if (b == 0.) throw 0;
- return a/b;
- case '<':
- return a<b;
- case '>':
- return a>b;
- case '=':
- return a==b;
- case '!':
- return a!=b;
- case '&':
- return a&&b;
- case '|':
- return a||b;
- }
- throw 1;
- return 0.;
- }
- // EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement