Pagini recente » Cod sursa (job #659767) | Cod sursa (job #1687226) | Cod sursa (job #2041828) | Cod sursa (job #2027929) | Cod sursa (job #3182107)
#include <iostream>
#include <fstream>
#include <string>
int search(const std::string &expression, int st, int dr, char op1, char op2) {
int cnt = 0;
for (int i = dr; i >= st; --i) {
if (expression[i] == ')') {
++cnt;
}
if (expression[i] == '(') {
--cnt;
}
if (cnt == 0 && (expression[i] == op1 || expression[i] == op2)) {
return i;
}
}
return -1;
}
int num(const std::string &expression, int st, int dr) {
int number = 0;
for (int i = st; i <= dr; ++i) {
number = number * 10 + expression[i] - '0';
}
return number;
}
int solve(const std::string &expression, int st, int dr) {
int pos = search(expression, st, dr, '+', '-');
if (pos != -1) {
int expr1 = solve(expression, st, pos - 1);
int expr2 = solve(expression, pos + 1, dr);
if (expression[pos] == '+') {
return expr1 + expr2;
} else {
return expr1 - expr2;
}
}
pos = search(expression, st, dr, '*', '/');
if (pos != -1) {
int expr1 = solve(expression, st, pos - 1);
int expr2 = solve(expression, pos + 1, dr);
if (expression[pos] == '*') {
return expr1 * expr2;
} else {
return expr1 / expr2;
}
}
if (expression[st] == '(' && expression[dr] == ')') {
return solve(expression, st + 1, dr - 1);
}
return num(expression, st, dr);
}
int main() {
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.in");
std::string expression;
getline(fin, expression);
fout << solve(expression, 0, (int) expression.size() - 1);
return 0;
}