Pagini recente » Cod sursa (job #2239279) | Cod sursa (job #783724) | Cod sursa (job #3342342) | Cod sursa (job #2582626) | Cod sursa (job #3310269)
#include <iostream>
#include <string>
#include <cctype>
#include <fstream>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.in");
class MathEvaluator {
private:
std::string expr;
size_t pos;
// Skip whitespace
void skipWhitespace() {
while (pos < expr.length() && std::isspace(expr[pos])) {
pos++;
}
}
// Parse a number
int parseNumber() {
skipWhitespace();
int result = 0;
bool negative = false;
if (pos < expr.length() && expr[pos] == '-') {
negative = true;
pos++;
} else if (pos < expr.length() && expr[pos] == '+') {
pos++;
}
while (pos < expr.length() && std::isdigit(expr[pos])) {
result = result * 10 + (expr[pos] - '0');
pos++;
}
return negative ? -result : result;
}
// Parse factors (numbers and parentheses)
int parseFactor() {
skipWhitespace();
if (pos < expr.length() && expr[pos] == '(') {
pos++; // skip '('
int result = parseExpression();
skipWhitespace();
if (pos < expr.length() && expr[pos] == ')') {
pos++; // skip ')'
}
return result;
}
return parseNumber();
}
// Parse terms (multiplication and division)
int parseTerm() {
int result = parseFactor();
while (pos < expr.length()) {
skipWhitespace();
if (pos >= expr.length()) break;
char op = expr[pos];
if (op == '*' || op == '/') {
pos++;
int right = parseFactor();
if (op == '*') {
result *= right;
} else {
result /= right;
}
} else {
break;
}
}
return result;
}
// Parse expressions (addition and subtraction)
int parseExpression() {
int result = parseTerm();
while (pos < expr.length()) {
skipWhitespace();
if (pos >= expr.length()) break;
char op = expr[pos];
if (op == '+' || op == '-') {
pos++;
int right = parseTerm();
if (op == '+') {
result += right;
} else {
result -= right;
}
} else {
break;
}
}
return result;
}
public:
int evaluate(const std::string& expression) {
expr = expression;
pos = 0;
return parseExpression();
}
};
// Main eval function
int eval(const std::string& expression) {
MathEvaluator evaluator;
return evaluator.evaluate(expression);
}
// Example usage
int main() {
std::string n;
fin>>n;
fout<<eval(n);
return 0;
}