Advertisement
GeeckoDev

expression.cpp +float

Dec 15th, 2011
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. #include "expression.h"
  5.  
  6. Expression::Expression()
  7. {
  8.     saPile = new std::stack<double>();
  9. }
  10.  
  11.  
  12. Expression::~Expression()
  13. {
  14.     delete saPile;
  15. }
  16.  
  17.  
  18. double Expression::chiffresEnNombre(std::vector<int>* unTab)
  19. {
  20.     unsigned int i, j=unTab->size();
  21.     double n=0.;
  22.        
  23.     for (i=0; i < unTab->size(); i++)
  24.     {
  25.         if ((*unTab)[i] < 0)
  26.         {
  27.             if (j < unTab->size()) throw 4;
  28.        
  29.             j = i;
  30.         }
  31.     }
  32.  
  33.     for (i=0; i < unTab->size(); i++)
  34.     {
  35.         if (i == j) continue;
  36.        
  37.         n += (*unTab)[i] * pow(10., (int)j - (int)i - (i < j));
  38.     }
  39.    
  40.     return n;
  41. }
  42.  
  43.  
  44. double Expression::evaluer(std::vector<char>* unTab)
  45. {
  46.     while (!saPile->empty())
  47.     {
  48.         saPile->pop();
  49.     }
  50.  
  51.     std::vector<int>* leTabChiffres = new std::vector<int>();
  52.  
  53.     for (std::vector<char>::iterator it = unTab->begin(); it != unTab->end(); it++)
  54.     {
  55.         if (((*it) >= '0' && (*it) <= '9') || (*it) == '.')
  56.         {
  57.             leTabChiffres->push_back(conversionCharEnInt((*it) == '.' ? -1 : (*it)));
  58.         }
  59.         else
  60.         {
  61.             if (!leTabChiffres->empty())
  62.             {
  63.                 saPile->push(chiffresEnNombre(leTabChiffres));
  64.                 //std::cout << "Empile: " << saPile->top() << std::endl;
  65.                 leTabChiffres->resize(0);
  66.             }
  67.          
  68.             switch (*it)
  69.             {
  70.             case ' ':
  71.                 continue;
  72.             default:
  73.                 saPile->push(traiterOperation(*it));
  74.                 //std::cout << "Empile: " << saPile->top() << std::endl;
  75.                 break;
  76.             }
  77.         }
  78.     }
  79.  
  80.     if (!leTabChiffres->empty())
  81.     {
  82.         saPile->push(chiffresEnNombre(leTabChiffres));
  83.     }
  84.     delete leTabChiffres;
  85.    
  86.     if (saPile->size() != 1) throw 3;
  87.     return saPile->top();
  88. }
  89.  
  90.  
  91. int Expression::conversionCharEnInt(char unChar)
  92. {
  93.     return unChar - '0';
  94. }
  95.  
  96.  
  97. double Expression::traiterOperation(char uneOp)
  98. {
  99.     double a, b;
  100.  
  101.     if (saPile->empty()) throw(2);
  102.     b = saPile->top();
  103.     saPile->pop();
  104.     //std::cout << "Dépile: " << b << std::endl;
  105.  
  106.     if (saPile->empty()) throw(2);
  107.     a = saPile->top();
  108.     saPile->pop();
  109.     //std::cout << "Dépile: " << a << std::endl;
  110.  
  111.     switch (uneOp)
  112.     {
  113.     case '+':
  114.         return a+b;
  115.     case '-':
  116.         return a-b;
  117.     case '*':
  118.         return a*b;
  119.     case '/':
  120.         if (b == 0.) throw 0;
  121.         return a/b;
  122.     case '<':
  123.         return a<b;
  124.     case '>':
  125.         return a>b;
  126.     case '=':
  127.         return a==b;
  128.     case '!':
  129.         return a!=b;
  130.     case '&':
  131.         return a&&b;
  132.     case '|':
  133.         return a||b;
  134.     }
  135.  
  136.     throw 1;
  137.     return 0.;
  138. }
  139.  
  140. // EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement