Pagini recente » Istoria paginii utilizator/andreii_092 | Cod sursa (job #3197341)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
vector<string> split(const string& str, char filter){
vector<string> result;
unsigned int p1=0, p2=0; int depth=0;
while(p2<str.size()){
if(str[p2]=='(') depth++;
else if(str[p2]==')') depth--;
if(str[p2]!=filter || depth!=0){
p2++;
continue;
}
result.push_back(str.substr(p1, p2-p1));
p1=++p2;
}
result.push_back(str.substr(p1, p2-p1));
return result;
}
int eval_expr(const string& expr){
vector<string> add_split=split(expr, '+');
int add_result=0;
for(auto add_str : add_split){
vector<string> mult_split=split(add_str, '*');
int mult_result=1;
for(auto mult_str : mult_split){
if(mult_str[0]=='('){
mult_result*=eval_expr(mult_str.substr(1, mult_str.size()-2));
}else if(mult_str[1]=='/'){
if(mult_str.substr(2, mult_str.size()-2)[0]=='('){
mult_result/=eval_expr(mult_str.substr(2, mult_str.size()-2));
}else{
mult_result/=stoi(mult_str.substr(2, mult_str.size()-2));
}
}else{
mult_result*=stoi(mult_str);
}
}
add_result+=mult_result;
}
return add_result;
}
int main(){
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string expr; fin>>expr;
for(unsigned int i=0; i<expr.size(); i++){
if(expr[i]=='-' && expr[i+1]=='('){
expr.insert(expr.begin()+i, '+');
expr.insert(expr.begin()+i+2, '*');
expr.insert(expr.begin()+i+2, '1');
i+=3;
}
if(expr[i]=='-'){
expr.insert(expr.begin()+i, '+');
i++;
}else if(expr[i]=='/'){
expr.insert(expr.begin()+i, '1');
expr.insert(expr.begin()+i, '*');
i+=2;
}
}
fout<<eval_expr(expr);
return 0;
}