-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathCalcAlg.h
81 lines (64 loc) · 1.63 KB
/
CalcAlg.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <string>
template <typename T>
class Calculator {
private:
std::string expression;
int current_num_index = 0;
T getNumber();
T calcComp();
T calcSum();
public:
T calculate(const std::string &str);
};
template <class T>
T Calculator<T>::calculate(const std::string &expression) {
for (int i = 0; i < expression.length; i++) {
if (!(expression[i] == ' ' && expression[i] == '\t')) {
this->expression.append(expression[i]);
}
}
return calcSum();
}
template <class T>
T Calculator<T>::getNumber() {
int tmp = 0;
T ans = std::stoi(str.data() + current_num_index, &tmp);
current_num_index = current_num_index + tmp;
return ans;
}
template <class T>
T Calculator<T>::calcComp() {
T value = getNumber();
while (current_num_index < str.size() && (str[current_num_index] == '*' || str[current_num_index] == '/')) {
if (str[current_num_index] == '*') {
value = value * getNumber();
}
else if (str[current_num_index] == '/') {
T number = getNumber();
if (number == T(0)) {
throw division_by_zero();
}
value = value / number;
}
++current_num_index;
}
return value;
}
template <class T>
T Calculator<T>::calcSum() {
T value = calcComp();
while (current_num_index < str.size() && (str[current_num_index] == '+' || str[current_num_index] == '-')) {
if (str[current_num_index] == '+') {
value = value + calcComp();
}
else if (str[current_num_index] == '-') {
value = value - calcComp();
}
++current_num_index;
}
if (index < str.size()) {
throw wrong_operation();
}
return value;
}