Pagini recente » Cod sursa (job #250208) | Cod sursa (job #212779) | Cod sursa (job #1716423) | Cod sursa (job #313205) | Cod sursa (job #2833400)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout ("evaluare.out");
string expression;
int index;
int element();
int factor();
// will handle the content of an expression/subexpression - which consist of an addition/subtraction
int evaluate() {
// element +/- element
int result = element();
while (expression[index] == '+' || expression[index] == '-') {
switch (expression[index]) {
case '+':
index ++;
result += element();
break;
case '-':
index ++;
result -= element();
break;
}
}
return result;
}
// 2 + 2 + 2 + 2 + 2
// element + element
// element + element
// will handle the content of an element - which consist of factors of a multiplication/division
int element() {
// factor * / factor
int result = factor();
while (expression[index] == '*' || expression[index] == '/') {
switch (expression[index]) {
case '*':
index ++;
result *= factor();
break;
case '/':
index ++;
result /= factor();
break;
}
}
return result;
}
// will return the value of a single factor, which in turn can be a subexpression
int factor() {
int result = 0;
if (expression[index] == '(') { // we have a subexpression
index ++;
result = evaluate(); // 2
index ++;
} else {
while(isdigit(expression[index])) {
result = result * 10 + expression[index] - '0';
index ++;
}
}
return result;
}
int main()
{
// 111*(1+1)
// ^
// (1+1)*13+10/2
// ^
fin >> expression;
fout << evaluate();
return 0;
}