View difference between Paste ID: 9gawWsft and 5kDuWhxn
SHOW: | | - or go back to the newest paste.
1
#include <iostream>
2
#include <cmath>
3
4
#include "expression.h"
5
6
Expression::Expression()
7
{
8-
    saPile = new std::stack<int>();
8+
    saPile = new std::stack<double>();
9
}
10
11
12
Expression::~Expression()
13
{
14
    delete saPile;
15
}
16
17
18-
int Expression::chiffresEnNombre(std::vector<int>* unTab)
18+
double Expression::chiffresEnNombre(std::vector<int>* unTab)
19
{
20-
    int i=0, n=0;
20+
    unsigned int i, j=unTab->size();
21
    double n=0.;
22-
    for (std::vector<int>::iterator it = unTab->begin(); it != unTab->end(); it++, i++)
22+
       
23
    for (i=0; i < unTab->size(); i++)
24-
        n += (*it) * pow(10, unTab->size() - i - 1);
24+
25
        if ((*unTab)[i] < 0)
26
        {
27
            if (j < unTab->size()) throw 4;
28
        
29
            j = i;
30
        }
31-
int Expression::evaluer(std::vector<char>* unTab)
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-
        if ((*it) >= '0' && (*it) <= '9')
42+
43
44-
            leTabChiffres->push_back(conversionCharEnInt(*it));
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) == ' ')
55+
        if (((*it) >= '0' && (*it) <= '9') || (*it) == '.')
56
        {
57
            leTabChiffres->push_back(conversionCharEnInt((*it) == '.' ? -1 : (*it)));
58
        }
59-
            else
59+
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-
int Expression::traiterOperation(char uneOp)
84+
85
    
86-
    int a, b;
86+
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-
        break;
102+
103
    saPile->pop();
104
    //std::cout << "Dépile: " << b << std::endl;
105-
        break;
105+
106
    if (saPile->empty()) throw(2);
107
    a = saPile->top();
108-
        break;
108+
109
    //std::cout << "Dépile: " << a << std::endl;
110-
        if (b == 0) throw 0;
110+
111
    switch (uneOp)
112-
        break;
112+
113-
    case '%':
113+
114-
        if (b == 0) throw 0;
114+
115-
        return a%b;
115+
116-
        break;
116+
117
    case '*':
118
        return a*b;
119-
        break;
119+
120
        if (b == 0.) throw 0;
121
        return a/b;
122-
        break;
122+
123
        return a<b;
124
    case '>':
125-
        break;
125+
126
    case '=':
127
        return a==b;
128-
        break;
128+
129
        return a!=b;
130
    case '&':
131-
        break;
131+
132
    case '|':
133
        return a||b;
134-
        break;
134+
135
136
    throw 1;
137
    return 0.;
138-
    return 0;
138+
139
140
// EOF