View difference between Paste ID: 5kDuWhxn and mXXXz0eD
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>();
9
}
10
11
12
Expression::~Expression()
13
{
14
    delete saPile;
15
}
16
17
18
int Expression::chiffresEnNombre(std::vector<int>* unTab)
19
{
20
    int i=0, n=0;
21
    
22
    for (std::vector<int>::iterator it = unTab->begin(); it != unTab->end(); it++, i++)
23
    {
24
        n += (*it) * pow(10, unTab->size() - i - 1);
25
    }
26
    
27
    return n;
28-
            saPile->push(conversionCharEnInt(*it));
28+
29-
            //std::cout << "Empile: " << saPile->top() << std::endl;
29+
30
31
int Expression::evaluer(std::vector<char>* unTab)
32
{
33-
            saPile->push(traiterOperation(*it));
33+
34-
            //std::cout << "Empile: " << saPile->top() << std::endl;
34+
35
        saPile->pop();
36
    }
37
38-
    if (saPile->size() > 1) throw 3;
38+
    std::vector<int>* leTabChiffres = new std::vector<int>();
39
40
    for (std::vector<char>::iterator it = unTab->begin(); it != unTab->end(); it++)
41
    {
42
        if ((*it) >= '0' && (*it) <= '9')
43
        {
44
            leTabChiffres->push_back(conversionCharEnInt(*it));
45
        }
46
        else
47
        {
48
            if (!leTabChiffres->empty())
49
            {
50
                saPile->push(chiffresEnNombre(leTabChiffres));
51
                //std::cout << "Empile: " << saPile->top() << std::endl;
52
                leTabChiffres->resize(0);
53
            }
54
          
55
            if ((*it) == ' ')
56
            {
57
                continue;
58
            }
59
            else
60
            {
61
                saPile->push(traiterOperation(*it));
62
                //std::cout << "Empile: " << saPile->top() << std::endl;
63
            }
64
        }
65
    }
66
67
    if (!leTabChiffres->empty())
68
    {
69
        saPile->push(chiffresEnNombre(leTabChiffres));
70
    }
71
    delete leTabChiffres;
72
    
73
    if (saPile->size() != 1) throw 3;
74
    return saPile->top();
75
}
76
77
78
int Expression::conversionCharEnInt(char unChar)
79
{
80
    return unChar - '0';
81
}
82
83
84
int Expression::traiterOperation(char uneOp)
85
{
86
    int a, b;
87
88
    if (saPile->empty()) throw(2);
89
    b = saPile->top();
90
    saPile->pop();
91
    //std::cout << "Dépile: " << b << std::endl;
92
93
    if (saPile->empty()) throw(2);
94
    a = saPile->top();
95
    saPile->pop();
96
    //std::cout << "Dépile: " << a << std::endl;
97
98
    switch (uneOp)
99
    {
100
    case '+':
101
        return a+b;
102
        break;
103
    case '-':
104
        return a-b;
105-
105+
106-
106+
107
        return a*b;
108
        break;
109
    case '/':
110
        if (b == 0) throw 0;
111
        return a/b;
112
        break;
113
    case '%':
114
        if (b == 0) throw 0;
115
        return a%b;
116
        break;
117
    case '<':
118
        return a<b;
119
        break;
120
    case '>':
121
        return a>b;
122
        break;
123
    case '=':
124
        return a==b;
125
        break;
126
    case '!':
127
        return a!=b;
128
        break;
129
    case '&':
130
        return a&&b;
131
        break;
132
    case '|':
133
        return a||b;
134
        break;
135
    }
136
137
    throw 1;
138
    return 0;
139
}
140
141
// EOF